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

```asm
<igamma>:
  endbr64
  pxor   %xmm6,%xmm6
  comisd %xmm1,%xmm6
  ja     L168
  comisd %xmm0,%xmm6
  movapd %xmm0,%xmm2
  jae    L168
  ucomisd %xmm6,%xmm1
  jp     L30
  movapd %xmm6,%xmm4
  je     L33
L30:
  sub    $0x28,%rsp
  comisd D38(%rip),%xmm1
  movsd  D107(%rip),%xmm4
  movsd  %xmm2,(%rsp)
  jbe    L160
L55:
  movapd %xmm4,%xmm0
  add    $0x28,%rsp
  ret
  nopl   0x0(%rax,%rax,1)
L168:
  movsd  D22(%rip),%xmm4
L33:
  movapd %xmm4,%xmm0
  ret
  nopl   (%rax)
L160:
  movapd %xmm1,%xmm0
  movsd  %xmm4,0x18(%rsp)
  movsd  %xmm1,0x8(%rsp)
  call   <log@plt>
  movsd  (%rsp),%xmm2
  movsd  0x8(%rsp),%xmm1
  movapd %xmm0,%xmm3
  movsd  0x18(%rsp),%xmm4
  mulsd  %xmm2,%xmm3
  movapd %xmm2,%xmm0
  movsd  %xmm1,0x10(%rsp)
  addsd  %xmm4,%xmm0
  subsd  %xmm1,%xmm3
  movsd  %xmm3,0x8(%rsp)
  call   <lngamma@plt>
  movsd  0x8(%rsp),%xmm3
  subsd  %xmm0,%xmm3
  movapd %xmm3,%xmm0
  call   <gp_exp@plt>
  movsd  0x10(%rsp),%xmm1
  movsd  (%rsp),%xmm2
  mov    D107(%rip),%rax
  movsd  %xmm0,0x8(%rsp)
  movq   %rax,%xmm4
  comisd %xmm4,%xmm1
  jbe    L88
  movsd  D49(%rip),%xmm0
  addsd  %xmm2,%xmm0
  comisd %xmm0,%xmm1
  jb     L88
  movq   %rax,%xmm7
  movapd %xmm1,%xmm5
  movapd %xmm1,%xmm8
  movq   D3(%rip),%xmm11
  subsd  %xmm2,%xmm7
  movapd %xmm1,%xmm9
  movsd  D71(%rip),%xmm14
  movsd  D2(%rip),%xmm10
  addsd  %xmm4,%xmm9
  movq   %rax,%xmm15
  mov    $0x1,%edx
  pxor   %xmm6,%xmm6
  addsd  %xmm7,%xmm5
  movapd %xmm9,%xmm13
  addsd  %xmm4,%xmm5
  mulsd  %xmm5,%xmm8
  divsd  %xmm8,%xmm13
  jmp    L16
  nopl   0x0(%rax)
L98:
  divsd  %xmm10,%xmm9
  movapd %xmm8,%xmm1
  divsd  %xmm10,%xmm3
  movapd %xmm9,%xmm15
  movapd %xmm12,%xmm9
  divsd  %xmm10,%xmm1
  movapd %xmm3,%xmm8
  divsd  %xmm10,%xmm9
L96:
  add    $0x1,%edx
  cmp    $0xc9,%edx
  je     L15
L16:
  pxor   %xmm0,%xmm0
  addsd  %xmm4,%xmm7
  movapd %xmm15,%xmm3
  cvtsi2sd %edx,%xmm0
  addsd  D49(%rip),%xmm5
  movapd %xmm5,%xmm12
  mulsd  %xmm7,%xmm0
  mulsd  %xmm9,%xmm12
  mulsd  %xmm0,%xmm3
  mulsd  %xmm1,%xmm0
  subsd  %xmm3,%xmm12
  movapd %xmm5,%xmm3
  mulsd  %xmm8,%xmm3
  subsd  %xmm0,%xmm3
  ucomisd %xmm6,%xmm3
  jp     L67
  je     L97
L67:
  movapd %xmm12,%xmm1
  divsd  %xmm3,%xmm1
  movapd %xmm1,%xmm15
  subsd  %xmm1,%xmm13
  mulsd  %xmm14,%xmm15
  movapd %xmm13,%xmm0
  movapd %xmm14,%xmm13
  andpd  %xmm11,%xmm0
  minsd  %xmm15,%xmm13
  comisd %xmm0,%xmm13
  jae    L61
  movapd %xmm1,%xmm13
L97:
  movapd %xmm12,%xmm0
  andpd  %xmm11,%xmm0
  comisd %xmm10,%xmm0
  jae    L98
  movapd %xmm8,%xmm1
  movapd %xmm9,%xmm15
  movapd %xmm3,%xmm8
  movapd %xmm12,%xmm9
  jmp    L96
  nopw   0x0(%rax,%rax,1)
L15:
  movsd  D22(%rip),%xmm4
  add    $0x28,%rsp
  movapd %xmm4,%xmm0
  ret
  nopl   0x0(%rax)
L88:
  movsd  D71(%rip),%xmm6
  mov    $0xc9,%eax
  movapd %xmm4,%xmm3
  movapd %xmm4,%xmm0
  jmp    L141
  nop
L4:
  sub    $0x1,%eax
  je     L15
L141:
  addsd  %xmm4,%xmm2
  movapd %xmm1,%xmm5
  divsd  %xmm2,%xmm5
  mulsd  %xmm5,%xmm0
  addsd  %xmm0,%xmm3
  movapd %xmm3,%xmm5
  mulsd  %xmm6,%xmm5
  comisd %xmm0,%xmm5
  jbe    L4
  movsd  0x8(%rsp),%xmm4
  add    $0x28,%rsp
  mulsd  %xmm3,%xmm4
  movapd %xmm4,%xmm0
  ret
  nopw   0x0(%rax,%rax,1)
L61:
  mulsd  0x8(%rsp),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm4
  jmp    L55
```

