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

```asm
<strtod>:
  endbr64
  push   %r15
  mov    %rdi,%r15
  push   %r14
  push   %r13
  mov    %rsi,%r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x18,%rsp
  movzbl (%rdi),%eax
  cmp    $0x20,%al
  jne    L828
  nopw   0x0(%rax,%rax,1)
L564:
  movzbl 0x1(%rbx),%eax
  add    $0x1,%rbx
  cmp    $0x20,%al
  je     L564
L828:
  cmp    $0x9,%al
  je     L564
  cmp    $0x2d,%al
  je     L659
  cmp    $0x2b,%al
  movl   $0x0,0xc(%rsp)
  sete   %al
  movzbl %al,%eax
  add    %rax,%rbx
L149:
  mov    $0xffffffff,%r12d
  xor    %ebp,%ebp
  jmp    L901
  nopl   (%rax)
L12:
  mov    %ebp,%r12d
L939:
  add    $0x1,%rbx
  add    $0x1,%ebp
L901:
  movsbl (%rbx),%edi
  mov    %edi,%r14d
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L939
  cmp    $0x2e,%r14b
  jne    L480
  test   %r12d,%r12d
  js     L12
L480:
  movslq %ebp,%rdx
  mov    %rbx,%rax
  sub    %rdx,%rax
  cmp    $0xffffffff,%r12d
  je     L150
  sub    $0x1,%ebp
L668:
  cmp    $0x12,%ebp
  jle    L458
  sub    $0x12,%r12d
  mov    $0x12,%ebp
L880:
  movsbl (%rax),%edx
  cmp    $0x2e,%dl
  je     L328
  add    $0x1,%rax
L898:
  sub    $0x30,%edx
  lea    -0x1(%rbp),%esi
  cmp    $0xa,%ebp
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L740
  add    $0x1,%rax
L661:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x30(%rcx,%rdx,2),%edx
  cmp    $0xb,%ebp
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L730
  add    $0x1,%rax
L4:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x30(%rcx,%rdx,2),%edx
  cmp    $0xc,%ebp
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L105
  add    $0x1,%rax
L422:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x30(%rcx,%rdx,2),%edx
  cmp    $0xd,%ebp
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L157
  add    $0x1,%rax
L684:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x30(%rcx,%rdx,2),%edx
  cmp    $0xe,%ebp
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L607
  add    $0x1,%rax
L343:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x30(%rcx,%rdx,2),%edx
  cmp    $0xf,%ebp
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L237
  add    $0x1,%rax
L738:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x7(%rbp),%edi
  lea    -0x30(%rcx,%rdx,2),%edx
  cmp    $0x10,%ebp
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L770
  add    $0x1,%rax
L482:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x30(%rcx,%rdx,2),%edx
  cmp    $0xa,%edi
  je     L630
  movsbl (%rax),%ecx
  cmp    $0x2e,%cl
  je     L624
  add    $0x1,%rax
L747:
  lea    (%rdx,%rdx,4),%edx
  lea    -0x30(%rcx,%rdx,2),%edx
L630:
  lea    -0xa(%rbp),%ecx
  xor    %edi,%edi
  neg    %ecx
  cmp    $0x9,%ebp
  cmovle %edi,%ecx
  lea    (%rcx,%rsi,1),%ebp
L486:
  movzbl (%rax),%ecx
  lea    0x1(%rax),%rsi
  cmp    $0x2e,%cl
  jne    L494
  movzbl 0x1(%rax),%ecx
  lea    0x2(%rax),%rsi
L494:
  movsbl %cl,%eax
  sub    $0x30,%eax
  cmp    $0x1,%ebp
  je     L967
  movsbl (%rsi),%ecx
  lea    0x1(%rsi),%rdi
  cmp    $0x2e,%cl
  jne    L868
  movsbl 0x1(%rsi),%ecx
  lea    0x2(%rsi),%rdi
L868:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
  cmp    $0x2,%ebp
  je     L967
  movsbl (%rdi),%ecx
  lea    0x1(%rdi),%rsi
  cmp    $0x2e,%cl
  jne    L962
  movsbl 0x1(%rdi),%ecx
  lea    0x2(%rdi),%rsi
L962:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
  cmp    $0x3,%ebp
  je     L967
  movsbl (%rsi),%ecx
  lea    0x1(%rsi),%rdi
  cmp    $0x2e,%cl
  jne    L290
  movsbl 0x1(%rsi),%ecx
  lea    0x2(%rsi),%rdi
L290:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
  cmp    $0x4,%ebp
  je     L967
  movsbl (%rdi),%ecx
  lea    0x1(%rdi),%rsi
  cmp    $0x2e,%cl
  jne    L544
  movsbl 0x1(%rdi),%ecx
  lea    0x2(%rdi),%rsi
L544:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
  cmp    $0x5,%ebp
  je     L967
  movsbl (%rsi),%ecx
  lea    0x1(%rsi),%rdi
  cmp    $0x2e,%cl
  jne    L339
  movsbl 0x1(%rsi),%ecx
  lea    0x2(%rsi),%rdi
L339:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
  cmp    $0x6,%ebp
  je     L967
  movsbl (%rdi),%ecx
  lea    0x1(%rdi),%rsi
  cmp    $0x2e,%cl
  jne    L558
  movsbl 0x1(%rdi),%ecx
  lea    0x2(%rdi),%rsi
L558:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
  sub    $0x7,%ebp
  je     L967
  movsbl (%rsi),%ecx
  lea    0x1(%rsi),%rdi
  cmp    $0x2e,%cl
  jne    L405
  movsbl 0x1(%rsi),%ecx
  lea    0x2(%rsi),%rdi
L405:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
  cmp    $0x1,%ebp
  je     L967
  movsbl (%rdi),%ecx
  cmp    $0x2e,%cl
  je     L977
L680:
  lea    (%rax,%rax,4),%eax
  lea    -0x30(%rcx,%rax,2),%eax
L967:
  pxor   %xmm0,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %edx,%xmm0
  mulsd  D96(%rip),%xmm0
  cvtsi2sd %eax,%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rsp)
L895:
  movzbl (%rbx),%eax
  mov    %eax,%edx
  and    $0xffffffdf,%edx
  cmp    $0x45,%dl
  je     L647
  sub    $0x44,%eax
  cmp    $0x2f,%al
  ja     L834
  movabs $0x810500008105,%rdx
  bt     %rax,%rdx
  jb     L647
L834:
  test   %r12d,%r12d
  js     L859
L432:
  mov    $0x133,%eax
  cmp    %eax,%r12d
  cmovle %r12d,%eax
  test   %r12d,%r12d
  je     L625
  xor    %edx,%edx
L194:
  movsd  D55(%rip),%xmm0
  test   $0x1,%al
  je     L132
  movsd  D30(%rip),%xmm0
L132:
  mov    %eax,%ecx
  sar    %ecx
  je     L333
  and    $0x1,%ecx
  je     L399
  mulsd  D50(%rip),%xmm0
L399:
  mov    %eax,%ecx
  sar    $0x2,%ecx
  je     L333
  and    $0x1,%ecx
  je     L873
  mulsd  D80(%rip),%xmm0
L873:
  mov    %eax,%ecx
  sar    $0x3,%ecx
  je     L333
  and    $0x1,%ecx
  je     L646
  mulsd  D79(%rip),%xmm0
L646:
  mov    %eax,%ecx
  sar    $0x4,%ecx
  je     L333
  and    $0x1,%ecx
  jne    L833
L415:
  mov    %eax,%ecx
  sar    $0x5,%ecx
  je     L333
  and    $0x1,%ecx
  jne    L296
L6:
  mov    %eax,%ecx
  sar    $0x6,%ecx
  je     L333
  and    $0x1,%ecx
  jne    L591
L298:
  sar    $0x7,%eax
  je     L333
  lea    D6(%rip),%rcx
L739:
  cmp    $0x1,%eax
  jne    L295
  mulsd  0x38(%rcx),%xmm0
L295:
  add    $0x8,%rcx
  sar    %eax
  jne    L739
  cs nopw 0x0(%rax,%rax,1)
L333:
  test   %edx,%edx
  jne    L567
  mulsd  (%rsp),%xmm0
  movsd  %xmm0,(%rsp)
L625:
  test   %r13,%r13
  je     L196
  mov    %rbx,0x0(%r13)
L196:
  mov    0xc(%rsp),%eax
  test   %eax,%eax
  je     L410
  movsd  (%rsp),%xmm2
  xorpd  D75(%rip),%xmm2
  movsd  %xmm2,(%rsp)
L410:
  movsd  (%rsp),%xmm0
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L458:
  test   %ebp,%ebp
  je     L709
  sub    %ebp,%r12d
  cmp    $0x9,%ebp
  jg     L880
  test   %ebp,%ebp
  jg     L280
  pxor   %xmm6,%xmm6
  movsd  %xmm6,(%rsp)
  jmp    L895
  nopw   0x0(%rax,%rax,1)
L328:
  movsbl 0x1(%rax),%edx
  add    $0x2,%rax
  jmp    L898
  nopl   (%rax)
L647:
  movzbl 0x1(%rbx),%eax
  cmp    $0x2d,%al
  je     L184
  cmp    $0x2b,%al
  je     L318
  add    $0x1,%rbx
  xor    %r15d,%r15d
L501:
  xor    %ebp,%ebp
  jmp    L381
  nop
L98:
  movsbl (%rbx),%eax
  lea    0x0(%rbp,%rbp,4),%edx
  add    $0x1,%rbx
  lea    -0x30(%rax,%rdx,2),%ebp
L381:
  movsbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L98
  lea    (%r12,%rbp,1),%eax
  sub    %ebp,%r12d
  test   %r15d,%r15d
  cmove  %eax,%r12d
  test   %r12d,%r12d
  jns    L432
L859:
  mov    %r12d,%eax
  mov    $0x133,%edx
  neg    %eax
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    $0x1,%edx
  jmp    L194
  nopl   0x0(%rax)
L567:
  movsd  (%rsp),%xmm3
  divsd  %xmm0,%xmm3
  movsd  %xmm3,(%rsp)
  jmp    L625
  nopl   0x0(%rax,%rax,1)
L150:
  mov    %ebp,%r12d
  jmp    L668
L659:
  movl   $0x1,0xc(%rsp)
  add    $0x1,%rbx
  jmp    L149
  nopl   0x0(%rax)
L740:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L661
  nopl   (%rax)
L184:
  add    $0x2,%rbx
  mov    $0x1,%r15d
  jmp    L501
  nopw   0x0(%rax,%rax,1)
L833:
  mulsd  D73(%rip),%xmm0
  jmp    L415
L709:
  pxor   %xmm5,%xmm5
  mov    %r15,%rbx
  movsd  %xmm5,(%rsp)
  jmp    L625
L296:
  mulsd  D74(%rip),%xmm0
  jmp    L6
L591:
  mulsd  D44(%rip),%xmm0
  jmp    L298
L977:
  movsbl 0x1(%rdi),%ecx
  jmp    L680
L624:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L747
  xchg   %ax,%ax
L730:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L4
L105:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L422
L157:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L684
L318:
  add    $0x2,%rbx
  xor    %r15d,%r15d
  jmp    L501
L607:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L343
L237:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L738
L770:
  movsbl 0x1(%rax),%ecx
  add    $0x2,%rax
  jmp    L482
L280:
  xor    %edx,%edx
  jmp    L486
```

