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

```asm
<expint>:
  endbr64
  push   %rbx
  pxor   %xmm2,%xmm2
  sub    $0x30,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  comisd %xmm0,%xmm2
  ja     L240
  comisd %xmm1,%xmm2
  movsd  %xmm1,(%rsp)
  ja     L240
  lea    0x20(%rsp),%rdi
  movsd  %xmm0,0x8(%rsp)
  call   <modf@plt>
  test   %rax,%rax
  jne    L240
  movsd  (%rsp),%xmm1
  pxor   %xmm2,%xmm2
  movsd  0x8(%rsp),%xmm6
  ucomisd %xmm2,%xmm1
  jp     L86
  jne    L86
  movsd  D41(%rip),%xmm0
  comisd %xmm6,%xmm0
  ja     L240
  ucomisd %xmm2,%xmm6
  jp     L5
  je     L182
L5:
  movsd  D44(%rip),%xmm3
  subsd  %xmm3,%xmm6
  divsd  %xmm6,%xmm3
  jmp    L58
  cs nopw 0x0(%rax,%rax,1)
L240:
  movsd  D37(%rip),%xmm3
L58:
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L105
  add    $0x30,%rsp
  movapd %xmm3,%xmm0
  pop    %rbx
  ret
  cs nopw 0x0(%rax,%rax,1)
L86:
  ucomisd %xmm2,%xmm6
  jp     L100
  je     L182
L100:
  comisd D112(%rip),%xmm1
  jbe    L222
  movsd  D44(%rip),%xmm7
  movapd %xmm1,%xmm4
  xor    %eax,%eax
  movapd %xmm2,%xmm3
  movsd  D79(%rip),%xmm8
  movapd %xmm7,%xmm0
  movapd %xmm7,%xmm5
  jmp    L71
  nop
L269:
  comisd %xmm8,%xmm4
  jb     L245
  divsd  %xmm8,%xmm2
  divsd  %xmm8,%xmm5
  divsd  %xmm8,%xmm0
  divsd  %xmm8,%xmm4
L245:
  cmp    $0x14d,%eax
  je     L38
L71:
  addsd  %xmm6,%xmm3
  add    $0x1,%eax
  movapd %xmm1,%xmm9
  mulsd  %xmm3,%xmm2
  mulsd  %xmm3,%xmm0
  pxor   %xmm3,%xmm3
  cvtsi2sd %eax,%xmm3
  addsd  %xmm5,%xmm2
  mulsd  %xmm3,%xmm5
  addsd  %xmm4,%xmm0
  mulsd  %xmm3,%xmm4
  mulsd  %xmm2,%xmm9
  addsd  %xmm9,%xmm5
  movapd %xmm1,%xmm9
  mulsd  %xmm0,%xmm9
  addsd  %xmm9,%xmm4
  movapd %xmm7,%xmm9
  movapd %xmm5,%xmm7
  divsd  %xmm4,%xmm7
  ucomisd %xmm9,%xmm7
  jp     L269
  jne    L269
L38:
  xorpd  D42(%rip),%xmm1
  movsd  %xmm7,(%rsp)
  movapd %xmm1,%xmm0
  call   <exp@plt>
  movsd  (%rsp),%xmm7
  movapd %xmm0,%xmm3
  mulsd  %xmm7,%xmm3
  jmp    L58
  nopl   (%rax)
L182:
  movapd %xmm1,%xmm0
  xorpd  D42(%rip),%xmm0
  movsd  %xmm1,(%rsp)
  call   <exp@plt>
  movsd  (%rsp),%xmm1
  movapd %xmm0,%xmm3
  divsd  %xmm1,%xmm3
  jmp    L58
L222:
  movapd %xmm1,%xmm0
  movsd  %xmm6,0x8(%rsp)
  movsd  %xmm1,(%rsp)
  call   <log@plt>
  movsd  (%rsp),%xmm1
  mov    $0x14c,%eax
  movsd  D44(%rip),%xmm7
  movsd  D97(%rip),%xmm3
  movsd  0x8(%rsp),%xmm6
  pxor   %xmm2,%xmm2
  movq   D42(%rip),%xmm8
  movapd %xmm7,%xmm4
  subsd  %xmm0,%xmm3
  movapd %xmm7,%xmm0
  jmp    L69
  nop
L104:
  addsd  %xmm7,%xmm4
  sub    $0x1,%eax
  je     L56
  movapd %xmm3,%xmm2
L69:
  xorpd  %xmm8,%xmm0
  mulsd  %xmm1,%xmm0
  divsd  %xmm4,%xmm0
  movapd %xmm0,%xmm5
  divsd  %xmm4,%xmm5
  subsd  %xmm5,%xmm3
  ucomisd %xmm2,%xmm3
  jp     L104
  jne    L104
L56:
  comisd %xmm7,%xmm6
  xorpd  %xmm1,%xmm8
  movapd %xmm7,%xmm2
  movq   %xmm8,%rbx
  jbe    L58
  cs nopw 0x0(%rax,%rax,1)
L49:
  movq   %rbx,%xmm0
  movsd  %xmm1,0x18(%rsp)
  movsd  %xmm6,0x10(%rsp)
  movsd  %xmm3,0x8(%rsp)
  movsd  %xmm2,(%rsp)
  call   <exp@plt>
  movsd  0x8(%rsp),%xmm3
  movsd  0x18(%rsp),%xmm1
  mov    D44(%rip),%rax
  movsd  (%rsp),%xmm2
  mulsd  %xmm1,%xmm3
  movsd  0x10(%rsp),%xmm6
  movq   %rax,%xmm7
  subsd  %xmm3,%xmm0
  movapd %xmm0,%xmm3
  divsd  %xmm2,%xmm3
  addsd  %xmm7,%xmm2
  comisd %xmm2,%xmm6
  ja     L49
  jmp    L58
L105:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_tag: D41
type: f32[2]
name: disassemble_data
arguments: data_tag: D44
type: f64
name: disassemble_data
arguments: data_tag: D37
type: f32[2]
name: disassemble_data
arguments: data_tag: D112
type: f32[4]
name: disassemble_data
arguments: data_tag: D79
type: byte[8]
name: disassemble_data
arguments: data_tag: D42
type: f32[4]
name: disassemble_data
arguments: data_tag: D97
type: byte[8]

tool: {"D41": [0.0,2.0]}

tool: D44: 1

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

tool: {"D112": [0.0,2.125,215.4105682373047,80943.4375]}

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

tool: {"D42": [0.0,-0.0,0.0,0.0]}

tool: {"D97": [0x19,0xb6,0x6f,0xfc,0x8c,0x78,0xe2,0xbf]}

assistant: ```c
double expint(double n, double z) {
  double y;
  {
    double junk;
    if (n < 0 || z < 0 || modf(n, &junk))
      return -1.0;
    if (z == 0 && n < 2)
      return -1.0;
  }
  if (n == 0)
    return exp(-z) / z;
  if (z == 0)
    return 1 / (n - 1);
  if (z > 3) {
    double n0, n1, n2, n3, d0, d1, d2, d3, y_prev = 1;
    int i;
    n0 = 0;
    n1 = 1;
    d0 = 1;
    d1 = z;
    for (i = 0; i < 333; i++) {
      n2 = n0 * (n + i) + n1;
      d2 = d0 * (n + i) + d1;
      n3 = n1 * (1 + i) + n2 * z;
      d3 = d1 * (1 + i) + d2 * z;
      y = n3 / d3;
      if (y == y_prev)
        break;
      y_prev = y;
      n0 = n2;
      n1 = n3;
      d0 = d2;
      d1 = d3;
      if (d3 >= 1.0E+37) {
        n0 /= 1.0E+37;
        n1 /= 1.0E+37;
        d0 /= 1.0E+37;
        d1 /= 1.0E+37;
      }
    }
    y = exp(-z) * y;
  } else {
    double euler_constant = .577215664901532860606512;
    double y_prev = 0;
    double t, m;
    y = -euler_constant - log(z);
    t = 1;
    for (m = 1; m < 333; m++) {
      t = -t * z / m;
      y = y - t / m;
      if (y == y_prev)
        break;
      y_prev = y;
    }
    for (m = 1; m < n; m++)
      y = (exp(-z) - z * y) / m;
  }
  return y;
}
```