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

```asm
<gcf>:
  endbr64
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x28,%rsp
  movsd  %xmm1,0x8(%rsp)
  movsd  %xmm0,(%rsp)
  call   <gammln@plt>
  movsd  0x8(%rsp),%xmm1
  movsd  D60(%rip),%xmm8
  mov    $0x1,%eax
  movsd  (%rsp),%xmm9
  movapd %xmm0,%xmm11
  movsd  D19(%rip),%xmm12
  movsd  %xmm0,0x0(%rbp)
  movapd %xmm1,%xmm4
  movapd %xmm8,%xmm13
  movsd  D27(%rip),%xmm0
  movq   D26(%rip),%xmm5
  addsd  %xmm8,%xmm4
  movsd  D12(%rip),%xmm6
  movapd %xmm12,%xmm3
  movsd  D25(%rip),%xmm10
  subsd  %xmm9,%xmm4
  divsd  %xmm4,%xmm13
  movapd %xmm13,%xmm7
  jmp    L30
  nopw   0x0(%rax,%rax,1)
L35:
  movapd %xmm8,%xmm13
  cmpnltsd %xmm6,%xmm2
  divsd  %xmm14,%xmm13
  andpd  %xmm2,%xmm3
  andnpd %xmm6,%xmm2
  orpd   %xmm2,%xmm3
L51:
  movapd %xmm3,%xmm2
  mulsd  %xmm13,%xmm2
  mulsd  %xmm2,%xmm7
  subsd  %xmm8,%xmm2
  andpd  %xmm5,%xmm2
  comisd %xmm2,%xmm10
  ja     L42
  add    $0x1,%eax
  cmp    $0x989681,%eax
  je     L46
L30:
  pxor   %xmm14,%xmm14
  pxor   %xmm2,%xmm2
  addsd  %xmm0,%xmm4
  mov    %eax,%edx
  cvtsi2sd %eax,%xmm14
  neg    %edx
  cvtsi2sd %edx,%xmm2
  subsd  %xmm9,%xmm14
  mulsd  %xmm14,%xmm2
  mulsd  %xmm2,%xmm13
  divsd  %xmm3,%xmm2
  movapd %xmm13,%xmm14
  addsd  %xmm4,%xmm14
  movapd %xmm14,%xmm13
  andpd  %xmm5,%xmm13
  comisd %xmm13,%xmm6
  movapd %xmm2,%xmm3
  addsd  %xmm4,%xmm3
  movapd %xmm3,%xmm2
  andpd  %xmm5,%xmm2
  jbe    L35
  comisd %xmm2,%xmm6
  ja     L42
  movapd %xmm12,%xmm13
  jmp    L51
  xchg   %ax,%ax
L42:
  movapd %xmm1,%xmm0
  movsd  %xmm7,0x10(%rsp)
  movsd  %xmm9,0x18(%rsp)
  movsd  %xmm11,0x8(%rsp)
  movsd  %xmm1,(%rsp)
  call   <log@plt>
  movsd  0x18(%rsp),%xmm9
  movsd  (%rsp),%xmm1
  movsd  0x8(%rsp),%xmm11
  mulsd  %xmm9,%xmm0
  subsd  %xmm1,%xmm0
  subsd  %xmm11,%xmm0
  call   <exp@plt>
  movsd  0x10(%rsp),%xmm7
  mulsd  %xmm7,%xmm0
  movsd  %xmm0,(%rbx)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  ret
  nopl   (%rax)
L46:
  add    $0x28,%rsp
  lea    D46(%rip),%rdi
  pop    %rbx
  pop    %rbp
  jmp    10a0 <chiGammaFlagError@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D60
type_guessed: f64
name: disassemble_data
arguments: data_tag: D19
type_guessed: byte[8]
name: disassemble_data
arguments: data_tag: D27
type_guessed: f64
name: disassemble_data
arguments: data_tag: D26
type_guessed: qword
name: disassemble_data
arguments: data_tag: D12
type_guessed: byte[8]
name: disassemble_data
arguments: data_tag: D25
type_guessed: byte[8]
name: disassemble_data
arguments: data_tag: D46
type_guessed: string

tool: D60: 1

tool: {"D19": [0xe9,0x8c,0xa0,0x39,0x59,0x3e,0x29,0x46]}

tool: D27: 2

tool: D26: 9223372036854775807

tool: {"D12": [0xa0,0xc2,0xeb,0xfe,0x4b,0x48,0xb4,0x39]}

tool: {"D25": [0x76,0x83,0x0d,0xf4,0xf5,0x21,0x94,0x3e]}

tool: D46: a too large, ITMAX too small in gcf

assistant: ```c
void gcf(double *gammcf, double a, double x, double *gln) {
  int i;
  double an, b, c, d, del, h;
  *gln = gammln(a);
  b = x + 1.0 - a;
  c = 1.0 / 1.0e-30;
  d = 1.0 / b;
  h = d;
  for (i = 1; i <= 10000000; i++) {
    an = -i * (i - a);
    b += 2.0;
    d = an * d + b;
    if (fabs(d) < 1.0e-30)
      d = 1.0e-30;
    c = b + an / c;
    if (fabs(c) < 1.0e-30)
      c = 1.0e-30;
    d = 1.0 / d;
    del = d * c;
    h *= del;
    if (fabs(del - 1.0) < 3.0e-7)
      break;
  }
  if (i > 10000000) {
    chiGammaFlagError("a too large, ITMAX too small in gcf");
    return;
  }
  *gammcf = exp(-x + a * log(x) - (*gln)) * h;
}
```