user: 请从给定的汇编指令推导出C源代码:

```asm
<cdrift_kepu_guess>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  movsd  %xmm0,-0x68(%rbp)
  movsd  %xmm1,-0x70(%rbp)
  movsd  %xmm2,-0x78(%rbp)
  movsd  %xmm3,-0x80(%rbp)
  movsd  %xmm4,-0x88(%rbp)
  movsd  %xmm5,-0x90(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movsd  -0x80(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jbe    L2
  movsd  -0x68(%rbp),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x70(%rbp),%xmm1
  movsd  D23(%rip),%xmm0
  comisd %xmm1,%xmm0
  jb     L47
  movsd  -0x68(%rbp),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x70(%rbp),%xmm1
  movsd  -0x68(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x88(%rbp),%xmm2
  movsd  -0x70(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  mulsd  -0x70(%rbp),%xmm0
  mulsd  -0x70(%rbp),%xmm0
  divsd  %xmm0,%xmm2
  subsd  %xmm2,%xmm1
  movapd %xmm1,%xmm0
  movsd  %xmm0,-0x90(%rbp)
  movsd  -0x90(%rbp),%xmm0
  jmp    L72
L47:
  movsd  -0x78(%rbp),%xmm0
  divsd  -0x80(%rbp),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  -0x40(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x40(%rbp),%xmm1
  movsd  -0x78(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x38(%rbp)
  movsd  -0x70(%rbp),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x40(%rbp),%xmm1
  movsd  D43(%rip),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  -0x38(%rbp),%xmm0
  mulsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x40(%rbp),%xmm1
  movsd  -0x88(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  -0x30(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  %xmm0,%xmm1
  movsd  -0x28(%rbp),%xmm0
  mulsd  %xmm0,%xmm0
  addsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x20(%rbp)
  movsd  -0x38(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  subsd  -0x28(%rbp),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  lea    -0x48(%rbp),%rdx
  lea    -0x50(%rbp),%rcx
  lea    -0x58(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <cmco_sine@plt>
  movsd  -0x48(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x28(%rbp),%xmm1
  movsd  -0x50(%rbp),%xmm0
  mulsd  -0x30(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jb     L65
  movsd  D43(%rip),%xmm0
  jmp    L70
L65:
  movsd  D36(%rip),%xmm0
L70:
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x18(%rbp),%xmm1
  movsd  D25(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x20(%rbp),%xmm1
  movsd  -0x58(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  mov    -0x80(%rbp),%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movapd %xmm0,%xmm1
  movsd  -0x10(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x90(%rbp)
  jmp    L18
L2:
  lea    -0x90(%rbp),%rdx
  movsd  -0x88(%rbp),%xmm3
  movsd  -0x80(%rbp),%xmm2
  movsd  -0x78(%rbp),%xmm1
  movsd  -0x70(%rbp),%xmm0
  mov    -0x68(%rbp),%rax
  mov    %rdx,%rdi
  movapd %xmm3,%xmm4
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <cdrift_kepu_p3solve@plt>
  mov    %eax,-0x5c(%rbp)
  cmpl   $0x0,-0x5c(%rbp)
  je     L18
  movsd  -0x68(%rbp),%xmm0
  divsd  -0x70(%rbp),%xmm0
  movsd  %xmm0,-0x90(%rbp)
L18:
  movsd  -0x90(%rbp),%xmm0
L72:
  movq   %xmm0,%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L34
  call   <__stack_chk_fail@plt>
L34:
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D23
type_guessed: f64
name: extract_symbolic_data
arguments: label: D43
type_guessed: f64
name: extract_symbolic_data
arguments: label: D36
type_guessed: f32[2]
name: extract_symbolic_data
arguments: label: D25
type_guessed: f64

tool: D23: 0.4

tool: D43: 1

tool: {"D36": [0.0,-1.875]}

tool: D25: 0.85

assistant: ```c
double cdrift_kepu_guess(const double dt, const double r0, const double mu, const double alpha, const double u, double s) {
  if (alpha > 0.0) {
    if (dt / r0 <= 0.4) {
      s = dt / r0 - (dt * dt * u) / (2.0 * r0 * r0 * r0);
      return s;
    } else {
      const double a = mu / alpha;
      const double en = sqrt(mu / (a * a * a));
      const double ec = 1.0 - r0 / a;
      const double es = u / (en * a * a);
      const double e = sqrt(ec * ec + es * es);
      double y = en * dt - es;
      double sy = 0.0, cy = 0.0;
      cmco_sine(&y, &sy, &cy);
      const double sigma = (es * cy + ec * sy) >= 0 ? fabs(1.0) : -fabs(1.0);
      const double x = y + sigma * 0.85 * e;
      s = x / sqrt(alpha);
    }
  } else {
    const int iflg = cdrift_kepu_p3solve(dt, r0, mu, alpha, u, &s);
    if (iflg) {
      s = dt / r0;
    }
  }
  return s;
}
```