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

```asm
<__format_double>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %edi,-0x44(%rbp)
  mov    %esi,-0x48(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  push   0x18(%rbp)
  push   0x10(%rbp)
  call   <isnan@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  je     L254
  mov    -0x44(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L237
  lea    D129(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L237:
  lea    D93(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L254:
  push   0x18(%rbp)
  push   0x10(%rbp)
  call   <isinf@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  je     L149
  mov    -0x44(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L84
  fldt   0x10(%rbp)
  fldz
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L28
  lea    D123(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L28:
  mov    -0x44(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L183
  lea    D43(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L183:
  lea    D97(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L84:
  fldt   0x10(%rbp)
  fldz
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L337
  lea    D30(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L337:
  mov    -0x44(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L62
  lea    D19(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L62:
  lea    D89(%rip),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  jmp    L119
L149:
  mov    -0x44(%rbp),%eax
  and    $0x80,%eax
  test   %eax,%eax
  jne    L40
  mov    -0x44(%rbp),%eax
  and    $0x100,%eax
  test   %eax,%eax
  je     L297
  fldt   0xc4a(%rip)        # 2030 <_fini+0x9c0>
  fldt   0x10(%rbp)
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L297
L40:
  push   0x18(%rbp)
  push   0x10(%rbp)
  call   <log10l@plt>
  add    $0x10,%rsp
  fstpt  -0x20(%rbp)
  fldt   -0x20(%rbp)
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  call   <floorl@plt>
  add    $0x10,%rsp
  mov    %eax,%esi
  mov    $0xa,%edi
  call   <powl@plt>
  fldt   0x10(%rbp)
  fdivp  %st,%st(1)
  fstpt  0x10(%rbp)
  mov    -0x44(%rbp),%eax
  and    $0x7f,%al
  mov    %eax,%edx
  mov    -0x48(%rbp),%eax
  push   0x18(%rbp)
  push   0x10(%rbp)
  mov    %eax,%esi
  mov    %edx,%edi
  call   <__format_double>
  add    $0x10,%rsp
  mov    %rax,-0x38(%rbp)
  mov    -0x44(%rbp),%eax
  or     $0x1,%eax
  fldt   -0x20(%rbp)
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  mov    %eax,%edi
  call   <__format_int@plt>
  add    $0x10,%rsp
  mov    %rax,-0x28(%rbp)
  mov    -0x44(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L320
  lea    D8(%rip),%rax
  jmp    L12
L320:
  lea    D3(%rip),%rax
L12:
  mov    -0x28(%rbp),%rdx
  mov    -0x38(%rbp),%rdi
  mov    $0x0,%ecx
  mov    %rax,%rsi
  mov    $0x0,%eax
  call   <strvcat@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  jmp    L69
L297:
  lea    -0x20(%rbp),%rax
  push   0x18(%rbp)
  push   0x10(%rbp)
  mov    %rax,%rdi
  call   <modfl@plt>
  add    $0x10,%rsp
  fstpt  0x10(%rbp)
  fldt   0xb5e(%rip)        # 2040 <_fini+0x9d0>
  fldt   0x10(%rbp)
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L67
  fldt   -0x20(%rbp)
  mov    -0x44(%rbp),%eax
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  mov    %eax,%edi
  call   <__format_double_int@plt>
  add    $0x10,%rsp
  mov    %rax,-0x38(%rbp)
  jmp    L196
L67:
  fldt   -0x20(%rbp)
  mov    -0x44(%rbp),%eax
  lea    -0x10(%rsp),%rsp
  fstpt  (%rsp)
  mov    %eax,%edi
  call   <__format_int@plt>
  add    $0x10,%rsp
  mov    %rax,-0x38(%rbp)
L196:
  mov    -0x48(%rbp),%edx
  mov    -0x44(%rbp),%eax
  push   0x18(%rbp)
  push   0x10(%rbp)
  mov    %edx,%esi
  mov    %eax,%edi
  call   <__format_double_frac@plt>
  add    $0x10,%rsp
  mov    %rax,-0x28(%rbp)
  fldt   -0x20(%rbp)
  fldz
  fucomip %st(1),%st
  jp     L187
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jne    L252
  fldt   0x10(%rbp)
  fldz
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L252
  fldt   0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L327
  fldt   0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jne    L327
  mov    -0x44(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L257
L327:
  mov    -0x28(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  mov    $0x0,%r8d
  mov    %rdx,%rcx
  lea    D34(%rip),%rdx
  mov    %rax,%rsi
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <strvcat@plt>
  mov    %rax,-0x30(%rbp)
  nop
  jmp    L49
L257:
  mov    -0x38(%rbp),%rax
  mov    $0x0,%edx
  mov    %rax,%rsi
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <strvcat@plt>
  mov    %rax,-0x30(%rbp)
  jmp    L49
L187:
  fstp   %st(0)
L252:
  fldt   0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L46
  fldt   0x10(%rbp)
  fldz
  fucomip %st(1),%st
  fstp   %st(0)
  jne    L46
  mov    -0x44(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L25
L46:
  mov    -0x28(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  mov    $0x0,%ecx
  lea    D34(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <strvcat@plt>
  mov    %rax,-0x30(%rbp)
  jmp    L49
L25:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  mov    %rax,-0x30(%rbp)
L49:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
L69:
  mov    -0x30(%rbp),%rax
L119:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L47
  call   <__stack_chk_fail@plt>
L47:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D129
data_type: string
name: parse_data
arguments: data_label: D93
data_type: string
name: parse_data
arguments: data_label: D123
data_type: string
name: parse_data
arguments: data_label: D43
data_type: string
name: parse_data
arguments: data_label: D97
data_type: string
name: parse_data
arguments: data_label: D30
data_type: string
name: parse_data
arguments: data_label: D19
data_type: string
name: parse_data
arguments: data_label: D89
data_type: string
name: parse_data
arguments: data_label: D8
data_type: string
name: parse_data
arguments: data_label: D3
data_type: string
name: parse_data
arguments: data_label: D34
data_type: string
name: parse_data
arguments: data_label: D76
data_type: string

tool: D129: NAN

tool: D93: nan

tool: D123: -INF

tool: D43: +INF

tool: D97: INF

tool: D30: -inf

tool: D19: +inf

tool: D89: inf

tool: D8: E

tool: D3: e

tool: D34: .

tool: D76: -

assistant: ```c
char *__format_double(long double value, int flags, int precision) {
  char *int_part;
  char *dec_part;
  char *string;
  long double i;
  if (isnan(value)) {
    if (flags & 0x10) {
      return strdup("NAN");
    } else {
      return strdup("nan");
    }
  }
  if (isinf(value)) {
    if (flags & 0x10) {
      if (value < 0) {
        return strdup("-INF");
      } else {
        if (flags & 0x01) {
          return strdup("+INF");
        } else {
          return strdup("INF");
        }
      }
    } else {
      if (value < 0) {
        return strdup("-inf");
      } else {
        if (flags & 0x01) {
          return strdup("+inf");
        } else {
          return strdup("inf");
        }
      }
    }
  }
  if (flags & 0x80 || (flags & 0x100 && value > 1000000000)) {
    i = log10l(value);
    value /= powl(10, floorl(i));
    int_part = __format_double(value, flags & ~(0x80), precision);
    dec_part = __format_int(i, flags | 0x01);
    string = strvcat(int_part, (flags & 0x10) ? "E" : "e", dec_part, NULL);
    free(int_part);
    free(dec_part);
  } else {
    value = modfl(value, &i);
    if (value > 2000000000) {
      int_part = __format_double_int(i, flags);
    } else {
      int_part = __format_int(i, flags);
    }
    dec_part = __format_double_frac(value, flags, precision);
    if (i == 0.0 && value < 0) {
      if (value != 0.0 || flags & 0x04) {
        string = strvcat("-", int_part, ".", dec_part, NULL);
      } else {
        string = strvcat("-", int_part, NULL);
      }
    } else {
      if (value != 0.0 || flags & 0x04) {
        string = strvcat(int_part, ".", dec_part, NULL);
      } else {
        string = strdup(int_part);
      }
    }
    free(int_part);
    free(dec_part);
  }
  return string;
}
```