user: 请从给定的汇编指令推导出C源代码：

```asm
<test2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x28,%rsp
  movsd  %xmm0,-0x18(%rbp)
  movsd  %xmm1,-0x20(%rbp)
  movsd  %xmm2,-0x28(%rbp)
  movsd  -0x20(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movq   %xmm0,%rbx
  movsd  -0x20(%rbp),%xmm1
  movsd  D13(%rip),%xmm0
  movapd %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movsd  -0x18(%rbp),%xmm0
  movq   D7(%rip),%xmm1
  andpd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movapd %xmm2,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %rbx,%xmm3
  ucomisd %xmm0,%xmm3
  jp     L38
  movq   %rbx,%xmm4
  ucomisd %xmm0,%xmm4
  je     L87
L38:
  mov    $0x0,%eax
  call   <link_error@plt>
L87:
  movsd  -0x20(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <log@plt>
  movq   %xmm0,%rbx
  mov    -0x18(%rbp),%rax
  movq   %rax,%xmm0
  call   <log@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movq   %rbx,%xmm5
  ucomisd %xmm0,%xmm5
  jp     L73
  movq   %rbx,%xmm6
  ucomisd %xmm0,%xmm6
  je     L22
L73:
  mov    $0x0,%eax
  call   <link_error@plt>
L22:
  mov    -0x18(%rbp),%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  movsd  -0x20(%rbp),%xmm0
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rbx
  movsd  -0x18(%rbp),%xmm0
  mulsd  -0x20(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %rbx,%xmm7
  ucomisd %xmm0,%xmm7
  jp     L52
  movq   %rbx,%xmm3
  ucomisd %xmm0,%xmm3
  je     L19
L52:
  mov    $0x0,%eax
  call   <link_error@plt>
L19:
  mov    -0x18(%rbp),%rax
  movq   %rax,%xmm0
  call   <sqrt@plt>
  movq   %xmm0,%rax
  movsd  -0x20(%rbp),%xmm0
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rbx
  movsd  -0x20(%rbp),%xmm1
  movsd  D13(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %rbx,%xmm4
  ucomisd %xmm0,%xmm4
  jp     L8
  movq   %rbx,%xmm5
  ucomisd %xmm0,%xmm5
  je     L15
L8:
  mov    $0x0,%eax
  call   <link_error@plt>
L15:
  movsd  -0x20(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rax
  movsd  -0x28(%rbp),%xmm0
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %xmm0,%rbx
  movsd  -0x20(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <pow@plt>
  movq   %rbx,%xmm6
  ucomisd %xmm0,%xmm6
  jp     L60
  movq   %rbx,%xmm7
  ucomisd %xmm0,%xmm7
  je     L11
L60:
  mov    $0x0,%eax
  call   <link_error@plt>
L11:
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: read_data
arguments: tag: D13
data_type: f64
name: read_data
arguments: tag: D7
data_type: qword

tool: D13: 0.5

tool: D7: 9223372036854775807

assistant: ```c
void test2(double x, double y, double z) {
  if (sqrt(pow(x, y)) != pow(fabs(x), y * 0.5))
    link_error();
  if (log(pow(x, y)) != y * log(x))
    link_error();
  if (pow(exp(x), y) != exp(x * y))
    link_error();
  if (pow(sqrt(x), y) != pow(x, y * 0.5))
    link_error();
  if (pow(pow(x, y), z) != pow(x, y * z))
    link_error();
}
```