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

```asm
<exactJ>:
  endbr64
  push   %r15
  push   %r14
  mov    $0xfffffffe,%r14d
  push   %r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0xc8,%rsp
  movsd  D238(%rip),%xmm7
  mov    %rdx,0x50(%rsp)
  mov    %rcx,0x58(%rsp)
  mulsd  %xmm0,%xmm7
  movsd  %xmm1,0x40(%rsp)
  movsd  %xmm0,0x48(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xb8(%rsp)
  xor    %eax,%eax
  mov    D55(%rip),%rax
  mov    %rax,0x70(%rsp)
  mov    D74(%rip),%rax
  movapd %xmm7,%xmm0
  mov    %rax,0x78(%rsp)
  mov    D122(%rip),%rax
  mov    %rax,0x80(%rsp)
  mov    D120(%rip),%rax
  mov    %rax,0x88(%rsp)
  mov    D132(%rip),%rax
  mov    %rax,0x90(%rsp)
  mov    D169(%rip),%rax
  mov    %rax,0x98(%rsp)
  mov    D61(%rip),%rax
  mov    %rax,0xa0(%rsp)
  mov    D228(%rip),%rax
  mov    %rax,0xa8(%rsp)
  mov    D34(%rip),%rax
  mov    %rax,0xb0(%rsp)
  divsd  D9(%rip),%xmm0
  call   <cos@plt>
  movq   %xmm0,%rbx
  movsd  D238(%rip),%xmm0
  mulsd  0x40(%rsp),%xmm0
  divsd  D9(%rip),%xmm0
  call   <cos@plt>
  movsd  D60(%rip),%xmm2
  pxor   %xmm5,%xmm5
  movapd %xmm0,%xmm1
  movq   %rbx,%xmm0
  movsd  %xmm5,0x10(%rsp)
  lea    0x60(%rsp),%rbx
  mulsd  D23(%rip),%xmm0
  movsd  %xmm5,0x8(%rsp)
  mulsd  D178(%rip),%xmm1
  addsd  %xmm2,%xmm0
  mulsd  D110(%rip),%xmm0
  addsd  %xmm2,%xmm1
  mulsd  %xmm1,%xmm0
  movsd  D59(%rip),%xmm1
  divsd  %xmm0,%xmm1
  movsd  %xmm0,(%r12)
  movsd  %xmm1,0x0(%rbp)
  lea    0x68(%rsp),%rbp
L58:
  pxor   %xmm7,%xmm7
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  mov    %r14d,%r13d
  cvtsi2sd %r14d,%xmm7
  movsd  D238(%rip),%xmm0
  mov    $0xffffffff,%r15d
  imul   %r14d,%r13d
  lea    -0x1(%r15),%r12d
  mulsd  %xmm7,%xmm0
  movsd  %xmm7,0x20(%rsp)
  mulsd  0x48(%rsp),%xmm0
  divsd  D9(%rip),%xmm0
  call   <sincos@plt>
  mov    %r14d,%eax
  movsd  0x60(%rsp),%xmm5
  neg    %eax
  movsd  0x68(%rsp),%xmm6
  cmovs  %r14d,%eax
  movsd  %xmm5,0x28(%rsp)
  movsd  %xmm6,0x30(%rsp)
  cltq
  lea    (%rax,%rax,2),%rax
  mov    %rax,0x38(%rsp)
  mov    %r14d,%eax
  or     %r12d,%eax
  je     L4
L56:
  pxor   %xmm1,%xmm1
  movsd  D238(%rip),%xmm0
  mov    %rbx,%rsi
  mov    %rbp,%rdi
  cvtsi2sd %r12d,%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm1,0x18(%rsp)
  mulsd  0x40(%rsp),%xmm0
  divsd  D9(%rip),%xmm0
  call   <sincos@plt>
  mov    %r12d,%edx
  pxor   %xmm2,%xmm2
  imul   %r12d,%edx
  mov    %r12d,%eax
  movsd  D16(%rip),%xmm0
  movsd  0x30(%rsp),%xmm3
  mulsd  0x60(%rsp),%xmm3
  movsd  0x18(%rsp),%xmm1
  add    %r13d,%edx
  cvtsi2sd %edx,%xmm2
  mov    %r12d,%edx
  neg    %edx
  cmovns %edx,%eax
  divsd  %xmm2,%xmm0
  cltq
  add    0x38(%rsp),%rax
  movsd  D133(%rip),%xmm2
  mulsd  0x70(%rsp,%rax,8),%xmm2
  mulsd  %xmm2,%xmm0
  movsd  0x28(%rsp),%xmm2
  mulsd  0x68(%rsp),%xmm2
  addsd  %xmm3,%xmm2
  mulsd  %xmm2,%xmm0
  movsd  0x20(%rsp),%xmm2
  mulsd  %xmm0,%xmm1
  mulsd  %xmm0,%xmm2
  addsd  0x10(%rsp),%xmm1
  addsd  0x8(%rsp),%xmm2
  movsd  %xmm1,0x10(%rsp)
  movsd  %xmm2,0x8(%rsp)
  cmp    $0x3,%r15d
  je     L2
L4:
  add    $0x1,%r15d
  mov    %r14d,%eax
  lea    -0x1(%r15),%r12d
  or     %r12d,%eax
  je     L4
  jmp    L56
  nopl   0x0(%rax,%rax,1)
L2:
  add    $0x1,%r14d
  cmp    $0x3,%r14d
  jne    L58
  mov    0x50(%rsp),%rax
  movsd  0x8(%rsp),%xmm6
  movsd  0x10(%rsp),%xmm4
  movsd  %xmm6,(%rax)
  mov    0x58(%rsp),%rax
  movsd  %xmm4,(%rax)
  mov    0xb8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L45
  add    $0xc8,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L45:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D238
data_type: f64
name: extract_symbolic_data
arguments: data_label: D55
data_type: f64
name: extract_symbolic_data
arguments: data_label: D74
data_type: f64
name: extract_symbolic_data
arguments: data_label: D122
data_type: f64
name: extract_symbolic_data
arguments: data_label: D120
data_type: f64
name: extract_symbolic_data
arguments: data_label: D132
data_type: f64
name: extract_symbolic_data
arguments: data_label: D169
data_type: f64
name: extract_symbolic_data
arguments: data_label: D61
data_type: f64
name: extract_symbolic_data
arguments: data_label: D228
data_type: f64
name: extract_symbolic_data
arguments: data_label: D34
data_type: f64
name: extract_symbolic_data
arguments: data_label: D9
data_type: f64
name: extract_symbolic_data
arguments: data_label: D60
data_type: f64
name: extract_symbolic_data
arguments: data_label: D23
data_type: f64
name: extract_symbolic_data
arguments: data_label: D178
data_type: f64
name: extract_symbolic_data
arguments: data_label: D110
data_type: f64
name: extract_symbolic_data
arguments: data_label: D59
data_type: byte[8]
name: extract_symbolic_data
arguments: data_label: D16
data_type: byte[8]
name: extract_symbolic_data
arguments: data_label: D133
data_type: byte[8]

tool: D238: 3.14159265358979

tool: D55: 1.0854

tool: D74: 0.108

tool: D122: 0.0027

tool: D120: 0.402

tool: D132: 0.04

tool: D169: 0.001

tool: D61: 0.0402

tool: D228: 0.004

tool: D34: 0.0001

tool: D9: 300000

tool: D60: 1

tool: D23: 0.4

tool: D178: 0.1

tool: D110: 500

tool: {"D59": [0x50,0xff,0x89,0x6b,0xc3,0x46,0x9a,0x43]}

tool: {"D16": [0x36,0x84,0x24,0x74,0x4f,0x50,0xd7,0x40]}

tool: {"D133": [0xd5,0xcd,0x83,0x9b,0x65,0x98,0xf2,0x3d]}

assistant: ```c
int exactJ(const double x, const double y, double *H, double *nu, double *u, double *v) {
  const double L = 300.0e3;
  const double H0 = 500.0;
  const double nu0 = 30.0 * 1.0e6 * 31556926.0;
  const double rho_ice = 910.0;
  const double rho_sw = 1028.0;
  const double g = 9.81;
  const double C = rho_ice * g * (1.0 - rho_ice / rho_sw) * H0 / (2.0 * nu0);
  const double my_gamma[3][3] = {{1.0854, 0.108, 0.0027}, {0.402, 0.04, 0.001}, {0.0402, 0.004, 0.0001}};
  const double A = L / (4.0 * 3.14159265358979);
  double uu = 0.0, vv = 0.0, denom, trig, kx, ly, B;
  int k, l;
  *H = H0 * (1.0 + 0.4 * cos(3.14159265358979 * x / L)) * (1.0 + 0.1 * cos(3.14159265358979 * y / L));
  *nu = (nu0 * H0) / *H;
  for (k = -2; k <= 2; k++) {
    for (l = -2; l <= 2; l++) {
      if ((k != 0) || (l != 0)) {
        denom = (double)(k * k + l * l);
        kx = (double)(k)*3.14159265358979 * x / L;
        ly = (double)(l)*3.14159265358979 * y / L;
        trig = cos(kx) * sin(ly) + sin(kx) * cos(ly);
        B = (A / denom) * (C * my_gamma[abs(k)][abs(l)]) * trig;
        uu += B * (double)(k);
        vv += B * (double)(l);
      }
    }
  }
  *u = uu;
  *v = vv;
  return 0;
}
```