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

```asm
<test_phaddw_c>:
  endbr64
  mov    $0x2,%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  test   %eax,%eax
  jle    L87
  push   %r12
  movslq %eax,%r9
  mov    %eax,%edx
  mov    %eax,%r8d
  push   %rbp
  lea    -0x1(%rax),%ebp
  mov    %eax,%r10d
  lea    0x0(,%r9,4),%r11
  push   %rbx
  cmp    $0x2,%ebp
  seta   %r12b
  xor    %eax,%eax
L25:
  movzwl 0x2(%rdi,%rax,4),%ecx
  add    (%rdi,%rax,4),%cx
  mov    %cx,(%rdi,%rax,2)
  add    $0x1,%rax
  cmp    %rax,%r10
  jne    L25
  lea    (%rdi,%r9,4),%rax
  lea    (%rdi,%r9,2),%rcx
  cmp    %rax,%rsi
  lea    (%rsi,%r11,1),%rax
  setae  %bl
  cmp    %rax,%rcx
  setae  %al
  or     %al,%bl
  je     L35
  test   %r12b,%r12b
  je     L35
  cmp    $0x6,%ebp
  jbe    L39
  mov    %edx,%r8d
  xor    %eax,%eax
  shr    $0x3,%r8d
  shl    $0x4,%r8
  nopl   (%rax)
L8:
  movdqu (%rsi,%rax,2),%xmm0
  movdqu 0x10(%rsi,%rax,2),%xmm3
  movdqa %xmm0,%xmm1
  movdqa %xmm0,%xmm2
  punpcklwd %xmm3,%xmm0
  punpcklwd %xmm3,%xmm1
  punpckhwd %xmm3,%xmm2
  movdqa %xmm1,%xmm4
  punpcklwd %xmm2,%xmm0
  punpcklwd %xmm2,%xmm1
  punpckhwd %xmm2,%xmm4
  punpcklwd %xmm4,%xmm1
  punpckhwd %xmm4,%xmm0
  paddw  %xmm0,%xmm1
  movups %xmm1,(%rcx,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%r8
  jne    L8
  mov    %edx,%ecx
  and    $0xfffffff8,%ecx
  mov    %ecx,%eax
  cmp    %edx,%ecx
  je     L91
  mov    %edx,%r8d
  sub    %ecx,%r8d
  lea    -0x1(%r8),%r10d
  cmp    $0x2,%r10d
  jbe    L84
L63:
  lea    (%rsi,%rcx,4),%r10
  add    %rcx,%r9
  mov    %r8d,%ecx
  movq   (%r10),%xmm0
  movq   0x8(%r10),%xmm2
  and    $0xfffffffc,%ecx
  add    %ecx,%eax
  movdqa %xmm0,%xmm3
  movdqa %xmm0,%xmm1
  punpcklwd %xmm2,%xmm0
  punpcklwd %xmm2,%xmm3
  punpcklwd %xmm2,%xmm1
  pshufd $0xe,%xmm3,%xmm3
  punpcklwd %xmm3,%xmm0
  punpcklwd %xmm3,%xmm1
  pshufd $0xe,%xmm0,%xmm0
  paddw  %xmm0,%xmm1
  movq   %xmm1,(%rdi,%r9,2)
  cmp    %r8d,%ecx
  je     L91
L84:
  lea    (%rax,%rax,1),%r8d
  lea    (%rdx,%rax,1),%ecx
  movslq %r8d,%r9
  movslq %ecx,%rcx
  movzwl (%rsi,%r9,2),%r11d
  add    0x2(%rsi,%r9,2),%r11w
  lea    (%r9,%r9,1),%r10
  mov    %r11w,(%rdi,%rcx,2)
  lea    0x1(%rax),%ecx
  cmp    %ecx,%edx
  jle    L91
  add    $0x3,%r8d
  add    %edx,%ecx
  movzwl 0x4(%rsi,%r10,1),%r11d
  add    $0x2,%eax
  movslq %r8d,%r8
  movslq %ecx,%rcx
  add    (%rsi,%r8,2),%r11w
  mov    %r11w,(%rdi,%rcx,2)
  cmp    %edx,%eax
  jge    L91
  add    %edx,%eax
  movzwl 0x8(%rsi,%r10,1),%edx
  add    0xa(%rsi,%r9,2),%dx
  cltq
  mov    %dx,(%rdi,%rax,2)
L91:
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopw   0x0(%rax,%rax,1)
L35:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L31:
  movzwl (%rsi,%rax,4),%edx
  add    0x2(%rsi,%rax,4),%dx
  mov    %dx,(%rcx,%rax,2)
  add    $0x1,%rax
  cmp    %r10,%rax
  jne    L31
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L87:
  ret
L39:
  xor    %ecx,%ecx
  xor    %eax,%eax
  jmp    L63
```

assistant: ```c
void test_phaddw_c(unsigned short *pDst, unsigned short *pSrc, int xmm) {
  int i;
  for (i = 0; i < (2 << xmm); i++)
    pDst[i] = pDst[i * 2] + pDst[i * 2 + 1];
  for (i = 0; i < (2 << xmm); i++)
    pDst[i + (2 << xmm)] = pSrc[i * 2] + pSrc[i * 2 + 1];
}
```