user: 请将以下的汇编代码转换成C语言代码:

```asm
<BGBDT_TagParse_ParseFloat>:
  endbr64
  movzbl (%rdi),%edx
  movsd  D22(%rip),%xmm4
  pxor   %xmm0,%xmm0
  cmp    $0x2d,%dl
  jne    L164
  movsd  D52(%rip),%xmm0
  movsd  D24(%rip),%xmm4
  add    $0x1,%rdi
  movzbl (%rdi),%edx
L164:
  test   %dl,%dl
  je     L119
  pxor   %xmm2,%xmm2
  movsd  D8(%rip),%xmm3
  movapd %xmm2,%xmm0
  nopw   0x0(%rax,%rax,1)
L53:
  add    $0x1,%rdi
  movsbl %dl,%eax
  cmp    $0x5f,%dl
  je     L163
  cmp    $0x2e,%eax
  je     L114
  sub    $0x30,%eax
  movapd %xmm2,%xmm1
  cmp    $0x9,%eax
  ja     L27
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
L27:
  mulsd  %xmm3,%xmm0
  addsd  %xmm1,%xmm0
L163:
  movzbl (%rdi),%edx
  test   %dl,%dl
  jne    L53
L68:
  mulsd  %xmm4,%xmm0
  ret
  nopl   0x0(%rax)
L114:
  movsd  D3(%rip),%xmm3
  movzbl (%rdi),%edx
  movapd %xmm3,%xmm2
  test   %dl,%dl
  je     L68
  nopl   0x0(%rax,%rax,1)
L18:
  mov    %rdi,%rcx
  movsbl %dl,%eax
  add    $0x1,%rdi
  cmp    $0x5f,%dl
  je     L80
  sub    $0x30,%eax
  cmp    $0x9,%eax
  ja     L4
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  mulsd  %xmm2,%xmm1
  mulsd  %xmm3,%xmm2
  addsd  %xmm1,%xmm0
L80:
  movzbl (%rdi),%edx
  test   %dl,%dl
  jne    L18
  mulsd  %xmm4,%xmm0
  ret
  nop
L4:
  movzbl (%rdi),%eax
  and    $0xffffffdf,%eax
  cmp    $0x45,%al
  jne    L68
  sub    $0x18,%rsp
  cmpb   $0x2b,0x1(%rdi)
  lea    0x2(%rdi),%r8
  je     L22
  lea    0x2(%rcx),%r8
L22:
  mov    %r8,%rdi
  movsd  %xmm4,0x8(%rsp)
  movsd  %xmm0,(%rsp)
  call   <BGBDT_TagParse_ParseInt@plt>
  movsd  (%rsp),%xmm0
  mov    D3(%rip),%rsi
  test   %eax,%eax
  movsd  0x8(%rsp),%xmm4
  movq   %rsi,%xmm3
  jle    L159
  movsd  D8(%rip),%xmm1
  sub    $0x1,%eax
  nopl   (%rax)
L65:
  mulsd  %xmm1,%xmm0
  sub    $0x1,%eax
  jae    L65
L160:
  mulsd  %xmm4,%xmm0
  add    $0x18,%rsp
  ret
L159:
  je     L160
  not    %eax
  xchg   %ax,%ax
L153:
  mulsd  %xmm3,%xmm0
  sub    $0x1,%eax
  jae    L153
  jmp    L160
L119:
  ret
```

tool_calls: name: read_data
arguments: data_label: D22
type_infered: byte[8]
name: read_data
arguments: data_label: D52
type_infered: byte[8]
name: read_data
arguments: data_label: D24
type_infered: byte[8]
name: read_data
arguments: data_label: D8
type_infered: byte[8]
name: read_data
arguments: data_label: D3
type_infered: f64

tool: {"D22": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

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

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

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

tool: D3: 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);
}
```