user: Translate the below assembly code into C programming language:

```asm
<gcf>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x10,%rsp
  mov    %rdi,%r12
  movsd  %xmm1,0x8(%rsp)
  mov    %rsi,%rbx
  movsd  %xmm0,(%rsp)
  call   <gammln@plt>
  movq   %xmm0,%rbp
  movsd  %xmm0,(%rbx)
  movsd  D61(%rip),%xmm0
  movsd  0x8(%rsp),%xmm3
  addsd  %xmm0,%xmm3
  subsd  (%rsp),%xmm3
  divsd  %xmm3,%xmm0
  movq   %xmm0,%rbx
  movsd  D52(%rip),%xmm2
  mov    $0x1,%eax
  movsd  D9(%rip),%xmm7
  movq   D54(%rip),%xmm6
  movsd  D7(%rip),%xmm5
  movapd %xmm6,%xmm12
  movapd %xmm5,%xmm11
  movapd %xmm5,%xmm13
  movapd %xmm6,%xmm10
  movapd %xmm5,%xmm4
  movapd %xmm5,%xmm9
  movapd %xmm6,%xmm8
  jmp    L29
L77:
  cmp    $0x989680,%eax
  jg     L70
  movsd  0x8(%rsp),%xmm0
  call   <log@plt>
  mulsd  (%rsp),%xmm0
  subsd  0x8(%rsp),%xmm0
  movq   %rbp,%xmm7
  subsd  %xmm7,%xmm0
  call   <exp@plt>
  movq   %rbx,%xmm5
  mulsd  %xmm5,%xmm0
  movsd  %xmm0,(%r12)
L34:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L70:
  lea    D15(%rip),%rdi
  call   <chiGammaFlagError@plt>
  jmp    L34
L20:
  divsd  %xmm2,%xmm1
  movapd %xmm1,%xmm2
  addsd  %xmm3,%xmm2
  movapd %xmm2,%xmm0
  andpd  %xmm12,%xmm0
  comisd %xmm0,%xmm11
  ja     L77
  movapd %xmm13,%xmm15
L21:
  movsd  D61(%rip),%xmm14
  movapd %xmm14,%xmm0
  divsd  %xmm15,%xmm0
  movapd %xmm2,%xmm1
  mulsd  %xmm0,%xmm1
  movq   %rbx,%xmm15
  mulsd  %xmm1,%xmm15
  movq   %xmm15,%rbx
  subsd  %xmm14,%xmm1
  andpd  %xmm8,%xmm1
  movsd  D19(%rip),%xmm14
  comisd %xmm1,%xmm14
  ja     L77
  add    $0x1,%eax
  cmp    $0x989681,%eax
  je     L70
L29:
  mov    %eax,%edx
  neg    %edx
  pxor   %xmm1,%xmm1
  cvtsi2sd %edx,%xmm1
  pxor   %xmm14,%xmm14
  cvtsi2sd %eax,%xmm14
  subsd  (%rsp),%xmm14
  mulsd  %xmm14,%xmm1
  addsd  %xmm7,%xmm3
  mulsd  %xmm1,%xmm0
  addsd  %xmm3,%xmm0
  movapd %xmm0,%xmm15
  andpd  %xmm6,%xmm0
  comisd %xmm0,%xmm5
  ja     L20
  divsd  %xmm2,%xmm1
  movapd %xmm1,%xmm2
  addsd  %xmm3,%xmm2
  movapd %xmm2,%xmm0
  andpd  %xmm10,%xmm0
  cmpnltsd %xmm4,%xmm0
  andpd  %xmm0,%xmm2
  andnpd %xmm9,%xmm0
  orpd   %xmm0,%xmm2
  jmp    L21
```

tool_calls: name: retrieve_data
arguments: data_tag: D61
type_guessed: f64
name: retrieve_data
arguments: data_tag: D52
type_guessed: byte[8]
name: retrieve_data
arguments: data_tag: D9
type_guessed: f64
name: retrieve_data
arguments: data_tag: D54
type_guessed: qword
name: retrieve_data
arguments: data_tag: D7
type_guessed: byte[8]
name: retrieve_data
arguments: data_tag: D15
type_guessed: string
name: retrieve_data
arguments: data_tag: D19
type_guessed: byte[8]

tool: D61: 1

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

tool: D9: 2

tool: D54: 9223372036854775807

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

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

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

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;
}
```