user: Translate the below assembly code into C programming language:

```asm
<quickSort>:
  endbr64
  cmp    %esi,%edi
  jge    L438
  push   %r15
  mov    %rdx,%r15
  push   %r14
  push   %r13
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  mov    %edi,%ebp
  push   %rbx
  sub    $0x48,%rsp
L520:
  mov    %r12d,%edx
  mov    %ebp,%esi
  mov    %r15,%rdi
  call   <partition@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L439
  cmp    %r12d,%eax
  jne    L292
  sub    $0x1,%r12d
L473:
  cmp    %r12d,%ebp
  jl     L520
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L439:
  mov    $0x1,%ebp
  jmp    L473
  nop
L292:
  lea    -0x1(%rax),%r14d
  cmp    %ebp,%r14d
  jle    L298
  mov    %eax,0x8(%rsp)
  mov    %r12d,0xc(%rsp)
  mov    %ebp,%r12d
  mov    %r14d,%ebp
L440:
  mov    %ebp,%edx
  mov    %r12d,%esi
  mov    %r15,%rdi
  call   <partition@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L81
  cmp    %ebp,%eax
  jne    L410
  sub    $0x1,%ebp
L203:
  cmp    %ebp,%r12d
  jl     L440
  mov    0x8(%rsp),%ebx
  mov    0xc(%rsp),%r12d
L298:
  lea    0x1(%rbx),%ebp
  jmp    L473
  nopl   (%rax)
L81:
  mov    $0x1,%r12d
  jmp    L203
L410:
  lea    -0x1(%rax),%r14d
  cmp    %r12d,%r14d
  jle    L25
  mov    %eax,0x10(%rsp)
  mov    %ebp,0x14(%rsp)
  mov    %r12d,%ebp
  mov    %r14d,%r12d
L505:
  mov    %r12d,%edx
  mov    %ebp,%esi
  mov    %r15,%rdi
  call   <partition@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L255
  cmp    %r12d,%eax
  jne    L455
  sub    $0x1,%r12d
L291:
  cmp    %r12d,%ebp
  jl     L505
  mov    0x10(%rsp),%ebx
  mov    0x14(%rsp),%ebp
L25:
  lea    0x1(%rbx),%r12d
  jmp    L203
  cs nopw 0x0(%rax,%rax,1)
L255:
  mov    $0x1,%ebp
  jmp    L291
  nopw   0x0(%rax,%rax,1)
L455:
  lea    -0x1(%rax),%r14d
  cmp    %ebp,%r14d
  jle    L411
  mov    %eax,0x18(%rsp)
  mov    %r14d,%r13d
  mov    %r12d,0x1c(%rsp)
  mov    %ebp,%r12d
  mov    %r15,%rbp
L464:
  mov    %r13d,%edx
  mov    %r12d,%esi
  mov    %rbp,%rdi
  call   <partition@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L533
  cmp    %r13d,%eax
  jne    L400
  sub    $0x1,%r13d
L353:
  cmp    %r13d,%r12d
  jl     L464
  mov    0x18(%rsp),%ebx
  mov    0x1c(%rsp),%r12d
  mov    %rbp,%r15
L411:
  lea    0x1(%rbx),%ebp
  jmp    L291
  xchg   %ax,%ax
L533:
  mov    $0x1,%r12d
  jmp    L353
  nopl   0x0(%rax,%rax,1)
L400:
  lea    -0x1(%rax),%r15d
  cmp    %r12d,%r15d
  jle    L107
  mov    %eax,0x20(%rsp)
  mov    %r13d,0x24(%rsp)
  mov    %r12d,%r13d
L177:
  mov    %r15d,%edx
  mov    %r13d,%esi
  mov    %rbp,%rdi
  call   <partition@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L421
  cmp    %r15d,%eax
  jne    L343
  sub    $0x1,%r15d
L497:
  cmp    %r15d,%r13d
  jl     L177
  mov    0x20(%rsp),%ebx
  mov    0x24(%rsp),%r13d
L107:
  lea    0x1(%rbx),%r12d
  jmp    L353
  cs nopw 0x0(%rax,%rax,1)
L421:
  mov    $0x1,%r13d
  jmp    L497
  nopl   0x0(%rax,%rax,1)
L343:
  lea    -0x1(%rax),%r12d
  cmp    %r13d,%r12d
  jle    L293
  mov    %eax,0x28(%rsp)
  mov    %r13d,%r14d
  mov    %r15d,0x2c(%rsp)
L262:
  mov    %r12d,%edx
  mov    %r14d,%esi
  mov    %rbp,%rdi
  call   <partition@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L208
  cmp    %r12d,%eax
  jne    L394
  sub    $0x1,%r12d
L504:
  cmp    %r12d,%r14d
  jl     L262
  mov    0x28(%rsp),%ebx
  mov    0x2c(%rsp),%r15d
L293:
  lea    0x1(%rbx),%r13d
  jmp    L497
  cs nopw 0x0(%rax,%rax,1)
L208:
  mov    $0x1,%r14d
  jmp    L504
  nopl   0x0(%rax,%rax,1)
L394:
  lea    -0x1(%rax),%r15d
  cmp    %r14d,%r15d
  jle    L221
  mov    %eax,0x30(%rsp)
  mov    %r12d,0x34(%rsp)
  mov    %r14d,%r12d
L263:
  mov    %r15d,%edx
  mov    %r12d,%esi
  mov    %rbp,%rdi
  call   <partition@plt>
  mov    %eax,%r13d
  test   %eax,%eax
  je     L500
  cmp    %r15d,%eax
  jne    L70
  sub    $0x1,%r15d
L83:
  cmp    %r15d,%r12d
  jl     L263
  mov    0x30(%rsp),%ebx
  mov    0x34(%rsp),%r12d
L221:
  lea    0x1(%rbx),%r14d
  jmp    L504
  nopw   0x0(%rax,%rax,1)
L500:
  mov    $0x1,%r12d
  jmp    L83
  nopl   0x0(%rax,%rax,1)
L70:
  lea    -0x1(%rax),%r14d
  cmp    %r12d,%r14d
  jle    L219
  mov    %eax,0x38(%rsp)
L134:
  mov    %r14d,%edx
  mov    %r12d,%esi
  mov    %rbp,%rdi
  call   <partition@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L471
  cmp    %r14d,%eax
  jne    L245
  sub    $0x1,%r14d
L246:
  cmp    %r14d,%r12d
  jl     L134
  mov    0x38(%rsp),%r13d
L219:
  lea    0x1(%r13),%r12d
  jmp    L83
  nopw   0x0(%rax,%rax,1)
L471:
  mov    $0x1,%r12d
  jmp    L246
  nopl   0x0(%rax,%rax,1)
L245:
  lea    -0x1(%rax),%r13d
  cmp    %r12d,%r13d
  jle    L303
  mov    %eax,0x3c(%rsp)
  mov    %rbp,%rbx
  mov    %r12d,%ebp
L361:
  mov    %r13d,%edx
  mov    %ebp,%esi
  mov    %rbx,%rdi
  call   <partition@plt>
  mov    %eax,%r12d
  test   %eax,%eax
  je     L492
  cmp    %r13d,%eax
  jne    L20
  sub    $0x1,%r13d
L179:
  cmp    %r13d,%ebp
  jl     L361
  mov    %rbx,%rbp
  mov    0x3c(%rsp),%ebx
L303:
  lea    0x1(%rbx),%r12d
  jmp    L246
  nopw   0x0(%rax,%rax,1)
L492:
  mov    $0x1,%ebp
  jmp    L179
  nop
L20:
  mov    %ebp,%edi
  lea    -0x1(%rax),%esi
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdx
  call   <quickSort>
  jmp    L179
  nopl   0x0(%rax)
L438:
  ret
```

assistant: ```c
void quickSort(int lo, int hi, unsigned long *arr) {
  int k;
  if (lo >= hi)
    return;
  k = partition(arr, lo, hi);
  if (k == 0) {
    quickSort(k + 1, hi, arr);
  } else if (k == hi) {
    quickSort(lo, k - 1, arr);
  } else {
    quickSort(lo, k - 1, arr);
    quickSort(k + 1, hi, arr);
  }
}
```