user: What is the c source code of the assembly code below?

```asm
<qexchange>:
  endbr64
  mov    %rdi,%rcx
  cmp    $0x8,%rdx
  jbe    L146
  lea    0xf(%rdi),%rax
  sub    $0x9,%rdx
  sub    %rsi,%rax
  cmp    $0x1e,%rax
  jbe    L181
  cmp    $0xf,%rdx
  jbe    L181
  mov    %rdx,%r8
  xor    %eax,%eax
  shr    $0x3,%r8
  add    $0x1,%r8
  mov    %r8,%rdi
  shr    %rdi
  shl    $0x4,%rdi
  nopw   0x0(%rax,%rax,1)
L107:
  movdqu (%rcx,%rax,1),%xmm0
  movdqu (%rsi,%rax,1),%xmm1
  movups %xmm1,(%rcx,%rax,1)
  movups %xmm0,(%rsi,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%rdi
  jne    L107
  mov    %r8,%r9
  and    $0xfffffffffffffffe,%r9
  lea    0x0(,%r9,8),%rax
  lea    (%rcx,%rax,1),%rdi
  add    %rsi,%rax
  cmp    %r9,%r8
  je     L239
  mov    (%rdi),%r8
  mov    (%rax),%r9
  mov    %r9,(%rdi)
  mov    %r8,(%rax)
L239:
  mov    %rdx,%rax
  shr    $0x3,%rax
  lea    0x8(,%rax,8),%rdi
  neg    %rax
  add    %rdi,%rcx
  add    %rdi,%rsi
  lea    (%rdx,%rax,8),%rax
L212:
  lea    0x7(%rsi),%rdx
  sub    %rcx,%rdx
  cmp    $0xe,%rdx
  jbe    L65
  cmp    $0x6,%rax
  jbe    L65
  mov    (%rcx),%rdx
  mov    (%rsi),%r8
  lea    0x1(%rax),%rdi
  mov    %r8,(%rcx)
  mov    %rdx,(%rsi)
  mov    %rdi,%rdx
  and    $0xfffffffffffffff8,%rdx
  add    %rdx,%rcx
  add    %rdx,%rsi
  sub    %rdx,%rax
  cmp    %rdx,%rdi
  je     L219
  movzbl (%rcx),%edx
  movzbl (%rsi),%edi
  mov    %dil,(%rcx)
  mov    %dl,(%rsi)
  test   %rax,%rax
  je     L219
  movzbl 0x1(%rcx),%edx
  movzbl 0x1(%rsi),%edi
  mov    %dil,0x1(%rcx)
  mov    %dl,0x1(%rsi)
  cmp    $0x1,%rax
  je     L219
  movzbl 0x2(%rcx),%edx
  movzbl 0x2(%rsi),%edi
  mov    %dil,0x2(%rcx)
  mov    %dl,0x2(%rsi)
  cmp    $0x2,%rax
  je     L219
  movzbl 0x3(%rcx),%edx
  movzbl 0x3(%rsi),%edi
  mov    %dil,0x3(%rcx)
  mov    %dl,0x3(%rsi)
  cmp    $0x3,%rax
  je     L219
  movzbl 0x4(%rcx),%edx
  movzbl 0x4(%rsi),%edi
  mov    %dil,0x4(%rcx)
  mov    %dl,0x4(%rsi)
  cmp    $0x4,%rax
  je     L219
  movzbl 0x5(%rcx),%edx
  movzbl 0x5(%rsi),%edi
  mov    %dil,0x5(%rcx)
  mov    %dl,0x5(%rsi)
  cmp    $0x5,%rax
  je     L219
  movzbl 0x6(%rcx),%eax
  movzbl 0x6(%rsi),%edx
  mov    %dl,0x6(%rcx)
  mov    %al,0x6(%rsi)
  ret
  xchg   %ax,%ax
L146:
  test   %rdx,%rdx
  jne    L114
L219:
  ret
  nopw   0x0(%rax,%rax,1)
L65:
  movzbl (%rcx),%edx
  movzbl (%rsi),%edi
  mov    %dil,(%rcx)
  mov    %dl,(%rsi)
  test   %rax,%rax
  je     L219
  movzbl 0x1(%rcx),%edx
  movzbl 0x1(%rsi),%edi
  mov    %dil,0x1(%rcx)
  mov    %dl,0x1(%rsi)
  cmp    $0x1,%rax
  je     L219
  movzbl 0x2(%rcx),%edx
  movzbl 0x2(%rsi),%edi
  mov    %dil,0x2(%rcx)
  mov    %dl,0x2(%rsi)
  cmp    $0x2,%rax
  je     L219
  movzbl 0x3(%rcx),%edx
  movzbl 0x3(%rsi),%edi
  mov    %dil,0x3(%rcx)
  mov    %dl,0x3(%rsi)
  cmp    $0x3,%rax
  je     L219
  movzbl 0x4(%rcx),%edx
  movzbl 0x4(%rsi),%edi
  mov    %dil,0x4(%rcx)
  mov    %dl,0x4(%rsi)
  cmp    $0x4,%rax
  je     L219
  movzbl 0x5(%rcx),%edx
  movzbl 0x5(%rsi),%edi
  mov    %dil,0x5(%rcx)
  mov    %dl,0x5(%rsi)
  cmp    $0x5,%rax
  je     L219
  movzbl 0x6(%rcx),%edx
  movzbl 0x6(%rsi),%edi
  mov    %dil,0x6(%rcx)
  mov    %dl,0x6(%rsi)
  cmp    $0x6,%rax
  je     L219
  movzbl 0x7(%rcx),%eax
  movzbl 0x7(%rsi),%edx
  mov    %dl,0x7(%rcx)
  mov    %al,0x7(%rsi)
  ret
  nopl   0x0(%rax)
L181:
  mov    %rdx,%rax
  mov    %rsi,%rdi
  shr    $0x3,%rax
  lea    0x8(%rcx,%rax,8),%r10
  mov    %rcx,%rax
  nopw   0x0(%rax,%rax,1)
L46:
  mov    (%rax),%r8
  mov    (%rdi),%r9
  add    $0x8,%rax
  add    $0x8,%rdi
  mov    %r9,-0x8(%rax)
  mov    %r8,-0x8(%rdi)
  cmp    %r10,%rax
  jne    L46
  jmp    L239
L114:
  lea    -0x1(%rdx),%rax
  jmp    L212
```

assistant: ```c
void qexchange(char *p, char *q, size_t n) {
  long c;
  long *pp = (long *)p;
  long *qq = (long *)q;
  while (n > sizeof(long)) {
    c = *pp;
    *pp++ = *qq;
    *qq++ = c;
    n -= sizeof(long);
  }
  p = (char *)pp;
  q = (char *)qq;
  while (n--) {
    c = *p;
    *p++ = *q;
    *q++ = c;
  }
}
```