user: Please show me the C implementation that matches the assembly code listed below:

```asm
<svtParseFloat>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  movl   $0x0,-0x8(%rbp)
  mov    -0x30(%rbp),%rax
  pxor   %xmm0,%xmm0
  movss  %xmm0,(%rax)
  cmpb   $0x2d,-0x11(%rbp)
  jne    L113
  movl   $0x1,-0x8(%rbp)
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  jmp    L316
L113:
  cmpb   $0x2b,-0x11(%rbp)
  jne    L316
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  jmp    L316
L84:
  cmpb   $0x2e,-0x11(%rbp)
  je     L62
  cmpb   $0x65,-0x11(%rbp)
  je     L62
  cmpb   $0x45,-0x11(%rbp)
  je     L62
  cmpb   $0x2f,-0x11(%rbp)
  jle    L4
  cmpb   $0x39,-0x11(%rbp)
  jle    L287
L4:
  mov    $0xffffffff,%eax
  jmp    L2
L287:
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm1
  movss  D54(%rip),%xmm0
  mulss  %xmm0,%xmm1
  movsbl -0x11(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  addss  %xmm1,%xmm0
  movss  D34(%rip),%xmm1
  subss  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  movss  %xmm0,(%rax)
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
L316:
  cmpb   $0x0,-0x11(%rbp)
  jne    L84
L62:
  cmpb   $0x2e,-0x11(%rbp)
  jne    L261
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  movss  D8(%rip),%xmm0
  movss  %xmm0,-0xc(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x10(%rbp)
  jmp    L91
L21:
  cmpb   $0x65,-0x11(%rbp)
  je     L317
  cmpb   $0x45,-0x11(%rbp)
  je     L317
  cmpb   $0x2f,-0x11(%rbp)
  jle    L168
  cmpb   $0x39,-0x11(%rbp)
  jle    L173
L168:
  mov    $0xffffffff,%eax
  jmp    L2
L173:
  movsbl -0x11(%rbp),%eax
  sub    $0x30,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mulss  -0xc(%rbp),%xmm0
  movss  -0x10(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x10(%rbp)
  pxor   %xmm1,%xmm1
  cvtss2sd -0xc(%rbp),%xmm1
  movsd  D50(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0xc(%rbp)
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
L91:
  cmpb   $0x0,-0x11(%rbp)
  jne    L21
L317:
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm0
  addss  -0x10(%rbp),%xmm0
  mov    -0x30(%rbp),%rax
  movss  %xmm0,(%rax)
L261:
  cmpl   $0x0,-0x8(%rbp)
  je     L298
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm0
  movss  D20(%rip),%xmm1
  xorps  %xmm1,%xmm0
  mov    -0x30(%rbp),%rax
  movss  %xmm0,(%rax)
L298:
  cmpb   $0x65,-0x11(%rbp)
  je     L248
  cmpb   $0x45,-0x11(%rbp)
  jne    L18
L248:
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  movl   $0x0,-0x8(%rbp)
  movl   $0x0,-0x4(%rbp)
  cmpb   $0x2d,-0x11(%rbp)
  jne    L127
  movl   $0x1,-0x8(%rbp)
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  jmp    L319
L127:
  cmpb   $0x2b,-0x11(%rbp)
  jne    L319
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  jmp    L319
L268:
  cmpb   $0x2f,-0x11(%rbp)
  jle    L215
  cmpb   $0x39,-0x11(%rbp)
  jle    L39
L215:
  mov    $0xffffffff,%eax
  jmp    L2
L39:
  mov    -0x4(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  movsbl -0x11(%rbp),%eax
  sub    $0x30,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
L319:
  cmpb   $0x0,-0x11(%rbp)
  jne    L268
  cmpl   $0x0,-0x8(%rbp)
  je     L106
  negl   -0x4(%rbp)
L106:
  cmpl   $0x0,-0x4(%rbp)
  je     L18
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  mov    D54(%rip),%eax
  movd   %eax,%xmm0
  call   <powf@plt>
  movd   %xmm0,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  -0xc(%rbp),%xmm0
  mov    -0x30(%rbp),%rax
  movss  %xmm0,(%rax)
L18:
  mov    $0x0,%eax
L2:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D54
type_infered: byte[4]
name: extract_symbolic_data
arguments: data_label: D34
type_infered: byte[4]
name: extract_symbolic_data
arguments: data_label: D8
type_infered: f32
name: extract_symbolic_data
arguments: data_label: D50
type_infered: byte[8]
name: extract_symbolic_data
arguments: data_label: D20
type_infered: byte[4]

tool: {"D54": [0x00,0x00,0x20,0x41]}

tool: {"D34": [0x00,0x00,0x40,0x42]}

tool: D8: 0.1

tool: {"D50": [0x9a,0x99,0x99,0x99,0x99,0x99,0xb9,0x3f]}

tool: {"D20": [0x00,0x00,0x00,0x80]}

assistant: ```c
int svtParseFloat(const char *str, float *val) {
  char c = *str;
  float fract;
  float mult;
  int negative = 0;
  int num;
  *val = 0.0;
  if (c == '-') {
    negative = 1;
    c = *++str;
  } else if (c == '+')
    c = *++str;
  while (c != 0) {
    if (c == '.' || c == 'e' || c == 'E')
      break;
    if (c < 48 || c > 57)
      return -1;
    *val = *val * 10 + c - 48;
    c = *++str;
  }
  if (c == '.') {
    c = *++str;
    mult = 0.1;
    fract = 0.f;
    while (c != 0) {
      if (c == 'e' || c == 'E')
        break;
      if (c < 48 || c > 57)
        return -1;
      fract = fract + mult * (c - 48);
      mult *= 0.1;
      c = *++str;
    }
    *val += fract;
  }
  if (negative)
    *val = *val * -1.f;
  if (c == 'e' || c == 'E') {
    c = *++str;
    negative = 0;
    num = 0;
    if (c == '-') {
      negative = 1;
      c = *++str;
    } else if (c == '+')
      c = *++str;
    while (c != 0) {
      if (c < 48 || c > 57)
        return -1;
      num = num * 10 + (c - 48);
      c = *++str;
    }
    if (negative)
      num *= -1;
    if (num != 0) {
      mult = powf(10.f, num);
      *val *= mult;
    }
  }
  return 0;
}
```