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

```asm
<EuropeanExchangeOption>:
  endbr64
  sub    $0x58,%rsp
  movapd %xmm0,%xmm8
  movsd  0x70(%rsp),%xmm0
  movsd  0x60(%rsp),%xmm9
  movsd  %xmm7,0x10(%rsp)
  movsd  0x68(%rsp),%xmm7
  movsd  %xmm5,0x8(%rsp)
  addsd  %xmm0,%xmm0
  movapd %xmm9,%xmm5
  mulsd  %xmm9,%xmm5
  movapd %xmm7,%xmm10
  mulsd  %xmm7,%xmm10
  mulsd  %xmm9,%xmm0
  addsd  %xmm10,%xmm5
  mulsd  %xmm7,%xmm0
  pxor   %xmm7,%xmm7
  subsd  %xmm0,%xmm5
  ucomisd %xmm5,%xmm7
  ja     L32
  sqrtsd %xmm5,%xmm5
L24:
  ucomisd %xmm4,%xmm7
  ja     L9
  movapd %xmm4,%xmm7
  sqrtsd %xmm7,%xmm7
L0:
  mulsd  %xmm8,%xmm2
  movsd  %xmm6,0x40(%rsp)
  mulsd  %xmm1,%xmm3
  movsd  %xmm4,0x30(%rsp)
  mulsd  %xmm5,%xmm7
  movsd  %xmm5,0x28(%rsp)
  movapd %xmm2,%xmm0
  movsd  %xmm2,0x18(%rsp)
  divsd  %xmm3,%xmm0
  movsd  %xmm3,0x38(%rsp)
  movsd  %xmm7,0x20(%rsp)
  call   <log@plt>
  movsd  0x28(%rsp),%xmm5
  movsd  0x40(%rsp),%xmm6
  movsd  0x30(%rsp),%xmm4
  movsd  0x20(%rsp),%xmm7
  mulsd  %xmm5,%xmm5
  movapd %xmm6,%xmm1
  subsd  0x10(%rsp),%xmm1
  mulsd  D3(%rip),%xmm5
  subsd  0x8(%rsp),%xmm6
  movsd  %xmm4,0x20(%rsp)
  mulsd  %xmm4,%xmm6
  addsd  %xmm1,%xmm5
  mulsd  %xmm4,%xmm5
  addsd  %xmm0,%xmm5
  movapd %xmm6,%xmm0
  divsd  %xmm7,%xmm5
  movapd %xmm5,%xmm8
  movsd  %xmm5,0x30(%rsp)
  subsd  %xmm7,%xmm8
  movsd  %xmm8,0x28(%rsp)
  call   <exp@plt>
  movsd  0x18(%rsp),%xmm2
  movsd  0x30(%rsp),%xmm5
  mov    $0x1,%eax
  mulsd  %xmm0,%xmm2
  movapd %xmm5,%xmm0
  movsd  %xmm2,0x18(%rsp)
  call   <cnd@plt>
  pxor   %xmm0,%xmm0
  movsd  0x18(%rsp),%xmm1
  movsd  0x20(%rsp),%xmm4
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm0,%xmm1
  movsd  0x10(%rsp),%xmm0
  subsd  0x8(%rsp),%xmm0
  mulsd  %xmm4,%xmm0
  movsd  %xmm1,0x18(%rsp)
  call   <exp@plt>
  movsd  0x38(%rsp),%xmm3
  mov    $0x1,%eax
  movsd  0x28(%rsp),%xmm8
  mulsd  %xmm0,%xmm3
  movapd %xmm8,%xmm0
  movsd  %xmm3,0x8(%rsp)
  call   <cnd@plt>
  pxor   %xmm2,%xmm2
  movsd  0x18(%rsp),%xmm1
  cvtsi2sd %eax,%xmm2
  mulsd  0x8(%rsp),%xmm2
  add    $0x58,%rsp
  subsd  %xmm2,%xmm1
  movapd %xmm1,%xmm0
  ret
L32:
  movapd %xmm5,%xmm0
  movsd  %xmm6,0x40(%rsp)
  movsd  %xmm4,0x38(%rsp)
  movsd  %xmm3,0x30(%rsp)
  movsd  %xmm2,0x28(%rsp)
  movsd  %xmm1,0x20(%rsp)
  movsd  %xmm8,0x18(%rsp)
  call   <sqrt@plt>
  movsd  0x40(%rsp),%xmm6
  pxor   %xmm7,%xmm7
  movsd  0x38(%rsp),%xmm4
  movsd  0x30(%rsp),%xmm3
  movsd  0x28(%rsp),%xmm2
  movapd %xmm0,%xmm5
  movsd  0x20(%rsp),%xmm1
  movsd  0x18(%rsp),%xmm8
  jmp    L24
L9:
  movapd %xmm4,%xmm0
  movsd  %xmm6,0x48(%rsp)
  movsd  %xmm3,0x40(%rsp)
  movsd  %xmm2,0x38(%rsp)
  movsd  %xmm1,0x30(%rsp)
  movsd  %xmm8,0x28(%rsp)
  movsd  %xmm5,0x20(%rsp)
  movsd  %xmm4,0x18(%rsp)
  call   <sqrt@plt>
  movsd  0x48(%rsp),%xmm6
  movsd  0x40(%rsp),%xmm3
  movsd  0x38(%rsp),%xmm2
  movsd  0x30(%rsp),%xmm1
  movapd %xmm0,%xmm7
  movsd  0x28(%rsp),%xmm8
  movsd  0x20(%rsp),%xmm5
  movsd  0x18(%rsp),%xmm4
  jmp    L0
```

tool_calls: name: disassemble_data
arguments: data_tag: D3
datatype: byte[8]

tool: {"D3": [0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f]}

assistant: ```c
double EuropeanExchangeOption(double S1, double S2, double Q1, double Q2, double T, double r, double b1, double b2, double v1, double v2, double Rho) {
  const double v = sqrt(((v1) * (v1)) + ((v2) * (v2)) - 2.0 * Rho * v1 * v2);
  const double vsT = v * sqrt(T);
  const double d1 = (log(Q1 * S1 / (Q2 * S2)) + (b1 - b2 + ((v) * (v)) / 2.0) * T) / vsT;
  const double d2 = d1 - vsT;
  return Q1 * S1 * exp((b1 - r) * T) * cnd(d1) - Q2 * S2 * exp((b2 - r) * T) * cnd(d2);
}
```