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

```asm
<Q_atof>:
  endbr64
  movzbl (%rdi),%eax
  test   %al,%al
  je     L176
  cmp    $0x20,%al
  jg     L176
L204:
  add    $0x1,%rdi
  movzbl (%rdi),%eax
  test   %al,%al
  je     L176
  cmp    $0x20,%al
  jle    L204
L176:
  mov    $0x1,%ecx
  cmp    $0x2d,%al
  je     L80
L14:
  movzbl (%rdi),%eax
  cmp    $0x30,%al
  je     L0
  cmp    $0x27,%al
  je     L191
  mov    $0x0,%edx
  mov    $0xffffffff,%r8d
  pxor   %xmm1,%xmm1
L116:
  movsd  D73(%rip),%xmm3
  movsd  D68(%rip),%xmm2
  jmp    L45
L80:
  add    $0x1,%rdi
  mov    $0xffffffff,%ecx
  jmp    L14
L0:
  movzbl 0x1(%rdi),%eax
  and    $0xffffffdf,%eax
  cmp    $0x58,%al
  je     L171
  mov    $0x0,%edx
  mov    $0xffffffff,%r8d
  pxor   %xmm1,%xmm1
  jmp    L116
L171:
  add    $0x2,%rdi
  pxor   %xmm0,%xmm0
  movsd  D12(%rip),%xmm8
  movsd  D70(%rip),%xmm7
  movsd  D73(%rip),%xmm6
  movapd %xmm8,%xmm5
  movsd  D33(%rip),%xmm4
  movapd %xmm6,%xmm3
  movapd %xmm8,%xmm2
  movsd  D68(%rip),%xmm1
  jmp    L102
L212:
  lea    -0x61(%rdx),%esi
  cmp    $0x5,%esi
  ja     L222
  mulsd  %xmm5,%xmm0
  movsbl %al,%eax
  pxor   %xmm9,%xmm9
  cvtsi2sd %eax,%xmm9
  addsd  %xmm9,%xmm0
  subsd  %xmm4,%xmm0
  addsd  %xmm3,%xmm0
L102:
  add    $0x1,%rdi
  movzbl -0x1(%rdi),%eax
  movsbl %al,%edx
  lea    -0x30(%rdx),%esi
  cmp    $0x9,%esi
  ja     L212
  mulsd  %xmm2,%xmm0
  pxor   %xmm9,%xmm9
  cvtsi2sd %edx,%xmm9
  addsd  %xmm9,%xmm0
  subsd  %xmm1,%xmm0
  jmp    L102
L222:
  sub    $0x41,%edx
  cmp    $0x5,%edx
  ja     L86
  mulsd  %xmm8,%xmm0
  movsbl %al,%eax
  pxor   %xmm9,%xmm9
  cvtsi2sd %eax,%xmm9
  addsd  %xmm9,%xmm0
  subsd  %xmm7,%xmm0
  addsd  %xmm6,%xmm0
  jmp    L102
L86:
  pxor   %xmm1,%xmm1
  cvtsi2sd %ecx,%xmm1
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  ret
L191:
  movsbl 0x1(%rdi),%eax
  imul   %ecx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  ret
L122:
  mov    %edx,%r8d
L45:
  add    $0x1,%rdi
  movzbl -0x1(%rdi),%eax
  cmp    $0x2e,%al
  je     L122
  movsbl %al,%esi
  sub    $0x30,%esi
  cmp    $0x9,%esi
  ja     L210
  mulsd  %xmm3,%xmm1
  movsbl %al,%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  addsd  %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  add    $0x1,%edx
  jmp    L45
L210:
  cmp    $0xffffffff,%r8d
  je     L60
  movsd  D73(%rip),%xmm0
  cmp    %edx,%r8d
  jge    L189
L28:
  divsd  %xmm0,%xmm1
  sub    $0x1,%edx
  cmp    %edx,%r8d
  jne    L28
L189:
  pxor   %xmm0,%xmm0
  cvtsi2sd %ecx,%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  ret
L60:
  pxor   %xmm0,%xmm0
  cvtsi2sd %ecx,%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  ret
```

tool_calls: name: read_data
arguments: label: D73
type: byte[8]
name: read_data
arguments: label: D68
type: byte[8]
name: read_data
arguments: label: D12
type: byte[8]
name: read_data
arguments: label: D70
type: byte[8]
name: read_data
arguments: label: D33
type: byte[8]

tool: {"D73": [0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x40]}

tool: {"D68": [0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x40]}

tool: {"D12": [0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x40]}

tool: {"D70": [0x00,0x00,0x00,0x00,0x00,0x40,0x50,0x40]}

tool: {"D33": [0x00,0x00,0x00,0x00,0x00,0x40,0x58,0x40]}

assistant: ```c
float Q_atof(char *str) {
  double val;
  int sign;
  int c;
  int decimal, total;
  while ((*str) && (*str <= ' ')) {
    str++;
  }
  if (*str == '-') {
    sign = -1;
    str++;
  } else
    sign = 1;
  val = 0;
  if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
    str += 2;
    while (1) {
      c = *str++;
      if (c >= '0' && c <= '9')
        val = (val * 16) + c - '0';
      else if (c >= 'a' && c <= 'f')
        val = (val * 16) + c - 'a' + 10;
      else if (c >= 'A' && c <= 'F')
        val = (val * 16) + c - 'A' + 10;
      else
        return val * sign;
    }
  }
  if (str[0] == '\'') {
    return sign * str[1];
  }
  decimal = -1;
  total = 0;
  while (1) {
    c = *str++;
    if (c == '.') {
      decimal = total;
      continue;
    }
    if (c < '0' || c > '9')
      break;
    val = val * 10 + c - '0';
    total++;
  }
  if (decimal == -1)
    return val * sign;
  while (total > decimal) {
    val /= 10;
    total--;
  }
  return val * sign;
}
```