user: What would the C source look like for the assembly code provided here?

```asm
<luaO_str2d>:
  endbr64
  push   %r13
  pxor   %xmm4,%xmm4
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x18,%rsp
  movsd  %xmm4,0x8(%rsp)
  jmp    L189
  nopl   (%rax)
L63:
  movsbl (%rbx),%eax
  movsd  D12(%rip),%xmm0
  pxor   %xmm1,%xmm1
  add    $0x1,%rbx
  mulsd  0x8(%rsp),%xmm0
  sub    $0x30,%eax
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x8(%rsp)
L189:
  movzbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L63
  movzbl (%rbx),%edi
  xor    %ebp,%ebp
  cmp    $0x2e,%dil
  je     L21
L69:
  call   <toupper@plt>
  cmp    $0x45,%al
  jne    L39
  jmp    L162
  nopl   0x0(%rax)
L152:
  add    $0x1,%rbx
L39:
  movzbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L152
  cmpb   $0x0,(%rbx)
  jne    L50
  test   %ebp,%ebp
  jg     L82
  jne    L96
L59:
  movsd  0x8(%rsp),%xmm0
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
  nopl   0x0(%rax)
L82:
  mov    %ebp,%edi
  call   <expten@plt>
  movsd  0x8(%rsp),%xmm6
  divsd  %xmm0,%xmm6
  movsd  %xmm6,0x8(%rsp)
  jmp    L59
  nopl   0x0(%rax)
L50:
  movsd  D29(%rip),%xmm5
  movsd  %xmm5,0x8(%rsp)
  jmp    L59
L162:
  movzbl 0x1(%rbx),%edi
  cmp    $0x2d,%dil
  je     L200
  cmp    $0x2b,%dil
  je     L120
  add    $0x1,%rbx
  mov    $0x1,%r13d
L75:
  call   <isdigit@plt>
  xor    %r12d,%r12d
  test   %rax,%rax
  je     L50
  nop
L186:
  movsbl (%rbx),%eax
  movzbl 0x1(%rbx),%edi
  lea    (%r12,%r12,4),%edx
  add    $0x1,%rbx
  lea    -0x30(%rax,%rdx,2),%r12d
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L186
  imul   %r12d,%r13d
  sub    %r13d,%ebp
  jmp    L39
  nopw   0x0(%rax,%rax,1)
L21:
  add    $0x1,%rbx
  jmp    L131
  cs nopw 0x0(%rax,%rax,1)
L166:
  movsbl (%rbx),%eax
  pxor   %xmm1,%xmm1
  add    $0x1,%rbx
  add    $0x1,%ebp
  movsd  D12(%rip),%xmm0
  mulsd  0x8(%rsp),%xmm0
  sub    $0x30,%eax
  cvtsi2sd %eax,%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x8(%rsp)
L131:
  movzbl (%rbx),%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L166
  movzbl (%rbx),%edi
  jmp    L69
L120:
  movzbl 0x2(%rbx),%edi
  mov    $0x1,%r13d
  add    $0x2,%rbx
  jmp    L75
  nopl   (%rax)
L200:
  movzbl 0x2(%rbx),%edi
  mov    $0xffffffff,%r13d
  add    $0x2,%rbx
  jmp    L75
  nopl   0x0(%rax,%rax,1)
L96:
  mov    %ebp,%edi
  neg    %edi
  call   <expten@plt>
  mulsd  0x8(%rsp),%xmm0
  movsd  %xmm0,0x8(%rsp)
  jmp    L59
```

tool_calls: name: unpack_data
arguments: label: D12
type_guessed: f64
name: unpack_data
arguments: label: D29
type_guessed: f32[2]

tool: D12: 10

tool: {"D29": [0.0,-1.875]}

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