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

```asm
<cephes_jnf>:
  endbr64
  push   %rbx
  sub    $0x10,%rsp
  movss  %xmm0,0x8(%rsp)
  test   %edi,%edi
  js     L119
  pxor   %xmm0,%xmm0
  mov    $0x1,%ebx
  comiss 0x8(%rsp),%xmm0
  jbe    L150
  mov    $0x1,%ebx
  mov    %edi,%eax
  and    $0x1,%eax
  je     L190
L43:
  neg    %eax
  mov    %eax,%ebx
L190:
  movss  0x8(%rsp),%xmm7
  xorps  D24(%rip),%xmm7
  movss  %xmm7,0x8(%rsp)
L150:
  test   %edi,%edi
  je     L62
L76:
  cmp    $0x1,%edi
  je     L187
  cmp    $0x2,%edi
  je     L56
  movss  0x8(%rsp),%xmm5
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm5,%xmm1
  pxor   %xmm0,%xmm0
  movsd  D25(%rip),%xmm2
  comisd %xmm1,%xmm2
  ja     L171
  lea    0x30(%rdi,%rdi,1),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movaps %xmm5,%xmm4
  mulss  %xmm5,%xmm4
  movaps %xmm0,%xmm1
  mov    $0x18,%edx
  movss  D35(%rip),%xmm3
L196:
  subss  %xmm3,%xmm0
  movaps %xmm4,%xmm2
  divss  %xmm1,%xmm2
  movaps %xmm0,%xmm1
  subss  %xmm2,%xmm1
  sub    $0x1,%edx
  jne    L196
  movss  D52(%rip),%xmm0
  movaps %xmm0,%xmm3
  divss  0x8(%rsp),%xmm3
  mulss  %xmm3,%xmm1
  movss  %xmm1,(%rsp)
  lea    -0x1(%rdi),%edx
  sub    $0x32,%eax
  pxor   %xmm2,%xmm2
  cvtsi2ss %eax,%xmm2
  movss  D35(%rip),%xmm4
  jmp    L114
L119:
  neg    %edi
  test   $0x1,%dil
  je     L193
  pxor   %xmm0,%xmm0
  mov    $0xffffffff,%ebx
  comiss 0x8(%rsp),%xmm0
  jbe    L76
  mov    $0xffffffff,%eax
  jmp    L43
L62:
  movss  0x8(%rsp),%xmm0
  call   <cephes_j0f@plt>
  imul   %ebx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  jmp    L171
L187:
  movss  0x8(%rsp),%xmm0
  call   <cephes_j1f@plt>
  imul   %ebx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  jmp    L171
L56:
  movss  0x8(%rsp),%xmm0
  call   <cephes_j1f@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  addsd  %xmm0,%xmm0
  movss  0x8(%rsp),%xmm7
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm7,%xmm1
  movapd %xmm0,%xmm6
  divsd  %xmm1,%xmm6
  movsd  %xmm6,(%rsp)
  movaps %xmm7,%xmm0
  call   <cephes_j0f@plt>
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movsd  (%rsp),%xmm0
  subsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebx,%xmm1
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  jmp    L171
L20:
  movss  0xc(%rsp),%xmm7
  movss  %xmm7,(%rsp)
L114:
  movss  (%rsp),%xmm5
  movaps %xmm5,%xmm1
  mulss  %xmm2,%xmm1
  mulss  0x8(%rsp),%xmm0
  subss  %xmm0,%xmm1
  mulss  %xmm3,%xmm1
  movss  %xmm1,0xc(%rsp)
  subss  %xmm4,%xmm2
  sub    $0x1,%edx
  movaps %xmm5,%xmm0
  test   %edx,%edx
  jg     L20
  pxor   %xmm2,%xmm2
  movaps %xmm5,%xmm1
  xorps  D24(%rip),%xmm1
  cmpltss %xmm2,%xmm0
  andps  %xmm0,%xmm1
  andnps %xmm5,%xmm0
  orps   %xmm0,%xmm1
  movaps %xmm2,%xmm3
  movss  0xc(%rsp),%xmm6
  movaps %xmm6,%xmm0
  xorps  D24(%rip),%xmm0
  movaps %xmm6,%xmm2
  cmpltss %xmm3,%xmm2
  andps  %xmm2,%xmm0
  andnps %xmm6,%xmm2
  orps   %xmm2,%xmm0
  comiss %xmm0,%xmm1
  jbe    L41
  movss  0x8(%rsp),%xmm0
  call   <cephes_j1f@plt>
  imul   %ebx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  divss  (%rsp),%xmm0
L171:
  add    $0x10,%rsp
  pop    %rbx
  ret
L41:
  movss  0x8(%rsp),%xmm0
  call   <cephes_j0f@plt>
  imul   %ebx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  divss  0xc(%rsp),%xmm0
  jmp    L171
L193:
  pxor   %xmm0,%xmm0
  mov    $0x1,%ebx
  comiss 0x8(%rsp),%xmm0
  jbe    L76
  mov    $0x1,%ebx
  jmp    L190
```

tool_calls: name: retrieve_data
arguments: data_label: D24
type: byte[16]
name: retrieve_data
arguments: data_label: D25
type: byte[8]
name: retrieve_data
arguments: data_label: D35
type: f32
name: retrieve_data
arguments: data_label: D52
type: f32

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

tool: {"D25": [0xfd,0xf4,0x02,0x01,0x00,0x00,0x70,0x3e]}

tool: D35: 2

tool: D52: 1

assistant: ```c
float cephes_jnf(int n, float x) {
  const double MACHEP = 5.9604645e-08;
  float pkm2, pkm1, pk, xk, r, ans;
  int k, sign;
  if (n < 0) {
    n = -n;
    if ((n & 1) == 0)
      sign = 1;
    else
      sign = -1;
  } else {
    sign = 1;
  }
  if (x < 0.0) {
    if (n & 1)
      sign = -sign;
    x = -x;
  }
  if (n == 0)
    return (sign * cephes_j0f(x));
  if (n == 1)
    return (sign * cephes_j1f(x));
  if (n == 2)
    return (sign * (2.0 * cephes_j1f(x) / x - cephes_j0f(x)));
  if (x < MACHEP)
    return (0.0);
  k = 24;
  pk = 2 * (n + k);
  ans = pk;
  xk = x * x;
  do {
    pk -= 2.0;
    ans = pk - (xk / ans);
  } while (--k > 0);
  pk = 1.0;
  const float xinv = 1.0 / x;
  pkm1 = ans * xinv;
  k = n - 1;
  r = (float)(2 * k);
  do {
    pkm2 = (pkm1 * r - pk * x) * xinv;
    pk = pkm1;
    pkm1 = pkm2;
    r -= 2.0;
  } while (--k > 0);
  r = pk;
  if (r < 0)
    r = -r;
  ans = pkm1;
  if (ans < 0)
    ans = -ans;
  if (r > ans)
    ans = sign * cephes_j1f(x) / pk;
  else
    ans = sign * cephes_j0f(x) / pkm1;
  return (ans);
}
```