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

```asm
<PopCSn0>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x30,%rsp
  movsd  %xmm0,0x10(%rsp)
  movsd  D88(%rip),%xmm0
  movsd  %xmm1,0x8(%rsp)
  cmp    %esi,%edi
  jge    L37
  add    $0x30,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L37:
  pxor   %xmm4,%xmm4
  movsd  D99(%rip),%xmm1
  mov    %edi,%ebp
  mov    %esi,%r12d
  cvtsi2sd %edi,%xmm4
  movapd %xmm4,%xmm0
  movsd  %xmm4,0x18(%rsp)
  call   <pow@plt>
  movsd  0x10(%rsp),%xmm3
  movsd  0x8(%rsp),%xmm2
  pxor   %xmm4,%xmm4
  cvtsi2sd %eax,%xmm4
  mulsd  D36(%rip),%xmm4
  divsd  %xmm3,%xmm2
  pxor   %xmm3,%xmm3
  ucomisd %xmm2,%xmm3
  ja     L11
  sqrtsd %xmm2,%xmm2
  movapd %xmm2,%xmm1
L24:
  divsd  %xmm1,%xmm4
  movsd  D62(%rip),%xmm2
  movapd %xmm2,%xmm1
  movapd %xmm4,%xmm0
  call   <pow@plt>
  pxor   %xmm0,%xmm0
  movsd  D21(%rip),%xmm1
  add    $0x1,%eax
  cvtsi2sd %eax,%xmm0
  call   <pow@plt>
  pxor   %xmm0,%xmm0
  mov    %eax,%r8d
  mov    %ebp,%eax
  cltd
  idiv   %r8d
  cvtsi2sd %eax,%xmm0
  mov    D62(%rip),%rax
  movq   %rax,%xmm1
  movsd  %xmm0,0x10(%rsp)
  divsd  0x18(%rsp),%xmm0
  call   <pow@plt>
  pxor   %xmm0,%xmm0
  pxor   %xmm3,%xmm3
  mov    %eax,%r8d
  mov    $0x1,%eax
  sub    %r8d,%eax
  cvtsi2sd %eax,%xmm0
  mulsd  0x10(%rsp),%xmm0
  ucomisd %xmm0,%xmm3
  ja     L42
  sqrtsd %xmm0,%xmm0
L30:
  mulsd  D28(%rip),%xmm0
  movsd  D25(%rip),%xmm1
  divsd  %xmm0,%xmm1
  mulsd  %xmm0,%xmm0
  movsd  %xmm0,0x20(%rsp)
  movsd  %xmm1,0x18(%rsp)
  test   %ebp,%ebp
  js     L76
  movsd  D75(%rip),%xmm4
  add    $0x1,%ebp
  xor    %ebx,%ebx
  movq   $0x0,0x8(%rsp)
  movsd  %xmm4,0x28(%rsp)
  nopl   0x0(%rax)
L59:
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm1
  cvtsi2sd %ebx,%xmm0
  add    $0x1,%ebx
  subsd  %xmm0,%xmm1
  movsd  0x28(%rsp),%xmm0
  mulsd  %xmm1,%xmm0
  mulsd  %xmm1,%xmm0
  divsd  0x20(%rsp),%xmm0
  call   <exp@plt>
  mulsd  0x18(%rsp),%xmm0
  addsd  0x8(%rsp),%xmm0
  movsd  %xmm0,0x8(%rsp)
  cmp    %ebp,%ebx
  jne    L59
L13:
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm1
  cvtsi2sd %r12d,%xmm0
  subsd  %xmm0,%xmm1
  movsd  0x28(%rsp),%xmm0
  mulsd  %xmm1,%xmm0
  mulsd  %xmm1,%xmm0
  divsd  0x20(%rsp),%xmm0
  call   <exp@plt>
  mulsd  0x18(%rsp),%xmm0
  divsd  0x8(%rsp),%xmm0
  add    $0x30,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   (%rax)
L76:
  movsd  D75(%rip),%xmm3
  movq   $0x0,0x8(%rsp)
  movsd  %xmm3,0x28(%rsp)
  jmp    L13
L42:
  call   <sqrt@plt>
  jmp    L30
L11:
  movapd %xmm2,%xmm0
  movsd  %xmm4,0x8(%rsp)
  call   <sqrt@plt>
  movsd  0x8(%rsp),%xmm4
  movapd %xmm0,%xmm1
  jmp    L24
```

tool_calls: name: unpack_data
arguments: label: D88
type_infered: f32[2]
name: unpack_data
arguments: label: D99
type_infered: f64
name: unpack_data
arguments: label: D36
type_infered: f64
name: unpack_data
arguments: label: D62
type_infered: f64
name: unpack_data
arguments: label: D21
type_infered: f64
name: unpack_data
arguments: label: D28
type_infered: f64
name: unpack_data
arguments: label: D25
type_infered: f64
name: unpack_data
arguments: label: D75
type_infered: f32[2]

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

tool: D99: 0.45

tool: D36: 0.26

tool: D62: 1.66666667

tool: D21: 0.6

tool: D28: 0.5

tool: D25: 0.39894228

tool: {"D75": [0.0,-1.75]}

assistant: ```c
double PopCSn0(int Z, double M, double E, int CSn) {
  int Q = 0;
  double Sum = 0, Q0 = 0, Width = 0, WP = 0;
  if (Z < CSn)
    return -1.0;
  Q0 = Z / pow(1 + pow(0.260 * pow(Z, 0.45) / sqrt(E / M), 1.66666667), 0.6);
  Width = 0.5 * sqrt(Q0 * (1 - pow(Q0 / Z, 1.66666667)));
  WP = 0.39894228 / Width;
  for (Q = 0; Q <= Z; Q++) {
    Sum += WP * exp(-0.5 * (Q0 - Q) * (Q0 - Q) / (Width * Width));
  };
  return WP * exp(-0.5 * (Q0 - CSn) * (Q0 - CSn) / (Width * Width)) / Sum;
}
```