user: 请将以下的汇编代码转换成C语言代码:

```asm
<bessi>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  movss  %xmm0,-0x28(%rbp)
  cmpl   $0x1,-0x24(%rbp)
  jg     L46
  lea    D81(%rip),%rax
  mov    %rax,%rdi
  call   <nrerror@plt>
L46:
  pxor   %xmm0,%xmm0
  ucomiss -0x28(%rbp),%xmm0
  jp     L89
  pxor   %xmm0,%xmm0
  ucomiss -0x28(%rbp),%xmm0
  jne    L89
  pxor   %xmm0,%xmm0
  jmp    L107
L89:
  mov    -0x28(%rbp),%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movsd  D18(%rip),%xmm1
  divsd  %xmm0,%xmm1
  pxor   %xmm0,%xmm0
  cvtsd2ss %xmm1,%xmm0
  movss  %xmm0,-0x8(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0xc(%rbp),%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  D83(%rip),%xmm0
  movss  %xmm0,-0x14(%rbp)
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x24(%rbp),%xmm1
  movsd  D89(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  mov    %eax,%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,-0x18(%rbp)
  jmp    L10
L32:
  pxor   %xmm0,%xmm0
  cvtsi2ssl -0x18(%rbp),%xmm0
  mulss  -0x8(%rbp),%xmm0
  mulss  -0x14(%rbp),%xmm0
  movss  -0x10(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x4(%rbp)
  movss  -0x14(%rbp),%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0x4(%rbp),%xmm0
  movss  %xmm0,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm2
  comisd D48(%rip),%xmm2
  jbe    L1
  pxor   %xmm1,%xmm1
  cvtss2sd -0xc(%rbp),%xmm1
  movsd  D30(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0xc(%rbp)
  pxor   %xmm1,%xmm1
  cvtss2sd -0x14(%rbp),%xmm1
  movsd  D30(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x14(%rbp)
  pxor   %xmm1,%xmm1
  cvtss2sd -0x10(%rbp),%xmm1
  movsd  D30(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x10(%rbp)
L1:
  mov    -0x18(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jne    L82
  movss  -0x10(%rbp),%xmm0
  movss  %xmm0,-0xc(%rbp)
L82:
  subl   $0x1,-0x18(%rbp)
L10:
  cmpl   $0x0,-0x18(%rbp)
  jg     L32
  mov    -0x28(%rbp),%eax
  movd   %eax,%xmm0
  call   <bessi0@plt>
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  divss  -0x14(%rbp),%xmm0
  movss  -0xc(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
  pxor   %xmm0,%xmm0
  comiss -0x28(%rbp),%xmm0
  jbe    L93
  mov    -0x24(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L93
  movss  -0xc(%rbp),%xmm0
  movss  D53(%rip),%xmm1
  xorps  %xmm1,%xmm0
  jmp    L107
L93:
  movss  -0xc(%rbp),%xmm0
L107:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D81
type: string
name: extract_symbolic_data
arguments: tag: D18
type: f64
name: extract_symbolic_data
arguments: tag: D83
type: f32
name: extract_symbolic_data
arguments: tag: D89
type: f64
name: extract_symbolic_data
arguments: tag: D48
type: f64[2]
name: extract_symbolic_data
arguments: tag: D30
type: byte[8]
name: extract_symbolic_data
arguments: tag: D53
type: byte[4]

tool: D81: Index n less than 2 in bessi

tool: D18: 2

tool: D83: 1

tool: D89: 40

tool: {"D48": [10000000000.0,1e-10]}

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

tool: {"D53": [0x00,0x00,0x00,0x80]}

assistant: ```c
float bessi(int n, float x) {
  float bessi0(float x);
  void nrerror(char error_text[]);
  int j;
  float bi, bim, bip, tox, ans;
  if (n < 2)
    nrerror("Index n less than 2 in bessi");
  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;
  }
}
```