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

```asm
<quicksort>:
  endbr64
  mov    %esi,%eax
  push   %r15
  mov    %rdi,%r15
  push   %r14
  shr    $0x1f,%eax
  push   %r13
  add    %esi,%eax
  push   %r12
  sar    %eax
  push   %rbp
  cltq
  push   %rbx
  lea    (%rdi,%rax,4),%rax
  sub    $0x78,%rsp
  mov    %esi,0x18(%rsp)
  cmp    $0x1,%esi
  jle    L714
  mov    (%rax),%edx
  mov    %esi,%eax
L489:
  sub    $0x1,%eax
  mov    %r15,%r8
  xor    %ecx,%ecx
  movslq %eax,%rdi
L425:
  mov    (%r8),%r10d
  lea    (%r15,%rdi,4),%r9
  mov    %ecx,0x1c(%rsp)
  mov    (%r9),%esi
  cmp    %edx,%r10d
  jl     L263
  cmp    %esi,%edx
  jge    L54
  lea    -0x4(%r15,%rdi,4),%rdi
L699:
  mov    %rdi,%r9
  mov    (%rdi),%esi
  sub    $0x4,%rdi
  sub    $0x1,%eax
  cmp    %edx,%esi
  jg     L699
L54:
  cmp    %ecx,%eax
  jle    L357
  mov    %esi,(%r8)
  add    $0x1,%eax
  mov    %r10d,(%r9)
  movslq %eax,%rdi
L263:
  add    $0x1,%rcx
  add    $0x4,%r8
  jmp    L425
L714:
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L357:
  mov    0x1c(%rsp),%esi
  mov    %r8,0x38(%rsp)
  mov    %esi,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%esi
  jle    L174
  mov    (%rax),%edx
  mov    0x1c(%rsp),%eax
  mov    %eax,(%rsp)
L57:
  sub    $0x1,%eax
  mov    %r15,%r8
  xor    %ecx,%ecx
  movslq %eax,%rdi
L509:
  mov    (%r8),%r10d
  lea    (%r15,%rdi,4),%r9
  mov    %ecx,0x20(%rsp)
  mov    (%r9),%esi
  cmp    %edx,%r10d
  jl     L164
  cmp    %esi,%edx
  jge    L281
  lea    -0x4(%r15,%rdi,4),%rdi
L253:
  mov    %rdi,%r9
  mov    (%rdi),%esi
  sub    $0x4,%rdi
  sub    $0x1,%eax
  cmp    %edx,%esi
  jg     L253
L281:
  cmp    %ecx,%eax
  jle    L416
  mov    %esi,(%r8)
  add    $0x1,%eax
  mov    %r10d,(%r9)
  movslq %eax,%rdi
L164:
  add    $0x1,%rcx
  add    $0x4,%r8
  jmp    L509
L174:
  mov    0x1c(%rsp),%eax
  sub    %eax,0x18(%rsp)
  mov    0x18(%rsp),%ebx
  mov    0x38(%rsp),%r15
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%ebx
  jle    L714
  mov    (%rax),%edx
  mov    %ebx,%eax
  jmp    L489
L416:
  mov    0x20(%rsp),%edi
  mov    %r8,0x40(%rsp)
  mov    %edi,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%edi
  jle    L225
  mov    (%rax),%edx
  mov    0x20(%rsp),%eax
  mov    %eax,0x4(%rsp)
L390:
  sub    $0x1,%eax
  mov    %r15,%r8
  xor    %ecx,%ecx
  movslq %eax,%rdi
L535:
  mov    (%r8),%r10d
  lea    (%r15,%rdi,4),%r9
  mov    %ecx,0x24(%rsp)
  mov    (%r9),%esi
  cmp    %edx,%r10d
  jl     L662
  cmp    %esi,%edx
  jge    L653
  lea    -0x4(%r15,%rdi,4),%rdi
L514:
  mov    %rdi,%r9
  mov    (%rdi),%esi
  sub    $0x4,%rdi
  sub    $0x1,%eax
  cmp    %edx,%esi
  jg     L514
L653:
  cmp    %ecx,%eax
  jle    L303
  mov    %esi,(%r8)
  add    $0x1,%eax
  mov    %r10d,(%r9)
  movslq %eax,%rdi
L662:
  add    $0x1,%rcx
  add    $0x4,%r8
  jmp    L535
L225:
  mov    0x20(%rsp),%eax
  sub    %eax,(%rsp)
  mov    (%rsp),%ebx
  mov    0x40(%rsp),%r15
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%ebx
  jle    L174
  mov    (%rax),%edx
  mov    %ebx,%eax
  jmp    L57
L303:
  mov    0x24(%rsp),%ebx
  mov    %r8,0x48(%rsp)
  mov    %ebx,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%ebx
  jle    L645
  mov    (%rax),%edx
  mov    0x24(%rsp),%eax
  mov    %eax,0x8(%rsp)
L204:
  sub    $0x1,%eax
  mov    %r15,%r8
  xor    %ecx,%ecx
  movslq %eax,%rdi
L181:
  mov    (%r8),%r10d
  lea    (%r15,%rdi,4),%r9
  mov    %ecx,0x28(%rsp)
  mov    (%r9),%esi
  cmp    %edx,%r10d
  jl     L553
  cmp    %esi,%edx
  jge    L279
  lea    -0x4(%r15,%rdi,4),%rdi
L232:
  mov    %rdi,%r9
  mov    (%rdi),%esi
  sub    $0x4,%rdi
  sub    $0x1,%eax
  cmp    %edx,%esi
  jg     L232
L279:
  cmp    %ecx,%eax
  jle    L329
  mov    %esi,(%r8)
  add    $0x1,%eax
  mov    %r10d,(%r9)
  movslq %eax,%rdi
L553:
  add    $0x1,%rcx
  add    $0x4,%r8
  jmp    L181
L645:
  mov    0x24(%rsp),%eax
  sub    %eax,0x4(%rsp)
  mov    0x4(%rsp),%ebx
  mov    0x48(%rsp),%r15
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%ebx
  jle    L225
  mov    (%rax),%edx
  mov    %ebx,%eax
  jmp    L390
L329:
  mov    0x28(%rsp),%ecx
  mov    %r8,0x50(%rsp)
  mov    %ecx,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%ecx
  jle    L44
  mov    (%rax),%edx
  mov    0x28(%rsp),%eax
  mov    %eax,0xc(%rsp)
L122:
  sub    $0x1,%eax
  mov    %r15,%r8
  xor    %ecx,%ecx
  movslq %eax,%rdi
L524:
  mov    (%r8),%r10d
  lea    (%r15,%rdi,4),%r9
  mov    %ecx,0x2c(%rsp)
  mov    (%r9),%esi
  cmp    %edx,%r10d
  jl     L414
  cmp    %esi,%edx
  jge    L227
  lea    -0x4(%r15,%rdi,4),%rdi
L549:
  mov    %rdi,%r9
  mov    (%rdi),%esi
  sub    $0x4,%rdi
  sub    $0x1,%eax
  cmp    %edx,%esi
  jg     L549
L227:
  cmp    %ecx,%eax
  jle    L648
  mov    %esi,(%r8)
  add    $0x1,%eax
  mov    %r10d,(%r9)
  movslq %eax,%rdi
L414:
  add    $0x1,%rcx
  add    $0x4,%r8
  jmp    L524
L648:
  mov    0x2c(%rsp),%esi
  mov    %r8,0x58(%rsp)
  mov    %esi,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%esi
  jle    L522
  mov    (%rax),%r9d
  mov    0x2c(%rsp),%eax
  mov    %eax,0x10(%rsp)
L438:
  sub    $0x1,%eax
  mov    %r15,%r14
  xor    %esi,%esi
  movslq %eax,%rdx
L20:
  mov    (%r14),%r8d
  lea    (%r15,%rdx,4),%rdi
  mov    %esi,%r10d
  mov    (%rdi),%ecx
  cmp    %r9d,%r8d
  jl     L497
  cmp    %ecx,%r9d
  jge    L683
  lea    -0x4(%r15,%rdx,4),%rdx
  nopl   0x0(%rax)
L586:
  mov    %rdx,%rdi
  mov    (%rdx),%ecx
  sub    $0x4,%rdx
  sub    $0x1,%eax
  cmp    %r9d,%ecx
  jg     L586
L683:
  cmp    %esi,%eax
  jle    L702
  mov    %ecx,(%r14)
  add    $0x1,%eax
  mov    %r8d,(%rdi)
  movslq %eax,%rdx
L497:
  add    $0x1,%rsi
  add    $0x4,%r14
  jmp    L20
L702:
  mov    %r10d,%eax
  mov    %r10d,0x30(%rsp)
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%r10d
  jle    L314
  mov    (%rax),%esi
  mov    0x30(%rsp),%eax
  mov    %r14,0x60(%rsp)
  mov    %eax,0x14(%rsp)
L593:
  sub    $0x1,%eax
  mov    %r15,%r14
  xor    %r8d,%r8d
  movslq %eax,%rdx
  nopl   0x0(%rax,%rax,1)
L103:
  mov    (%r14),%r9d
  lea    (%r15,%rdx,4),%rdi
  mov    %r8d,%r10d
  mov    (%rdi),%ecx
  cmp    %esi,%r9d
  jl     L400
  cmp    %ecx,%esi
  jge    L680
  lea    -0x4(%r15,%rdx,4),%rdx
  nopw   0x0(%rax,%rax,1)
L310:
  mov    %rdx,%rdi
  mov    (%rdx),%ecx
  sub    $0x4,%rdx
  sub    $0x1,%eax
  cmp    %esi,%ecx
  jg     L310
L680:
  cmp    %r8d,%eax
  jle    L125
  mov    %ecx,(%r14)
  add    $0x1,%eax
  mov    %r9d,(%rdi)
  movslq %eax,%rdx
L400:
  add    $0x1,%r8
  add    $0x4,%r14
  jmp    L103
L125:
  mov    %r10d,%eax
  mov    %r10d,0x34(%rsp)
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%r10d
  jle    L622
  mov    (%rax),%esi
  mov    %r10d,%ebx
L383:
  lea    -0x1(%rbx),%eax
  mov    %r15,%r12
  xor    %edi,%edi
  movslq %eax,%rdx
  nopl   (%rax)
L312:
  mov    (%r12),%r9d
  lea    (%r15,%rdx,4),%r8
  mov    %edi,%r13d
  mov    (%r8),%ecx
  cmp    %esi,%r9d
  jl     L116
  cmp    %ecx,%esi
  jge    L231
  lea    -0x4(%r15,%rdx,4),%rdx
  nopl   0x0(%rax)
L67:
  mov    %rdx,%r8
  mov    (%rdx),%ecx
  sub    $0x4,%rdx
  sub    $0x1,%eax
  cmp    %esi,%ecx
  jg     L67
L231:
  cmp    %edi,%eax
  jle    L521
  mov    %ecx,(%r12)
  add    $0x1,%eax
  mov    %r9d,(%r8)
  movslq %eax,%rdx
L116:
  add    $0x1,%rdi
  add    $0x4,%r12
  jmp    L312
L521:
  mov    %r13d,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%r13d
  jle    L49
  mov    (%rax),%eax
  mov    %r13d,%r9d
L657:
  lea    -0x1(%r9),%esi
  mov    %r15,%rbp
  xor    %edx,%edx
  movslq %esi,%r11
  nopl   (%rax)
L123:
  mov    0x0(%rbp),%edi
  lea    (%r15,%r11,4),%rcx
  mov    %edx,%r10d
  mov    (%rcx),%r8d
  cmp    %eax,%edi
  jl     L111
  cmp    %r8d,%eax
  jge    L188
  lea    -0x4(%r15,%r11,4),%r11
  nopl   0x0(%rax,%rax,1)
L284:
  mov    %r11,%rcx
  mov    (%r11),%r8d
  sub    $0x4,%r11
  sub    $0x1,%esi
  cmp    %eax,%r8d
  jg     L284
L188:
  cmp    %edx,%esi
  jle    L387
  mov    %r8d,0x0(%rbp)
  add    $0x1,%esi
  mov    %edi,(%rcx)
  movslq %esi,%r11
L111:
  add    $0x1,%rdx
  add    $0x4,%rbp
  jmp    L123
L49:
  sub    %r13d,%ebx
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  lea    (%r12,%rax,4),%rax
  cmp    $0x1,%ebx
  jle    L622
  mov    (%rax),%esi
  mov    %r12,%r15
  jmp    L383
  nopl   (%rax)
L387:
  mov    %r10d,%esi
  mov    %r15,%rdi
  mov    %r9d,0x6c(%rsp)
  mov    %r10d,0x68(%rsp)
  call   <quicksort>
  mov    0x68(%rsp),%r10d
  mov    0x6c(%rsp),%r9d
  sub    %r10d,%r9d
  mov    %r9d,%eax
  shr    $0x1f,%eax
  add    %r9d,%eax
  sar    %eax
  cltq
  lea    0x0(%rbp,%rax,4),%rax
  cmp    $0x1,%r9d
  jle    L49
  mov    (%rax),%eax
  mov    %rbp,%r15
  jmp    L657
L622:
  mov    0x34(%rsp),%eax
  sub    %eax,0x14(%rsp)
  mov    0x14(%rsp),%ecx
  mov    %ecx,%esi
  shr    $0x1f,%esi
  mov    %esi,%eax
  add    %ecx,%eax
  sar    %eax
  cltq
  lea    (%r14,%rax,4),%rax
  cmp    $0x1,%ecx
  jle    L228
  mov    (%rax),%esi
  mov    %r14,%r15
  mov    %ecx,%eax
  jmp    L593
L228:
  mov    0x60(%rsp),%r14
L314:
  mov    0x30(%rsp),%eax
  sub    %eax,0x10(%rsp)
  mov    0x10(%rsp),%esi
  mov    %esi,%ebx
  shr    $0x1f,%ebx
  mov    %ebx,%eax
  add    %esi,%eax
  sar    %eax
  cltq
  lea    (%r14,%rax,4),%rax
  cmp    $0x1,%esi
  jle    L522
  mov    (%rax),%r9d
  mov    %r14,%r15
  mov    %esi,%eax
  jmp    L438
L522:
  mov    0x2c(%rsp),%eax
  sub    %eax,0xc(%rsp)
  mov    0xc(%rsp),%ebx
  mov    0x58(%rsp),%r15
  mov    %ebx,%ecx
  shr    $0x1f,%ecx
  mov    %ecx,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%ebx
  jle    L44
  mov    (%rax),%edx
  mov    %ebx,%eax
  jmp    L122
L44:
  mov    0x28(%rsp),%eax
  sub    %eax,0x8(%rsp)
  mov    0x8(%rsp),%ebx
  mov    0x50(%rsp),%r15
  mov    %ebx,%eax
  shr    $0x1f,%eax
  add    %ebx,%eax
  sar    %eax
  cltq
  lea    (%r15,%rax,4),%rax
  cmp    $0x1,%ebx
  jle    L645
  mov    (%rax),%edx
  mov    %ebx,%eax
  jmp    L204
```

assistant: ```c
void quicksort(int *a, int array_size) {
  int pivot = a[array_size / 2];
  int i, j, temp;
  if (array_size < 2)
    return;
  for (i = 0, j = array_size - 1;; i++, j++) {
    while (a[i] < pivot)
      i++;
    while (a[j] > pivot)
      j--;
    if (i >= j)
      break;
    temp = a[i];
    a[i] = a[j];
    a[j] = temp;
  }
  quicksort(a, i);
  quicksort(a + i, array_size - i);
}
```