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

```asm
<nuclear_attraction>:
  endbr64
  push   %r15
  movapd %xmm5,%xmm9
  movapd %xmm4,%xmm5
  mov    %esi,%r15d
  push   %r14
  mov    %edx,%r14d
  push   %r13
  mov    %edi,%r13d
  push   %r12
  mov    %r9d,%r12d
  push   %rbp
  mov    %r8d,%ebp
  push   %rbx
  mov    %ecx,%ebx
  sub    $0x88,%rsp
  addsd  0xc8(%rsp),%xmm4
  movsd  %xmm2,0x10(%rsp)
  movsd  0xc8(%rsp),%xmm2
  movsd  %xmm1,0x8(%rsp)
  movapd %xmm0,%xmm1
  movsd  %xmm3,0x70(%rsp)
  movapd %xmm9,%xmm3
  movsd  %xmm0,0x40(%rsp)
  movapd %xmm5,%xmm0
  movsd  %xmm6,0x18(%rsp)
  movsd  %xmm7,0x20(%rsp)
  movsd  %xmm4,0x30(%rsp)
  movsd  %xmm9,0x48(%rsp)
  movsd  %xmm5,0x58(%rsp)
  call   <product_center_1D@plt>
  movsd  0x18(%rsp),%xmm3
  movsd  0xc8(%rsp),%xmm2
  movsd  0x8(%rsp),%xmm1
  movsd  %xmm0,0x78(%rsp)
  movsd  0x58(%rsp),%xmm0
  call   <product_center_1D@plt>
  movsd  0x20(%rsp),%xmm3
  movsd  0xc8(%rsp),%xmm2
  movsd  0x10(%rsp),%xmm1
  movsd  %xmm0,0x38(%rsp)
  movsd  0x58(%rsp),%xmm0
  call   <product_center_1D@plt>
  movsd  0x48(%rsp),%xmm9
  movsd  0x40(%rsp),%xmm10
  movsd  0x20(%rsp),%xmm5
  movsd  0x18(%rsp),%xmm4
  movsd  %xmm0,0x28(%rsp)
  movsd  0x10(%rsp),%xmm2
  movsd  0x8(%rsp),%xmm1
  movapd %xmm9,%xmm3
  movapd %xmm10,%xmm0
  movsd  %xmm9,0x60(%rsp)
  movsd  %xmm10,0x48(%rsp)
  call   <dist2@plt>
  movsd  0x28(%rsp),%xmm6
  movsd  0x38(%rsp),%xmm7
  movsd  0x78(%rsp),%xmm8
  movsd  %xmm0,0x68(%rsp)
  movsd  0xe0(%rsp),%xmm2
  movapd %xmm6,%xmm5
  movapd %xmm7,%xmm4
  movsd  %xmm6,0x50(%rsp)
  movsd  0xd8(%rsp),%xmm1
  movsd  0xd0(%rsp),%xmm0
  movapd %xmm8,%xmm3
  movsd  %xmm7,0x40(%rsp)
  movsd  %xmm8,0x28(%rsp)
  call   <dist2@plt>
  movsd  0x30(%rsp),%xmm3
  mov    %ebx,%esi
  mov    %r13d,%edi
  movsd  0x28(%rsp),%xmm8
  movsd  0x60(%rsp),%xmm9
  mov    %r13d,0x28(%rsp)
  movsd  0x48(%rsp),%xmm10
  movsd  %xmm0,0x38(%rsp)
  movapd %xmm8,%xmm2
  movapd %xmm8,%xmm0
  subsd  %xmm9,%xmm8
  subsd  0xd0(%rsp),%xmm2
  subsd  %xmm10,%xmm0
  movapd %xmm8,%xmm1
  call   <A_array@plt>
  movsd  0x40(%rsp),%xmm7
  mov    %ebp,%esi
  mov    %r15d,%edi
  movsd  0x30(%rsp),%xmm3
  mov    %rax,0x60(%rsp)
  movapd %xmm7,%xmm0
  movapd %xmm7,%xmm2
  movapd %xmm7,%xmm1
  subsd  0x8(%rsp),%xmm0
  subsd  0x18(%rsp),%xmm1
  subsd  0xd8(%rsp),%xmm2
  call   <A_array@plt>
  movsd  0x50(%rsp),%xmm6
  mov    %r12d,%esi
  mov    %r14d,%edi
  movsd  0x30(%rsp),%xmm3
  mov    %rax,0x48(%rsp)
  movapd %xmm6,%xmm0
  movapd %xmm6,%xmm2
  movapd %xmm6,%xmm1
  subsd  0x10(%rsp),%xmm0
  subsd  0x20(%rsp),%xmm1
  subsd  0xe0(%rsp),%xmm2
  call   <A_array@plt>
  add    0x28(%rsp),%ebx
  mov    %ebx,0x50(%rsp)
  mov    %rax,%r13
  js     L22
  lea    (%r15,%rbp,1),%esi
  pxor   %xmm7,%xmm7
  mov    0x60(%rsp),%r15
  add    %r14d,%r12d
  mov    %esi,0x28(%rsp)
  movl   $0x0,0x40(%rsp)
  movsd  %xmm7,0x8(%rsp)
  cs nopw 0x0(%rax,%rax,1)
L27:
  mov    0x28(%rsp),%eax
  test   %eax,%eax
  js     L37
  movl   $0x0,0x20(%rsp)
  mov    0x48(%rsp),%rbp
  mov    0x40(%rsp),%ebx
  nopl   (%rax)
L36:
  test   %r12d,%r12d
  js     L1
  movsd  0x30(%rsp),%xmm3
  mulsd  0x38(%rsp),%xmm3
  xor    %r14d,%r14d
  movsd  %xmm3,0x18(%rsp)
  nopw   0x0(%rax,%rax,1)
L50:
  movsd  (%r15),%xmm0
  mulsd  0x0(%rbp),%xmm0
  lea    (%rbx,%r14,1),%edi
  mulsd  0x0(%r13,%r14,8),%xmm0
  add    $0x1,%r14
  movsd  %xmm0,0x10(%rsp)
  movsd  0x18(%rsp),%xmm0
  call   <Fgamma@plt>
  mulsd  0x10(%rsp),%xmm0
  addsd  0x8(%rsp),%xmm0
  movsd  %xmm0,0x8(%rsp)
  cmp    %r14d,%r12d
  jge    L50
L1:
  addl   $0x1,0x20(%rsp)
  add    $0x8,%rbp
  mov    0x20(%rsp),%eax
  add    $0x1,%ebx
  cmp    0x28(%rsp),%eax
  jle    L36
L37:
  addl   $0x1,0x40(%rsp)
  add    $0x8,%r15
  mov    0x40(%rsp),%eax
  cmp    0x50(%rsp),%eax
  jle    L27
L25:
  mov    0x60(%rsp),%rdi
  call   <free@plt>
  mov    0x48(%rsp),%rdi
  call   <free@plt>
  mov    %r13,%rdi
  call   <free@plt>
  movq   D28(%rip),%xmm1
  movsd  0x58(%rsp),%xmm0
  xorpd  %xmm1,%xmm0
  mulsd  0xc8(%rsp),%xmm0
  mulsd  0x68(%rsp),%xmm0
  divsd  0x30(%rsp),%xmm0
  call   <exp@plt>
  movq   D28(%rip),%xmm1
  movapd %xmm0,%xmm2
  movsd  0x70(%rsp),%xmm0
  xorpd  %xmm1,%xmm0
  mulsd  0xc0(%rsp),%xmm0
  addsd  %xmm0,%xmm0
  mulsd  D3(%rip),%xmm0
  divsd  0x30(%rsp),%xmm0
  mulsd  %xmm2,%xmm0
  mulsd  0x8(%rsp),%xmm0
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L22:
  pxor   %xmm2,%xmm2
  movsd  %xmm2,0x8(%rsp)
  jmp    L25
```

