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

```asm
<vecswap>:
  endbr64
  push   %r15
  lea    -0x1(%rdx),%eax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %eax,-0x34(%rsp)
  test   %edx,%edx
  jle    L14
  mov    %edx,%ebx
  movslq %edi,%r10
  movslq %esi,%rbp
  mov    %rcx,%r9
  movslq %ebx,%r12
  lea    0x10(,%r10,4),%rdx
  mov    %ebx,-0x38(%rsp)
  lea    0x0(,%rbp,4),%r13
  lea    (%r10,%r12,1),%rax
  add    %rbp,%r12
  mov    %rdx,-0x30(%rsp)
  lea    0x0(,%r10,4),%r14
  lea    (%rcx,%rax,8),%r15
  lea    (%r8,%rax,4),%rdx
  mov    %r15,-0x28(%rsp)
  lea    0x0(,%r10,8),%r15
  lea    (%r8,%r14,1),%r11
  lea    (%rcx,%r15,1),%rax
  lea    (%rcx,%r12,8),%rcx
  mov    %rdx,-0x48(%rsp)
  mov    %r15,-0x18(%rsp)
  lea    (%r8,%r13,1),%rdx
  mov    %rcx,%r15
  lea    (%r8,%r12,4),%r12
  lea    0x0(,%rbp,8),%rcx
  mov    %r12,-0x40(%rsp)
  mov    %rcx,-0x10(%rsp)
  add    %r9,%rcx
  cmp    %rdx,%r15
  setbe  %r12b
  cmp    -0x40(%rsp),%rcx
  mov    %r15,-0x20(%rsp)
  setae  %r15b
  or     %r12d,%r15d
  cmp    $0x1,%ebx
  setne  %r12b
  and    %r15d,%r12d
  lea    0x10(%r13),%r15
  cmp    %r15,%r14
  mov    -0x28(%rsp),%r15
  setge  %r14b
  cmp    -0x30(%rsp),%r13
  setge  %r13b
  or     %r14d,%r13d
  and    %r12d,%r13d
  cmp    %r11,%r15
  setbe  %r12b
  cmp    %rax,-0x48(%rsp)
  setbe  %r14b
  or     %r14d,%r12d
  and    %r13d,%r12d
  cmp    -0x20(%rsp),%r11
  setae  %r13b
  cmp    %rcx,-0x48(%rsp)
  setbe  %r14b
  or     %r14d,%r13d
  and    %r12d,%r13d
  cmp    %rdx,%r15
  setbe  %r12b
  cmp    -0x40(%rsp),%rax
  setae  %r14b
  or     %r14d,%r12d
  test   %r12b,%r13b
  je     L38
  mov    -0x18(%rsp),%r15
  mov    -0x10(%rsp),%r14
  lea    0x20(%r15),%r12
  lea    0x20(%r14),%r13
  cmp    %r14,%r12
  setle  %r12b
  cmp    %r15,%r13
  setle  %r13b
  or     %r12b,%r13b
  je     L38
  cmpl   $0x2,-0x34(%rsp)
  jbe    L17
  mov    %ebx,%r13d
  xor    %r12d,%r12d
  shr    $0x2,%r13d
  shl    $0x4,%r13
  nopl   0x0(%rax,%rax,1)
L83:
  movdqu 0x10(%rax,%r12,2),%xmm0
  movdqu 0x10(%rcx,%r12,2),%xmm2
  movdqu (%rcx,%r12,2),%xmm3
  movdqu (%rax,%r12,2),%xmm1
  movups %xmm2,0x10(%rax,%r12,2)
  movdqu (%rdx,%r12,1),%xmm4
  movups %xmm3,(%rax,%r12,2)
  movups %xmm0,0x10(%rcx,%r12,2)
  movdqu (%r11,%r12,1),%xmm0
  movups %xmm1,(%rcx,%r12,2)
  movups %xmm4,(%r11,%r12,1)
  movups %xmm0,(%rdx,%r12,1)
  add    $0x10,%r12
  cmp    %r13,%r12
  jne    L83
  mov    %ebx,%eax
  and    $0xfffffffc,%eax
  add    %eax,%edi
  add    %eax,%esi
  cmp    %eax,%ebx
  je     L14
  sub    %eax,%ebx
  mov    %ebx,-0x38(%rsp)
  cmp    $0x1,%ebx
  je     L36
L82:
  add    %rax,%r10
  add    %rbp,%rax
  lea    (%r9,%r10,8),%rcx
  lea    (%r9,%rax,8),%rdx
  mov    (%rcx),%rbx
  mov    0x8(%rcx),%r11
  lea    (%r8,%rax,4),%rax
  lea    (%r8,%r10,4),%r10
  mov    (%rdx),%r12
  mov    0x8(%rdx),%rbp
  mov    %r12,(%rcx)
  mov    %rbp,0x8(%rcx)
  mov    (%rax),%rcx
  mov    %rbx,(%rdx)
  mov    -0x38(%rsp),%ebx
  mov    %r11,0x8(%rdx)
  mov    (%r10),%rdx
  mov    %rcx,(%r10)
  mov    %rdx,(%rax)
  mov    %ebx,%eax
  and    $0xfffffffe,%eax
  add    %eax,%edi
  add    %eax,%esi
  cmp    %eax,%ebx
  je     L14
L36:
  movslq %esi,%rsi
  movslq %edi,%rdi
  lea    (%r9,%rdi,8),%rdx
  lea    (%r9,%rsi,8),%rax
  mov    (%rdx),%rcx
  mov    (%rax),%r9
  mov    %r9,(%rdx)
  lea    (%r8,%rdi,4),%rdx
  mov    %rcx,(%rax)
  lea    (%r8,%rsi,4),%rax
  mov    (%rdx),%ecx
  mov    (%rax),%esi
  mov    %esi,(%rdx)
  mov    %ecx,(%rax)
L14:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L38:
  mov    -0x34(%rsp),%ecx
  add    %r10,%rcx
  lea    0x8(%r9,%rcx,8),%r8
  mov    %rbp,%rcx
  sub    %r10,%rcx
  sub    %rbp,%r10
  nopl   (%rax)
L28:
  mov    (%rax),%rsi
  mov    (%rax,%rcx,8),%rdi
  mov    %rdi,(%rax)
  mov    (%rdx),%edi
  mov    %rsi,(%rax,%rcx,8)
  mov    (%rdx,%r10,4),%esi
  add    $0x8,%rax
  mov    %edi,(%rdx,%r10,4)
  add    $0x4,%rdx
  mov    %esi,-0x4(%rdx)
  cmp    %r8,%rax
  jne    L28
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L17:
  xor    %eax,%eax
  jmp    L82
```

assistant: ```c
void vecswap(int i, int j, int n, char **x, int *oi) {
  while (n-- > 0) {
    do {
      __typeof__(x[i]) _t = x[i];
      x[i] = x[j];
      x[j] = _t;
    } while (0);
    do {
      __typeof__(oi[i]) _t = oi[i];
      oi[i] = oi[j];
      oi[j] = _t;
    } while (0);
    ++i;
    ++j;
  }
}
```