user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<luaO_str2d>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    D1(%rip),%rbp
  jmp    L16
L64:
  movq   %rbp,%xmm0
  mulsd  D23(%rip),%xmm0
  add    $0x1,%rbx
  movsbl -0x1(%rbx),%eax
  sub    $0x30,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movq   %xmm1,%rbp
L16:
  movzbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L64
  mov    $0x0,%r12d
  cmpb   $0x2e,(%rbx)
  je     L186
L42:
  movzbl (%rbx),%edi
  call   <toupper@plt>
  cmp    $0x45,%al
  jne    L37
  movzbl 0x1(%rbx),%eax
  cmp    $0x2d,%al
  je     L146
  cmp    $0x2b,%al
  je     L163
  add    $0x1,%rbx
  mov    $0x1,%r14d
L76:
  movzbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L130
  mov    $0x0,%r13d
L33:
  lea    0x0(%r13,%r13,4),%edx
  add    $0x1,%rbx
  movsbl -0x1(%rbx),%eax
  lea    -0x30(%rax,%rdx,2),%r13d
  movzbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L33
  imul   %r13d,%r14d
  sub    %r14d,%r12d
  jmp    L37
L186:
  add    $0x1,%rbx
  jmp    L63
L72:
  movq   %rbp,%xmm0
  mulsd  D23(%rip),%xmm0
  add    $0x1,%rbx
  movsbl -0x1(%rbx),%eax
  sub    $0x30,%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movq   %xmm1,%rbp
  add    $0x1,%r12d
L63:
  movzbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L72
  jmp    L42
L146:
  add    $0x2,%rbx
  mov    $0xffffffff,%r14d
  jmp    L76
L163:
  add    $0x2,%rbx
  mov    $0x1,%r14d
  jmp    L76
L113:
  add    $0x1,%rbx
L37:
  movzbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L113
  cmpb   $0x0,(%rbx)
  jne    L177
  test   %r12d,%r12d
  jg     L202
  jns    L107
  mov    %r12d,%edi
  neg    %edi
  call   <expten@plt>
  movq   %rbp,%xmm3
  mulsd  %xmm0,%xmm3
  movq   %xmm3,%rbp
  jmp    L107
L202:
  mov    %r12d,%edi
  call   <expten@plt>
  movq   %rbp,%xmm2
  divsd  %xmm0,%xmm2
  movq   %xmm2,%rbp
  jmp    L107
L130:
  mov    D44(%rip),%rbp
  jmp    L107
L177:
  mov    D44(%rip),%rbp
L107:
  movq   %rbp,%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

tool_calls: name: read_data
arguments: label: D1
data_type: f64
name: read_data
arguments: label: D23
data_type: f64
name: read_data
arguments: label: D44
data_type: byte[8]

tool: D1: 0

tool: D23: 10

tool: {"D44": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

assistant: ```c
double luaO_str2d(char *s) {
  double a = 0.0;
  int point = 0;
  while (isdigit((unsigned char)*s)) {
    a = 10.0 * a + (*(s++) - '0');
  }
  if (*s == '.') {
    s++;
    while (isdigit((unsigned char)*s)) {
      a = 10.0 * a + (*(s++) - '0');
      point++;
    }
  }
  if (toupper((unsigned char)*s) == 'E') {
    int e = 0;
    int sig = 1;
    s++;
    if (*s == '-') {
      s++;
      sig = -1;
    } else if (*s == '+')
      s++;
    if (!isdigit((unsigned char)*s))
      return -1;
    do {
      e = 10 * e + (*(s++) - '0');
    } while (isdigit((unsigned char)*s));
    point -= sig * e;
  }
  while (isspace((unsigned char)*s))
    s++;
  if (*s != '\0')
    return -1;
  if (point > 0)
    a /= expten(point);
  else if (point < 0)
    a *= expten(-point);
  return a;
}
```