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

```asm
<coreGTRCATPROT>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x2b8,%rsp
  mov    %rdi,-0x278(%rbp)
  movsd  %xmm0,-0x280(%rbp)
  mov    %esi,-0x284(%rbp)
  mov    %rdx,-0x290(%rbp)
  mov    %rcx,-0x298(%rbp)
  mov    %r8d,-0x288(%rbp)
  mov    %r9,-0x2a0(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0x2a8(%rbp)
  mov    0x18(%rbp),%rax
  mov    %rax,-0x2b0(%rbp)
  mov    0x20(%rbp),%rax
  mov    %rax,-0x2b8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x248(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x240(%rbp)
  mov    -0x284(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  shl    $0x2,%eax
  cltq
  shl    $0x3,%eax
  mov    %eax,%edi
  call   <rax_malloc@plt>
  mov    %rax,-0x238(%rbp)
  mov    -0x238(%rbp),%rax
  mov    %rax,-0x230(%rbp)
  movl   $0x1,-0x264(%rbp)
  jmp    L93
L70:
  mov    -0x264(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x278(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x264(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x278(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x264(%rbp),%eax
  cltq
  movsd  %xmm0,-0x200(%rbp,%rax,8)
  mov    -0x264(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x278(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x264(%rbp),%eax
  cltq
  movsd  %xmm0,-0x160(%rbp,%rax,8)
  mov    -0x264(%rbp),%eax
  cltq
  movsd  -0x160(%rbp,%rax,8),%xmm0
  mulsd  -0x280(%rbp),%xmm0
  mov    -0x264(%rbp),%eax
  cltq
  movsd  %xmm0,-0xc0(%rbp,%rax,8)
  addl   $0x1,-0x264(%rbp)
L93:
  cmpl   $0x13,-0x264(%rbp)
  jle    L70
  movl   $0x0,-0x268(%rbp)
  jmp    L44
L37:
  movl   $0x1,-0x264(%rbp)
  jmp    L74
L55:
  mov    -0x264(%rbp),%eax
  cltq
  movsd  -0xc0(%rbp,%rax,8),%xmm1
  mov    -0x268(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x290(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rdx
  mov    -0x268(%rbp),%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  shl    $0x2,%eax
  mov    %eax,%ecx
  mov    -0x264(%rbp),%eax
  add    %ecx,%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x230(%rbp),%rax
  lea    (%rcx,%rax,1),%rbx
  movq   %rdx,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  mov    %rax,(%rbx)
  addl   $0x1,-0x264(%rbp)
L74:
  cmpl   $0x13,-0x264(%rbp)
  jle    L55
  addl   $0x1,-0x268(%rbp)
L44:
  mov    -0x268(%rbp),%eax
  cmp    -0x284(%rbp),%eax
  jl     L37
  movl   $0x0,-0x268(%rbp)
  jmp    L94
L79:
  mov    -0x268(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x298(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x290(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x228(%rbp)
  mov    -0x268(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x2b8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  -0x228(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x220(%rbp)
  movsd  -0x228(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  %xmm0,%xmm1
  mov    -0x268(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x2b8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x218(%rbp)
  mov    -0x268(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x298(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  shl    $0x2,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x238(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x230(%rbp)
  mov    -0x268(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  shl    $0x2,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x2b0(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x210(%rbp)
  mov    -0x210(%rbp),%rax
  movsd  (%rax),%xmm0
  movsd  %xmm0,-0x260(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x258(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x250(%rbp)
  movl   $0x1,-0x264(%rbp)
  jmp    L59
L51:
  mov    -0x264(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x230(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x264(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x210(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x208(%rbp)
  movsd  -0x208(%rbp),%xmm0
  movsd  -0x260(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x260(%rbp)
  mov    -0x264(%rbp),%eax
  cltq
  movsd  -0x160(%rbp,%rax,8),%xmm0
  mulsd  -0x208(%rbp),%xmm0
  movsd  -0x258(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x258(%rbp)
  mov    -0x264(%rbp),%eax
  cltq
  movsd  -0x200(%rbp,%rax,8),%xmm0
  mulsd  -0x208(%rbp),%xmm0
  movsd  -0x250(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x250(%rbp)
  addl   $0x1,-0x264(%rbp)
L59:
  cmpl   $0x13,-0x264(%rbp)
  jle    L51
  mov    -0x260(%rbp),%rax
  movq   %rax,%xmm0
  call   <FABS@plt>
  movapd %xmm0,%xmm1
  movsd  D5(%rip),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x260(%rbp)
  movsd  -0x258(%rbp),%xmm0
  mulsd  -0x260(%rbp),%xmm0
  movsd  %xmm0,-0x258(%rbp)
  movsd  -0x250(%rbp),%xmm0
  mulsd  -0x260(%rbp),%xmm0
  movsd  %xmm0,-0x250(%rbp)
  movsd  -0x220(%rbp),%xmm0
  mulsd  -0x258(%rbp),%xmm0
  movsd  -0x248(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x248(%rbp)
  movsd  -0x258(%rbp),%xmm0
  movapd %xmm0,%xmm1
  mulsd  %xmm0,%xmm1
  movsd  -0x250(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  mulsd  -0x218(%rbp),%xmm0
  movsd  -0x240(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x240(%rbp)
  addl   $0x1,-0x268(%rbp)
L94:
  mov    -0x268(%rbp),%eax
  cmp    -0x288(%rbp),%eax
  jl     L79
  mov    -0x2a0(%rbp),%rax
  movsd  -0x248(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x2a8(%rbp),%rax
  movsd  -0x240(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x238(%rbp),%rax
  mov    %rax,%rdi
  call   <rax_free@plt>
  nop
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L8
  call   <__stack_chk_fail@plt>
L8:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D5
type_infered: f64

tool: D5: 1

assistant: ```c
void coreGTRCATPROT(double *EIGN, double lz, int numberOfCategories, double *rptr, int *cptr, int upper, volatile double *ext_dlnLdlz, volatile double *ext_d2lnLdlz2, double *sumtable, int *wgt) {
  int i, l;
  double *d1, *d_start, *sum;
  double e[20], s[20], dd[20];
  double tmp;
  double inv_Li, dlnLidlz, d2lnLidlz2;
  double dlnLdlz = 0.0;
  double d2lnLdlz2 = 0.0;
  d1 = d_start = (double *)rax_malloc(numberOfCategories * 20 * sizeof(double));
  for (l = 1; l < 20; l++) {
    e[l] = EIGN[l - 1] * EIGN[l - 1];
    s[l] = EIGN[l - 1];
    dd[l] = s[l] * lz;
  }
  for (i = 0; i < numberOfCategories; i++) {
    for (l = 1; l < 20; l++)
      d1[20 * i + l] = exp(dd[l] * rptr[i]);
  }
  for (i = 0; i < upper; i++) {
    double r = rptr[cptr[i]], wr1 = r * wgt[i], wr2 = r * r * wgt[i];
    d1 = &d_start[20 * cptr[i]];
    sum = &sumtable[20 * i];
    inv_Li = sum[0];
    dlnLidlz = 0.0;
    d2lnLidlz2 = 0.0;
    for (l = 1; l < 20; l++) {
      inv_Li += (tmp = d1[l] * sum[l]);
      dlnLidlz += tmp * s[l];
      d2lnLidlz2 += tmp * e[l];
    }
    inv_Li = 1.0 / FABS(inv_Li);
    dlnLidlz *= inv_Li;
    d2lnLidlz2 *= inv_Li;
    dlnLdlz += wr1 * dlnLidlz;
    d2lnLdlz2 += wr2 * (d2lnLidlz2 - dlnLidlz * dlnLidlz);
  }
  *ext_dlnLdlz = dlnLdlz;
  *ext_d2lnLdlz2 = d2lnLdlz2;
  rax_free(d_start);
}
```