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

```asm
<coef_deriv_d>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  movsd  D12(%rip),%xmm0
  movsd  %xmm0,-0x8(%rbp)
  cmpq   $0x2,-0x18(%rbp)
  je     L69
  cmpq   $0x2,-0x18(%rbp)
  ja     L0
  cmpq   $0x0,-0x18(%rbp)
  je     L49
  cmpq   $0x1,-0x18(%rbp)
  je     L19
  jmp    L0
L49:
  mov    -0x28(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x28,%rax
  movsd  (%rax),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  mulsd  -0x8(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  movsd  -0x8(%rbp),%xmm0
  movq   D13(%rip),%xmm1
  xorpd  %xmm0,%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x28,%rax
  movsd  (%rax),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x20(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x20,%rax
  movq   D13(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  movsd  D55(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x8(%rbp),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm2
  subsd  %xmm2,%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x28,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L0
L19:
  movsd  -0x8(%rbp),%xmm0
  movq   D13(%rip),%xmm1
  xorpd  %xmm0,%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x28(%rbp),%rax
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mulsd  -0x8(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x28,%rax
  movsd  (%rax),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  movq   D13(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  movsd  D55(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x8(%rbp),%xmm1
  mov    -0x20(%rbp),%rax
  movsd  (%rax),%xmm0
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  movsd  (%rax),%xmm2
  subsd  %xmm2,%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x20,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x18(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    $0x28,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  jmp    L0
L69:
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mulsd  -0x8(%rbp),%xmm0
  mov    -0x28(%rbp),%rax
  movsd  %xmm0,(%rax)
  movsd  -0x8(%rbp),%xmm0
  movq   D13(%rip),%xmm1
  xorpd  %xmm0,%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  movsd  (%rax),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  movsd  D55(%rip),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x8(%rbp),%xmm1
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  movsd  (%rax),%xmm0
  mov    -0x20(%rbp),%rax
  movsd  (%rax),%xmm2
  subsd  %xmm2,%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x18,%rax
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x28(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rdx),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mov    -0x28(%rbp),%rax
  add    $0x28,%rax
  movq   D13(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  nop
L0:
  nop
  pop    %rbp
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D12
type: byte[8]
name: disassemble_data
arguments: tag: D13
type: f32[2]
name: disassemble_data
arguments: tag: D55
type: f64

tool: {"D12": [0xaa,0x4c,0x58,0xe8,0x7a,0xb6,0xfb,0x3f]}

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

tool: D55: 2

assistant: ```c
void coef_deriv_d(size_t axis, const double *coef, double *der) {
  const double sqrt3 = sqrt(3.0);
  switch (axis) {
  case 0:
    der[0] = 0.0;
    der[1] = sqrt3 * coef[5];
    der[2] = -sqrt3 * coef[5];
    der[3] = coef[4];
    der[4] = -coef[3];
    der[5] = 2.0 / sqrt3 * (coef[2] - coef[1]);
    break;
  case 1:
    der[0] = -sqrt3 * coef[4];
    der[1] = 0.0;
    der[2] = sqrt3 * coef[4];
    der[3] = -coef[5];
    der[4] = 2.0 / sqrt3 * (coef[0] - coef[2]);
    der[5] = coef[3];
    break;
  case 2:
    der[0] = sqrt3 * coef[3];
    der[1] = -sqrt3 * coef[3];
    der[2] = 0.0;
    der[3] = 2.0 / sqrt3 * (coef[1] - coef[0]);
    der[4] = coef[5];
    der[5] = -coef[4];
    break;
  };
}
```