user: 下面的汇编指令对应的C源代码是什么：

```asm
<setup>:
  endbr64
  push   %r15
  mov    %rcx,%rax
  push   %r14
  imul   %rdx,%rax
  mov    %rcx,%r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x98,%rsp
  mov    %rdi,0x38(%rsp)
  mov    %rsi,%rdi
  add    %rdi,%rax
  mov    %rsi,0x40(%rsp)
  mov    %rdx,%rsi
  mov    %r8,0x20(%rsp)
  mov    %rax,0x88(%rsp)
  cmp    $0x5,%rdx
  jbe    L725
  mov    %r8,%r13
  mov    %rdx,%r8
  mov    0x38(%rsp),%r15
  mov    %r14,%rdx
  and    $0x1,%r8d
  add    $0x4,%r8
  sub    %r8,%rsi
  imul   %rcx,%rsi
  mov    %r13,%rcx
  lea    (%r15,%rsi,1),%rbp
  mov    %rsi,%rbx
  mov    %r8,%rsi
  mov    %rbp,%rdi
  mov    %rbp,0x10(%rsp)
  call   <insertionsort@plt>
  mov    0x40(%rsp),%r12
  lea    (%r15,%r14,1),%rsi
  mov    0x88(%rsp),%rdi
  lea    0x7(%r12,%rbx,1),%rax
  mov    %r15,%rbx
  and    $0xfffffffffffffff8,%rax
  mov    %rdi,(%rax)
  mov    %r15,%rdi
  call   *%r13
  test   %eax,%eax
  setg   %al
  movzbl %al,%eax
  mov    %eax,0xc(%rsp)
  cmp    %r15,%rbp
  jbe    L577
  lea    (%r14,%r14,1),%rax
  mov    %r14,%rdi
  mov    %rax,0x18(%rsp)
  lea    -0x1(%r14),%rax
  mov    %rax,0x58(%rsp)
  lea    -0x10(%r14),%rax
  shr    $0x4,%rax
  add    $0x1,%rax
  mov    %rax,0x60(%rsp)
  shl    $0x4,%rax
  sub    %rax,%rdi
  mov    %rax,0x68(%rsp)
  mov    %rdi,%rax
  mov    %rdi,0x70(%rsp)
  sub    $0x1,%rax
  mov    %rax,0x78(%rsp)
  xchg   %ax,%ax
L653:
  mov    0x18(%rsp),%rax
  lea    (%rbx,%rax,1),%rcx
  mov    %rcx,%r15
  cmp    %rcx,0x10(%rsp)
  jbe    L727
  mov    %rbx,0x28(%rsp)
  mov    $0x2,%ebp
  mov    0xc(%rsp),%ebx
  mov    %rax,%r13
  mov    %r12,0x30(%rsp)
  mov    0x20(%rsp),%r12
  mov    %rcx,0x48(%rsp)
  mov    %rcx,0x50(%rsp)
  jmp    L186
  xchg   %ax,%ax
L412:
  add    $0x2,%ebp
  add    %r13,%r15
  cmp    %r15,0x10(%rsp)
  jbe    L248
L186:
  lea    (%r15,%r14,1),%rsi
  mov    %r15,%rdi
  call   *%r12
  test   %eax,%eax
  setg   %al
  movzbl %al,%eax
  cmp    %ebx,%eax
  je     L412
L248:
  mov    0x28(%rsp),%rbx
  mov    0x30(%rsp),%r12
  mov    0x48(%rsp),%r13
  mov    0x50(%rsp),%rcx
  cmp    $0xf,%ebp
  jle    L727
  mov    %r14,%rax
  neg    %rax
  mov    %rax,0x80(%rsp)
  cmp    %r15,%rcx
  jae    L57
  mov    %r15,0x30(%rsp)
  mov    0x68(%rsp),%r15
  mov    %r14,0x28(%rsp)
  mov    %r12,%r14
  mov    0x60(%rsp),%r12
  xchg   %ax,%ax
L64:
  mov    %r13,%rbp
  sub    0x28(%rsp),%rbp
  mov    0x20(%rsp),%rax
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   *%rax
  mov    0xc(%rsp),%edi
  test   %eax,%eax
  setg   %al
  movzbl %al,%eax
  cmp    %edi,%eax
  je     L419
  add    $0x7,%r14
  mov    %r13,%r11
  sub    0x38(%rsp),%r11
  add    0x40(%rsp),%r11
  and    $0xfffffffffffffff8,%r14
  mov    %r11,(%r14)
  cmp    $0x1,%edi
  je     L713
  mov    %r11,%r14
  mov    %r13,%rbx
L419:
  add    0x18(%rsp),%r13
  cmp    0x30(%rsp),%r13
  jb     L64
  cmpl   $0x1,0xc(%rsp)
  mov    %r14,%r12
  mov    0x28(%rsp),%r14
  je     L664
L254:
  cmp    %r13,0x10(%rsp)
  ja     L745
  mov    0x80(%rsp),%rdi
  mov    0x20(%rsp),%rax
  mov    %r13,%rsi
  add    %r13,%rdi
  call   *%rax
  test   %eax,%eax
  jle    L141
L745:
  lea    0x7(%r12),%rax
  mov    %r13,%r12
  sub    0x38(%rsp),%r12
  mov    %r13,%rbx
  and    $0xfffffffffffffff8,%rax
  add    0x40(%rsp),%r12
  mov    %r12,(%rax)
L506:
  xorl   $0x1,0xc(%rsp)
  cmp    %rbx,0x10(%rsp)
  ja     L653
L577:
  add    $0x98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L727:
  mov    0x18(%rsp),%rdi
  mov    $0x10,%eax
  lea    0x10(%r14),%r13
  mov    0x40(%rsp),%r10
  mov    %r13,0x48(%rsp)
  lea    (%rbx,%r14,1),%rsi
  mov    0x38(%rsp),%r13
  sub    %rdi,%rax
  mov    %rax,0x30(%rsp)
  jmp    L193
  nopl   0x0(%rax,%rax,1)
L14:
  add    %rdi,%rsi
  cmp    %r15,%rcx
  jae    L506
  add    %rdi,%rcx
L193:
  lea    0x7(%r12),%rdx
  mov    %rcx,%r12
  mov    %rbx,%rax
  mov    %rcx,%rbx
  sub    %r13,%r12
  and    $0xfffffffffffffff8,%rdx
  add    %r10,%r12
  cmpl   $0x1,0xc(%rsp)
  mov    %r12,(%rdx)
  jne    L14
  mov    0x30(%rsp),%r9
  mov    %rsi,%rdx
  lea    (%rcx,%r9,1),%r8
  cmp    %r8,%rsi
  setae  %r9b
  cmpq   $0x0,0x48(%rsp)
  setle  %r8b
  or     %r9b,%r8b
  je     L566
  cmpq   $0x6,0x58(%rsp)
  jbe    L566
  cmpq   $0xe,0x58(%rsp)
  jbe    L58
  mov    0x60(%rsp),%r9
  xor    %edx,%edx
  xor    %r8d,%r8d
  nopl   (%rax)
L405:
  movdqu (%rax,%rdx,1),%xmm0
  movdqu (%rsi,%rdx,1),%xmm3
  add    $0x1,%r8
  movups %xmm3,(%rax,%rdx,1)
  movups %xmm0,(%rsi,%rdx,1)
  add    $0x10,%rdx
  cmp    %r9,%r8
  jb     L405
  mov    0x68(%rsp),%r11
  lea    (%rax,%r11,1),%r8
  lea    (%rsi,%r11,1),%rdx
  cmp    %r11,%r14
  je     L14
  mov    0x70(%rsp),%r9
  cmpq   $0x6,0x78(%rsp)
  mov    %r9,0x28(%rsp)
  jbe    L492
L82:
  lea    (%rax,%r11,1),%rbp
  add    %r14,%r11
  add    %r11,%rax
  mov    0x0(%rbp),%r11
  movq   (%rax),%xmm0
  movq   %xmm0,0x0(%rbp)
  mov    %r11,(%rax)
  mov    0x28(%rsp),%r11
  mov    %r11,%rax
  and    $0xfffffffffffffff8,%rax
  sub    %rax,%r9
  add    %rax,%r8
  add    %rax,%rdx
  cmp    %r11,%rax
  je     L14
L492:
  movzbl (%r8),%eax
  movzbl (%rdx),%r11d
  mov    %r11b,(%r8)
  mov    %al,(%rdx)
  cmp    $0x1,%r9
  je     L14
  movzbl 0x1(%r8),%eax
  movzbl 0x1(%rdx),%r11d
  mov    %r11b,0x1(%r8)
  mov    %al,0x1(%rdx)
  cmp    $0x2,%r9
  je     L14
  movzbl 0x2(%r8),%eax
  movzbl 0x2(%rdx),%r11d
  mov    %r11b,0x2(%r8)
  mov    %al,0x2(%rdx)
  cmp    $0x3,%r9
  je     L14
  movzbl 0x3(%r8),%eax
  movzbl 0x3(%rdx),%r11d
  mov    %r11b,0x3(%r8)
  mov    %al,0x3(%rdx)
  cmp    $0x4,%r9
  je     L14
  movzbl 0x4(%r8),%eax
  movzbl 0x4(%rdx),%r11d
  mov    %r11b,0x4(%r8)
  mov    %al,0x4(%rdx)
  cmp    $0x5,%r9
  je     L14
  movzbl 0x5(%r8),%eax
  movzbl 0x5(%rdx),%r11d
  mov    %r11b,0x5(%r8)
  mov    %al,0x5(%rdx)
  cmp    $0x6,%r9
  je     L14
  movzbl 0x6(%r8),%eax
  movzbl 0x6(%rdx),%r9d
  mov    %r9b,0x6(%r8)
  mov    %al,0x6(%rdx)
  jmp    L14
  nopl   0x0(%rax,%rax,1)
L713:
  mov    0x28(%rsp),%r8
  mov    0x58(%rsp),%r10
  mov    %r11,0x48(%rsp)
  mov    %r13,0x50(%rsp)
  mov    0x70(%rsp),%r11
  mov    0x78(%rsp),%r13
  mov    %r8,%r14
  sub    0x18(%rsp),%r14
  cs nopw 0x0(%rax,%rax,1)
L439:
  lea    0xf(%rbx),%rax
  sub    %rbp,%rax
  cmp    $0x1e,%rax
  jbe    L63
  cmp    $0x6,%r10
  jbe    L63
  cmp    $0xe,%r10
  jbe    L340
  xor    %eax,%eax
  xor    %edx,%edx
  nopl   0x0(%rax)
L188:
  movdqu (%rbx,%rax,1),%xmm0
  movdqu 0x0(%rbp,%rax,1),%xmm2
  add    $0x1,%rdx
  movups %xmm2,(%rbx,%rax,1)
  movups %xmm0,0x0(%rbp,%rax,1)
  add    $0x10,%rax
  cmp    %r12,%rdx
  jb     L188
  lea    (%rbx,%r15,1),%rax
  lea    0x0(%rbp,%r15,1),%rdx
  cmp    %r15,%r8
  je     L735
  mov    %r11,%r9
  cmp    $0x6,%r13
  jbe    L33
  mov    %r15,%rcx
  mov    %r11,%rsi
L641:
  lea    (%rbx,%rcx,1),%rdi
  add    %rbp,%rcx
  movq   (%rcx),%xmm1
  movq   (%rdi),%xmm0
  movq   %xmm1,(%rdi)
  movq   %xmm0,(%rcx)
  mov    %r9,%rcx
  and    $0xfffffffffffffff8,%rcx
  sub    %rcx,%rsi
  add    %rcx,%rax
  add    %rcx,%rdx
  cmp    %rcx,%r9
  je     L549
L400:
  movzbl (%rax),%ecx
  movzbl (%rdx),%edi
  mov    %dil,(%rax)
  mov    %cl,(%rdx)
  cmp    $0x1,%rsi
  je     L549
  movzbl 0x1(%rax),%ecx
  movzbl 0x1(%rdx),%edi
  mov    %dil,0x1(%rax)
  mov    %cl,0x1(%rdx)
  cmp    $0x2,%rsi
  je     L549
  movzbl 0x2(%rax),%ecx
  movzbl 0x2(%rdx),%edi
  mov    %dil,0x2(%rax)
  mov    %cl,0x2(%rdx)
  cmp    $0x3,%rsi
  je     L549
  movzbl 0x3(%rax),%ecx
  movzbl 0x3(%rdx),%edi
  mov    %dil,0x3(%rax)
  mov    %cl,0x3(%rdx)
  cmp    $0x4,%rsi
  je     L549
  movzbl 0x4(%rax),%ecx
  movzbl 0x4(%rdx),%edi
  mov    %dil,0x4(%rax)
  mov    %cl,0x4(%rdx)
  cmp    $0x5,%rsi
  je     L549
  movzbl 0x5(%rax),%ecx
  movzbl 0x5(%rdx),%edi
  mov    %dil,0x5(%rax)
  mov    %cl,0x5(%rdx)
  cmp    $0x6,%rsi
  je     L549
  movzbl 0x6(%rax),%ecx
  movzbl 0x6(%rdx),%esi
  mov    %sil,0x6(%rax)
  mov    %cl,0x6(%rdx)
L549:
  lea    (%rbx,%r8,1),%rax
L735:
  add    %r14,%rbp
  mov    %rax,%rbx
  cmp    %rax,%rbp
  ja     L439
  mov    0x48(%rsp),%r11
  mov    0x50(%rsp),%r13
  mov    %r11,%r14
  mov    %r13,%rbx
  jmp    L419
  nopw   0x0(%rax,%rax,1)
L63:
  mov    %rbp,%rdx
  lea    (%rbx,%r8,1),%rax
  nopw   0x0(%rax,%rax,1)
L558:
  movzbl (%rbx),%ecx
  movzbl (%rdx),%esi
  add    $0x1,%rbx
  add    $0x1,%rdx
  mov    %sil,-0x1(%rbx)
  mov    %cl,-0x1(%rdx)
  cmp    %rax,%rbx
  jne    L558
  jmp    L735
L340:
  mov    %r8,%r9
  mov    %rbp,%rdx
  mov    %rbx,%rax
  mov    %r8,%rsi
  xor    %ecx,%ecx
  jmp    L641
L33:
  mov    %r11,%rsi
  jmp    L400
L566:
  lea    (%r14,%rsi,1),%r9
  nopl   0x0(%rax,%rax,1)
L386:
  movzbl (%rax),%r8d
  movzbl (%rdx),%r11d
  add    $0x1,%rdx
  add    $0x1,%rax
  mov    %r11b,-0x1(%rax)
  mov    %r8b,-0x1(%rdx)
  cmp    %r9,%rdx
  jne    L386
  jmp    L14
L141:
  mov    0x88(%rsp),%rax
  add    $0x7,%r12
  and    $0xfffffffffffffff8,%r12
  mov    %rax,(%r12)
  jmp    L577
L57:
  cmpl   $0x1,0xc(%rsp)
  jne    L745
L664:
  mov    0x80(%rsp),%rax
  mov    %r12,0x28(%rsp)
  mov    %r14,%r11
  mov    0x58(%rsp),%r12
  mov    0x60(%rsp),%r8
  mov    %r13,0x30(%rsp)
  add    %r13,%rax
  mov    0x68(%rsp),%rbp
  mov    0x70(%rsp),%r15
  mov    0x78(%rsp),%r13
  sub    0x18(%rsp),%r11
  nopl   0x0(%rax)
L47:
  lea    0xf(%rbx),%rdx
  sub    %rax,%rdx
  cmp    $0x1e,%rdx
  jbe    L611
  cmp    $0x6,%r12
  jbe    L611
  cmp    $0xe,%r12
  jbe    L2
  xor    %edx,%edx
  xor    %ecx,%ecx
  nopl   0x0(%rax)
L369:
  movdqu (%rbx,%rdx,1),%xmm0
  movdqu (%rax,%rdx,1),%xmm4
  add    $0x1,%rcx
  movups %xmm4,(%rbx,%rdx,1)
  movups %xmm0,(%rax,%rdx,1)
  add    $0x10,%rdx
  cmp    %r8,%rcx
  jb     L369
  lea    (%rbx,%rbp,1),%rdx
  lea    (%rax,%rbp,1),%rcx
  cmp    %rbp,%r14
  je     L489
  mov    %r15,%r10
  cmp    $0x6,%r13
  jbe    L581
  mov    %rbp,%rsi
  mov    %r15,%rdi
L474:
  lea    (%rbx,%rsi,1),%r9
  add    %rax,%rsi
  movq   (%rsi),%xmm1
  movq   (%r9),%xmm0
  movq   %xmm1,(%r9)
  movq   %xmm0,(%rsi)
  mov    %r10,%rsi
  and    $0xfffffffffffffff8,%rsi
  sub    %rsi,%rdi
  add    %rsi,%rdx
  add    %rsi,%rcx
  cmp    %rsi,%r10
  je     L480
L739:
  movzbl (%rdx),%esi
  movzbl (%rcx),%r9d
  mov    %r9b,(%rdx)
  mov    %sil,(%rcx)
  cmp    $0x1,%rdi
  je     L480
  movzbl 0x1(%rdx),%esi
  movzbl 0x1(%rcx),%r9d
  mov    %r9b,0x1(%rdx)
  mov    %sil,0x1(%rcx)
  cmp    $0x2,%rdi
  je     L480
  movzbl 0x2(%rdx),%esi
  movzbl 0x2(%rcx),%r9d
  mov    %r9b,0x2(%rdx)
  mov    %sil,0x2(%rcx)
  cmp    $0x3,%rdi
  je     L480
  movzbl 0x3(%rdx),%esi
  movzbl 0x3(%rcx),%r9d
  mov    %r9b,0x3(%rdx)
  mov    %sil,0x3(%rcx)
  cmp    $0x4,%rdi
  je     L480
  movzbl 0x4(%rdx),%esi
  movzbl 0x4(%rcx),%r9d
  mov    %r9b,0x4(%rdx)
  mov    %sil,0x4(%rcx)
  cmp    $0x5,%rdi
  je     L480
  movzbl 0x5(%rdx),%esi
  movzbl 0x5(%rcx),%r9d
  mov    %r9b,0x5(%rdx)
  mov    %sil,0x5(%rcx)
  cmp    $0x6,%rdi
  je     L480
  movzbl 0x6(%rdx),%esi
  movzbl 0x6(%rcx),%edi
  mov    %dil,0x6(%rdx)
  mov    %sil,0x6(%rcx)
L480:
  lea    (%rbx,%r14,1),%rdx
L489:
  add    %r11,%rax
  mov    %rdx,%rbx
  cmp    %rdx,%rax
  ja     L47
  mov    0x28(%rsp),%r12
  mov    0x30(%rsp),%r13
  jmp    L254
L611:
  mov    %rax,%rcx
  lea    (%rbx,%r14,1),%rdx
  nopl   0x0(%rax,%rax,1)
L296:
  movzbl (%rbx),%esi
  movzbl (%rcx),%edi
  add    $0x1,%rbx
  add    $0x1,%rcx
  mov    %dil,-0x1(%rbx)
  mov    %sil,-0x1(%rcx)
  cmp    %rdx,%rbx
  jne    L296
  jmp    L489
L725:
  mov    0x38(%rsp),%rdi
  mov    %r8,%rcx
  mov    %r14,%rdx
  call   <insertionsort@plt>
  mov    0x40(%rsp),%rax
  mov    0x88(%rsp),%rdi
  add    $0x7,%rax
  and    $0xfffffffffffffff8,%rax
  mov    %rdi,(%rax)
  jmp    L577
L58:
  mov    %r14,0x28(%rsp)
  mov    %r14,%r9
  mov    %rax,%r8
  xor    %r11d,%r11d
  jmp    L82
L581:
  mov    %r15,%rdi
  jmp    L739
L2:
  mov    %r14,%r10
  mov    %rax,%rcx
  mov    %rbx,%rdx
  mov    %r14,%rdi
  xor    %esi,%esi
  jmp    L474
```

