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

```asm
<BGBDT_TagParse_ParseFloat>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    $0x1,%ebp
  cmpb   $0x2d,(%rdi)
  je     L154
L81:
  movzbl (%rdi),%eax
  test   %al,%al
  je     L19
  mov    D46(%rip),%rbx
  mov    $0x0,%esi
  movsd  D56(%rip),%xmm2
  jmp    L57
L154:
  add    $0x1,%rdi
  mov    $0xffffffff,%ebp
  jmp    L81
L144:
  movzbl (%rdi),%eax
  test   %al,%al
  je     L130
L57:
  mov    %rdi,%rcx
  add    $0x1,%rdi
  movsbl %al,%edx
  cmp    $0x5f,%al
  je     L144
  cmp    $0x2e,%edx
  je     L14
  mov    %edx,%eax
  sub    $0x30,%eax
  mov    %eax,%edx
  cmp    $0xa,%eax
  cmovae %esi,%edx
  movq   %rbx,%xmm0
  mulsd  %xmm2,%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sd %edx,%xmm1
  addsd  %xmm0,%xmm1
  movq   %xmm1,%rbx
  jmp    L144
L188:
  movzbl (%rdx),%eax
  test   %al,%al
  je     L130
L115:
  mov    %rdx,%rsi
  add    $0x1,%rdx
  movsbl %al,%ecx
  cmp    $0x5f,%al
  je     L188
  mov    %ecx,%eax
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L60
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  mulsd  %xmm1,%xmm0
  movq   %rbx,%xmm3
  addsd  %xmm0,%xmm3
  movq   %xmm3,%rbx
  mulsd  %xmm2,%xmm1
  jmp    L188
L60:
  movzbl (%rdx),%eax
  and    $0xffffffdf,%eax
  cmp    $0x45,%al
  jne    L130
  lea    0x2(%rdx),%rdi
  cmpb   $0x2b,0x1(%rdx)
  je     L82
  lea    0x2(%rsi),%rdi
L82:
  call   <BGBDT_TagParse_ParseInt@plt>
  test   %eax,%eax
  jle    L9
  sub    $0x1,%eax
  movsd  D56(%rip),%xmm0
L40:
  movq   %rbx,%xmm4
  mulsd  %xmm0,%xmm4
  movq   %xmm4,%rbx
  sub    $0x1,%eax
  cmp    $0xffffffff,%eax
  jne    L40
L130:
  pxor   %xmm0,%xmm0
  cvtsi2sd %ebp,%xmm0
  movq   %rbx,%xmm5
  mulsd  %xmm5,%xmm0
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
L9:
  jns    L130
  not    %eax
  movsd  D41(%rip),%xmm0
L20:
  movq   %rbx,%xmm6
  mulsd  %xmm0,%xmm6
  movq   %xmm6,%rbx
  sub    $0x1,%eax
  cmp    $0xffffffff,%eax
  jne    L20
  jmp    L130
L19:
  mov    D46(%rip),%rbx
  jmp    L130
L14:
  lea    0x1(%rcx),%rdx
  movzbl 0x1(%rcx),%eax
  movsd  D41(%rip),%xmm1
  movapd %xmm1,%xmm2
  test   %al,%al
  jne    L115
  jmp    L130
```

tool_calls: name: disassemble_data
arguments: label: D46
type: byte[8]
name: disassemble_data
arguments: label: D56
type: byte[8]
name: disassemble_data
arguments: label: D41
type: f64

tool: {"D46": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

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

tool: D41: 0.1

assistant: ```c
double BGBDT_TagParse_ParseFloat(char *s) {
  double v, sc;
  int sg, se;
  int i, j, k;
  if (*s == '-') {
    s++;
    sg = -1;
  } else {
    sg = 1;
  }
  v = 0;
  while (*s) {
    i = *s++;
    j = 0;
    if (i == '_')
      continue;
    if (i == '.') {
      s--;
      break;
    }
    if ((i >= '0') && (i <= '9')) {
      j = i - '0';
    }
    v = (v * 10) + j;
  }
  if (*s == '.') {
    s++;
    sc = 0.1;
    while (*s) {
      i = *s++;
      j = 0;
      if (i == '_')
        continue;
      if ((i >= '0') && (i <= '9')) {
        j = i - '0';
      } else {
        break;
      }
      v = v + (j * sc);
      sc = sc * 0.1;
    }
    if ((*s == 'e') || (*s == 'E')) {
      s++;
      if (*s == '+')
        s++;
      se = BGBDT_TagParse_ParseInt(s);
      if (se > 0) {
        i = se;
        while (i--)
          v = v * 10;
      } else if (se < 0) {
        i = -se;
        while (i--)
          v = v * 0.1;
      }
    }
  }
  return (v * sg);
}
```