user: 请从给定的汇编指令推导出C源代码:

```asm
<flt2ieee_nan>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  movss  %xmm0,-0x24(%rbp)
  mov    %rdi,-0x30(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  ucomiss -0x24(%rbp),%xmm0
  jp     L9
  pxor   %xmm0,%xmm0
  ucomiss -0x24(%rbp),%xmm0
  jne    L9
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movb   $0x0,(%rax)
  mov    -0x30(%rbp),%rdx
  add    $0x2,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  movzbl (%rax),%edx
  mov    -0x30(%rbp),%rax
  mov    %dl,(%rax)
  mov    $0x0,%eax
  jmp    L91
L9:
  pxor   %xmm0,%xmm0
  cvtss2sd -0x24(%rbp),%xmm0
  comisd D5(%rip),%xmm0
  jb     L116
  pxor   %xmm1,%xmm1
  cvtss2sd -0x24(%rbp),%xmm1
  movsd  D44(%rip),%xmm0
  comisd %xmm1,%xmm0
  jb     L116
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movb   $0xff,(%rax)
  mov    -0x30(%rbp),%rdx
  add    $0x2,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  movzbl (%rax),%edx
  mov    -0x30(%rbp),%rax
  mov    %dl,(%rax)
  mov    $0x0,%eax
  jmp    L91
L116:
  pxor   %xmm0,%xmm0
  comiss -0x24(%rbp),%xmm0
  jbe    L119
  movl   $0x80,-0x18(%rbp)
  movss  -0x24(%rbp),%xmm0
  movss  D49(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x24(%rbp)
  jmp    L93
L119:
  movl   $0x0,-0x18(%rbp)
L93:
  pxor   %xmm2,%xmm2
  cvtss2sd -0x24(%rbp),%xmm2
  movq   %xmm2,%rax
  lea    -0x1c(%rbp),%rdx
  mov    %rdx,%rdi
  movq   %rax,%xmm0
  call   <frexp@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm1
  movsd  D36(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  D9(%rip),%xmm0
  addsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%rax
  mov    %eax,-0x14(%rbp)
  cmpl   $0xffffff,-0x14(%rbp)
  jbe    L79
  mov    -0x14(%rbp),%eax
  shr    %eax
  mov    %eax,-0x14(%rbp)
  mov    -0x1c(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x1c(%rbp)
L79:
  mov    -0x1c(%rbp),%eax
  add    $0x7e,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  test   %eax,%eax
  jns    L96
  mov    -0x18(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rax
  lea    0x3(%rax),%rdx
  movb   $0x0,(%rdx)
  mov    -0x30(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rdx
  add    $0x1,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  mov    $0x0,%eax
  jmp    L91
L96:
  mov    -0x1c(%rbp),%eax
  cmp    $0xff,%eax
  jle    L104
  mov    -0x18(%rbp),%eax
  lea    0x7f(%rax),%edx
  mov    -0x30(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  movb   $0x80,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  movb   $0x0,(%rax)
  mov    -0x30(%rbp),%rdx
  add    $0x2,%rdx
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  mov    $0x0,%eax
  jmp    L91
L104:
  mov    -0x1c(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x30(%rbp),%rax
  add    $0x3,%rax
  mov    -0x14(%rbp),%edx
  mov    %dl,(%rax)
  mov    -0x14(%rbp),%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  mov    -0x1c(%rbp),%eax
  shl    $0x7,%eax
  mov    %eax,%ecx
  mov    -0x14(%rbp),%eax
  shr    $0x10,%eax
  and    $0x7f,%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  add    %ecx,%edx
  mov    %dl,(%rax)
  mov    $0x0,%eax
L91:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L136
  call   <__stack_chk_fail@plt>
L136:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D5
type: f64[2]
name: parse_data
arguments: data_label: D44
type: f64
name: parse_data
arguments: data_label: D49
type: byte[4]
name: parse_data
arguments: data_label: D36
type: f32[2]
name: parse_data
arguments: data_label: D9
type: f64

tool: {"D5": [9.9989e20,9.9991e20]}

tool: D44: 9.9991e+20

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

tool: {"D36": [0.0,15.0]}

tool: D9: 0.5

assistant: ```c
int flt2ieee_nan(float x, unsigned char *ieee) {
  int sign, exp;
  unsigned int umant;
  double mant;
  if (x == 0.0) {
    ieee[0] = ieee[1] = ieee[2] = ieee[3] = 0;
    return 0;
  }
  if (((x) >= 9.9989e20 && (x) <= 9.9991e20)) {
    ieee[0] = ieee[1] = ieee[2] = ieee[3] = 255;
    return 0;
  }
  if (x < 0.0) {
    sign = 128;
    x = -x;
  } else
    sign = 0;
  mant = frexp((double)x, &exp);
  umant = mant * 16777216 + 0.5;
  if (umant >= 16777216) {
    umant = umant / 2;
    exp++;
  }
  exp = exp - 1 + 127;
  if (exp < 0) {
    ieee[0] = sign;
    ieee[1] = ieee[2] = ieee[3] = 0;
    return 0;
  }
  if (exp > 255) {
    ieee[0] = sign + 127;
    ieee[1] = 128;
    ieee[2] = ieee[3] = 0;
    return 0;
  }
  ieee[0] = sign + (exp >> 1);
  ieee[3] = umant & 255;
  ieee[2] = (umant >> 8) & 255;
  ieee[1] = ((exp & 1) << 7) + ((umant >> 16) & 127);
  return 0;
}
```