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

```asm
<iwftoa>:
  endbr64
  push   %r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x20,%rsp
  fldt   0x50(%rsp)
  fucomi %st(0),%st
  jp     L83
  fld    %st(0)
  fabs
  fldt   0xe97(%rip)        # 2000 <_fini+0xb40>
  fxch   %st(1)
  fucomip %st(1),%st
  fstp   %st(0)
  ja     L276
  fldz
  fxch   %st(1)
  fucomi %st(1),%st
  fstp   %st(1)
  jp     L94
  je     L194
L94:
  fldz
  fcomip %st(1),%st
  ja     L206
  sub    $0x10,%rsp
  fld    %st(0)
  fstpt  (%rsp)
  fstpt  0x60(%rsp)
  call   <log10l@plt>
  fnstcw 0x2e(%rsp)
  movzwl 0x2e(%rsp),%eax
  or     $0xc,%ah
  mov    %ax,0x2c(%rsp)
  fldcw  0x2c(%rsp)
  fistpl 0x20(%rsp)
  fldcw  0x2e(%rsp)
  mov    0x20(%rsp),%ebp
  pop    %rax
  pop    %rdx
  fldt   0x50(%rsp)
  cmp    $0xd,%ebp
  jle    L154
  mov    %r13,%r12
L26:
  pxor   %xmm1,%xmm1
  fstpt  0x50(%rsp)
  xor    %ebx,%ebx
  mov    $0x1,%r14d
  cvtsi2sd %ebp,%xmm1
  movsd  D15(%rip),%xmm0
  call   <pow@plt>
  fldt   0x50(%rsp)
  movsd  %xmm0,0x10(%rsp)
  fdivl  0x10(%rsp)
  jmp    L155
  nopl   (%rax)
L96:
  sub    $0x1,%ebx
L155:
  fldl   0xe0f(%rip)        # 2020 <_fini+0xb60>
  fxch   %st(1)
  fcomi  %st(1),%st
  fstp   %st(1)
  ja     L327
  test   %ebx,%ebx
  js     L109
L327:
  pxor   %xmm1,%xmm1
  mov    D15(%rip),%rax
  fstpt  0x50(%rsp)
  cvtsi2sd %ebx,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  fldt   0x50(%rsp)
  pxor   %xmm2,%xmm2
  comisd %xmm2,%xmm0
  jbe    L10
  ucomisd D22(%rip),%xmm0
  ja     L10
  movsd  %xmm0,0x10(%rsp)
  fld    %st(0)
  fldl   0x10(%rsp)
  pxor   %xmm1,%xmm1
  fnstcw 0x1e(%rsp)
  add    $0x1,%r12
  fdivrp %st,%st(1)
  movzwl 0x1e(%rsp),%eax
  and    $0xf3,%ah
  or     $0x4,%ah
  mov    %ax,0x1a(%rsp)
  movzwl 0x1e(%rsp),%eax
  or     $0xc,%ah
  mov    %ax,0x1c(%rsp)
  fldcw  0x1a(%rsp)
  frndint
  fldcw  0x1e(%rsp)
  fldcw  0x1c(%rsp)
  fistpl 0x10(%rsp)
  fldcw  0x1e(%rsp)
  mov    0x10(%rsp),%eax
  cvtsi2sd %eax,%xmm1
  add    $0x30,%eax
  mov    %al,-0x1(%r12)
  mulsd  %xmm0,%xmm1
  movsd  %xmm1,0x10(%rsp)
  fsubl  0x10(%rsp)
L10:
  test   %ebx,%ebx
  jne    L96
  fldz
  fxch   %st(1)
  fcomi  %st(1),%st
  fstp   %st(1)
  jbe    L96
  movb   $0x2e,(%r12)
  add    $0x1,%r12
  jmp    L96
  nopl   (%rax)
L194:
  fstp   %st(0)
  mov    $0x30,%edi
  mov    %di,0x0(%r13)
L248:
  add    $0x20,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax)
L276:
  fstp   %st(0)
  movl   $0x666e69,(%rdi)
  add    $0x20,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L154:
  fldz
  fcomip %st(1),%st
  seta   %al
  cmp    $0x8,%ebp
  setg   %dl
  test   %al,%dl
  jne    L294
  cmp    $0xfffffff8,%ebp
  jge    L160
L294:
  fldz
  fcomip %st(1),%st
  ja     L170
  mov    %r13,%r12
L191:
  cmp    $0x80000000,%ebp
  adc    $0xffffffff,%ebp
  jmp    L26
  nopl   0x0(%rax)
L206:
  fchs
  sub    $0x10,%rsp
  fld    %st(0)
  fstpt  (%rsp)
  fstpt  0x10(%rsp)
  call   <log10l@plt>
  fnstcw 0x2e(%rsp)
  movzwl 0x2e(%rsp),%eax
  or     $0xc,%ah
  mov    %ax,0x2c(%rsp)
  fldcw  0x2c(%rsp)
  fistpl 0x20(%rsp)
  fldcw  0x2e(%rsp)
  mov    0x20(%rsp),%ebp
  pop    %rcx
  pop    %rsi
  fldt   (%rsp)
  cmp    $0xd,%ebp
  jg     L170
  mov    $0x1,%eax
  cmp    $0x8,%ebp
  jg     L170
  cmp    $0xfffffff8,%ebp
  jl     L170
L160:
  xor    %ebx,%ebx
  test   %ebp,%ebp
  cmovns %ebp,%ebx
  test   %al,%al
  jne    L108
  mov    %r13,%r12
  xor    %r14d,%r14d
  jmp    L155
  nopl   0x0(%rax)
L109:
  fstp   %st(0)
  test   %r14d,%r14d
  je     L92
  movb   $0x65,(%r12)
  lea    0x2(%r12),%rax
  test   %ebp,%ebp
  jle    L173
  movb   $0x2b,0x1(%r12)
L99:
  mov    %rax,%r12
  xor    %ecx,%ecx
  mov    $0xcccccccd,%esi
  nopl   (%rax)
L198:
  mov    %ebp,%eax
  add    $0x1,%r12
  mov    %ecx,%edi
  imul   %rsi,%rax
  lea    0x1(%rcx),%ecx
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%edx
  add    %edx,%edx
  sub    %edx,%ebp
  add    $0x30,%ebp
  mov    %bpl,-0x1(%r12)
  mov    %eax,%ebp
  test   %eax,%eax
  jne    L198
  movslq %ecx,%rcx
  mov    %r12,%rsi
  sub    %rcx,%rsi
  test   %edi,%edi
  je     L92
  movslq %edi,%rdx
  mov    %rsi,%rcx
  nopl   0x0(%rax,%rax,1)
L197:
  movzbl (%rcx),%eax
  xor    (%rsi,%rdx,1),%al
  mov    %al,(%rcx)
  xor    (%rsi,%rdx,1),%al
  mov    %al,(%rsi,%rdx,1)
  sub    $0x1,%rdx
  xor    %al,(%rcx)
  mov    %edi,%eax
  add    $0x1,%rcx
  sub    %edx,%eax
  cmp    %edx,%eax
  jl     L197
L92:
  movb   $0x0,(%r12)
  add    $0x20,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   (%rax)
L170:
  movb   $0x2d,0x0(%r13)
  lea    0x1(%r13),%r12
  jmp    L191
  cs nopw 0x0(%rax,%rax,1)
L173:
  movb   $0x2d,0x1(%r12)
  mov    %rax,%r12
  je     L92
  neg    %ebp
  jmp    L99
L83:
  fstp   %st(0)
  movl   $0x6e616e,(%rdi)
  jmp    L248
L108:
  movb   $0x2d,0x0(%r13)
  lea    0x1(%r13),%r12
  xor    %r14d,%r14d
  jmp    L155
```

