user: 下面的汇编指令对应的C源代码是什么：

```asm
<interp1_table0_complex_per>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edx,-0x4(%rsp)
  mov    %rcx,%rbp
  mov    0x40(%rsp),%r12
  mov    0x48(%rsp),%edx
  mov    0x50(%rsp),%r14
  mov    0x58(%rsp),%r13
  mov    %r9d,%ecx
  imul   0x38(%rsp),%ecx
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  test   %edx,%edx
  jle    L13
  mov    %rdi,%r11
  mov    %rsi,%rbx
  mov    %r9d,%edi
  movslq %eax,%r15
  pxor   %xmm12,%xmm12
  cvtsi2sd %r9d,%xmm12
  mulsd  D33(%rip),%xmm12
  movsd  %xmm12,-0x10(%rsp)
  mov    %edx,%edx
  lea    (%r12,%rdx,8),%rsi
  mov    D27(%rip),%rcx
  movsd  D27(%rip),%xmm12
  movapd %xmm12,%xmm13
  mov    0x38(%rsp),%r10d
  jmp    L31
L0:
  mulsd  %xmm5,%xmm0
  subsd  %xmm0,%xmm1
  cvttsd2si %xmm1,%eax
  cltq
  movsd  (%r11,%rax,8),%xmm2
  movsd  (%rbx,%rax,8),%xmm3
  movapd %xmm2,%xmm0
  mulsd  %xmm10,%xmm0
  movapd %xmm3,%xmm1
  mulsd  %xmm14,%xmm1
  subsd  %xmm1,%xmm0
  addsd  %xmm0,%xmm4
  mulsd  %xmm10,%xmm3
  movapd %xmm3,%xmm0
  movapd %xmm2,%xmm1
  mulsd  %xmm14,%xmm1
  addsd  %xmm1,%xmm0
  addsd  %xmm0,%xmm11
  add    $0x1,%edx
  cmp    %edx,%r9d
  je     L92
L76:
  pxor   %xmm1,%xmm1
  cvtsi2sd %edx,%xmm1
  movapd %xmm15,%xmm0
  subsd  %xmm1,%xmm0
  mulsd  %xmm9,%xmm0
  addsd  %xmm8,%xmm0
  movapd %xmm0,%xmm2
  movapd %xmm0,%xmm3
  andpd  %xmm12,%xmm3
  ucomisd %xmm3,%xmm7
  jbe    L43
  cvttsd2si %xmm0,%rax
  pxor   %xmm3,%xmm3
  cvtsi2sd %rax,%xmm3
  movapd %xmm3,%xmm14
  cmpnlesd %xmm0,%xmm14
  movsd  D5(%rip),%xmm2
  andpd  %xmm2,%xmm14
  subsd  %xmm14,%xmm3
  movapd %xmm12,%xmm2
  andnpd %xmm0,%xmm2
  orpd   %xmm3,%xmm2
L43:
  cvttsd2si %xmm2,%eax
  cltq
  add    %r15,%rax
  movsd  0x0(%rbp,%rax,8),%xmm10
  movsd  (%r8,%rax,8),%xmm14
  movapd %xmm1,%xmm3
  divsd  %xmm5,%xmm3
  movapd %xmm3,%xmm0
  movapd %xmm3,%xmm2
  andpd  %xmm13,%xmm2
  movsd  D88(%rip),%xmm6
  ucomisd %xmm2,%xmm6
  jbe    L0
  cvttsd2si %xmm3,%rax
  pxor   %xmm2,%xmm2
  cvtsi2sd %rax,%xmm2
  movapd %xmm2,%xmm0
  cmpnlesd %xmm3,%xmm0
  movsd  D5(%rip),%xmm6
  andpd  %xmm6,%xmm0
  subsd  %xmm0,%xmm2
  movapd %xmm13,%xmm0
  andnpd %xmm3,%xmm0
  orpd   %xmm2,%xmm0
  jmp    L0
L75:
  pxor   %xmm11,%xmm11
  movapd %xmm11,%xmm4
L92:
  add    $0x8,%r14
  movsd  %xmm4,-0x8(%r14)
  add    $0x8,%r13
  movsd  %xmm11,-0x8(%r13)
  cmp    %rsi,%r12
  je     L13
L31:
  add    $0x8,%r12
  movsd  -0x8(%r12),%xmm15
  movapd %xmm15,%xmm2
  subsd  -0x10(%rsp),%xmm2
  movapd %xmm2,%xmm0
  movq   %rcx,%xmm1
  andpd  %xmm2,%xmm1
  movsd  D88(%rip),%xmm7
  ucomisd %xmm1,%xmm7
  jbe    L64
  cvttsd2si %xmm2,%rax
  pxor   %xmm1,%xmm1
  cvtsi2sd %rax,%xmm1
  movapd %xmm1,%xmm0
  cmpnlesd %xmm2,%xmm0
  movsd  D5(%rip),%xmm3
  andpd  %xmm3,%xmm0
  subsd  %xmm0,%xmm1
  movq   %rcx,%xmm0
  andnpd %xmm2,%xmm0
  orpd   %xmm1,%xmm0
L64:
  addsd  D5(%rip),%xmm0
  cvttsd2si %xmm0,%edx
  test   %edi,%edi
  jle    L75
  lea    (%rdx,%rdi,1),%r9d
  pxor   %xmm11,%xmm11
  movapd %xmm11,%xmm4
  pxor   %xmm9,%xmm9
  cvtsi2sd %r10d,%xmm9
  movsd  D33(%rip),%xmm8
  movsd  D88(%rip),%xmm7
  pxor   %xmm5,%xmm5
  cvtsi2sdl -0x4(%rsp),%xmm5
  jmp    L76
L13:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: unpack_data
arguments: label: D33
datatype: f64
name: unpack_data
arguments: label: D27
datatype: byte[8]
name: unpack_data
arguments: label: D5
datatype: f32[2]
name: unpack_data
arguments: label: D88
datatype: f32[2]

tool: D33: 0.5

tool: {"D27": [0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f]}

tool: {"D5": [0.0,1.875]}

tool: {"D88": [0.0,176.0]}

assistant: ```c
void interp1_table0_complex_per(const double *r_ck, const double *i_ck, const int K1, const double *r_h1, const double *i_h1, const int J1, const int L1, const double *p_tm, const int M, double *r_fm, double *i_fm) {
  int mm;
  {
    const int ncenter1 = floor(J1 * L1 / 2);
    r_h1 += ncenter1;
    i_h1 += ncenter1;
  }
  for (mm = 0; mm < M; mm++) {
    int jj1;
    const double t1 = *p_tm++;
    register double sum1r = 0;
    register double sum1i = 0;
    int k1 = 1 + floor(t1 - J1 / 2.);
    for (jj1 = 0; jj1 < J1; jj1++, k1++) {
      const double p1 = (t1 - k1) * L1;
      const int n1 = floor(p1 + 0.5);
      register const double coef1r = r_h1[n1];
      register const double coef1i = i_h1[n1];
      const int k1mod = ((k1) - (K1)*floor((k1) / (double)(K1)));
      sum1r += coef1r * r_ck[k1mod] - coef1i * i_ck[k1mod];
      sum1i += coef1r * i_ck[k1mod] + coef1i * r_ck[k1mod];
    }
    *r_fm++ = sum1r;
    *i_fm++ = sum1i;
  }
}
```