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

```asm
<sqrt>:
  endbr64
  ucomisd %xmm0,%xmm0
  movapd %xmm0,%xmm2
  jp     L143
  pxor   %xmm6,%xmm6
  mov    $0x0,%edx
  ucomisd %xmm6,%xmm0
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  jne    L143
  comisd %xmm0,%xmm6
  ja     L3
  andpd  D86(%rip),%xmm0
  movsd  D19(%rip),%xmm1
  ucomisd %xmm0,%xmm1
  jb     L143
  push   %rbp
  movapd %xmm2,%xmm0
  push   %rbx
  sub    $0x18,%rsp
  movsd  %xmm2,0x8(%rsp)
  call   <logb@plt>
  pxor   %xmm1,%xmm1
  movsd  0x8(%rsp),%xmm2
  cvttsd2si %xmm0,%ebx
  movapd %xmm2,%xmm0
  mov    %ebx,%eax
  neg    %eax
  cvtsi2sd %eax,%xmm1
  call   <scalb@plt>
  movsd  %xmm0,0x8(%rsp)
  call   <logb@plt>
  movsd  0x8(%rsp),%xmm2
  pxor   %xmm6,%xmm6
  cvttsd2si %xmm0,%ebp
  test   %ebp,%ebp
  jne    L89
L62:
  lea    (%rbx,%rbp,1),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %eax,%edx
  mov    %edx,%ecx
  and    $0xfffffffe,%edx
  sar    %ecx
  cmp    %eax,%edx
  je     L30
  sub    $0x1,%eax
  addsd  %xmm2,%xmm2
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
L30:
  movsd  D70(%rip),%xmm5
  movsd  D15(%rip),%xmm7
  movapd %xmm2,%xmm0
  mov    $0x33,%eax
  movsd  D75(%rip),%xmm4
  movsd  D49(%rip),%xmm9
  subsd  %xmm5,%xmm0
  movapd %xmm5,%xmm3
  movapd %xmm7,%xmm1
  movapd %xmm5,%xmm8
  jmp    L75
  nopl   0x0(%rax,%rax,1)
L5:
  movapd %xmm2,%xmm1
  subsd  %xmm2,%xmm0
  addsd  %xmm3,%xmm8
  addsd  %xmm2,%xmm1
  addsd  %xmm9,%xmm1
  sub    $0x1,%eax
  je     L217
L75:
  mulsd  %xmm7,%xmm0
  movapd %xmm1,%xmm2
  addsd  %xmm5,%xmm2
  mulsd  %xmm4,%xmm3
  comisd %xmm2,%xmm0
  jae    L5
  addsd  %xmm1,%xmm1
  sub    $0x1,%eax
  jne    L75
L217:
  mulsd  %xmm7,%xmm0
  ucomisd %xmm6,%xmm0
  jp     L72
  je     L226
L72:
  mulsd  %xmm4,%xmm3
  movsd  D12(%rip),%xmm2
  movsd  D59(%rip),%xmm4
  comisd %xmm1,%xmm0
  mulsd  %xmm3,%xmm2
  mulsd  %xmm4,%xmm2
  addsd  %xmm5,%xmm2
  jbe    L222
  ucomisd %xmm5,%xmm2
  addsd  %xmm3,%xmm8
  jp     L153
  je     L226
L153:
  mulsd  %xmm3,%xmm4
  addsd  %xmm5,%xmm4
  comisd %xmm5,%xmm4
  jbe    L47
L220:
  addsd  %xmm3,%xmm8
L226:
  pxor   %xmm1,%xmm1
  add    $0x18,%rsp
  movapd %xmm8,%xmm0
  cvtsi2sd %ecx,%xmm1
  pop    %rbx
  pop    %rbp
  jmp    1070 <scalb@plt>
  nopl   0x0(%rax,%rax,1)
L3:
  divsd  %xmm6,%xmm6
  movapd %xmm6,%xmm2
L143:
  movapd %xmm2,%xmm0
  ret
L89:
  mov    %ebp,%eax
  pxor   %xmm1,%xmm1
  movapd %xmm2,%xmm0
  neg    %eax
  cvtsi2sd %eax,%xmm1
  call   <scalb@plt>
  pxor   %xmm6,%xmm6
  movapd %xmm0,%xmm2
  jmp    L62
L222:
  ucomisd %xmm5,%xmm2
  jp     L46
  je     L226
L46:
  mulsd  %xmm3,%xmm4
  addsd  %xmm5,%xmm4
  comisd %xmm5,%xmm4
  ja     L220
  mulsd  %xmm7,%xmm0
  addsd  %xmm1,%xmm1
  subsd  %xmm1,%xmm0
  subsd  %xmm5,%xmm0
  comisd %xmm6,%xmm0
  jb     L226
  jmp    L220
L47:
  subsd  %xmm1,%xmm0
  addsd  D49(%rip),%xmm1
  mulsd  %xmm7,%xmm0
  addsd  %xmm1,%xmm1
  subsd  %xmm1,%xmm0
  subsd  D67(%rip),%xmm0
  comisd %xmm6,%xmm0
  jb     L226
  jmp    L220
```

