user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<__dtostr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  movsd  %xmm0,-0x68(%rbp)
  mov    %rdi,-0x70(%rbp)
  mov    %esi,-0x74(%rbp)
  mov    %edx,-0x78(%rbp)
  mov    %ecx,-0x7c(%rbp)
  mov    %r8d,-0x80(%rbp)
  movsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  shr    $0x34,%rax
  and    $0x7ff,%eax
  sub    $0x3ff,%rax
  mov    %rax,-0x28(%rbp)
  movsd  -0x68(%rbp),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x68(%rbp),%rax
  movq   %rax,%xmm0
  call   <isinf@plt>
  mov    %eax,-0x50(%rbp)
  cmpl   $0x0,-0x50(%rbp)
  je     L47
  cmpl   $0x0,-0x50(%rbp)
  je     L214
  lea    D74(%rip),%rax
  jmp    L132
L214:
  lea    D142(%rip),%rax
L132:
  mov    -0x74(%rbp),%esi
  mov    -0x70(%rbp),%rcx
  mov    %rax,%rdx
  mov    %rcx,%rdi
  call   <copystring@plt>
  jmp    L49
L47:
  mov    -0x68(%rbp),%rax
  movq   %rax,%xmm0
  call   <isnan@plt>
  test   %rax,%rax
  je     L38
  mov    -0x74(%rbp),%ecx
  mov    -0x70(%rbp),%rax
  lea    D109(%rip),%rdx
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <copystring@plt>
  jmp    L49