tool_calls: name: extract_symbolic_data
arguments: label: D28
type_infered: f32[2]
name: extract_symbolic_data
arguments: label: D3
type_infered: f64

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

tool: D3: 3.141592653589793

assistant: ```c
double nuclear_attraction(double x1, double y1, double z1, double norm1, int l1, int m1, int n1, double alpha1, double x2, double y2, double z2, double norm2, int l2, int m2, int n2, double alpha2, double x3, double y3, double z3) {
  int I, J, K;
  double gamma, xp, yp, zp, sum, rab2, rcp2;
  double *Ax, *Ay, *Az;
  gamma = alpha1 + alpha2;
  xp = product_center_1D(alpha1, x1, alpha2, x2);
  yp = product_center_1D(alpha1, y1, alpha2, y2);
  zp = product_center_1D(alpha1, z1, alpha2, z2);
  rab2 = dist2(x1, y1, z1, x2, y2, z2);
  rcp2 = dist2(x3, y3, z3, xp, yp, zp);
  Ax = A_array(l1, l2, xp - x1, xp - x2, xp - x3, gamma);
  Ay = A_array(m1, m2, yp - y1, yp - y2, yp - y3, gamma);
  Az = A_array(n1, n2, zp - z1, zp - z2, zp - z3, gamma);
  sum = 0.;
  for (I = 0; I < l1 + l2 + 1; I++)
    for (J = 0; J < m1 + m2 + 1; J++)
      for (K = 0; K < n1 + n2 + 1; K++)
        sum += Ax[I] * Ay[J] * Az[K] * Fgamma(I + J + K, rcp2 * gamma);
  free(Ax);
  free(Ay);
  free(Az);
  return -norm1 * norm2 * 2 * 3.14159265358979323846 / gamma * exp(-alpha1 * alpha2 * rab2 / gamma) * sum;
}
```