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

```asm
<xsq_to_stddev>:
  endbr64
  movapd %xmm1,%xmm7
  push   %rbx
  movapd %xmm1,%xmm3
  mov    %rdi,%rbx
  divsd  %xmm2,%xmm7
  sub    $0x30,%rsp
  subsd  D66(%rip),%xmm3
  movsd  %xmm2,0x18(%rsp)
  movsd  %xmm1,0x10(%rsp)
  movsd  %xmm3,(%rsp)
  addsd  %xmm0,%xmm7
  movapd %xmm7,%xmm0
  movsd  %xmm7,0x8(%rsp)
  divsd  %xmm3,%xmm0
  call   <log@plt>
  movsd  (%rsp),%xmm3
  pxor   %xmm5,%xmm5
  movsd  0x8(%rsp),%xmm7
  movsd  0x10(%rsp),%xmm1
  movsd  0x18(%rsp),%xmm2
  mulsd  %xmm3,%xmm0
  movapd %xmm7,%xmm6
  subsd  %xmm3,%xmm6
  subsd  %xmm0,%xmm6
  comisd %xmm6,%xmm5
  ja     L7
  ucomisd %xmm6,%xmm5
  ja     L26
L44:
  sqrtsd %xmm6,%xmm6
L15:
  movsd  D49(%rip),%xmm4
  divsd  %xmm3,%xmm4
  ucomisd %xmm4,%xmm5
  ja     L132
  sqrtsd %xmm4,%xmm4
L74:
  comisd %xmm7,%xmm3
  divsd  D61(%rip),%xmm4
  jb     L114
  subsd  %xmm6,%xmm4
  movapd %xmm4,%xmm1
L83:
  addsd  %xmm3,%xmm3
  movapd %xmm1,%xmm4
  andpd  D48(%rip),%xmm4
  ucomisd %xmm3,%xmm5
  ja     L45
  sqrtsd %xmm3,%xmm3
L87:
  divsd  %xmm3,%xmm2
  xor    %eax,%eax
  movapd %xmm1,%xmm0
  comisd %xmm2,%xmm4
  seta   %al
  mov    %eax,(%rbx)
  add    $0x30,%rsp
  pop    %rbx
  ret
  xchg   %ax,%ax
L7:
  movapd %xmm5,%xmm6
  jmp    L44
  cs nopw 0x0(%rax,%rax,1)
L114:
  movapd %xmm2,%xmm0
  movsd  %xmm4,0x28(%rsp)
  addsd  %xmm7,%xmm0
  xorpd  D90(%rip),%xmm0
  movsd  %xmm6,0x20(%rsp)
  movsd  %xmm3,0x18(%rsp)
  divsd  %xmm1,%xmm0
  movsd  %xmm2,0x10(%rsp)
  movsd  %xmm7,0x8(%rsp)
  movsd  %xmm1,(%rsp)
  call   <exp@plt>
  movsd  0x10(%rsp),%xmm2
  movsd  0x8(%rsp),%xmm7
  movsd  (%rsp),%xmm1
  movapd %xmm0,%xmm8
  divsd  %xmm2,%xmm7
  movsd  %xmm2,0x8(%rsp)
  movapd %xmm1,%xmm0
  addsd  D66(%rip),%xmm7
  divsd  %xmm7,%xmm0
  movsd  D66(%rip),%xmm7
  subsd  %xmm8,%xmm7
  mulsd  %xmm7,%xmm0
  divsd  %xmm0,%xmm1
  movapd %xmm0,%xmm7
  addsd  %xmm0,%xmm7
  movsd  %xmm7,(%rsp)
  movapd %xmm1,%xmm0
  call   <log@plt>
  movsd  0x8(%rsp),%xmm2
  movsd  (%rsp),%xmm7
  pxor   %xmm5,%xmm5
  movsd  0x18(%rsp),%xmm3
  movsd  0x20(%rsp),%xmm6
  movapd %xmm2,%xmm1
  movsd  0x28(%rsp),%xmm4
  addsd  %xmm2,%xmm1
  subsd  D66(%rip),%xmm1
  subsd  %xmm7,%xmm1
  mulsd  %xmm0,%xmm1
  movsd  D55(%rip),%xmm0
  subsd  %xmm7,%xmm1
  addsd  D74(%rip),%xmm1
  comisd %xmm1,%xmm0
  ja     L18
  movapd %xmm1,%xmm0
  subsd  D74(%rip),%xmm0
  movsd  %xmm2,0x20(%rsp)
  movsd  %xmm4,0x18(%rsp)
  movsd  %xmm6,0x10(%rsp)
  movsd  %xmm3,0x8(%rsp)
  movsd  %xmm1,(%rsp)
  call   <log@plt>
  movsd  (%rsp),%xmm1
  pxor   %xmm5,%xmm5
  movsd  0x8(%rsp),%xmm3
  movsd  0x10(%rsp),%xmm6
  movsd  0x18(%rsp),%xmm4
  subsd  %xmm0,%xmm1
  subsd  D74(%rip),%xmm1
  movsd  0x20(%rsp),%xmm2
  ucomisd %xmm1,%xmm5
  ja     L133
L8:
  sqrtsd %xmm1,%xmm1
L14:
  addsd  %xmm6,%xmm4
  minsd  %xmm4,%xmm1
  jmp    L83
L18:
  movsd  D13(%rip),%xmm1
  jmp    L8
L26:
  movapd %xmm6,%xmm0
  movsd  %xmm2,0x18(%rsp)
  movsd  %xmm1,0x10(%rsp)
  movsd  %xmm3,0x8(%rsp)
  movsd  %xmm7,(%rsp)
  call   <sqrt@plt>
  movsd  0x18(%rsp),%xmm2
  movsd  0x10(%rsp),%xmm1
  pxor   %xmm5,%xmm5
  movsd  0x8(%rsp),%xmm3
  movsd  (%rsp),%xmm7
  movapd %xmm0,%xmm6
  jmp    L15
L45:
  movapd %xmm3,%xmm0
  movsd  %xmm2,0x10(%rsp)
  movsd  %xmm1,0x8(%rsp)
  movsd  %xmm4,(%rsp)
  call   <sqrt@plt>
  movsd  0x10(%rsp),%xmm2
  movsd  0x8(%rsp),%xmm1
  movsd  (%rsp),%xmm4
  movapd %xmm0,%xmm3
  jmp    L87
L132:
  movapd %xmm4,%xmm0
  movsd  %xmm2,0x20(%rsp)
  movsd  %xmm1,0x18(%rsp)
  movsd  %xmm6,0x10(%rsp)
  movsd  %xmm3,0x8(%rsp)
  movsd  %xmm7,(%rsp)
  call   <sqrt@plt>
  movsd  0x20(%rsp),%xmm2
  movsd  (%rsp),%xmm7
  pxor   %xmm5,%xmm5
  movsd  0x18(%rsp),%xmm1
  movsd  0x10(%rsp),%xmm6
  movapd %xmm0,%xmm4
  movsd  0x8(%rsp),%xmm3
  jmp    L74
L133:
  movapd %xmm1,%xmm0
  movsd  %xmm2,0x18(%rsp)
  movsd  %xmm4,0x10(%rsp)
  movsd  %xmm6,0x8(%rsp)
  movsd  %xmm3,(%rsp)
  call   <sqrt@plt>
  movsd  0x18(%rsp),%xmm2
  movsd  0x10(%rsp),%xmm4
  pxor   %xmm5,%xmm5
  movsd  0x8(%rsp),%xmm6
  movsd  (%rsp),%xmm3
  movapd %xmm0,%xmm1
  jmp    L14
```

