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

```asm
<setup>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  add    $0xffffffffffffff80,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  mov    %rdx,-0x68(%rbp)
  mov    %rcx,-0x70(%rbp)
  mov    %r8,-0x78(%rbp)
  mov    -0x70(%rbp),%rax
  add    %rax,%rax
  mov    %rax,-0x18(%rbp)
  cmpq   $0x5,-0x68(%rbp)
  ja     L217
  mov    -0x78(%rbp),%rcx
  mov    -0x70(%rbp),%rdx
  mov    -0x68(%rbp),%rsi
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  call   <insertionsort@plt>
  mov    -0x68(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x60(%rbp),%rax
  add    $0x7,%rax
  and    $0xfffffffffffffff8,%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  add    %rcx,%rax
  mov    %rax,(%rdx)
  jmp    L62
L217:
  mov    -0x68(%rbp),%rax
  and    $0x1,%eax
  add    $0x4,%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x68(%rbp),%rax
  sub    -0x40(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x58(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  mov    -0x78(%rbp),%rcx
  mov    -0x70(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  mov    %rax,%rsi
  call   <insertionsort@plt>
  mov    -0x68(%rbp),%rax
  sub    -0x40(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x68(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x10(%rbp),%rax
  sub    -0x58(%rbp),%rax
  lea    0x7(%rax),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  and    $0xfffffffffffffff8,%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  add    %rcx,%rax
  mov    %rax,(%rdx)
  mov    -0x60(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x38(%rbp),%rax
  mov    -0x78(%rbp),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   *%rdx
  test   %eax,%eax
  setg   %al
  movzbl %al,%eax
  mov    %eax,-0x48(%rbp)
  jmp    L200
L59:
  movl   $0x2,-0x4c(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  jmp    L163
L224:
  mov    -0x30(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x30(%rbp),%rax
  mov    -0x78(%rbp),%rdx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   *%rdx
  test   %eax,%eax
  setg   %al
  movzbl %al,%eax
  cmp    %eax,-0x48(%rbp)
  jne    L116
  addl   $0x2,-0x4c(%rbp)
  mov    -0x18(%rbp),%rax
  add    %rax,-0x30(%rbp)
L163:
  mov    -0x30(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L224
  jmp    L42
L116:
  nop
L42:
  cmpl   $0xf,-0x4c(%rbp)
  jg     L137
L177:
  mov    -0x38(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  sub    -0x58(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x20(%rbp),%rax
  add    $0x7,%rax
  and    $0xfffffffffffffff8,%rax
  mov    -0x60(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  cmpl   $0x0,-0x48(%rbp)
  jle    L142
  mov    -0x38(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x40(%rbp)
L201:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    -0x28(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x44(%rbp),%edx
  mov    %dl,(%rax)
  subq   $0x1,-0x40(%rbp)
  cmpq   $0x0,-0x40(%rbp)
  jne    L201
  mov    -0x70(%rbp),%rax
  neg    %rax
  add    %rax,-0x38(%rbp)
L142:
  mov    -0x18(%rbp),%rax
  add    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jb     L177
  jmp    L39
L137:
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
  jmp    L134
L1:
  mov    -0x70(%rbp),%rax
  neg    %rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x30(%rbp),%rax
  mov    -0x78(%rbp),%rdx
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   *%rdx
  test   %eax,%eax
  setg   %al
  movzbl %al,%eax
  cmp    %eax,-0x48(%rbp)
  je     L88
  mov    -0x30(%rbp),%rax
  sub    -0x58(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x20(%rbp),%rax
  add    $0x7,%rax
  and    $0xfffffffffffffff8,%rax
  mov    -0x60(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  cmpl   $0x0,-0x48(%rbp)
  jle    L107
  mov    -0x70(%rbp),%rax
  neg    %rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
L179:
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x40(%rbp)
L246:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    -0x28(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x44(%rbp),%edx
  mov    %dl,(%rax)
  subq   $0x1,-0x40(%rbp)
  cmpq   $0x0,-0x40(%rbp)
  jne    L246
  mov    -0x18(%rbp),%rax
  neg    %rax
  add    %rax,-0x28(%rbp)
  mov    -0x38(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jb     L179
L107:
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x38(%rbp)
L88:
  mov    -0x18(%rbp),%rax
  add    %rax,-0x30(%rbp)
L134:
  mov    -0x30(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jb     L1
  cmpl   $0x0,-0x48(%rbp)
  jle    L131
  mov    -0x70(%rbp),%rax
  neg    %rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
L76:
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x40(%rbp)
L14:
  mov    -0x38(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  mov    -0x28(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  mov    -0x44(%rbp),%edx
  mov    %dl,(%rax)
  subq   $0x1,-0x40(%rbp)
  cmpq   $0x0,-0x40(%rbp)
  jne    L14
  mov    -0x18(%rbp),%rax
  neg    %rax
  add    %rax,-0x28(%rbp)
  mov    -0x38(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jb     L76
L131:
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L135
  mov    -0x70(%rbp),%rax
  neg    %rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x30(%rbp),%rax
  mov    -0x78(%rbp),%rdx
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   *%rdx
  test   %eax,%eax
  jle    L20
L135:
  mov    -0x30(%rbp),%rax
  sub    -0x58(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x20(%rbp),%rax
  add    $0x7,%rax
  and    $0xfffffffffffffff8,%rax
  mov    -0x60(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
  jmp    L39
L20:
  mov    -0x68(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rcx
  mov    -0x20(%rbp),%rax
  add    $0x7,%rax
  and    $0xfffffffffffffff8,%rax
  mov    -0x60(%rbp),%rdx
  add    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    (%rax),%rax
  mov    %rax,-0x20(%rbp)
L39:
  cmpl   $0x0,-0x48(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x48(%rbp)
L200:
  mov    -0x38(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  jb     L59
L62:
  leave
  ret
```

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;
    }
  }
}
```