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

```asm
<merge_sort>:
  endbr64
  push   %r15
  mov    %ecx,%r15d
  xor    %eax,%eax
  push   %r14
  sub    %edx,%r15d
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %edx,0x4(%rsp)
  test   %r15d,%r15d
  jle    L34
  mov    %r15d,%eax
  mov    %rsi,%r14
  mov    %rdi,%r12
  mov    %ecx,%ebx
  movq   $0x0,0x8(%rsp)
  sar    %eax
  lea    (%rax,%rdx,1),%esi
  mov    %esi,(%rsp)
  je     L30
  mov    %r15d,%eax
  mov    $0x0,%ebp
  sar    $0x2,%eax
  lea    (%rdx,%rax,1),%edi
  mov    %edi,0x40(%rsp)
  je     L189
  mov    %r15d,%eax
  sar    $0x3,%eax
  lea    (%rdx,%rax,1),%r13d
  je     L166
  mov    %r15d,%eax
  sar    $0x4,%eax
  lea    (%rdx,%rax,1),%r10d
  je     L141
  sar    $0x5,%r15d
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %r10d,0x8(%rsp)
  add    %edx,%r15d
  mov    %r15d,%ecx
  call   <merge_sort>
  mov    0x8(%rsp),%r10d
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    0x1(%r15),%edx
  mov    %rax,%rbp
  mov    %r10d,%ecx
  mov    %r10d,0x10(%rsp)
  call   <merge_sort>
  mov    0x10(%rsp),%r8d
  mov    %r15d,%ecx
  mov    %r14,%rsi
  mov    0x4(%rsp),%edx
  mov    %r12,%rdi
  mov    %rax,0x8(%rsp)
  call   <merge@plt>
  add    0x8(%rsp),%rbp
  mov    0x10(%rsp),%r10d
  add    %rax,%rbp
L141:
  lea    0x1(%r10),%r11d
  mov    %r13d,%r9d
  xor    %r15d,%r15d
  sub    %r11d,%r9d
  test   %r9d,%r9d
  jle    L37
  sar    %r9d
  mov    %r11d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    (%r9,%r11,1),%r15d
  mov    %r10d,0x20(%rsp)
  mov    %r15d,%ecx
  mov    %r11d,0x18(%rsp)
  call   <merge_sort>
  lea    0x1(%r15),%edx
  mov    %r13d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x8(%rsp)
  call   <merge_sort>
  mov    0x18(%rsp),%edx
  mov    %r15d,%ecx
  mov    %r13d,%r8d
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x10(%rsp)
  call   <merge@plt>
  mov    0x8(%rsp),%rdx
  mov    0x20(%rsp),%r10d
  add    0x10(%rsp),%rdx
  lea    (%rdx,%rax,1),%r15
L37:
  mov    0x4(%rsp),%edx
  mov    %r13d,%r8d
  mov    %r10d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <merge@plt>
  add    %r15,%rax
  add    %rbp,%rax
  mov    %rax,0x8(%rsp)
L166:
  mov    0x40(%rsp),%r9d
  lea    0x1(%r13),%r15d
  xor    %ebp,%ebp
  sub    %r15d,%r9d
  test   %r9d,%r9d
  jle    L54
  sar    %r9d
  mov    %r15d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    (%r9,%r15,1),%ebp
  mov    %ebp,%ecx
  call   <merge_sort>
  mov    0x40(%rsp),%ecx
  lea    0x1(%rbp),%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x10(%rsp)
  call   <merge_sort>
  mov    0x40(%rsp),%r8d
  mov    %ebp,%ecx
  mov    %r15d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x18(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%rbp
  add    0x18(%rsp),%rbp
  add    %rax,%rbp
L54:
  mov    0x40(%rsp),%r8d
  mov    0x4(%rsp),%edx
  mov    %r13d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <merge@plt>
  add    %rax,%rbp
  add    0x8(%rsp),%rbp
L189:
  mov    0x40(%rsp),%eax
  mov    (%rsp),%r9d
  xor    %r15d,%r15d
  lea    0x1(%rax),%r13d
  sub    %r13d,%r9d
  test   %r9d,%r9d
  jle    L150
  movq   $0x0,0x8(%rsp)
  mov    %r9d,%eax
  sar    %eax
  lea    0x0(%r13,%rax,1),%r10d
  je     L23
  sar    $0x2,%r9d
  mov    %r13d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    (%r9,%r13,1),%r15d
  mov    %r10d,0x10(%rsp)
  mov    %r15d,%ecx
  call   <merge_sort>
  mov    0x10(%rsp),%r10d
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    0x1(%r15),%edx
  mov    %rax,0x8(%rsp)
  mov    %r10d,%ecx
  mov    %r10d,0x18(%rsp)
  call   <merge_sort>
  mov    0x18(%rsp),%r8d
  mov    %r13d,%edx
  mov    %r15d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x10(%rsp)
  call   <merge@plt>
  mov    0x8(%rsp),%rdx
  add    0x10(%rsp),%rdx
  add    %rdx,%rax
  mov    0x18(%rsp),%r10d
  mov    %rax,0x8(%rsp)
L23:
  mov    (%rsp),%r9d
  lea    0x1(%r10),%r11d
  xor    %r15d,%r15d
  sub    %r11d,%r9d
  test   %r9d,%r9d
  jle    L134
  sar    %r9d
  mov    %r11d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    (%r9,%r11,1),%r15d
  mov    %r10d,0x28(%rsp)
  mov    %r15d,%ecx
  mov    %r11d,0x20(%rsp)
  call   <merge_sort>
  mov    (%rsp),%ecx
  lea    0x1(%r15),%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x10(%rsp)
  call   <merge_sort>
  mov    (%rsp),%r8d
  mov    0x20(%rsp),%edx
  mov    %r15d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x18(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%r15
  mov    0x28(%rsp),%r10d
  add    0x18(%rsp),%r15
  add    %rax,%r15
L134:
  mov    (%rsp),%r8d
  mov    %r10d,%ecx
  mov    %r13d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <merge@plt>
  add    %r15,%rax
  mov    0x8(%rsp),%r15
  add    %rax,%r15
L150:
  mov    (%rsp),%r8d
  mov    0x40(%rsp),%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    0x4(%rsp),%edx
  call   <merge@plt>
  add    %r15,%rax
  add    %rbp,%rax
  mov    %rax,0x8(%rsp)
L30:
  mov    (%rsp),%eax
  mov    %ebx,%r13d
  xor    %ebp,%ebp
  lea    0x1(%rax),%r10d
  sub    %r10d,%r13d
  test   %r13d,%r13d
  jle    L185
  movq   $0x0,0x18(%rsp)
  mov    %r13d,%eax
  sar    %eax
  lea    (%r10,%rax,1),%edi
  mov    %edi,0x40(%rsp)
  je     L129
  mov    %r13d,%eax
  sar    $0x2,%eax
  lea    (%r10,%rax,1),%r15d
  je     L46
  sar    $0x3,%r13d
  mov    %r10d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  add    %r10d,%r13d
  mov    %r10d,0x18(%rsp)
  mov    %r13d,%ecx
  call   <merge_sort>
  lea    0x1(%r13),%edx
  mov    %r15d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,%rbp
  call   <merge_sort>
  mov    0x18(%rsp),%edx
  mov    %r15d,%r8d
  mov    %r13d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x10(%rsp)
  call   <merge@plt>
  add    0x10(%rsp),%rbp
  mov    0x18(%rsp),%r10d
  add    %rax,%rbp
L46:
  mov    0x40(%rsp),%eax
  lea    0x1(%r15),%r9d
  xor    %r13d,%r13d
  sub    %r9d,%eax
  test   %eax,%eax
  jle    L38
  sar    %eax
  mov    %r9d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    (%rax,%r9,1),%r13d
  mov    %r10d,0x28(%rsp)
  mov    %r13d,%ecx
  mov    %r9d,0x20(%rsp)
  call   <merge_sort>
  mov    0x40(%rsp),%ecx
  lea    0x1(%r13),%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x10(%rsp)
  call   <merge_sort>
  mov    0x20(%rsp),%edx
  mov    %r13d,%ecx
  mov    %r14,%rsi
  mov    0x40(%rsp),%r8d
  mov    %r12,%rdi
  mov    %rax,0x18(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%rdx
  mov    0x28(%rsp),%r10d
  add    0x18(%rsp),%rdx
  lea    (%rdx,%rax,1),%r13
L38:
  mov    0x40(%rsp),%r8d
  mov    %r10d,%edx
  mov    %r15d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %r10d,0x10(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%r10d
  add    %r13,%rax
  add    %rbp,%rax
  mov    %rax,0x18(%rsp)
L129:
  mov    0x40(%rsp),%eax
  mov    %ebx,%r13d
  xor    %ebp,%ebp
  lea    0x1(%rax),%r11d
  sub    %r11d,%r13d
  test   %r13d,%r13d
  jle    L107
  movq   $0x0,0x20(%rsp)
  mov    %r13d,%eax
  sar    %eax
  lea    (%r11,%rax,1),%esi
  mov    %esi,0x10(%rsp)
  je     L137
  mov    %r13d,%eax
  sar    $0x2,%eax
  lea    (%r11,%rax,1),%r9d
  je     L177
  sar    $0x3,%r13d
  mov    %r11d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  add    %r11d,%r13d
  mov    %r10d,0x38(%rsp)
  mov    %r13d,%ecx
  mov    %r11d,0x28(%rsp)
  mov    %r9d,0x20(%rsp)
  call   <merge_sort>
  mov    0x20(%rsp),%ecx
  lea    0x1(%r13),%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,%r15
  call   <merge_sort>
  mov    0x20(%rsp),%r9d
  mov    %r13d,%ecx
  mov    %r14,%rsi
  mov    0x28(%rsp),%edx
  mov    %rax,%rbp
  mov    %r12,%rdi
  mov    %r9d,%r8d
  mov    %r9d,0x30(%rsp)
  add    %rbp,%r15
  call   <merge@plt>
  mov    0x38(%rsp),%r10d
  mov    0x30(%rsp),%r9d
  add    %r15,%rax
  mov    0x28(%rsp),%r11d
  mov    %rax,0x20(%rsp)
L177:
  mov    0x10(%rsp),%r13d
  lea    0x1(%r9),%r15d
  xor    %ebp,%ebp
  sub    %r15d,%r13d
  test   %r13d,%r13d
  jle    L84
  sar    %r13d
  mov    %r15d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  add    %r15d,%r13d
  mov    %r9d,0x44(%rsp)
  mov    %r13d,%ecx
  mov    %r11d,0x38(%rsp)
  mov    %r10d,0x30(%rsp)
  call   <merge_sort>
  mov    0x10(%rsp),%ecx
  lea    0x1(%r13),%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x28(%rsp)
  call   <merge_sort>
  mov    0x10(%rsp),%r8d
  mov    %r13d,%ecx
  mov    %r15d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,%rbp
  call   <merge@plt>
  add    0x28(%rsp),%rbp
  mov    0x44(%rsp),%r9d
  mov    0x38(%rsp),%r11d
  mov    0x30(%rsp),%r10d
  add    %rax,%rbp
L84:
  mov    0x10(%rsp),%r8d
  mov    %r11d,%edx
  mov    %r9d,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %r10d,0x30(%rsp)
  mov    %r11d,0x28(%rsp)
  call   <merge@plt>
  mov    0x30(%rsp),%r10d
  mov    0x28(%rsp),%r11d
  add    %rbp,%rax
  add    0x20(%rsp),%rax
  mov    %rax,0x20(%rsp)
L137:
  mov    0x10(%rsp),%eax
  mov    %ebx,%edx
  xor    %ebp,%ebp
  lea    0x1(%rax),%r13d
  sub    %r13d,%edx
  test   %edx,%edx
  jle    L62
  movq   $0x0,0x28(%rsp)
  mov    %edx,%eax
  sar    %eax
  lea    0x0(%r13,%rax,1),%r9d
  je     L145
  mov    %edx,%eax
  mov    %r14,%rsi
  mov    %r13d,%edx
  mov    %r12,%rdi
  sar    $0x2,%eax
  mov    %r9d,0x30(%rsp)
  lea    (%rax,%r13,1),%r15d
  mov    %r11d,0x44(%rsp)
  mov    %r15d,%ecx
  mov    %r10d,0x38(%rsp)
  call   <merge_sort>
  mov    0x30(%rsp),%ecx
  lea    0x1(%r15),%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x28(%rsp)
  call   <merge_sort>
  mov    0x30(%rsp),%r8d
  mov    %r15d,%ecx
  mov    %r13d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,%rbp
  call   <merge@plt>
  mov    0x28(%rsp),%r15
  mov    0x44(%rsp),%r11d
  mov    0x38(%rsp),%r10d
  mov    0x30(%rsp),%r9d
  add    %rbp,%r15
  add    %r15,%rax
  mov    %rax,0x28(%rsp)
L145:
  lea    0x1(%r9),%r15d
  mov    %ebx,%eax
  xor    %ebp,%ebp
  sub    %r15d,%eax
  test   %eax,%eax
  jle    L8
  sar    %eax
  mov    %r15d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  lea    (%rax,%r15,1),%ebp
  mov    %r9d,0x4c(%rsp)
  mov    %ebp,%ecx
  mov    %r11d,0x48(%rsp)
  mov    %r10d,0x44(%rsp)
  call   <merge_sort>
  lea    0x1(%rbp),%edx
  mov    %ebx,%ecx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x30(%rsp)
  call   <merge_sort>
  mov    %ebp,%ecx
  mov    %ebx,%r8d
  mov    %r15d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %rax,0x38(%rsp)
  call   <merge@plt>
  mov    0x30(%rsp),%rbp
  mov    0x4c(%rsp),%r9d
  add    0x38(%rsp),%rbp
  mov    0x48(%rsp),%r11d
  mov    0x44(%rsp),%r10d
  add    %rax,%rbp
L8:
  mov    %ebx,%r8d
  mov    %r9d,%ecx
  mov    %r13d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %r11d,0x38(%rsp)
  mov    %r10d,0x30(%rsp)
  call   <merge@plt>
  mov    0x38(%rsp),%r11d
  mov    0x30(%rsp),%r10d
  add    %rax,%rbp
  add    0x28(%rsp),%rbp
L62:
  mov    0x10(%rsp),%ecx
  mov    %ebx,%r8d
  mov    %r11d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  mov    %r10d,0x28(%rsp)
  call   <merge@plt>
  mov    0x28(%rsp),%r10d
  add    %rax,%rbp
  add    0x20(%rsp),%rbp
L107:
  mov    0x40(%rsp),%ecx
  mov    %ebx,%r8d
  mov    %r10d,%edx
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <merge@plt>
  add    %rax,%rbp
  add    0x18(%rsp),%rbp
L185:
  mov    (%rsp),%ecx
  mov    0x4(%rsp),%edx
  mov    %ebx,%r8d
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <merge@plt>
  add    %rbp,%rax
  add    0x8(%rsp),%rax
L34:
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
unsigned long merge_sort(int values[], int scratch[], int first_ix, int last_ix) {
  int diff = last_ix - first_ix;
  if (diff <= 0)
    return 0L;
  int mid_ix = first_ix + diff / 2;
  unsigned long first_half_inversions, second_half_inversions, merge_inversions;
  first_half_inversions = merge_sort(values, scratch, first_ix, mid_ix);
  second_half_inversions = merge_sort(values, scratch, mid_ix + 1, last_ix);
  merge_inversions = merge(values, scratch, first_ix, mid_ix, last_ix);
  return first_half_inversions + second_half_inversions + merge_inversions;
}
```