user: Demonstrate the C code that generates the assembly output below:

```asm
<bessi>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %edi,%ebp
  movss  %xmm0,0x1c(%rsp)
  cmp    $0x1,%edi
  jle    L25
L124:
  movss  0x1c(%rsp),%xmm4
  ucomiss D8(%rip),%xmm4
  jp     L66
  pxor   %xmm0,%xmm0
  jne    L66
L37:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  ret
L25:
  lea    D6(%rip),%rdi
  call   <nrerror@plt>
  jmp    L124
L66:
  movss  0x1c(%rsp),%xmm0
  call   <fabs@plt>
  movapd %xmm0,%xmm1
  movsd  D80(%rip),%xmm0
  divsd  %xmm1,%xmm0
  pxor   %xmm7,%xmm7
  cvtsd2ss %xmm0,%xmm7
  movss  %xmm7,0x18(%rsp)
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebp,%xmm0
  mulsd  D33(%rip),%xmm0
  call   <sqrt@plt>
  lea    0x0(%rbp,%rax,1),%ebx
  add    %ebx,%ebx
  test   %ebx,%ebx
  jle    L57
  pxor   %xmm6,%xmm6
  movss  %xmm6,0x14(%rsp)
  movaps %xmm6,%xmm1
  movss  D54(%rip),%xmm5
  movss  %xmm5,0xc(%rsp)
  jmp    L43
L50:
  movss  0xc(%rsp),%xmm1
  movss  0x10(%rsp),%xmm7
  movss  %xmm7,0xc(%rsp)
L139:
  cmp    %ebx,%ebp
  je     L29
L83:
  sub    $0x1,%ebx
  je     L138
L43:
  pxor   %xmm0,%xmm0
  cvtsi2ss %ebx,%xmm0
  mulss  0x18(%rsp),%xmm0
  mulss  0xc(%rsp),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,0x10(%rsp)
  call   <fabs@plt>
  comisd D58(%rip),%xmm0
  jbe    L50
  pxor   %xmm0,%xmm0
  cvtss2sd 0x14(%rsp),%xmm0
  mulsd  D85(%rip),%xmm0
  pxor   %xmm5,%xmm5
  cvtsd2ss %xmm0,%xmm5
  movss  %xmm5,0x14(%rsp)
  pxor   %xmm0,%xmm0
  cvtss2sd 0x10(%rsp),%xmm0
  mulsd  D85(%rip),%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  mulsd  D85(%rip),%xmm1
  cvtsd2ss %xmm1,%xmm1
  pxor   %xmm6,%xmm6
  cvtsd2ss %xmm0,%xmm6
  movss  %xmm6,0xc(%rsp)
  jmp    L139
L29:
  movss  %xmm1,0x14(%rsp)
  jmp    L83
L57:
  pxor   %xmm5,%xmm5
  movss  %xmm5,0x14(%rsp)
  movss  D54(%rip),%xmm5
  movss  %xmm5,0xc(%rsp)
L138:
  movss  0x1c(%rsp),%xmm0
  call   <bessi0@plt>
  divss  0xc(%rsp),%xmm0
  mulss  0x14(%rsp),%xmm0
  pxor   %xmm1,%xmm1
  comiss 0x1c(%rsp),%xmm1
  jbe    L37
  test   $0x1,%bpl
  je     L37
  xorps  D89(%rip),%xmm0
  jmp    L37
```

tool_calls: name: extract_symbolic_data
arguments: label: D8
type_infered: f64
name: extract_symbolic_data
arguments: label: D6
type_infered: string
name: extract_symbolic_data
arguments: label: D80
type_infered: f64
name: extract_symbolic_data
arguments: label: D33
type_infered: f64
name: extract_symbolic_data
arguments: label: D54
type_infered: f32
name: extract_symbolic_data
arguments: label: D58
type_infered: f64[2]
name: extract_symbolic_data
arguments: label: D85
type_infered: byte[8]
name: extract_symbolic_data
arguments: label: D89
type_infered: byte[16]

tool: D8: 0

tool: D6: Index n less than 2 in bessi

tool: D80: 2

tool: D33: 40

tool: D54: 1

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

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

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

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;
  }
}
```