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

```asm
<ieee_80_to_double>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  movw   $0x0,-0x12(%rbp)
  movl   $0x0,-0x10(%rbp)
  movl   $0x0,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %ax,-0x12(%rbp)
  movswl -0x12(%rbp),%eax
  shl    $0x8,%eax
  mov    %ax,-0x12(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %ax,-0x12(%rbp)
  movzwl -0x12(%rbp),%eax
  sar    $0xf,%ax
  and    $0x1,%eax
  mov    %al,-0x13(%rbp)
  andw   $0x7fff,-0x12(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x10(%rbp)
  shll   $0x8,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0x10(%rbp)
  shll   $0x8,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0x10(%rbp)
  shll   $0x8,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  shll   $0x8,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0xc(%rbp)
  shll   $0x8,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0xc(%rbp)
  shll   $0x8,-0xc(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,-0xc(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jne    L7
  cmpl   $0x0,-0xc(%rbp)
  jne    L7
  cmpw   $0x0,-0x12(%rbp)
  jne    L7
  cmpb   $0x0,-0x13(%rbp)
  jne    L7
  pxor   %xmm0,%xmm0
  jmp    L52
L7:
  mov    -0xc(%rbp),%eax
  mov    %eax,%edi
  call   <myUlongToDouble@plt>
  movsd  D36(%rip),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,%edi
  call   <myUlongToDouble@plt>
  movsd  D7(%rip),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  -0x8(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movswl -0x12(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  D4(%rip),%xmm1
  subsd  %xmm1,%xmm0
  mov    D20(%rip),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movsd  -0x8(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  cmpb   $0x0,-0x13(%rbp)
  je     L13
  movsd  -0x8(%rbp),%xmm0
  movq   D27(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  jmp    L52
L13:
  movsd  -0x8(%rbp),%xmm0
L52:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D36
type_infered: f32[2]
name: parse_data
arguments: data_tag: D7
type_infered: f32[2]
name: parse_data
arguments: data_tag: D4
type_infered: f64
name: parse_data
arguments: data_tag: D20
type_infered: f64
name: parse_data
arguments: data_tag: D27
type_infered: f32[2]

tool: {"D36": [0.0,0.0078125]}

tool: {"D7": [0.0,0.125]}

tool: D4: 16383

tool: D20: 2

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

assistant: ```c
double ieee_80_to_double(unsigned char *p) {
  unsigned char sign;
  short exp = 0;
  unsigned int mant1 = 0;
  unsigned int mant0 = 0;
  double val;
  exp = *p++;
  exp <<= 8;
  exp |= *p++;
  sign = (exp & 0x8000) ? 1 : 0;
  exp &= 0x7FFF;
  mant1 = *p++;
  mant1 <<= 8;
  mant1 |= *p++;
  mant1 <<= 8;
  mant1 |= *p++;
  mant1 <<= 8;
  mant1 |= *p++;
  mant0 = *p++;
  mant0 <<= 8;
  mant0 |= *p++;
  mant0 <<= 8;
  mant0 |= *p++;
  mant0 <<= 8;
  mant0 |= *p++;
  if (mant1 == 0 && mant0 == 0 && exp == 0 && sign == 0)
    return 0.0;
  else {
    val = myUlongToDouble(mant0) * pow(2.0, -63.0);
    val += myUlongToDouble(mant1) * pow(2.0, -31.0);
    val *= pow(2.0, ((double)exp) - 16383.0);
    return sign ? -val : val;
  }
}
```