user: 这段汇编代码用C语言表示是什么样的？

```asm
<hc_fftw_to_half_mx>:
  endbr64
  mov    %rdx,%rax
  push   %r14
  mov    %rcx,%rdx
  push   %r13
  movsd  (%rax),%xmm0
  push   %r12
  push   %rbp
  push   %rbx
  and    $0x1,%ecx
  je     L18
  lea    0x1(%rdx),%r9
  movsd  %xmm0,(%rdi)
  mov    %r9,%r8
  movq   $0x0,(%rsi)
  sar    %r8
  cmp    $0x3,%r9
  jle    L42
  lea    0x0(,%rdx,8),%rbx
  lea    0x0(,%r8,8),%r11
  lea    0x8(%rbx),%r10
  lea    0x8(%rdi),%r12
  lea    0x10(%rax),%r14
  sub    %r11,%r10
  lea    0x8(%rsi),%rbp
  add    %rax,%r10
  cmp    %r14,%r12
  lea    (%rax,%rbx,1),%r13
  setne  %r9b
  cmp    %r14,%rbp
  setne  %r14b
  and    %r14d,%r9d
  lea    0x10(%rdi),%r14
  cmp    %r14,%rbp
  setne  %r14b
  and    %r14d,%r9d
  lea    -0x2(%r8),%r14
  cmp    $0x1,%r14
  seta   %r14b
  and    %r14d,%r9d
  lea    (%rdi,%r11,1),%r14
  cmp    %r14,%r10
  setae  %r14b
  cmp    %r13,%r12
  setae  %r12b
  or     %r14d,%r12d
  test   %r12b,%r9b
  je     L66
  add    %rsi,%r11
  cmp    %r11,%r10
  setae  %r9b
  cmp    %r13,%rbp
  setae  %r10b
  or     %r10b,%r9b
  je     L66
  lea    -0x1(%r8),%r11
  lea    -0x10(%rax,%rbx,1),%r10
  mov    $0x8,%ecx
  mov    %r11,%r9
  shr    %r9
  shl    $0x4,%r9
  add    $0x8,%r9
  nopw   0x0(%rax,%rax,1)
L3:
  movupd (%rax,%rcx,1),%xmm1
  mov    %rcx,%r8
  neg    %r8
  movups %xmm1,(%rdi,%rcx,1)
  movupd 0x8(%r10,%r8,1),%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,(%rsi,%rcx,1)
  add    $0x10,%rcx
  cmp    %r9,%rcx
  jne    L3
  mov    %r11,%rcx
  or     $0x1,%rcx
  and    $0x1,%r11d
  je     L42
  movsd  (%rax,%rcx,8),%xmm0
  sub    %rcx,%rdx
  movsd  %xmm0,(%rdi,%rcx,8)
  movsd  (%rax,%rdx,8),%xmm0
  movsd  %xmm0,(%rsi,%rcx,8)
L42:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   (%rax)
L18:
  mov    %rdx,%r9
  movsd  %xmm0,(%rdi)
  sar    %r9
  movq   $0x0,(%rsi)
  cmp    $0x3,%rdx
  jle    L106
  lea    0x8(%rdi),%r13
  lea    0x10(%rax),%r12
  mov    %rax,%rcx
  lea    0x0(,%r9,8),%r8
  lea    0x0(,%rdx,8),%r10
  sub    %r8,%rcx
  lea    0x8(%rsi),%r11
  lea    (%rax,%r10,1),%rbx
  cmp    %r12,%r13
  lea    0x8(%rcx,%r10,1),%rbp
  setne  %cl
  cmp    %r12,%r11
  setne  %r12b
  and    %r12d,%ecx
  lea    0x10(%rdi),%r12
  cmp    %r12,%r11
  setne  %r12b
  and    %r12d,%ecx
  lea    -0x2(%r9),%r12
  cmp    $0x1,%r12
  seta   %r12b
  and    %r12d,%ecx
  lea    (%rdi,%r8,1),%r12
  cmp    %r12,%rbp
  setae  %r12b
  cmp    %r13,%rbx
  setbe  %r13b
  or     %r13d,%r12d
  test   %r12b,%cl
  je     L65
  add    %rsi,%r8
  cmp    %r8,%rbp
  setae  %cl
  cmp    %r11,%rbx
  setbe  %r8b
  or     %r8b,%cl
  je     L65
  lea    -0x1(%r9),%rbx
  lea    -0x10(%rax,%r10,1),%r11
  mov    $0x8,%ecx
  mov    %rbx,%r10
  shr    %r10
  shl    $0x4,%r10
  add    $0x8,%r10
  xchg   %ax,%ax
L45:
  movupd (%rax,%rcx,1),%xmm2
  mov    %rcx,%r8
  neg    %r8
  movups %xmm2,(%rdi,%rcx,1)
  movupd 0x8(%r11,%r8,1),%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,(%rsi,%rcx,1)
  add    $0x10,%rcx
  cmp    %rcx,%r10
  jne    L45
  mov    %rbx,%rcx
  or     $0x1,%rcx
  and    $0x1,%ebx
  je     L106
  movsd  (%rax,%rcx,8),%xmm0
  sub    %rcx,%rdx
  movsd  %xmm0,(%rdi,%rcx,8)
  movsd  (%rax,%rdx,8),%xmm0
  movsd  %xmm0,(%rsi,%rcx,8)
L106:
  movsd  (%rax,%r9,8),%xmm0
  pop    %rbx
  pop    %rbp
  pop    %r12
  movsd  %xmm0,(%rdi,%r9,8)
  pop    %r13
  pop    %r14
  movq   $0x0,(%rsi,%r9,8)
  ret
  nopl   0x0(%rax,%rax,1)
L65:
  lea    -0x8(%rax,%r10,1),%rcx
  mov    $0x1,%edx
  nopw   0x0(%rax,%rax,1)
L5:
  movsd  (%rax,%rdx,8),%xmm0
  sub    $0x8,%rcx
  movsd  %xmm0,(%rdi,%rdx,8)
  movsd  0x8(%rcx),%xmm0
  movsd  %xmm0,(%rsi,%rdx,8)
  add    $0x1,%rdx
  cmp    %rdx,%r9
  jne    L5
  jmp    L106
  nopl   0x0(%rax,%rax,1)
L66:
  lea    -0x8(%rax,%rbx,1),%rdx
  nopl   (%rax)
L125:
  movsd  (%rax,%rcx,8),%xmm0
  sub    $0x8,%rdx
  movsd  %xmm0,(%rdi,%rcx,8)
  movsd  0x8(%rdx),%xmm0
  movsd  %xmm0,(%rsi,%rcx,8)
  add    $0x1,%rcx
  cmp    %rcx,%r8
  jne    L125
  jmp    L42
```

assistant: ```c
void hc_fftw_to_half_mx(register double *Xr, register double *Xi, register double *X, long N) {
  register long k;
  long Nover2 = N >> 1;
  if (N & 1) {
    Xr[0] = X[0];
    Xi[0] = 0.0;
    for (k = 1; k < ((N + 1) >> 1); ++k) {
      Xr[k] = X[k];
      Xi[k] = X[N - k];
    }
  } else {
    Xr[0] = X[0];
    Xi[0] = 0.0;
    for (k = 1; k < (Nover2); ++k) {
      Xr[k] = X[k];
      Xi[k] = X[N - k];
    }
    Xr[Nover2] = X[Nover2];
    Xi[Nover2] = 0.0;
  }
}
```