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

```asm
<cephes_jnf>:
  endbr64
  push   %rbx
  movaps %xmm0,%xmm5
  sub    $0x10,%rsp
  test   %edi,%edi
  js     L17
  pxor   %xmm7,%xmm7
  mov    $0x1,%ebx
  comiss %xmm0,%xmm7
  ja     L100
  test   %edi,%edi
  je     L47
L59:
  cmp    $0x1,%edi
  je     L90
  cmp    $0x2,%edi
  je     L64
  movsd  D28(%rip),%xmm2
  pxor   %xmm1,%xmm1
  movaps %xmm7,%xmm0
  cvtss2sd %xmm5,%xmm1
  comisd %xmm1,%xmm2
  ja     L29
  lea    0x30(%rdi,%rdi,1),%eax
  pxor   %xmm0,%xmm0
  movaps %xmm5,%xmm4
  mov    $0x18,%edx
  cvtsi2ss %eax,%xmm0
  mulss  %xmm5,%xmm4
  movss  D24(%rip),%xmm3
  movaps %xmm0,%xmm1
L174:
  movaps %xmm4,%xmm2
  subss  %xmm3,%xmm0
  divss  %xmm1,%xmm2
  movaps %xmm0,%xmm1
  subss  %xmm2,%xmm1
  sub    $0x1,%edx
  jne    L174
  movaps %xmm1,%xmm2
  pxor   %xmm4,%xmm4
  lea    -0x1(%rdi),%edx
  sub    $0x32,%eax
  movss  D0(%rip),%xmm0
  cvtsi2ss %eax,%xmm4
  movaps %xmm0,%xmm6
  divss  %xmm5,%xmm6
  mulss  %xmm6,%xmm2
  jmp    L143
  nopl   (%rax)
L155:
  movaps %xmm1,%xmm2
L143:
  mulss  %xmm5,%xmm0
  movaps %xmm2,%xmm1
  mulss  %xmm4,%xmm1
  subss  %xmm3,%xmm4
  subss  %xmm0,%xmm1
  movaps %xmm2,%xmm0
  mulss  %xmm6,%xmm1
  sub    $0x1,%edx
  jne    L155
  cmpltss %xmm7,%xmm0
  movaps %xmm2,%xmm3
  movaps %xmm1,%xmm4
  movss  %xmm2,0x8(%rsp)
  xorps  D30(%rip),%xmm3
  cmpltss %xmm7,%xmm4
  andps  %xmm0,%xmm3
  andnps %xmm2,%xmm0
  orps   %xmm0,%xmm3
  movaps %xmm1,%xmm0
  xorps  D30(%rip),%xmm0
  andps  %xmm4,%xmm0
  andnps %xmm1,%xmm4
  orps   %xmm4,%xmm0
  comiss %xmm0,%xmm3
  jbe    L150
  movaps %xmm5,%xmm0
  call   <cephes_j1f@plt>
  pxor   %xmm0,%xmm0
  movss  0x8(%rsp),%xmm2
  imul   %ebx,%eax
  cvtsi2ss %eax,%xmm0
  divss  %xmm2,%xmm0
L29:
  add    $0x10,%rsp
  pop    %rbx
  ret
  nopw   0x0(%rax,%rax,1)
L100:
  mov    %edi,%eax
  and    $0x1,%eax
  cmp    $0x1,%eax
  sbb    %ebx,%ebx
  and    $0x2,%ebx
  sub    $0x1,%ebx
L175:
  xorps  D30(%rip),%xmm5
  test   %edi,%edi
  jne    L59
L47:
  movaps %xmm5,%xmm0
  call   <cephes_j0f@plt>
  pxor   %xmm0,%xmm0
  add    $0x10,%rsp
  imul   %ebx,%eax
  pop    %rbx
  cvtsi2ss %eax,%xmm0
  ret
  nopl   0x0(%rax,%rax,1)
L17:
  neg    %edi
  mov    %edi,%ebx
  and    $0x1,%ebx
  jne    L107
  pxor   %xmm7,%xmm7
  mov    $0x1,%ebx
  comiss %xmm0,%xmm7
  jbe    L59
  jmp    L175
  nopl   (%rax)
L150:
  movaps %xmm5,%xmm0
  movss  %xmm1,0x8(%rsp)
  call   <cephes_j0f@plt>
  pxor   %xmm0,%xmm0
  movss  0x8(%rsp),%xmm1
  add    $0x10,%rsp
  imul   %ebx,%eax
  pop    %rbx
  cvtsi2ss %eax,%xmm0
  divss  %xmm1,%xmm0
  ret
  nopl   0x0(%rax)
L107:
  pxor   %xmm7,%xmm7
  comiss %xmm0,%xmm7
  ja     L175
  mov    $0xffffffff,%ebx
  jmp    L59
L90:
  movaps %xmm5,%xmm0
  call   <cephes_j1f@plt>
  pxor   %xmm0,%xmm0
  imul   %ebx,%eax
  cvtsi2ss %eax,%xmm0
  jmp    L29
L64:
  movaps %xmm5,%xmm0
  movss  %xmm5,0x8(%rsp)
  call   <cephes_j1f@plt>
  pxor   %xmm0,%xmm0
  movss  0x8(%rsp),%xmm5
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm0
  cvtss2sd %xmm5,%xmm2
  addsd  %xmm0,%xmm0
  divsd  %xmm2,%xmm0
  movsd  %xmm0,0x8(%rsp)
  movaps %xmm5,%xmm0
  call   <cephes_j0f@plt>
  pxor   %xmm2,%xmm2
  movsd  0x8(%rsp),%xmm1
  cvtsi2sd %eax,%xmm2
  movapd %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebx,%xmm1
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  jmp    L29
```

tool_calls: name: read_data
arguments: data_label: D28
type_guessed: byte[8]
name: read_data
arguments: data_label: D24
type_guessed: f32
name: read_data
arguments: data_label: D0
type_guessed: f32
name: read_data
arguments: data_label: D30
type_guessed: byte[16]

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

tool: D24: 2

tool: D0: 1

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

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