tool_calls: name: parse_data
arguments: data_label: D96
type_infered: f32[2]
name: parse_data
arguments: data_label: D55
type_infered: f64
name: parse_data
arguments: data_label: D30
type_infered: f64
name: parse_data
arguments: data_label: D50
type_infered: f64
name: parse_data
arguments: data_label: D80
type_infered: f64
name: parse_data
arguments: data_label: D79
type_infered: f64
name: parse_data
arguments: data_label: D6
type_infered: f64
name: parse_data
arguments: data_label: D75
type_infered: f32[4]
name: parse_data
arguments: data_label: D73
type_infered: f64
name: parse_data
arguments: data_label: D74
type_infered: f64
name: parse_data
arguments: data_label: D44
type_infered: f32[2]

tool: {"D96": [0.0,25.725290298461914]}

tool: D55: 1

tool: D30: 10

tool: D50: 100

tool: D80: 10000

tool: D79: 100000000

tool: D6: 10

tool: {"D75": [0.0,-0.0,0.0,0.0]}

tool: D73: 1e+16

tool: D74: 1e+32

tool: {"D44": [0.0,0.0]}

assistant: ```c
double strtod(const char *string, char **endPtr) {
  int sign = 0, expSign = 0, i;
  double fraction, dblExp;
  register const char *p;
  register char c;
  int exp = 0;
  int fracExp = 0;
  int mantSize;
  int decPt;
  const char *pExp;
  static int maxExponent = 307;
  static double powersOf10[] = {
      1e1, 1e2, 1e4, 1e8, 1e16, 1e32,
  };
  p = string;
  while (*p == ' ' || *p == '\t')
    ++p;
  if (*p == '-') {
    sign = 1;
    ++p;
  } else if (*p == '+')
    ++p;
  decPt = -1;
  for (mantSize = 0;; ++mantSize) {
    c = *p;
    if (!isdigit(c)) {
      if (c != '.' || decPt >= 0)
        break;
      decPt = mantSize;
    }
    ++p;
  }
  pExp = p;
  p -= mantSize;
  if (decPt < 0)
    decPt = mantSize;
  else
    --mantSize;
  if (mantSize > 2 * 9)
    mantSize = 2 * 9;
  fracExp = decPt - mantSize;
  if (mantSize == 0) {
    fraction = 0.0;
    p = string;
    goto done;
  } else {
    int frac1, frac2;
    for (frac1 = 0; mantSize > 9; --mantSize) {
      c = *p++;
      if (c == '.')
        c = *p++;
      frac1 = frac1 * 10 + (c - '0');
    }
    for (frac2 = 0; mantSize > 0; --mantSize) {
      c = *p++;
      if (c == '.')
        c = *p++;
      frac2 = frac2 * 10 + (c - '0');
    }
    fraction = (double)1000000000 * frac1 + frac2;
  }
  p = pExp;
  if (*p == 'E' || *p == 'e' || *p == 'S' || *p == 's' || *p == 'F' || *p == 'f' || *p == 'D' || *p == 'd' || *p == 'L' || *p == 'l') {
    ++p;
    if (*p == '-') {
      expSign = 1;
      ++p;
    } else if (*p == '+')
      ++p;
    while (isdigit(*p))
      exp = exp * 10 + (*p++ - '0');
  }
  if (expSign)
    exp = fracExp - exp;
  else
    exp = fracExp + exp;
  if (exp < 0) {
    expSign = 1;
    exp = -exp;
  } else
    expSign = 0;
  if (exp > maxExponent)
    exp = maxExponent;
  dblExp = 1.0;
  for (i = 0; exp; exp >>= 1, ++i)
    if (exp & 01)
      dblExp *= powersOf10[i];
  if (expSign)
    fraction /= dblExp;
  else
    fraction *= dblExp;
done:
  if (endPtr)
    *endPtr = (char *)p;
  return sign ? -fraction : fraction;
}
```