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

```asm
<bessel_i1>:
  endbr64
  movsd  D142(%rip),%xmm4
  movapd %xmm0,%xmm3
  movapd %xmm0,%xmm1
  andpd  D117(%rip),%xmm3
  comisd %xmm3,%xmm4
  jbe    L16
  movapd %xmm0,%xmm2
  movsd  D40(%rip),%xmm0
  divsd  %xmm4,%xmm2
  pxor   %xmm4,%xmm4
  comisd %xmm1,%xmm4
  mulsd  %xmm2,%xmm2
  mulsd  %xmm2,%xmm0
  addsd  D106(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  D59(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  D82(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  D103(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  D92(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  D7(%rip),%xmm0
  mulsd  %xmm3,%xmm0
  ja     L0
  ret
  nopl   (%rax)
L0:
  xorpd  D0(%rip),%xmm0
  ret
  nopl   0x0(%rax)
L16:
  divsd  %xmm3,%xmm4
  sub    $0x28,%rsp
  movsd  D70(%rip),%xmm5
  movsd  D31(%rip),%xmm2
  movsd  %xmm0,0x10(%rsp)
  movsd  %xmm3,0x8(%rsp)
  mulsd  %xmm4,%xmm5
  subsd  %xmm5,%xmm2
  movapd %xmm2,%xmm0
  mulsd  %xmm4,%xmm0
  subsd  D136(%rip),%xmm0
  mulsd  %xmm4,%xmm0
  addsd  D198(%rip),%xmm0
  mulsd  %xmm4,%xmm0
  subsd  D176(%rip),%xmm0
  mulsd  %xmm4,%xmm0
  addsd  D88(%rip),%xmm0
  mulsd  %xmm4,%xmm0
  subsd  D192(%rip),%xmm0
  mulsd  %xmm4,%xmm0
  subsd  D191(%rip),%xmm0
  mulsd  %xmm4,%xmm0
  addsd  D81(%rip),%xmm0
  movsd  %xmm0,(%rsp)
  movapd %xmm3,%xmm0
  call   <exp@plt>
  movsd  0x8(%rsp),%xmm3
  pxor   %xmm4,%xmm4
  movsd  0x10(%rsp),%xmm1
  movapd %xmm0,%xmm2
  ucomisd %xmm3,%xmm4
  ja     L29
  sqrtsd %xmm3,%xmm3
L26:
  divsd  %xmm3,%xmm2
  comisd %xmm1,%xmm4
  movsd  (%rsp),%xmm0
  mulsd  %xmm2,%xmm0
  ja     L13
  add    $0x28,%rsp
  ret
  nopl   0x0(%rax,%rax,1)
L13:
  xorpd  D0(%rip),%xmm0
  add    $0x28,%rsp
  ret
L29:
  movsd  %xmm0,0x8(%rsp)
  movapd %xmm3,%xmm0
  movsd  %xmm4,0x18(%rsp)
  movsd  %xmm1,0x10(%rsp)
  call   <sqrt@plt>
  movsd  0x18(%rsp),%xmm4
  movsd  0x10(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm2
  movapd %xmm0,%xmm3
  jmp    L26
```

tool_calls: name: read_data
arguments: label: D142
type: f64
name: read_data
arguments: label: D117
type: qword[2]
name: read_data
arguments: label: D40
type: byte[8]
name: read_data
arguments: label: D106
type: byte[8]
name: read_data
arguments: label: D59
type: byte[8]
name: read_data
arguments: label: D82
type: f64
name: read_data
arguments: label: D103
type: f64
name: read_data
arguments: label: D92
type: f64
name: read_data
arguments: label: D7
type: f64
name: read_data
arguments: label: D0
type: f32[4]
name: read_data
arguments: label: D70
type: byte[8]
name: read_data
arguments: label: D31
type: byte[8]
name: read_data
arguments: label: D136
type: byte[8]
name: read_data
arguments: label: D198
type: byte[8]
name: read_data
arguments: label: D176
type: byte[8]
name: read_data
arguments: label: D88
type: byte[8]
name: read_data
arguments: label: D192
type: byte[8]
name: read_data
arguments: label: D191
type: byte[8]
name: read_data
arguments: label: D81
type: f64

tool: D142: 3.75

tool: {"D117": [0x7fffffffffffffff,0x0000000000000000]}

tool: {"D40": [0xd3,0xb0,0xad,0xd9,0xa9,0x3d,0x35,0x3f]}

tool: {"D106": [0x9c,0xe5,0x2e,0x99,0x95,0xb3,0x68,0x3f]}

tool: {"D59": [0x1a,0x12,0x5a,0x83,0xb5,0x39,0x9b,0x3f]}

tool: D82: 0.15084934

tool: D103: 0.51498869

tool: D92: 0.87890594

tool: D7: 0.5

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

tool: {"D70": [0x3b,0x50,0xc8,0x4a,0xa3,0x34,0x71,0x3f]}

tool: {"D31": [0x71,0x9c,0xa9,0x4a,0x3a,0x4e,0x92,0x3f]}

tool: {"D136": [0x50,0x93,0x11,0xfe,0xe2,0xa5,0x9d,0x3f]}

tool: {"D198": [0xd9,0x27,0x1d,0x38,0xa9,0x60,0x97,0x3f]}

tool: {"D176": [0xdc,0x3c,0x1f,0xaf,0x51,0x20,0x85,0x3f]}

tool: {"D88": [0x96,0x74,0x5a,0xd8,0x4f,0xd6,0x5a,0x3f]}

tool: {"D192": [0x3f,0x8c,0x94,0x56,0x11,0xa8,0x6d,0x3f]}

tool: {"D191": [0xbe,0xfe,0x1c,0xcd,0x2e,0x6b,0xa4,0x3f]}

tool: D81: 0.39894228

assistant: ```c
double bessel_i1(double x) {
  double ax, ans;
  double y;
  if ((ax = fabs(x)) < 3.75) {
    y = x / 3.75;
    y *= y;
    ans = ax * (0.5 + y * (0.87890594 + y * (0.51498869 + y * (0.15084934 + y * (0.2658733e-1 + y * (0.301532e-2 + y * 0.32411e-3))))));
  } else {
    y = 3.75 / ax;
    ans = 0.2282967e-1 + y * (-0.2895312e-1 + y * (0.1787654e-1 - y * 0.420059e-2));
    ans = 0.39894228 + y * (-0.3988024e-1 + y * (-0.362018e-2 + y * (0.163801e-2 + y * (-0.1031555e-1 + y * ans))));
    ans *= (exp(ax) / sqrt(ax));
  }
  return x < 0.0 ? -ans : ans;
}
```