tool_calls: name: disassemble_data
arguments: data_tag: D66
type_infered: f64
name: disassemble_data
arguments: data_tag: D49
type_infered: f64
name: disassemble_data
arguments: data_tag: D61
type_infered: f64
name: disassemble_data
arguments: data_tag: D48
type_infered: qword[2]
name: disassemble_data
arguments: data_tag: D90
type_infered: f32[4]
name: disassemble_data
arguments: data_tag: D55
type_infered: f64
name: disassemble_data
arguments: data_tag: D74
type_infered: f64
name: disassemble_data
arguments: data_tag: D13
type_infered: byte[8]

tool: D66: 1

tool: D49: 2

tool: D61: 3

tool: {"D48": [0x7fffffffffffffff,0x0000000000000000]}

tool: {"D90": [0.0,-0.0,0.0,0.0]}

tool: D55: 2.83

tool: D74: 1.837877

tool: {"D13": [0x88,0x39,0x68,0xb6,0x0c,0xfa,0x8e,0x40]}

assistant: ```c
double xsq_to_stddev(xsq, k, n, approx)
double xsq, k, n;
int *approx;
{
  double stddev, v, wsq, w, a, keff, twologp, u;
  xsq = xsq + k / n;
  v = k - 1.0;
  wsq = xsq - v - v * log(xsq / v);
  if (wsq < 0.0)
    wsq = 0.0;
  w = sqrt(wsq);
  a = sqrt(2.0 / v) / 3.0;
  if (xsq <= v) {
    stddev = -w + a;
  } else {
    keff = k / (1.0 + xsq / n) * (1.0 - exp(-(xsq + n) / k));
    twologp = (2.0 * n - 1.0 - 2.0 * keff) * log(k / keff) - 2.0 * keff + 1.837877;
    if (twologp < 2.83)
      twologp = 1000.0;
    u = sqrt(twologp - log(twologp - 1.837877) - 1.837877);
    stddev = (((u) < (w + a)) ? (u) : (w + a));
  }
  if (fabs(stddev) > n / sqrt(2.0 * v)) {
    *approx = 1;
  } else {
    *approx = 0;
  }
  return (stddev);
}
```