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

```asm
<airBesselIn>:
  endbr64
  push   %rbx
  movapd %xmm0,%xmm6
  mov    %edi,%eax
  pxor   %xmm0,%xmm0
  neg    %eax
  cvtsi2ss %edi,%xmm0
  mov    %edi,%ebx
  sub    $0x20,%rsp
  ucomiss D59(%rip),%xmm0
  cmovbe %eax,%ebx
  test   %ebx,%ebx
  je     L104
  cmp    $0x1,%ebx
  je     L10
  pxor   %xmm3,%xmm3
  ucomisd %xmm3,%xmm6
  jp     L95
  movapd %xmm3,%xmm0
  je     L65
L95:
  comisd %xmm3,%xmm6
  movapd %xmm6,%xmm0
  ja     L113
  xorpd  D59(%rip),%xmm0
L113:
  movsd  D13(%rip),%xmm8
  movsd  %xmm6,0x8(%rsp)
  divsd  %xmm0,%xmm8
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebx,%xmm0
  mulsd  D39(%rip),%xmm0
  movsd  %xmm8,0x10(%rsp)
  call   <sqrt@plt>
  movsd  0x8(%rsp),%xmm6
  pxor   %xmm3,%xmm3
  add    %ebx,%eax
  add    %eax,%eax
  test   %eax,%eax
  jle    L106
  movsd  D54(%rip),%xmm2
  movapd %xmm3,%xmm4
  movapd %xmm3,%xmm7
  movsd  D71(%rip),%xmm5
  movsd  D9(%rip),%xmm9
  movsd  D61(%rip),%xmm0
  movsd  0x10(%rsp),%xmm8
  jmp    L71
  nopl   0x0(%rax)
L9:
  comisd %xmm0,%xmm1
  jbe    L90
L5:
  mulsd  %xmm5,%xmm7
  mulsd  %xmm5,%xmm1
  mulsd  %xmm5,%xmm2
L90:
  cmp    %eax,%ebx
  je     L89
L105:
  sub    $0x1,%eax
  je     L99
L40:
  movapd %xmm2,%xmm4
  movapd %xmm1,%xmm2
L71:
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  mulsd  %xmm8,%xmm1
  mulsd  %xmm2,%xmm1
  addsd  %xmm4,%xmm1
  comisd %xmm3,%xmm1
  ja     L9
  comisd %xmm1,%xmm9
  ja     L5
  cmp    %eax,%ebx
  jne    L105
L89:
  lea    -0x1(%rbx),%eax
  movapd %xmm2,%xmm7
  jmp    L40
  nopw   0x0(%rax,%rax,1)
L106:
  movsd  D54(%rip),%xmm1
  movapd %xmm3,%xmm7
  nopl   0x0(%rax)
L99:
  movapd %xmm6,%xmm0
  movsd  %xmm7,0x18(%rsp)
  movsd  %xmm1,0x10(%rsp)
  movsd  %xmm6,0x8(%rsp)
  call   <airBesselI0@plt>
  movsd  0x10(%rsp),%xmm1
  pxor   %xmm3,%xmm3
  movsd  0x8(%rsp),%xmm6
  movsd  0x18(%rsp),%xmm7
  divsd  %xmm1,%xmm0
  comisd %xmm6,%xmm3
  mulsd  %xmm7,%xmm0
  ja     L144
L65:
  add    $0x20,%rsp
  pop    %rbx
  ret
  nopl   (%rax)
L104:
  add    $0x20,%rsp
  movapd %xmm6,%xmm0
  pop    %rbx
  jmp    1080 <airBesselI0@plt>
  cs nopw 0x0(%rax,%rax,1)
L144:
  xorpd  D59(%rip),%xmm0
  add    $0x20,%rsp
  pop    %rbx
  ret
  xchg   %ax,%ax
L10:
  add    $0x20,%rsp
  movapd %xmm6,%xmm0
  pop    %rbx
  jmp    1090 <airBesselI1@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D59
type_guessed: f32[4]
name: extract_symbolic_data
arguments: data_label: D13
type_guessed: f64
name: extract_symbolic_data
arguments: data_label: D39
type_guessed: f64
name: extract_symbolic_data
arguments: data_label: D54
type_guessed: f64
name: extract_symbolic_data
arguments: data_label: D71
type_guessed: byte[8]
name: extract_symbolic_data
arguments: data_label: D9
type_guessed: byte[8]
name: extract_symbolic_data
arguments: data_label: D61
type_guessed: f64

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

tool: D13: 2

tool: D39: 40

tool: D54: 1

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

tool: {"D9": [0x00,0x00,0x00,0x20,0x5f,0xa0,0x02,0xc2]}

tool: D61: 10000000000

assistant: ```c
double airBesselIn(int nn, double xx) {
  double tax, bb, bi, bim, bip;
  int ii, an, top;
  an = ((nn) > 0.0f ? (nn) : -(nn));
  if (0 == an) {
    return airBesselI0(xx);
  } else if (1 == an) {
    return airBesselI1(xx);
  }
  if (0.0 == xx) {
    return 0.0;
  }
  tax = 2.0 / ((xx) > 0.0f ? (xx) : -(xx));
  bip = bb = 0.0;
  bi = 1.0;
  top = 2 * (an + ((int)(sqrt(40.0 * an))));
  for (ii = top; ii > 0; ii--) {
    bim = bip + ii * tax * bi;
    bip = bi;
    bi = bim;
    if (((bi) > 0.0f ? (bi) : -(bi)) > 1.0e10) {
      bb *= 1.0e-10;
      bi *= 1.0e-10;
      bip *= 1.0e-10;
    }
    if (ii == an) {
      bb = bip;
    }
  }
  bb *= airBesselI0(xx) / bi;
  return (xx < 0.0 ? -bb : bb);
}
```