tool_calls: name: unpack_data
arguments: data_tag: D15
type: f64
name: unpack_data
arguments: data_tag: D22
type: byte[8]

tool: D15: 10

tool: {"D22": [0xff,0xff,0xff,0xff,0xff,0xff,0xef,0x7f]}

assistant: ```c
char *iwftoa(long double n, char s[32]) {
  static double PRECISION = 0.00000000000001;
  if (isnan(n)) {
    strcpy(s, "nan");
  } else if (isinf(n)) {
    strcpy(s, "inf");
  } else if (n == 0.0) {
    strcpy(s, "0");
  } else {
    int digit, m, m1;
    char *c = s;
    int neg = (n < 0);
    if (neg) {
      n = -n;
    }
    m = (int)log10l(n);
    int useExp = (m >= 14 || (neg && m >= 9) || m <= -9);
    if (neg) {
      *(c++) = '-';
    }
    if (useExp) {
      if (m < 0) {
        m -= 1;
      }
      n = n / pow(10.0, m);
      m1 = m;
      m = 0;
    }
    if (m < 1) {
      m = 0;
    }
    while (n > PRECISION || m >= 0) {
      double weight = pow(10.0, m);
      if ((weight > 0) && !isinf(weight)) {
        digit = (int)floorl(n / weight);
        n -= (digit * weight);
        *(c++) = '0' + digit;
      }
      if ((m == 0) && (n > 0)) {
        *(c++) = '.';
      }
      m--;
    }
    if (useExp) {
      int i, j;
      *(c++) = 'e';
      if (m1 > 0) {
        *(c++) = '+';
      } else {
        *(c++) = '-';
        m1 = -m1;
      }
      m = 0;
      while (m1 > 0) {
        *(c++) = '0' + m1 % 10;
        m1 /= 10;
        m++;
      }
      c -= m;
      for (i = 0, j = m - 1; i < j; i++, j--) {
        c[i] ^= c[j];
        c[j] ^= c[i];
        c[i] ^= c[j];
      }
      c += m;
    }
    *(c) = '\0';
  }
  return s;
}
```