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

```asm
<gamma_continued_frac>:
  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  D35(%rip),%xmm0
  movsd  0x8(%rsp),%xmm3
  addsd  %xmm0,%xmm3
  subsd  (%rsp),%xmm3
  divsd  %xmm3,%xmm0
  movq   %xmm0,%rbx
  movsd  D5(%rip),%xmm2
  mov    $0x1,%eax
  movsd  D32(%rip),%xmm7
  movq   D68(%rip),%xmm6
  movsd  D39(%rip),%xmm5
  movapd %xmm6,%xmm12
  movapd %xmm5,%xmm11
  movapd %xmm5,%xmm13
  movapd %xmm6,%xmm10
  movapd %xmm5,%xmm4
  movapd %xmm5,%xmm9
  movapd %xmm6,%xmm8
  jmp    L17
L58:
  cmp    $0x64,%eax
  jg     L73
L75:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L73:
  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)
  jmp    L75
L30:
  divsd  %xmm2,%xmm1
  movapd %xmm1,%xmm2
  addsd  %xmm3,%xmm2
  movapd %xmm2,%xmm0
  andpd  %xmm12,%xmm0
  comisd %xmm0,%xmm11
  ja     L58
  movapd %xmm13,%xmm15
L43:
  movsd  D35(%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  D31(%rip),%xmm14
  comisd %xmm1,%xmm14
  ja     L58
  add    $0x1,%eax
  cmp    $0x65,%eax
  je     L73
L17:
  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     L30
  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    L43
```

tool_calls: name: retrieve_data
arguments: data_tag: D35
datatype: f64
name: retrieve_data
arguments: data_tag: D5
datatype: byte[8]
name: retrieve_data
arguments: data_tag: D32
datatype: f64
name: retrieve_data
arguments: data_tag: D68
datatype: qword
name: retrieve_data
arguments: data_tag: D39
datatype: byte[8]
name: retrieve_data
arguments: data_tag: D31
datatype: byte[8]

tool: D35: 1

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

tool: D32: 2

tool: D68: 9223372036854775807

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

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

assistant: ```c
void gamma_continued_frac(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 <= 100; 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 > 100)
    *gammcf = exp(-x + a * log(x) - (*gln)) * h;
}
```