user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<rsqrt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  movsd  %xmm0,-0x18(%rbp)
  movsd  -0x18(%rbp),%xmm1
  movsd  D112(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  movsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D53(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x10(%rbp),%eax
  sar    %eax
  mov    %eax,%edx
  mov    $0xc7aa19f9,%eax
  sub    %edx,%eax
  mov    %eax,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movsd  -0x10(%rbp),%xmm1
  movsd  -0x10(%rbp),%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x8(%rbp),%xmm2
  movsd  -0x10(%rbp),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  D27(%rip),%xmm0
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D11(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movsd  -0x10(%rbp),%xmm1
  movsd  -0x10(%rbp),%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x8(%rbp),%xmm2
  movsd  -0x10(%rbp),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  D27(%rip),%xmm0
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D75(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movsd  -0x10(%rbp),%xmm1
  movsd  -0x10(%rbp),%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x8(%rbp),%xmm2
  movsd  -0x10(%rbp),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  D27(%rip),%xmm0
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D109(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movsd  -0x10(%rbp),%xmm1
  movsd  -0x10(%rbp),%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x8(%rbp),%xmm2
  movsd  -0x10(%rbp),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  D27(%rip),%xmm0
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D31(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movsd  -0x10(%rbp),%xmm1
  movsd  -0x10(%rbp),%xmm0
  movapd %xmm0,%xmm2
  mulsd  -0x8(%rbp),%xmm2
  movsd  -0x10(%rbp),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  D27(%rip),%xmm0
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  mov    -0x10(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  lea    D70(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movsd  -0x10(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D112
type_guessed: f64
name: extract_symbolic_data
arguments: data_label: D53
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D7
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D27
type_guessed: f64
name: extract_symbolic_data
arguments: data_label: D11
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D75
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D109
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D31
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D70
type_guessed: string

tool: D112: 0.5

tool: D53:   a = %.13a = %.16e


tool: D7:  r0 = %.13a = %.16e


tool: D27: 1.5

tool: D11:  r1 = %.13a = %.16e


tool: D75:  r2 = %.13a = %.16e


tool: D109:  r3 = %.13a = %.16e


tool: D31:  r4 = %.13a = %.16e


tool: D70:  r5 = %.13a = %.16e


assistant: ```c
double rsqrt(double x) {
  double xhalf = 0.5 * x;
  union {
    double float64;
    int64_t int64;
  } u;
  u.float64 = x;
  printf("  a = %.13a = %.16e\n", u.float64, u.float64);
  u.int64 = 0x5fe6eb50c7aa19f9LL - (u.int64 >> 1);
  printf(" r0 = %.13a = %.16e\n", u.float64, u.float64);
  u.float64 = u.float64 * (1.5 - xhalf * u.float64 * u.float64);
  printf(" r1 = %.13a = %.16e\n", u.float64, u.float64);
  u.float64 = u.float64 * (1.5 - xhalf * u.float64 * u.float64);
  printf(" r2 = %.13a = %.16e\n", u.float64, u.float64);
  u.float64 = u.float64 * (1.5 - xhalf * u.float64 * u.float64);
  printf(" r3 = %.13a = %.16e\n", u.float64, u.float64);
  u.float64 = u.float64 * (1.5 - xhalf * u.float64 * u.float64);
  printf(" r4 = %.13a = %.16e\n", u.float64, u.float64);
  u.float64 = u.float64 * (1.5 - xhalf * u.float64 * u.float64);
  printf(" r5 = %.13a = %.16e\n", u.float64, u.float64);
  return u.float64;
}
```