user: 下面的汇编指令对应的C源代码是什么:

```asm
<iwftoa>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x20,%rsp
  mov    %rdi,%r13
  fldt   0x50(%rsp)
  fucomip %st(0),%st
  jp     L255
  fldt   0x50(%rsp)
  fabs
  fldt   0xe9c(%rip)        # 2000 <_fini+0xb64>
  fxch   %st(1)
  fucomip %st(1),%st
  fstp   %st(0)
  ja     L308
  fldz
  fldt   0x50(%rsp)
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L344
  je     L259
L344:
  fldt   0x50(%rsp)
  fldz
  fcomip %st(1),%st
  ja     L298
  fstp   %st(0)
  push   0x58(%rsp)
  push   0x58(%rsp)
  call   <log10l@plt>
  fnstcw 0x2e(%rsp)
  movzwl 0x2e(%rsp),%eax
  or     $0xc,%ah
  mov    %ax,0x2a(%rsp)
  fldcw  0x2a(%rsp)
  fistpl 0x10(%rsp)
  fldcw  0x2e(%rsp)
  mov    0x10(%rsp),%ebx
  add    $0x10,%rsp
  cmp    $0xd,%ebx
  jg     L218
  fldt   0x50(%rsp)
  fstpt  (%rsp)
L119:
  fldt   0x50(%rsp)
  fldz
  fcomi  %st(1),%st
  seta   %r14b
  cmp    $0x8,%ebx
  setg   %al
  and    %eax,%r14d
  cmp    $0xfffffff8,%ebx
  setl   %al
  or     %eax,%r14d
  movzbl %r14b,%r14d
  mov    %r13,%rbp
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L206
L334:
  lea    0x1(%r13),%rbp
  movb   $0x2d,0x0(%r13)
L206:
  test   %r14d,%r14d
  jne    L132
L225:
  test   %ebx,%ebx
  mov    $0x0,%eax
  cmovs  %eax,%ebx
  jmp    L270
L255:
  movl   $0x6e616e,(%rdi)
  jmp    L200
L308:
  movl   $0x666e69,(%rdi)
  jmp    L200
L259:
  movw   $0x30,(%rdi)
  jmp    L200
L298:
  fchs
  fld    %st(0)
  fstpt  (%rsp)
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  call   <log10l@plt>
  fnstcw 0x2e(%rsp)
  movzwl 0x2e(%rsp),%eax
  or     $0xc,%ah
  mov    %ax,0x2a(%rsp)
  fldcw  0x2a(%rsp)
  fistpl 0x24(%rsp)
  fldcw  0x2e(%rsp)
  mov    0x24(%rsp),%ebx
  add    $0x10,%rsp
  cmp    $0xd,%ebx
  jle    L119
  mov    $0x1,%r14d
  jmp    L334
L247:
  fldt   0x50(%rsp)
  fstpt  (%rsp)
  mov    $0x1,%r14d
  jmp    L334
L132:
  test   %ebx,%ebx
  jns    L348
  sub    $0x1,%ebx
  fldt   (%rsp)
  fstpt  0x50(%rsp)
  jmp    L297
L348:
  fldt   (%rsp)
  fstpt  0x50(%rsp)
  jmp    L297
L11:
  test   %ebx,%ebx
  je     L325
L44:
  sub    $0x1,%ebx
L270:
  fldl   0xd59(%rip)        # 2028 <_fini+0xb8c>
  fldt   (%rsp)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L173
  test   %ebx,%ebx
  js     L243
L173:
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebx,%xmm1
  movsd  D30(%rip),%xmm0
  call   <pow@plt>
  ucomisd D0(%rip),%xmm0
  ja     L11
  comisd D35(%rip),%xmm0
  jbe    L11
  fldt   (%rsp)
  fld    %st(0)
  movsd  %xmm0,(%rsp)
  fldl   (%rsp)
  fdivrp %st,%st(1)
  fnstcw 0x1e(%rsp)
  movzwl 0x1e(%rsp),%eax
  and    $0xf3,%ah
  or     $0x4,%ah
  mov    %ax,0x1c(%rsp)
  fldcw  0x1c(%rsp)
  frndint
  fldcw  0x1e(%rsp)
  movzwl 0x1e(%rsp),%eax
  or     $0xc,%ah
  mov    %ax,0x1a(%rsp)
  fldcw  0x1a(%rsp)
  fistpl (%rsp)
  fldcw  0x1e(%rsp)
  mov    (%rsp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  mulsd  %xmm0,%xmm1
  movsd  %xmm1,(%rsp)
  fsubl  (%rsp)
  fstpt  (%rsp)
  add    $0x30,%eax
  mov    %al,0x0(%rbp)
  lea    0x1(%rbp),%rbp
  jmp    L11
L325:
  fldz
  fldt   (%rsp)
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L44
  movb   $0x2e,0x0(%rbp)
  lea    0x1(%rbp),%rbp
  jmp    L44
L243:
  test   %r14d,%r14d
  je     L174
  movb   $0x65,0x0(%rbp)
  test   %r12d,%r12d
  jle    L278
  movb   $0x2b,0x1(%rbp)
  lea    0x2(%rbp),%rbp
L276:
  mov    $0x0,%esi
L154:
  add    $0x1,%rbp
  movslq %r12d,%rax
  imul   $0x66666667,%rax,%rax
  sar    $0x22,%rax
  mov    %r12d,%edx
  sar    $0x1f,%edx
  sub    %edx,%eax
  lea    (%rax,%rax,4),%ecx
  add    %ecx,%ecx
  mov    %r12d,%edx
  sub    %ecx,%edx
  add    $0x30,%edx
  mov    %dl,-0x1(%rbp)
  mov    %r12d,%edx
  mov    %eax,%r12d
  mov    %esi,%r8d
  add    $0x1,%esi
  cmp    $0x9,%edx
  jg     L154
  movslq %esi,%rsi
  mov    %rbp,%rdi
  sub    %rsi,%rdi
  test   %r8d,%r8d
  jle    L174
  movslq %r8d,%rdx
  mov    %rdi,%rcx
L194:
  movzbl (%rcx),%eax
  xor    (%rdi,%rdx,1),%al
  mov    %al,(%rcx)
  xor    (%rdi,%rdx,1),%al
  mov    %al,(%rdi,%rdx,1)
  xor    %al,(%rcx)
  sub    $0x1,%rdx
  add    $0x1,%rcx
  mov    %r8d,%eax
  sub    %edx,%eax
  cmp    %edx,%eax
  jl     L194
L174:
  movb   $0x0,0x0(%rbp)
L200:
  mov    %r13,%rax
  add    $0x20,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L278:
  lea    0x2(%rbp),%rax
  movb   $0x2d,0x1(%rbp)
  mov    %rax,%rbp
  jns    L174
  neg    %r12d
  jmp    L276
L218:
  fldt   0x50(%rsp)
  fldz
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L247
  mov    %r13,%rbp
L297:
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebx,%xmm1
  movsd  D30(%rip),%xmm0
  call   <pow@plt>
  movsd  %xmm0,(%rsp)
  fldt   0x50(%rsp)
  fdivl  (%rsp)
  fstpt  (%rsp)
  mov    %ebx,%r12d
  mov    $0x1,%r14d
  mov    $0x0,%ebx
  jmp    L225
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D30
data_type: f64
name: extract_symbolic_data
arguments: data_tag: D0
data_type: byte[8]
name: extract_symbolic_data
arguments: data_tag: D35
data_type: f64[2]

tool: D30: 10

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

tool: {"D35": [0.0,1e-14]}

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