L38:
  pxor   %xmm1,%xmm1
  cvtsi2sdq -0x28(%rbp),%xmm1
  movsd  D80(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  cvttsd2si %xmm0,%rax
  add    $0x1,%rax
  mov    %rax,-0x38(%rbp)
  pxor   %xmm0,%xmm0
  ucomisd -0x68(%rbp),%xmm0
  jp     L312
  pxor   %xmm0,%xmm0
  ucomisd -0x68(%rbp),%xmm0
  jne    L312
  cmpl   $0x0,-0x7c(%rbp)
  je     L555
  mov    -0x7c(%rbp),%eax
  add    $0x2,%eax
  jmp    L297
L555:
  mov    $0x1,%eax
L297:
  mov    %eax,-0x7c(%rbp)
  mov    -0x7c(%rbp),%eax
  cmp    -0x74(%rbp),%eax
  ja     L564
  mov    -0x7c(%rbp),%eax
  jmp    L535
L564:
  mov    $0x8,%eax
L535:
  mov    %eax,-0x7c(%rbp)
  movl   $0x0,-0x50(%rbp)
  cmpl   $0x0,-0x7c(%rbp)
  je     L65
  mov    -0x40(%rbp),%rax
  test   %rax,%rax
  jns    L65
  mov    -0x70(%rbp),%rax
  movb   $0x2d,(%rax)
  addl   $0x1,-0x50(%rbp)
  jmp    L65
L173:
  mov    -0x50(%rbp),%edx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movb   $0x30,(%rax)
  addl   $0x1,-0x50(%rbp)
L65:
  mov    -0x50(%rbp),%eax
  cmp    -0x7c(%rbp),%eax
  jb     L173
  mov    -0x70(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x30,%al
  jne    L407
  mov    $0x1,%edx
  jmp    L572
L407:
  mov    $0x2,%edx
L572:
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movb   $0x2e,(%rax)
  mov    -0x50(%rbp),%edx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x50(%rbp),%eax
  jmp    L49
L312:
  pxor   %xmm0,%xmm0
  comisd -0x68(%rbp),%xmm0
  jbe    L251
  movsd  -0x68(%rbp),%xmm0
  movq   D4(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0x70(%rbp),%rax
  movb   $0x2d,(%rax)
  subl   $0x1,-0x74(%rbp)
  addq   $0x1,-0x70(%rbp)
L251:
  movsd  D121(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movl   $0x0,-0x50(%rbp)
  jmp    L110
L331:
  movsd  -0x30(%rbp),%xmm1
  movsd  D36(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  addl   $0x1,-0x50(%rbp)
L110:
  mov    -0x50(%rbp),%eax
  cmp    -0x7c(%rbp),%eax
  jb     L331
  movsd  -0x68(%rbp),%xmm0
  addsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  D63(%rip),%xmm0
  comisd -0x68(%rbp),%xmm0
  jbe    L458
  mov    -0x70(%rbp),%rax
  movb   $0x30,(%rax)
  subl   $0x1,-0x74(%rbp)
  addq   $0x1,-0x70(%rbp)
L458:
  cmpq   $0x0,-0x38(%rbp)
  jle    L88
  movl   $0x1,-0x4c(%rbp)
  movsd  D84(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %eax,-0x50(%rbp)
  jmp    L357
L406:
  movsd  -0x30(%rbp),%xmm1
  movsd  D95(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  subl   $0xa,-0x50(%rbp)
L357:
  cmpl   $0xa,-0x50(%rbp)
  ja     L406
  jmp    L597
L552:
  movsd  -0x30(%rbp),%xmm1
  movsd  D84(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  subl   $0x1,-0x50(%rbp)
L597:
  cmpl   $0x1,-0x50(%rbp)
  ja     L552
  jmp    L403
L206:
  movsd  -0x68(%rbp),%xmm0
  divsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  cvttsd2si %xmm0,%eax
  mov    %al,-0x52(%rbp)
  cmpl   $0x0,-0x4c(%rbp)
  je     L518
  cmpb   $0x0,-0x52(%rbp)
  je     L141
L518:
  movl   $0x0,-0x4c(%rbp)
  movzbl -0x52(%rbp),%eax
  add    $0x30,%eax
  mov    %eax,%edx
  mov    -0x70(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x70(%rbp)
  cmpl   $0x0,-0x74(%rbp)
  jne    L307
  movsd  -0x20(%rbp),%xmm0
  divsd  -0x30(%rbp),%xmm0
  movq   %xmm0,%rax
  mov    -0x7c(%rbp),%ecx
  mov    -0x78(%rbp),%edx
  mov    -0x74(%rbp),%esi
  mov    -0x18(%rbp),%rdi
  mov    $0x0,%r8d
  movq   %rax,%xmm0
  call   <__dtostr>
  mov    %eax,-0x48(%rbp)
  movl   $0x1,-0x44(%rbp)
  cmpl   $0x0,-0x48(%rbp)
  jne    L446
  mov    $0x0,%eax
  jmp    L49
L446:
  mov    -0x48(%rbp),%eax
  sub    %eax,-0x74(%rbp)
  mov    -0x48(%rbp),%eax
  cltq
  add    %rax,-0x70(%rbp)
  cmpl   $0x0,-0x74(%rbp)
  je     L595
  mov    -0x70(%rbp),%rax
  movb   $0x65,(%rax)
  addq   $0x1,-0x70(%rbp)
L595:
  subl   $0x1,-0x74(%rbp)
  movl   $0x3e8,-0x48(%rbp)
  jmp    L187
L387:
  mov    -0x48(%rbp),%eax
  cltq
  cmp    %rax,-0x38(%rbp)
  jge    L322
  cmpl   $0x0,-0x44(%rbp)
  jne    L107
L322:
  cmpl   $0x0,-0x74(%rbp)
  je     L377
  mov    -0x48(%rbp),%eax
  movslq %eax,%rdi
  mov    -0x38(%rbp),%rax
  cqto
  idiv   %rdi
  add    $0x30,%eax
  mov    %eax,%edx
  mov    -0x70(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x70(%rbp)
L377:
  subl   $0x1,-0x74(%rbp)
  movl   $0x0,-0x44(%rbp)
  mov    -0x48(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x38(%rbp),%rax
  cqto
  idiv   %rcx
  mov    %rdx,-0x38(%rbp)
L107:
  mov    -0x48(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x48(%rbp)
L187:
  cmpl   $0x0,-0x48(%rbp)
  jg     L387
  cmpl   $0x0,-0x74(%rbp)
  jne    L250
  mov    $0x0,%eax
  jmp    L49
L307:
  movsbl -0x52(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x30(%rbp),%xmm1
  movsd  -0x68(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  subl   $0x1,-0x74(%rbp)
L141:
  movsd  -0x30(%rbp),%xmm0
  movsd  D84(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
L403:
  movsd  -0x30(%rbp),%xmm0
  comisd D37(%rip),%xmm0
  ja     L206
  jmp    L317
L88:
  movsd  D36(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
L317:
  mov    -0x70(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jne    L417
  cmpl   $0x0,-0x74(%rbp)
  jne    L316
  mov    $0x0,%eax
  jmp    L49
L316:
  subl   $0x1,-0x74(%rbp)
  mov    -0x70(%rbp),%rax
  movb   $0x30,(%rax)
  addq   $0x1,-0x70(%rbp)
L417:
  cmpl   $0x0,-0x7c(%rbp)
  jne    L410
  mov    -0x70(%rbp),%rax
  sub    -0x18(%rbp),%rax
  add    $0x1,%eax
  cmp    %eax,-0x78(%rbp)
  jbe    L93
L410:
  cmpl   $0x0,-0x74(%rbp)
  jne    L119
  mov    $0x0,%eax
  jmp    L49
L119:
  subl   $0x1,-0x74(%rbp)
  mov    -0x70(%rbp),%rax
  movb   $0x2e,(%rax)
  addq   $0x1,-0x70(%rbp)
  cmpl   $0x0,-0x80(%rbp)
  je     L153
  cmpl   $0x0,-0x7c(%rbp)
  je     L197
  mov    -0x7c(%rbp),%eax
  mov    %eax,-0x78(%rbp)
L197:
  mov    -0x70(%rbp),%rax
  sub    -0x18(%rbp),%rax
  mov    %eax,%edx
  mov    -0x78(%rbp),%eax
  sub    %edx,%eax
  add    $0x1,%eax
  mov    %eax,-0x78(%rbp)
  jmp    L244
L153:
  mov    -0x70(%rbp),%rax
  sub    -0x18(%rbp),%rax
  mov    %eax,%edx
  mov    -0x78(%rbp),%eax
  sub    %edx,%eax
  add    $0x1,%eax
  mov    %eax,-0x78(%rbp)
  cmpl   $0x0,-0x7c(%rbp)
  je     L244
  mov    -0x7c(%rbp),%eax
  mov    %eax,-0x78(%rbp)
L244:
  mov    -0x78(%rbp),%eax
  cmp    -0x74(%rbp),%eax
  jbe    L381
  mov    $0x0,%eax
  jmp    L49
L538:
  movsd  -0x68(%rbp),%xmm0
  divsd  -0x30(%rbp),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x8(%rbp),%xmm0
  cvttsd2si %xmm0,%eax
  mov    %al,-0x51(%rbp)
  movzbl -0x51(%rbp),%eax
  add    $0x30,%eax
  mov    %eax,%edx
  mov    -0x70(%rbp),%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x70(%rbp)
  movsbl -0x51(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movapd %xmm0,%xmm1
  mulsd  -0x30(%rbp),%xmm1
  movsd  -0x68(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  -0x30(%rbp),%xmm0
  movsd  D84(%rip),%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  subl   $0x1,-0x78(%rbp)
L381:
  cmpl   $0x0,-0x78(%rbp)
  jne    L538
  jmp    L93
L250:
  nop
  jmp    L511
L93:
  nop
L511:
  mov    -0x70(%rbp),%rax
  movb   $0x0,(%rax)
  mov    -0x70(%rbp),%rax
  sub    -0x18(%rbp),%rax
L49:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D74
data_type: string
name: parse_data
arguments: data_tag: D142
data_type: string
name: parse_data
arguments: data_tag: D109
data_type: string
name: parse_data
arguments: data_tag: D80
data_type: f64
name: parse_data
arguments: data_tag: D4
data_type: f32[2]
name: parse_data
arguments: data_tag: D121
data_type: f64
name: parse_data
arguments: data_tag: D36
data_type: f64
name: parse_data
arguments: data_tag: D63
data_type: f64
name: parse_data
arguments: data_tag: D84
data_type: f64
name: parse_data
arguments: data_tag: D95
data_type: f64
name: parse_data
arguments: data_tag: D37
data_type: f64

tool: D74: inf

tool: D142: -inf

tool: D109: nan

tool: D80: 0.3010299956639812

tool: {"D4": [0.0,-0.0]}

tool: D121: 0.5

tool: D36: 0.1

tool: D63: 1

tool: D84: 10

tool: D95: 10000000000

tool: D37: 0.9

assistant: ```c
int __dtostr(double d, char *buf, unsigned int maxlen, unsigned int prec, unsigned int prec2, int g) {
  union {
    unsigned long long l;
    double d;
  } u = {.d = d};
  signed long e = ((u.l >> 52) & ((1 << 11) - 1)) - 1023;
  signed long e10;
  unsigned int i;
  double backup = d;
  double tmp;
  char *oldbuf = buf;
  if ((i = isinf(d)))
    return copystring(buf, maxlen, i > 0 ? "inf" : "-inf");
  if (isnan(d))
    return copystring(buf, maxlen, "nan");
  e10 = 1 + (long)(e * 0.30102999566398119802);
  if (d == 0.0) {
    prec2 = prec2 == 0 ? 1 : prec2 + 2;
    prec2 = prec2 > maxlen ? 8 : prec2;
    i = 0;
    if (prec2 && (long long)u.l < 0) {
      buf[0] = '-';
      ++i;
    }
    for (; i < prec2; ++i)
      buf[i] = '0';
    buf[buf[0] == '0' ? 1 : 2] = '.';
    buf[i] = 0;
    return i;
  }
  if (d < 0.0) {
    d = -d;
    *buf = '-';
    --maxlen;
    ++buf;
  }
  tmp = 0.5;
  for (i = 0; i < prec2; i++) {
    tmp *= 0.1;
  }
  d += tmp;
  if (d < 1.0) {
    *buf = '0';
    --maxlen;
    ++buf;
  }
  if (e10 > 0) {
    int first = 1;
    tmp = 10.0;
    i = e10;
    while (i > 10) {
      tmp = tmp * 1e10;
      i -= 10;
    }
    while (i > 1) {
      tmp = tmp * 10;
      --i;
    }
    while (tmp > 0.9) {
      char digit;
      double fraction = d / tmp;
      digit = (int)(fraction);
      if (!first || digit) {
        first = 0;
        *buf = digit + '0';
        ++buf;
        if (!maxlen) {
          int len = __dtostr(backup / tmp, oldbuf, maxlen, prec, prec2, 0);
          int initial = 1;
          if (len == 0)
            return 0;
          maxlen -= len;
          buf += len;
          if (maxlen > 0) {
            *buf = 'e';
            ++buf;
          }
          --maxlen;
          for (len = 1000; len > 0; len /= 10) {
            if (e10 >= len || !initial) {
              if (maxlen > 0) {
                *buf = (e10 / len) + '0';
                ++buf;
              }
              --maxlen;
              initial = 0;
              e10 = e10 % len;
            }
          }
          if (maxlen > 0)
            goto fini;
          return 0;
        }
        d -= digit * tmp;
        --maxlen;
      }
      tmp /= 10.0;
    }
  } else {
    tmp = 0.1;
  }
  if (buf == oldbuf) {
    if (!maxlen)
      return 0;
    --maxlen;
    *buf = '0';
    ++buf;
  }
  if (prec2 || prec > (unsigned int)(buf - oldbuf) + 1) {
    if (!maxlen)
      return 0;
    --maxlen;
    *buf = '.';
    ++buf;
    if (g) {
      if (prec2)
        prec = prec2;
      prec -= buf - oldbuf - 1;
    } else {
      prec -= buf - oldbuf - 1;
      if (prec2)
        prec = prec2;
    }
    if (prec > maxlen)
      return 0;
    while (prec > 0) {
      char digit;
      double fraction = d / tmp;
      digit = (int)(fraction);
      *buf = digit + '0';
      ++buf;
      d -= digit * tmp;
      tmp /= 10.0;
      --prec;
    }
  }
fini:
  *buf = 0;
  return buf - oldbuf;
}
```