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

```asm
<mergeSort>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    -0x1c(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jge    L53
  mov    -0x20(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <mergeSort>
  mov    -0x4(%rbp),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <mergeSort>
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  jmp    L9
L17:
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0x10(%rbp)
L9:
  mov    -0x10(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jle    L17
  lea    D35(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    -0x4(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0xc(%rbp)
  jmp    L22
L29:
  mov    -0xc(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0xc(%rbp)
L22:
  mov    -0xc(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jle    L29
  mov    -0x20(%rbp),%ecx
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <merge@plt>
  lea    D43(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x8(%rbp)
  jmp    L34
L35:
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0x8(%rbp)
L34:
  cmpl   $0x8,-0x8(%rbp)
  jle    L35
L53:
  nop
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D5
type_infered: string
name: parse_data
arguments: tag: D4
type_infered: string
name: parse_data
arguments: tag: D35
type_infered: string
name: parse_data
arguments: tag: D43
type_infered: string

tool: D5: 

Merging

tool: D4:  %d 

tool: D35: 
and

tool: D43: 

Recursion finished, array is:  

assistant: ```c
void mergeSort(int array[], int lowBound, int highBound) {
  if (lowBound < highBound) {
    int midpoint = (highBound + lowBound) / 2;
    mergeSort(array, lowBound, midpoint);
    mergeSort(array, midpoint + 1, highBound);
    printf("\n\nMerging\n");
    for (int i = lowBound; i <= midpoint; i++)
      printf(" %d ", array[i]);
    printf("\nand\n");
    for (int j = midpoint + 1; j <= highBound; j++)
      printf(" %d ", array[j]);
    merge(array, lowBound, midpoint, highBound);
    printf("\n\nRecursion finished, array is:  ");
    for (int k = 0; k < 9; k++)
      printf(" %d ", array[k]);
  }
}
```