user: 下面的汇编指令对应的C源代码是什么:

```asm
<atof_nonlocalized>:
  endbr64
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x10,%rsp
  call   <atoi_nonlocalized@plt>
  movzbl 0x0(%rbp),%edx
  pxor   %xmm3,%xmm3
  cvtsi2sd %eax,%xmm3
  cmp    $0x20,%dl
  jne    L21
  mov    $0x1,%eax
  xchg   %ax,%ax
L139:
  mov    %eax,%ecx
  add    $0x1,%rax
  movzbl -0x1(%rbp,%rax,1),%edx
  cmp    $0x20,%dl
  je     L139
L163:
  lea    -0x2b(%rdx),%eax
  mov    $0x1,%r12d
  test   $0xfd,%al
  jne    L160
  xor    %r12d,%r12d
  cmp    $0x2d,%dl
  setne  %r12b
  add    $0x1,%ecx
  movslq %ecx,%rax
  lea    -0x1(%r12,%r12,1),%r12d
  movzbl 0x0(%rbp,%rax,1),%edx
L160:
  test   %dl,%dl
  je     L108
  movslq %ecx,%rcx
  xor    %ebx,%ebx
  mov    $0xffffffffffffffff,%rsi
  jmp    L134
  nopl   (%rax)
L55:
  cmp    $0x9,%r8b
  ja     L62
  add    $0x1,%rcx
  add    $0x1,%ebx
  movzbl 0x0(%rbp,%rcx,1),%edx
  test   %dl,%dl
  je     L62
L134:
  lea    -0x30(%rdx),%r8d
  movslq %ecx,%rdi
  cmp    $0x9,%r8b
  jbe    L137
  cmp    $0x2e,%dl
  jne    L62
L137:
  cmp    $0xffffffff,%esi
  jne    L55
  cmp    $0x2e,%dl
  cmove  %rdi,%rsi
  add    $0x1,%rcx
  movzbl 0x0(%rbp,%rcx,1),%edx
  test   %dl,%dl
  jne    L134
L62:
  pxor   %xmm0,%xmm0
  test   %ebx,%ebx
  jne    L93
L132:
  add    $0x10,%rsp
  addsd  %xmm3,%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  cs nopw 0x0(%rax,%rax,1)
L93:
  lea    0x1(%rbp,%rsi,1),%rdi
  movsd  %xmm3,0x8(%rsp)
  call   <atoi_nonlocalized@plt>
  pxor   %xmm0,%xmm0
  movsd  0x8(%rsp),%xmm3
  mov    %ebx,%ecx
  imul   %r12d,%eax
  cmp    $0x1,%ebx
  cvtsi2sd %eax,%xmm0
  je     L112
  movq   D5(%rip),%xmm1
  mov    %ebx,%edx
  xor    %eax,%eax
  shr    %edx
  nopw   0x0(%rax,%rax,1)
L28:
  movdqa %xmm1,%xmm2
  add    $0x1,%eax
  pslld  $0x2,%xmm2
  paddd  %xmm2,%xmm1
  pslld  $0x1,%xmm1
  cmp    %edx,%eax
  jne    L28
  movd   %xmm1,%eax
  pshufd $0xe5,%xmm1,%xmm4
  movd   %xmm4,%ebx
  imul   %eax,%ebx
  and    $0x1,%ecx
  je     L141
L112:
  lea    (%rbx,%rbx,4),%ebx
  add    %ebx,%ebx
L141:
  pxor   %xmm1,%xmm1
  add    $0x10,%rsp
  cvtsi2sd %ebx,%xmm1
  pop    %rbx
  pop    %rbp
  pop    %r12
  divsd  %xmm1,%xmm0
  addsd  %xmm3,%xmm0
  ret
  nopl   0x0(%rax)
L21:
  xor    %ecx,%ecx
  jmp    L163
L108:
  pxor   %xmm0,%xmm0
  jmp    L132
```

tool_calls: name: disassemble_data
arguments: tag: D5
datatype: byte[8]

tool: {"D5": [0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00]}

assistant: ```c
double atof_nonlocalized(const char *str) {
  int i = 0, dot_pos = -1, decimals = 0, sign = 1;
  double value, value2 = 0.0;
  value = atoi_nonlocalized(str);
  while (str[i] == ' ') {
    i++;
  }
  if ((str[i] == '+') || (str[i] == '-')) {
    if (str[i] == '-') {
      sign = -1;
    }
    i++;
  }
  for (;; i++) {
    if (str[i] == 0) {
      break;
    }
    if (((str[i] < '0') || (str[i] > '9')) && (str[i] != '.')) {
      break;
    }
    if (dot_pos >= 0) {
      if ((str[i] >= '0') && (str[i] <= '9')) {
        decimals++;
      } else {
        break;
      }
    }
    if (str[i] == '.') {
      if (dot_pos < 0) {
        dot_pos = i;
      }
    }
  }
  if (decimals) {
    value2 = atoi_nonlocalized(str + dot_pos + 1) * sign;
    i = 1;
    while (decimals--) {
      i *= 10;
    }
    value2 /= i;
  }
  return (value + value2);
}
```