user: Please show me the C implementation that matches the assembly code listed below:

```asm
<VasicekBondOption>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %edi,-0x34(%rbp)
  movsd  %xmm0,-0x40(%rbp)
  movsd  %xmm1,-0x48(%rbp)
  movsd  %xmm2,-0x50(%rbp)
  movsd  %xmm3,-0x58(%rbp)
  movsd  %xmm4,-0x60(%rbp)
  movsd  %xmm5,-0x68(%rbp)
  movsd  %xmm6,-0x70(%rbp)
  movsd  %xmm7,-0x78(%rbp)
  movsd  -0x48(%rbp),%xmm0
  ucomisd -0x48(%rbp),%xmm0
  jp     L39
  movsd  -0x48(%rbp),%xmm0
  comisd D139(%rip),%xmm0
  jb     L39
  movsd  D101(%rip),%xmm0
  comisd -0x48(%rbp),%xmm0
  jb     L39
  mov    $0x1,%eax
  jmp    L98
L39:
  mov    $0x0,%eax
L98:
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  movsd  -0x58(%rbp),%xmm0
  ucomisd -0x58(%rbp),%xmm0
  jp     L60
  movsd  -0x58(%rbp),%xmm0
  comisd D45(%rip),%xmm0
  jb     L60
  movsd  D142(%rip),%xmm0
  comisd -0x58(%rbp),%xmm0
  jb     L60
  mov    $0x1,%eax
  jmp    L80
L60:
  mov    $0x0,%eax
L80:
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  movsd  -0x60(%rbp),%xmm0
  ucomisd -0x60(%rbp),%xmm0
  jp     L71
  movsd  -0x60(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L71
  movsd  D79(%rip),%xmm0
  comisd -0x60(%rbp),%xmm0
  jb     L71
  mov    $0x1,%eax
  jmp    L100
L71:
  mov    $0x0,%eax
L100:
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  movsd  -0x78(%rbp),%xmm0
  ucomisd -0x78(%rbp),%xmm0
  jp     L95
  movsd  -0x78(%rbp),%xmm0
  comisd D5(%rip),%xmm0
  jb     L95
  movsd  D122(%rip),%xmm0
  comisd -0x78(%rbp),%xmm0
  jb     L95
  mov    $0x1,%eax
  jmp    L147
L95:
  mov    $0x0,%eax
L147:
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <assert@plt>
  movsd  -0x48(%rbp),%xmm0
  divsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  -0x78(%rbp),%xmm4
  movsd  -0x70(%rbp),%xmm3
  movsd  -0x68(%rbp),%xmm2
  movsd  -0x60(%rbp),%xmm1
  movsd  -0x58(%rbp),%xmm0
  movapd %xmm4,%xmm5
  movapd %xmm3,%xmm4
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  mov    D87(%rip),%rax
  movq   %rax,%xmm0
  mov    $0x6,%eax
  call   <VasicekBondPrice@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  -0x78(%rbp),%xmm4
  movsd  -0x70(%rbp),%xmm3
  movsd  -0x68(%rbp),%xmm2
  movsd  -0x60(%rbp),%xmm1
  movsd  -0x50(%rbp),%xmm0
  movapd %xmm4,%xmm5
  movapd %xmm3,%xmm4
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  mov    D87(%rip),%rax
  movq   %rax,%xmm0
  mov    $0x6,%eax
  call   <VasicekBondPrice@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x78(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0x70(%rbp),%xmm1
  movsd  D51(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm7
  mulsd  -0x58(%rbp),%xmm7
  movq   %xmm7,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movsd  D118(%rip),%xmm1
  subsd  %xmm0,%xmm1
  mulsd  -0x80(%rbp),%xmm1
  movsd  -0x70(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  divsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0x70(%rbp),%xmm0
  movq   D56(%rip),%xmm1
  xorpd  %xmm0,%xmm1
  movsd  -0x50(%rbp),%xmm0
  subsd  -0x58(%rbp),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movsd  D118(%rip),%xmm1
  subsd  %xmm0,%xmm1
  movsd  -0x80(%rbp),%xmm0
  mulsd  %xmm1,%xmm0
  divsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  D118(%rip),%xmm0
  divsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0x20(%rbp),%xmm0
  movapd %xmm0,%xmm5
  mulsd  -0x48(%rbp),%xmm5
  movapd %xmm5,%xmm1
  movsd  -0x18(%rbp),%xmm0
  movapd %xmm0,%xmm6
  divsd  %xmm1,%xmm6
  movq   %xmm6,%rax
  movq   %rax,%xmm0
  call   <log@plt>
  movsd  -0x80(%rbp),%xmm1
  mulsd  %xmm0,%xmm1
  movsd  -0x10(%rbp),%xmm0
  movsd  D46(%rip),%xmm2
  divsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  je     L3
  mov    -0x8(%rbp),%rax
  movq   %rax,%xmm0
  mov    $0x1,%eax
  call   <cnd@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0x48(%rbp),%xmm0
  movapd %xmm0,%xmm6
  mulsd  -0x20(%rbp),%xmm6
  movsd  %xmm6,-0x88(%rbp)
  movsd  -0x8(%rbp),%xmm0
  movapd %xmm0,%xmm7
  subsd  -0x10(%rbp),%xmm7
  movq   %xmm7,%rax
  movq   %rax,%xmm0
  mov    $0x1,%eax
  call   <cnd@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  -0x88(%rbp),%xmm1
  mulsd  %xmm0,%xmm1
  movsd  -0x80(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  -0x40(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  jmp    L117
L3:
  movsd  -0x48(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0x10(%rbp),%xmm0
  movapd %xmm0,%xmm3
  subsd  -0x8(%rbp),%xmm3
  movq   %xmm3,%rax
  movq   %rax,%xmm0
  mov    $0x1,%eax
  call   <cnd@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  -0x8(%rbp),%xmm0
  movq   D56(%rip),%xmm1
  movapd %xmm0,%xmm4
  xorpd  %xmm1,%xmm4
  movq   %xmm4,%rax
  movq   %rax,%xmm0
  mov    $0x1,%eax
  call   <cnd@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x18(%rbp),%xmm1
  movsd  -0x80(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  -0x40(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
L117:
  movsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D139
type_guessed: f64[2]
name: retrieve_data
arguments: label: D101
type_guessed: f64
name: retrieve_data
arguments: label: D45
type_guessed: byte[16]
name: retrieve_data
arguments: label: D142
type_guessed: f64
name: retrieve_data
arguments: label: D79
type_guessed: f64
name: retrieve_data
arguments: label: D5
type_guessed: f64[2]
name: retrieve_data
arguments: label: D122
type_guessed: f64
name: retrieve_data
arguments: label: D87
type_guessed: f64
name: retrieve_data
arguments: label: D51
type_guessed: byte[8]
name: retrieve_data
arguments: label: D118
type_guessed: f64
name: retrieve_data
arguments: label: D56
type_guessed: byte[8]
name: retrieve_data
arguments: label: D46
type_guessed: f64

tool: {"D139": [1e-6,1000000000000.0]}

tool: D101: 1000000000000

tool: {"D45": [0xce,0xd2,0x29,0x9c,0x17,0x96,0x25,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x40]}

tool: D142: 20

tool: D79: 1000

tool: {"D5": [1e-7,100.99999]}

tool: D122: 100.99999

tool: D87: 0

tool: {"D51": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0]}

tool: D118: 1

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

tool: D46: 2

assistant: ```c
double VasicekBondOption(int fCall, double F, double X, double tau, double T, double r, double Theta, double kappa, double v) {
  double PtT, Pt_tau, vp, H, result;
  assert(((X) == (X)) && (X) >= 0.000001 && (X) <= 1000000000000.0);
  assert(((T) == (T)) && (T) >= (1.0 / (253.0 * 24.0)) && (T) <= (20.0));
  assert(((r) == (r)) && (r) >= 0.0 && (r) <= 1000.0);
  assert(((v) == (v)) && (v) >= 0.0000001 && v <= 100.99999);
  X = X / F;
  PtT = VasicekBondPrice(0.0, T, r, Theta, kappa, v);
  Pt_tau = VasicekBondPrice(0.0, tau, r, Theta, kappa, v);
  vp = sqrt(((v) * (v)) * (1.0 - exp(-2.0 * kappa * T)) / (2.0 * kappa)) * (1.0 - exp(-kappa * (tau - T))) / kappa;
  H = 1.0 / vp * log(Pt_tau / (PtT * X)) + vp / 2.0;
  if (fCall)
    result = F * (Pt_tau * cnd(H) - X * PtT * cnd(H - vp));
  else
    result = F * (X * PtT * cnd(-H + vp) - Pt_tau * cnd(-H));
  return result;
}
```