user: Translate the below assembly code into C programming language:

```asm
<inverse_transform>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  movsd  %xmm0,-0x28(%rbp)
  movsd  %xmm1,-0x30(%rbp)
  movsd  %xmm2,-0x38(%rbp)
  mov    %rdi,-0x40(%rbp)
  mov    -0x30(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  jne    L89
  mov    -0x38(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  je     L89
  mov    -0x40(%rbp),%rax
  movsd  (%rax),%xmm0
  addsd  -0x28(%rbp),%xmm0
  mov    -0x40(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  addsd  -0x30(%rbp),%xmm0
  jmp    L156
L89:
  mov    -0x38(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  jne    L158
  mov    -0x30(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  je     L158
  mov    -0x40(%rbp),%rax
  movsd  (%rax),%xmm0
  addsd  -0x28(%rbp),%xmm0
  mov    -0x40(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movapd %xmm0,%xmm1
  movsd  -0x38(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  jmp    L156
L158:
  mov    -0x38(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  je     L85
  mov    -0x30(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  je     L85
  movsd  -0x28(%rbp),%xmm0
  jmp    L156
L85:
  movsd  -0x28(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jbe    L109
  movsd  -0x28(%rbp),%xmm0
  movq   D96(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm1
  movsd  D45(%rip),%xmm0
  addsd  %xmm0,%xmm1
  movsd  D45(%rip),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x38(%rbp),%xmm0
  subsd  -0x30(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <log@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm3
  subsd  -0x28(%rbp),%xmm3
  movsd  %xmm3,-0x48(%rbp)
  mov    -0x8(%rbp),%rax
  movq   %rax,%xmm0
  call   <log1p@plt>
  add    %eax,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  -0x48(%rbp),%xmm1
  subsd  %xmm0,%xmm1
  mov    -0x40(%rbp),%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x40(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  jne    L154
  movsd  D45(%rip),%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jp     L154
  movsd  D45(%rip),%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jne    L154
  movsd  D40(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  jmp    L154
L109:
  mov    -0x28(%rbp),%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm1
  movsd  D45(%rip),%xmm0
  movapd %xmm1,%xmm2
  addsd  %xmm0,%xmm2
  movsd  D45(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  %xmm2,%xmm1
  movsd  D45(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x38(%rbp),%xmm0
  subsd  -0x30(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <log@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm4
  addsd  -0x28(%rbp),%xmm4
  movsd  %xmm4,-0x48(%rbp)
  mov    -0x10(%rbp),%rax
  movq   %rax,%xmm0
  call   <log1p@plt>
  add    %eax,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  -0x48(%rbp),%xmm1
  subsd  %xmm0,%xmm1
  mov    -0x40(%rbp),%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x40(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  test   %rax,%rax
  jne    L154
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jp     L154
  pxor   %xmm0,%xmm0
  ucomisd -0x18(%rbp),%xmm0
  jne    L154
  movsd  D71(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
L154:
  movsd  -0x38(%rbp),%xmm0
  subsd  -0x30(%rbp),%xmm0
  mulsd  -0x18(%rbp),%xmm0
  addsd  -0x30(%rbp),%xmm0
L156:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D96
type_guessed: byte[8]
name: read_data
arguments: label: D45
type_guessed: f64
name: read_data
arguments: label: D40
type_guessed: byte[8]
name: read_data
arguments: label: D71
type_guessed: byte[8]

tool: {"D96": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80]}

tool: D45: 1

tool: {"D40": [0xf7,0xff,0xff,0xff,0xff,0xff,0xef,0x3f]}

tool: {"D71": [0x16,0x56,0xe7,0x9e,0xaf,0x03,0xd2,0x3c]}

assistant: ```c
double inverse_transform(double z, double lb, double ub, double *lp) {
  if (!isinf(lb) && isinf(ub)) {
    *lp += z;
    return exp(z) + lb;
  } else if (!isinf(ub) && isinf(lb)) {
    *lp += z;
    return ub - exp(z);
  } else if (isinf(ub) && isinf(lb)) {
    return z;
  }
  double inv_logit_x;
  if (z > 0) {
    double exp_minus_x = exp(-z);
    inv_logit_x = 1.0 / (1.0 + exp_minus_x);
    *lp += log(ub - lb) - z - 2 * log1p(exp_minus_x);
    if (!isinf(z) && inv_logit_x == 1)
      inv_logit_x = 1 - 1e-15;
  } else {
    double exp_x = exp(z);
    inv_logit_x = 1.0 - 1.0 / (1.0 + exp_x);
    *lp += log(ub - lb) + z - 2 * log1p(exp_x);
    if (!isinf(z) && inv_logit_x == 0)
      inv_logit_x = 1e-15;
  }
  return lb + (ub - lb) * inv_logit_x;
}
```