user: What is the c source code of the assembly code below:

```asm
<bessi>:
  endbr64
  push   %rbx
  cvttsd2si %xmm0,%ebx
  sub    $0x20,%rsp
  test   %ebx,%ebx
  je     L122
  cmp    $0x1,%ebx
  je     L176
  pxor   %xmm5,%xmm5
  ucomisd %xmm5,%xmm1
  jp     L104
  movapd %xmm5,%xmm0
  jne    L104
L178:
  add    $0x20,%rsp
  pop    %rbx
  ret
  nopl   0x0(%rax)
L104:
  movq   D72(%rip),%xmm8
  movsd  D89(%rip),%xmm7
  movapd %xmm1,%xmm0
  andpd  %xmm8,%xmm0
  divsd  %xmm0,%xmm7
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  mulsd  D48(%rip),%xmm0
  ucomisd %xmm0,%xmm5
  ja     L179
  sqrtsd %xmm0,%xmm0
L14:
  cvttsd2si %xmm0,%eax
  movapd %xmm5,%xmm6
  add    %ebx,%eax
  add    %eax,%eax
  test   %eax,%eax
  jle    L87
  movsd  D36(%rip),%xmm2
  movsd  D49(%rip),%xmm4
  movapd %xmm5,%xmm3
  movsd  D63(%rip),%xmm9
  jmp    L27
  nopw   0x0(%rax,%rax,1)
L60:
  mulsd  %xmm4,%xmm2
  mulsd  %xmm4,%xmm6
  movapd %xmm2,%xmm3
  movapd %xmm0,%xmm2
  mulsd  %xmm4,%xmm2
  cmp    %eax,%ebx
  je     L162
L137:
  sub    $0x1,%eax
  je     L58
L27:
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm7,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm3,%xmm0
  movapd %xmm0,%xmm3
  andpd  %xmm8,%xmm3
  comisd %xmm9,%xmm3
  ja     L60
  movapd %xmm2,%xmm3
  movapd %xmm0,%xmm2
  cmp    %eax,%ebx
  jne    L137
L162:
  movapd %xmm3,%xmm6
  sub    $0x1,%eax
  jne    L27
  cs nopw 0x0(%rax,%rax,1)
L58:
  movapd %xmm1,%xmm0
  mov    $0x1,%eax
  movsd  %xmm6,0x18(%rsp)
  movsd  %xmm2,0x10(%rsp)
  movsd  %xmm1,0x8(%rsp)
  call   <bessi0@plt>
  pxor   %xmm0,%xmm0
  movsd  0x10(%rsp),%xmm2
  movsd  0x8(%rsp),%xmm1
  cvtsi2sd %eax,%xmm0
  pxor   %xmm5,%xmm5
  movsd  0x18(%rsp),%xmm6
  comisd %xmm1,%xmm5
  divsd  %xmm2,%xmm0
  mulsd  %xmm6,%xmm0
  jbe    L178
  and    $0x1,%ebx
  je     L178
  xorpd  D80(%rip),%xmm0
  jmp    L178
  cs nopw 0x0(%rax,%rax,1)
L122:
  movapd %xmm1,%xmm0
  mov    $0x1,%eax
  call   <bessi0@plt>
  pxor   %xmm0,%xmm0
  add    $0x20,%rsp
  cvtsi2sd %eax,%xmm0
  pop    %rbx
  ret
  nopl   0x0(%rax)
L176:
  movapd %xmm1,%xmm0
  mov    $0x1,%eax
  call   <bessi1@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  jmp    L178
  nopl   0x0(%rax,%rax,1)
L87:
  movsd  D36(%rip),%xmm2
  jmp    L58
L179:
  movsd  %xmm1,0x10(%rsp)
  movsd  %xmm7,0x8(%rsp)
  call   <sqrt@plt>
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm7
  pxor   %xmm5,%xmm5
  movq   D72(%rip),%xmm8
  jmp    L14
```

tool_calls: name: retrieve_data
arguments: label: D72
type: qword
name: retrieve_data
arguments: label: D89
type: f64
name: retrieve_data
arguments: label: D48
type: f64
name: retrieve_data
arguments: label: D36
type: f64
name: retrieve_data
arguments: label: D49
type: byte[8]
name: retrieve_data
arguments: label: D63
type: f64
name: retrieve_data
arguments: label: D80
type: f32[4]

tool: D72: 9223372036854775807

tool: D89: 2

tool: D48: 40

tool: D36: 1

tool: {"D49": [0xbb,0xbd,0xd7,0xd9,0xdf,0x7c,0xdb,0x3d]}

tool: D63: 10000000000

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

assistant: ```c
double bessi(nn, x)
double x;
double nn;
{
  int j, n;
  double bi, bim, bip, tox, ans;
  n = (int)nn;
  if (n == 0)
    return bessi0(x);
  if (n == 1)
    return bessi1(x);
  if (x == 0.0)
    return 0.0;
  else {
    tox = 2.0 / fabs(x);
    bip = ans = 0.0;
    bi = 1.0;
    for (j = 2 * (n + (int)sqrt(40.0 * n)); j > 0; j--) {
      bim = bip + j * tox * bi;
      bip = bi;
      bi = bim;
      if (fabs(bi) > 1.0e10) {
        ans *= 1.0e-10;
        bi *= 1.0e-10;
        bip *= 1.0e-10;
      }
      if (j == n)
        ans = bip;
    }
    ans *= bessi0(x) / bi;
    return x < 0.0 && (n & 1) ? -ans : ans;
  }
}
```