assistant: ```c
void setup(unsigned char *list1, unsigned char *list2, size_t n, size_t size, int (*cmp)(const void *, const void *)) {
  size_t i;
  unsigned int tmp;
  int length, sense;
  size_t size2;
  unsigned char *f1, *f2, *s, *l2, *last, *p2;
  size2 = size * 2;
  if (n <= 5) {
    insertionsort(list1, n, size, cmp);
    *(unsigned char **)((unsigned char *)0 + (((unsigned char *)list2 + sizeof(unsigned char *) - 1 - (unsigned char *)0) & ~(sizeof(unsigned char *) - 1))) = (unsigned char *)list2 + n * size;
    return;
  }
  i = 4 + (n & 1);
  insertionsort(list1 + (n - i) * size, i, size, cmp);
  last = list1 + size * (n - i);
  *(unsigned char **)((unsigned char *)0 + (((unsigned char *)list2 + (last - list1) + sizeof(unsigned char *) - 1 - (unsigned char *)0) & ~(sizeof(unsigned char *) - 1))) = list2 + n * size;
  p2 = list2;
  f1 = list1;
  sense = (cmp(f1, f1 + size) > 0);
  for (; f1 < last; sense = !sense) {
    length = 2;
    for (f2 = f1 + size2; f2 < last; f2 += size2) {
      if ((cmp(f2, f2 + size) > 0) != sense)
        break;
      length += 2;
    }
    if (length < 16) {
      do {
        p2 = *(unsigned char **)((unsigned char *)0 + (((unsigned char *)p2 + sizeof(unsigned char *) - 1 - (unsigned char *)0) & ~(sizeof(unsigned char *) - 1))) = f1 + size2 - list1 + list2;
        if (sense > 0) {
          s = f1 + size;
          i = size;
          do {
            tmp = *f1;
            *f1++ = *s;
            *s++ = tmp;
          } while (--i);
          f1 -= size;
        };
      } while ((f1 += size2) < f2);
    } else {
      l2 = f2;
      for (f2 = f1 + size2; f2 < l2; f2 += size2) {
        if ((cmp(f2 - size, f2) > 0) != sense) {
          p2 = *(unsigned char **)((unsigned char *)0 + (((unsigned char *)p2 + sizeof(unsigned char *) - 1 - (unsigned char *)0) & ~(sizeof(unsigned char *) - 1))) = f2 - list1 + list2;
          if (sense > 0) {
            s = f2 - size;
            do {
              i = size;
              do {
                tmp = *f1;
                *f1++ = *s;
                *s++ = tmp;
              } while (--i);
              s -= size2;
            } while (f1 < s);
          };
          f1 = f2;
        }
      }
      if (sense > 0) {
        s = f2 - size;
        do {
          i = size;
          do {
            tmp = *f1;
            *f1++ = *s;
            *s++ = tmp;
          } while (--i);
          s -= size2;
        } while (f1 < s);
      };
      f1 = f2;
      if (f2 < last || cmp(f2 - size, f2) > 0)
        p2 = *(unsigned char **)((unsigned char *)0 + (((unsigned char *)p2 + sizeof(unsigned char *) - 1 - (unsigned char *)0) & ~(sizeof(unsigned char *) - 1))) = f2 - list1 + list2;
      else
        p2 = *(unsigned char **)((unsigned char *)0 + (((unsigned char *)p2 + sizeof(unsigned char *) - 1 - (unsigned char *)0) & ~(sizeof(unsigned char *) - 1))) = list2 + n * size;
    }
  }
}
```