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

```asm
<rec_merge_sort>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x58,%rsp
  cmp    $0x1,%rsi
  je     L118
  mov    %rsi,%rax
  mov    %rsi,%rbx
  shr    %rax
  mov    %rax,0x8(%rsp)
  cmp    $0x1,%rax
  je     L37
  mov    %rsi,%r12
  shr    $0x2,%r12
  cmp    $0x1,%r12
  je     L240
  mov    %rsi,%r13
  shr    $0x3,%r13
  cmp    $0x1,%r13
  je     L238
  mov    %rsi,%r14
  shr    $0x4,%r14
  mov    %r14,%rsi
  call   <rec_merge_sort>
  mov    %r13,%rcx
  lea    0x0(%rbp,%r14,8),%rdi
  sub    %r14,%rcx
  mov    %rax,0x18(%rsp)
  mov    %rcx,%rsi
  mov    %rcx,0x10(%rsp)
  call   <rec_merge_sort>
  mov    0x18(%rsp),%r8
  mov    0x10(%rsp),%rcx
  mov    %r14,%rsi
  mov    %rax,%rdx
  mov    %rax,%r15
  mov    %r8,%rdi
  mov    %r8,0x10(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,%r14
  call   <free@plt>
  mov    %r15,%rdi
  call   <free@plt>
L41:
  mov    %r12,%r8
  lea    0x0(%rbp,%r13,8),%rdi
  sub    %r13,%r8
  cmp    $0x1,%r8
  je     L119
  mov    %r8,%r15
  mov    %r8,0x18(%rsp)
  shr    %r15
  mov    %rdi,0x10(%rsp)
  mov    %r15,%rsi
  call   <rec_merge_sort>
  mov    0x18(%rsp),%r8
  mov    0x10(%rsp),%rdi
  mov    %rax,0x28(%rsp)
  mov    %r8,%rcx
  lea    (%rdi,%r15,8),%rdi
  mov    %r8,0x20(%rsp)
  sub    %r15,%rcx
  mov    %rcx,%rsi
  mov    %rcx,0x10(%rsp)
  call   <rec_merge_sort>
  mov    0x28(%rsp),%r10
  mov    0x10(%rsp),%rcx
  mov    %r15,%rsi
  mov    %rax,%rdx
  mov    %rax,0x18(%rsp)
  mov    %r10,%rdi
  mov    %r10,0x10(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,%r15
  call   <free@plt>
  mov    0x18(%rsp),%rdi
  call   <free@plt>
  mov    0x20(%rsp),%r8
L168:
  mov    %r13,%rsi
  mov    %r8,%rcx
  mov    %r15,%rdx
  mov    %r14,%rdi
  call   <merge@plt>
  mov    %r14,%rdi
  mov    %rax,%r13
  call   <free@plt>
  mov    %r15,%rdi
  call   <free@plt>
L253:
  mov    0x8(%rsp),%r14
  lea    0x0(%rbp,%r12,8),%r10
  sub    %r12,%r14
  cmp    $0x1,%r14
  je     L123
  mov    %r14,%r15
  shr    %r15
  cmp    $0x1,%r15
  je     L166
  mov    %r14,%r8
  mov    %r10,%rdi
  mov    %r10,0x10(%rsp)
  shr    $0x2,%r8
  mov    %r8,%rsi
  mov    %r8,0x18(%rsp)
  call   <rec_merge_sort>
  mov    0x18(%rsp),%r8
  mov    0x10(%rsp),%r10
  mov    %r15,%rcx
  mov    %rax,0x30(%rsp)
  sub    %r8,%rcx
  lea    (%r10,%r8,8),%rdi
  mov    %r10,0x28(%rsp)
  mov    %rcx,%rsi
  mov    %rcx,0x10(%rsp)
  call   <rec_merge_sort>
  mov    0x30(%rsp),%r9
  mov    0x18(%rsp),%rsi
  mov    0x10(%rsp),%rcx
  mov    %rax,%rdx
  mov    %rax,0x20(%rsp)
  mov    %r9,%rdi
  mov    %r9,0x18(%rsp)
  call   <merge@plt>
  mov    0x18(%rsp),%rdi
  mov    %rax,0x10(%rsp)
  call   <free@plt>
  mov    0x20(%rsp),%rdi
  call   <free@plt>
  mov    0x28(%rsp),%r10
L176:
  mov    %r14,%r9
  lea    (%r10,%r15,8),%rdi
  sub    %r15,%r9
  cmp    $0x1,%r9
  je     L248
  mov    %r9,%r11
  mov    %r9,0x28(%rsp)
  shr    %r11
  mov    %rdi,0x18(%rsp)
  mov    %r11,%rsi
  mov    %r11,0x20(%rsp)
  call   <rec_merge_sort>
  mov    0x28(%rsp),%r9
  mov    0x20(%rsp),%r11
  mov    0x18(%rsp),%rdi
  mov    %rax,0x38(%rsp)
  mov    %r9,%rcx
  mov    %r9,0x30(%rsp)
  sub    %r11,%rcx
  lea    (%rdi,%r11,8),%rdi
  mov    %rcx,%rsi
  mov    %rcx,0x18(%rsp)
  call   <rec_merge_sort>
  mov    0x38(%rsp),%r10
  mov    0x20(%rsp),%rsi
  mov    0x18(%rsp),%rcx
  mov    %rax,%rdx
  mov    %rax,0x28(%rsp)
  mov    %r10,%rdi
  mov    %r10,0x20(%rsp)
  call   <merge@plt>
  mov    0x20(%rsp),%rdi
  mov    %rax,0x18(%rsp)
  call   <free@plt>
  mov    0x28(%rsp),%rdi
  call   <free@plt>
  mov    0x30(%rsp),%r9
  mov    0x18(%rsp),%r11
L18:
  mov    0x10(%rsp),%rdi
  mov    %r15,%rsi
  mov    %r9,%rcx
  mov    %r11,%rdx
  mov    %r11,0x18(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,%r15
  call   <free@plt>
  mov    0x18(%rsp),%rdi
  call   <free@plt>
L52:
  mov    %r12,%rsi
  mov    %r14,%rcx
  mov    %r15,%rdx
  mov    %r13,%rdi
  call   <merge@plt>
  mov    %r13,%rdi
  mov    %rax,%r12
  call   <free@plt>
  mov    %r15,%rdi
  call   <free@plt>
  jmp    L31
  nopl   0x0(%rax)
L37:
  mov    $0x1,%esi
  call   <copy_array@plt>
  mov    %rax,%r12
L31:
  mov    0x8(%rsp),%rax
  sub    %rax,%rbx
  lea    0x0(%rbp,%rax,8),%r13
  cmp    $0x1,%rbx
  je     L272
  mov    %rbx,%rbp
  shr    %rbp
  cmp    $0x1,%rbp
  je     L101
  mov    %rbx,%r15
  shr    $0x2,%r15
  cmp    $0x1,%r15
  je     L224
  mov    %rbx,%r14
  mov    %r13,%rdi
  shr    $0x3,%r14
  mov    %r14,%rsi
  call   <rec_merge_sort>
  mov    %r15,%rcx
  lea    0x0(%r13,%r14,8),%rdi
  sub    %r14,%rcx
  mov    %rax,0x20(%rsp)
  mov    %rcx,%rsi
  mov    %rcx,0x10(%rsp)
  call   <rec_merge_sort>
  mov    0x20(%rsp),%r9
  mov    0x10(%rsp),%rcx
  mov    %r14,%rsi
  mov    %rax,%rdx
  mov    %rax,0x18(%rsp)
  mov    %r9,%rdi
  mov    %r9,0x10(%rsp)
  call   <merge@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,%r14
  call   <free@plt>
  mov    0x18(%rsp),%rdi
  call   <free@plt>
L93:
  mov    %rbp,%r8
  lea    0x0(%r13,%r15,8),%rdi
  sub    %r15,%r8
  cmp    $0x1,%r8
  je     L23
  mov    %r8,%r10
  mov    %r8,0x20(%rsp)
  shr    %r10
  mov    %rdi,0x10(%rsp)
  mov    %r10,%rsi
  mov    %r10,0x18(%rsp)
  call   <rec_merge_sort>
  mov    0x20(%rsp),%r8
  mov    0x18(%rsp),%r10
  mov    0x10(%rsp),%rdi
  mov    %rax,0x30(%rsp)
  mov    %r8,%rcx
  mov    %r8,0x28(%rsp)
  sub    %r10,%rcx
  lea    (%rdi,%r10,8),%rdi
  mov    %rcx,%rsi
  mov    %rcx,0x10(%rsp)
  call   <rec_merge_sort>
  mov    0x30(%rsp),%r9
  mov    0x18(%rsp),%rsi
  mov    0x10(%rsp),%rcx
  mov    %rax,%rdx
  mov    %rax,0x20(%rsp)
  mov    %r9,%rdi
  mov    %r9,0x18(%rsp)
  call   <merge@plt>
  mov    0x18(%rsp),%rdi
  mov    %rax,0x10(%rsp)
  call   <free@plt>
  mov    0x20(%rsp),%rdi
  call   <free@plt>
  mov    0x28(%rsp),%r8
  mov    0x10(%rsp),%r10
L107:
  mov    %r8,%rcx
  mov    %r10,%rdx
  mov    %r15,%rsi
  mov    %r14,%rdi
  mov    %r10,0x10(%rsp)
  call   <merge@plt>
  mov    %r14,%rdi
  mov    %rax,0x18(%rsp)
  call   <free@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
L254:
  mov    %rbx,%r15
  lea    0x0(%r13,%rbp,8),%r8
  sub    %rbp,%r15
  cmp    $0x1,%r15
  je     L330
  mov    %r15,%rax
  shr    %rax
  mov    %rax,0x10(%rsp)
  cmp    $0x1,%rax
  je     L116
  mov    %r15,%r13
  shr    $0x2,%r13
  cmp    $0x1,%r13
  je     L27
  mov    %r15,%r14
  mov    %r8,%rdi
  mov    %r8,0x20(%rsp)
  shr    $0x3,%r14
  mov    %r14,%rsi
  call   <rec_merge_sort>
  mov    0x20(%rsp),%r8
  mov    %r13,%rcx
  sub    %r14,%rcx
  mov    %rax,0x38(%rsp)
  lea    (%r8,%r14,8),%rdi
  mov    %rcx,%rsi
  mov    %r8,0x30(%rsp)
  mov    %rcx,0x20(%rsp)
  call   <rec_merge_sort>
  mov    0x38(%rsp),%r9
  mov    0x20(%rsp),%rcx
  mov    %r14,%rsi
  mov    %rax,%rdx
  mov    %rax,0x28(%rsp)
  mov    %r9,%rdi
  mov    %r9,0x20(%rsp)
  call   <merge@plt>
  mov    0x20(%rsp),%rdi
  mov    %rax,%r14
  call   <free@plt>
  mov    0x28(%rsp),%rdi
  call   <free@plt>
  mov    0x30(%rsp),%r8
L309:
  mov    0x10(%rsp),%r9
  lea    (%r8,%r13,8),%rdi
  sub    %r13,%r9
  cmp    $0x1,%r9
  je     L200
  mov    %r9,%r10
  mov    %r8,0x48(%rsp)
  shr    %r10
  mov    %r9,0x38(%rsp)
  mov    %r10,%rsi
  mov    %r10,0x30(%rsp)
  mov    %rdi,0x28(%rsp)
  call   <rec_merge_sort>
  mov    0x38(%rsp),%r9
  mov    0x30(%rsp),%r10
  mov    0x28(%rsp),%rdi
  mov    %rax,0x20(%rsp)
  mov    %r9,%rcx
  mov    %r9,0x40(%rsp)
  sub    %r10,%rcx
  lea    (%rdi,%r10,8),%rdi
  mov    %r10,0x38(%rsp)
  mov    %rcx,%rsi
  mov    %rcx,0x28(%rsp)
  call   <rec_merge_sort>
  mov    0x28(%rsp),%rcx
  mov    0x38(%rsp),%rsi
  mov    0x20(%rsp),%rdi
  mov    %rax,%rdx
  mov    %rax,0x30(%rsp)
  call   <merge@plt>
  mov    0x20(%rsp),%rdi
  mov    %rax,0x28(%rsp)
  call   <free@plt>
  mov    0x30(%rsp),%rdi
  call   <free@plt>
  mov    0x48(%rsp),%r8
  mov    0x40(%rsp),%r9
  mov    0x28(%rsp),%r10
L21:
  mov    %r13,%rsi
  mov    %r9,%rcx
  mov    %r10,%rdx
  mov    %r14,%rdi
  mov    %r8,0x28(%rsp)
  mov    %r10,0x20(%rsp)
  call   <merge@plt>
  mov    %r14,%rdi
  mov    %rax,%r13
  call   <free@plt>
  mov    0x20(%rsp),%rdi
  call   <free@plt>
  mov    0x28(%rsp),%r8
L275:
  mov    0x10(%rsp),%rax
  mov    %r15,%r9
  sub    %rax,%r9
  lea    (%r8,%rax,8),%r10
  cmp    $0x1,%r9
  je     L6
  mov    %r9,%r8
  shr    %r8
  mov    %r8,0x30(%rsp)
  cmp    $0x1,%r8
  je     L73
  mov    %r9,%r14
  mov    %r10,%rdi
  mov    %r9,0x40(%rsp)
  shr    $0x2,%r14
  mov    %r10,0x28(%rsp)
  mov    %r14,%rsi
  call   <rec_merge_sort>
  mov    0x30(%rsp),%r8
  mov    0x28(%rsp),%r10
  mov    %rax,0x20(%rsp)
  mov    %r8,%rcx
  lea    (%r10,%r14,8),%rdi
  mov    %r8,0x38(%rsp)
  sub    %r14,%rcx
  mov    %r10,0x30(%rsp)
  mov    %rcx,%rsi
  mov    %rcx,0x28(%rsp)
  call   <rec_merge_sort>
  mov    0x28(%rsp),%rcx
  mov    0x20(%rsp),%rdi
  mov    %r14,%rsi
  mov    %rax,%rdx
  mov    %rax,0x28(%rsp)
  call   <merge@plt>
  mov    0x20(%rsp),%rdi
  mov    %rax,%r14
  call   <free@plt>
  mov    0x28(%rsp),%rdi
  call   <free@plt>
  mov    0x40(%rsp),%r9
  mov    0x38(%rsp),%r8
  mov    0x30(%rsp),%r10
L59:
  mov    %r9,%rcx
  lea    (%r10,%r8,8),%rdi
  mov    %r9,0x38(%rsp)
  sub    %r8,%rcx
  mov    %r8,0x30(%rsp)
  mov    %rcx,%rsi
  mov    %rcx,0x20(%rsp)
  call   <rec_merge_sort>
  mov    0x20(%rsp),%rcx
  mov    0x30(%rsp),%rsi
  mov    %r14,%rdi
  mov    %rax,%rdx
  mov    %rax,0x28(%rsp)
  call   <merge@plt>
  mov    %r14,%rdi
  mov    %rax,0x20(%rsp)
  call   <free@plt>
  mov    0x28(%rsp),%rdi
  call   <free@plt>
  mov    0x38(%rsp),%r9
  mov    0x20(%rsp),%r8
L276:
  mov    0x10(%rsp),%rsi
  mov    %r9,%rcx
  mov    %r8,%rdx
  mov    %r13,%rdi
  mov    %r8,0x20(%rsp)
  call   <merge@plt>
  mov    %r13,%rdi
  mov    %rax,%r14
  call   <free@plt>
  mov    0x20(%rsp),%rdi
  call   <free@plt>
L232:
  mov    %r15,%rcx
  mov    0x18(%rsp),%r15
  mov    %rbp,%rsi
  mov    %r14,%rdx
  mov    %r15,%rdi
  call   <merge@plt>
  mov    %r15,%rdi
  mov    %rax,%rbp
  call   <free@plt>
  mov    %r14,%rdi
  call   <free@plt>
  jmp    L131
  nopl   (%rax)
L118:
  add    $0x58,%rsp
  mov    $0x1,%esi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1090 <copy_array@plt>
L272:
  mov    $0x1,%esi
  mov    %r13,%rdi
  call   <copy_array@plt>
  mov    %rax,%rbp
L131:
  mov    0x8(%rsp),%rsi
  mov    %rbx,%rcx
  mov    %rbp,%rdx
  mov    %r12,%rdi
  call   <merge@plt>
  mov    %r12,%rdi
  mov    %rax,%r13
  call   <free@plt>
  mov    %rbp,%rdi
  call   <free@plt>
  add    $0x58,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L224:
  mov    $0x1,%esi
  mov    %r13,%rdi
  call   <copy_array@plt>
  mov    %rax,%r14
  jmp    L93
  nopl   (%rax)
L238:
  mov    $0x1,%esi
  call   <copy_array@plt>
  mov    %rax,%r14
  jmp    L41
  nopw   0x0(%rax,%rax,1)
L240:
  mov    $0x1,%esi
  call   <copy_array@plt>
  mov    %rax,%r13
  jmp    L253
  nopw   0x0(%rax,%rax,1)
L123:
  mov    $0x1,%esi
  mov    %r10,%rdi
  call   <copy_array@plt>
  mov    %rax,%r15
  jmp    L52
  nopl   (%rax)
L101:
  mov    $0x1,%esi
  mov    %r13,%rdi
  call   <copy_array@plt>
  mov    %rax,0x18(%rsp)
  jmp    L254
  nopw   0x0(%rax,%rax,1)
L330:
  mov    $0x1,%esi
  mov    %r8,%rdi
  call   <copy_array@plt>
  mov    %rax,%r14
  jmp    L232
  nopl   (%rax)
L23:
  mov    $0x1,%esi
  mov    %r8,0x10(%rsp)
  call   <copy_array@plt>
  mov    0x10(%rsp),%r8
  mov    %rax,%r10
  jmp    L107
  nopl   0x0(%rax)
L248:
  mov    $0x1,%esi
  mov    %r9,0x18(%rsp)
  call   <copy_array@plt>
  mov    0x18(%rsp),%r9
  mov    %rax,%r11
  jmp    L18
  nopl   0x0(%rax)
L166:
  mov    %r10,%rdi
  mov    $0x1,%esi
  mov    %r10,0x18(%rsp)
  call   <copy_array@plt>
  mov    0x18(%rsp),%r10
  mov    %rax,0x10(%rsp)
  jmp    L176
  nopl   0x0(%rax)
L116:
  mov    %r8,%rdi
  mov    $0x1,%esi
  mov    %r8,0x20(%rsp)
  call   <copy_array@plt>
  mov    0x20(%rsp),%r8
  mov    %rax,%r13
  jmp    L275
  nop
L119:
  mov    $0x1,%esi
  mov    %r8,0x10(%rsp)
  call   <copy_array@plt>
  mov    0x10(%rsp),%r8
  mov    %rax,%r15
  jmp    L168
  nopl   0x0(%rax)
L6:
  mov    $0x1,%esi
  mov    %r10,%rdi
  mov    %r9,0x20(%rsp)
  call   <copy_array@plt>
  mov    0x20(%rsp),%r9
  mov    %rax,%r8
  jmp    L276
  nop
L200:
  mov    $0x1,%esi
  mov    %r9,0x28(%rsp)
  mov    %r8,0x20(%rsp)
  call   <copy_array@plt>
  mov    0x20(%rsp),%r8
  mov    0x28(%rsp),%r9
  mov    %rax,%r10
  jmp    L21
  cs nopw 0x0(%rax,%rax,1)
L27:
  mov    %r8,%rdi
  mov    $0x1,%esi
  mov    %r8,0x20(%rsp)
  call   <copy_array@plt>
  mov    0x20(%rsp),%r8
  mov    %rax,%r14
  jmp    L309
  nop
L73:
  mov    %r10,%rdi
  mov    $0x1,%esi
  mov    %r9,0x28(%rsp)
  mov    %r10,0x20(%rsp)
  call   <copy_array@plt>
  mov    0x20(%rsp),%r10
  mov    0x28(%rsp),%r9
  mov    0x30(%rsp),%r8
  mov    %rax,%r14
  jmp    L59
```

assistant: ```c
double *rec_merge_sort(double *array, size_t size) {
  if (size == 1) {
    return copy_array(array, 1);
  } else {
    size_t size2 = size / 2;
    double *s0 = rec_merge_sort(array, size2);
    double *s1 = rec_merge_sort(array + size2, size - size2);
    double *res = merge(s0, size2, s1, size - size2);
    free(s0);
    free(s1);
    return res;
  }
}
```