tool_calls: name: disassemble_data
arguments: label: D38
type_guessed: f32[4]
name: disassemble_data
arguments: label: D107
type_guessed: f64
name: disassemble_data
arguments: label: D22
type_guessed: f32[2]
name: disassemble_data
arguments: label: D49
type_guessed: f64
name: disassemble_data
arguments: label: D3
type_guessed: qword
name: disassemble_data
arguments: label: D71
type_guessed: byte[8]
name: disassemble_data
arguments: label: D2
type_guessed: byte[8]

tool: {"D38": [0.0,18.98023223876953,0.0,2.0]}

tool: D107: 1

tool: {"D22": [0.0,-1.875]}

tool: D49: 2

tool: D3: 9223372036854775807

tool: {"D71": [0x3a,0x8c,0x30,0xe2,0x8e,0x79,0x45,0x3e]}

tool: {"D2": [0x1b,0x69,0x57,0x43,0xb8,0x17,0x9e,0x47]}

assistant: ```c
double igamma(double a, double x) {
  double arg;
  double aa;
  double an;
  double b;
  int i;
  if (x < 0.0 || a <= 0.0)
    return -1.0;
  if (x == 0.0)
    return 0.0;
  if (x > 1.0E+08)
    return 1.0;
  arg = a * log(x) - x - lngamma((a + 1.0));
  arg = gp_exp(arg);
  if ((x > 1.0) && (x >= a + 2.0)) {
    double pn1, pn2, pn3, pn4, pn5, pn6;
    double rn;
    double rnold;
    aa = 1.0 - a;
    b = aa + x + 1.0;
    pn1 = 1.0;
    pn2 = x;
    pn3 = x + 1.0;
    pn4 = x * b;
    rnold = pn3 / pn4;
    for (i = 1; i <= 200; i++) {
      aa++;
      b += 2.0;
      an = aa * (double)i;
      pn5 = b * pn3 - an * pn1;
      pn6 = b * pn4 - an * pn2;
      if (pn6 != 0.0) {
        rn = pn5 / pn6;
        if (fabs(rnold - rn) <= ((1.0E-08) < (1.0E-08 * rn) ? (1.0E-08) : (1.0E-08 * rn)))
          return 1.0 - arg * rn * a;
        rnold = rn;
      }
      pn1 = pn3;
      pn2 = pn4;
      pn3 = pn5;
      pn4 = pn6;
      if (fabs(pn5) >= 1.0E+37) {
        pn1 /= 1.0E+37;
        pn2 /= 1.0E+37;
        pn3 /= 1.0E+37;
        pn4 /= 1.0E+37;
      }
    }
  } else {
    for (i = 0, aa = a, an = b = 1.0; i <= 200; i++) {
      aa++;
      an *= x / aa;
      b += an;
      if (an < b * 1.0E-08)
        return arg * b;
    }
  }
  return -1.0;
}
```