tool_calls: name: disassemble_data
arguments: data_label: D86
type_infered: byte[16]
name: disassemble_data
arguments: data_label: D19
type_infered: byte[8]
name: disassemble_data
arguments: data_label: D70
type_infered: f64
name: disassemble_data
arguments: data_label: D15
type_infered: f64
name: disassemble_data
arguments: data_label: D75
type_infered: f32[2]
name: disassemble_data
arguments: data_label: D49
type_infered: f32[2]
name: disassemble_data
arguments: data_label: D12
type_infered: f32[2]
name: disassemble_data
arguments: data_label: D59
type_infered: f32[2]
name: disassemble_data
arguments: data_label: D67
type_infered: f32[2]

tool: {"D86": [0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: {"D19": [0xff,0xff,0xff,0xff,0xff,0xff,0xef,0x7f]}

tool: D70: 1

tool: D15: 4

tool: {"D75": [0.0,1.75]}

tool: {"D49": [0.0,2.0]}

tool: {"D12": [0.0,2.125]}

tool: {"D59": [0.0,1.625]}

tool: {"D67": [0.0,2.3125]}

assistant: ```c
double sqrt(x)
double x;
{
  double q, s, b, r;
  double t;
  double const zero = 0.0;
  int m, n, i;
  int k = 51;
  if (x != x || x == zero)
    return (x);
  if (x < zero) {
    return (zero / zero);
  }
  if (!finite(x))
    return (x);
  n = logb(x);
  x = scalb(x, -n);
  if ((m = logb(x)) != 0)
    x = scalb(x, -m);
  m += n;
  n = m / 2;
  if ((n + n) != m) {
    x *= 2;
    m -= 1;
    n = m / 2;
  }
  q = 1.0;
  s = 4.0;
  x -= 1.0;
  r = 1;
  for (i = 1; i <= k; i++) {
    t = s + 1;
    x *= 4;
    r /= 2;
    if (t <= x) {
      s = t + t + 2, x -= t;
      q += r;
    } else
      s *= 2;
  }
  r /= 2;
  x *= 4;
  if (x == zero)
    goto end;
  100 + r;
  if (s < x) {
    q += r;
    x -= s;
    s += 2;
    s *= 2;
    x *= 4;
    t = (x - s) - 5;
    b = 1.0 + 3 * r / 4;
    if (b == 1.0)
      goto end;
    b = 1.0 + r / 4;
    if (b > 1.0)
      t = 1;
    if (t >= 0)
      q += r;
  } else {
    s *= 2;
    x *= 4;
    t = (x - s) - 1;
    b = 1.0 + 3 * r / 4;
    if (b == 1.0)
      goto end;
    b = 1.0 + r / 4;
    if (b > 1.0)
      t = 1;
    if (t >= 0)
      q += r;
  }
end:
  return (scalb(q, n));
}
```