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

```asm
<merge>:
  endbr64
  mov    %rdi,%rax
  mov    %edx,%edi
  push   %r15
  mov    %ecx,%r9d
  push   %r14
  mov    %esi,%r10d
  add    $0x1,%edx
  mov    %esi,%ecx
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  cmp    %edi,%esi
  jg     L153
  cmp    %r9d,%edx
  jg     L153
  mov    $0x1,%r11d
  movslq %esi,%r13
  nopl   0x0(%rax,%rax,1)
L270:
  movslq %edx,%r12
  mov    (%rax,%r13,4),%ebp
  mov    %r11d,%esi
  mov    (%rax,%r12,4),%ebx
  cmp    %ebp,%ebx
  jle    L320
L330:
  mov    %ebp,-0x4(%r8,%r11,4)
  add    $0x1,%ecx
  add    $0x1,%r11
  cmp    %edx,%r9d
  jl     L199
  cmp    %ecx,%edi
  jl     L199
  movslq %ecx,%r13
  mov    (%rax,%r12,4),%ebx
  mov    %r11d,%esi
  mov    (%rax,%r13,4),%ebp
  cmp    %ebp,%ebx
  jg     L330
L320:
  mov    %ebx,-0x4(%r8,%r11,4)
  add    $0x1,%edx
  add    $0x1,%r11
  cmp    %ecx,%edi
  jl     L199
  cmp    %edx,%r9d
  jge    L270
L199:
  cmp    %edi,%ecx
  jge    L117
L148:
  mov    %edi,%ebx
  movslq %esi,%r11
  sub    %ecx,%ebx
  lea    0x0(,%r11,4),%r15
  cmp    %edi,%ecx
  lea    -0x1(%rbx),%r12d
  mov    %ebx,-0x14(%rsp)
  lea    (%r8,%r15,1),%rbp
  movslq %ecx,%rbx
  mov    %r15,-0x10(%rsp)
  setl   %r15b
  cmp    $0x2,%r12d
  lea    0x1(%rbx),%r11
  seta   %r14b
  lea    0x0(,%r11,4),%r13
  test   %r14b,%r15b
  je     L347
  lea    (%rax,%r13,1),%r15
  mov    %rbp,%r14
  sub    %r15,%r14
  cmp    $0x8,%r14
  jbe    L347
  cmp    %edi,%ecx
  mov    $0x1,%r14d
  cmovl  -0x14(%rsp),%r14d
  xor    %r11d,%r11d
  lea    -0x4(%rax,%r13,1),%r13
  mov    %r14d,%ebx
  shr    $0x2,%ebx
  shl    $0x4,%rbx
L249:
  movdqu 0x0(%r13,%r11,1),%xmm1
  movups %xmm1,0x0(%rbp,%r11,1)
  add    $0x10,%r11
  cmp    %r11,%rbx
  jne    L249
  mov    %r14d,%ebx
  and    $0xfffffffc,%ebx
  lea    (%rcx,%rbx,1),%r11d
  lea    (%rsi,%rbx,1),%ebp
  cmp    %ebx,%r14d
  je     L299
  movslq %r11d,%r14
  lea    0x1(%rbp),%r13d
  lea    0x1(%r11),%ebx
  movslq %ebp,%rbp
  mov    (%rax,%r14,4),%r14d
  mov    %r14d,(%r8,%rbp,4)
  cmp    %ebx,%edi
  jle    L299
  movslq %ebx,%rbx
  movslq %r13d,%rbp
  add    $0x2,%r11d
  lea    0x0(,%rbx,4),%r14
  mov    (%rax,%rbx,4),%ebx
  lea    0x0(,%rbp,4),%r13
  mov    %ebx,(%r8,%rbp,4)
  cmp    %r11d,%edi
  jle    L299
  mov    0x4(%rax,%r14,1),%r11d
  mov    %r11d,0x4(%r8,%r13,1)
L299:
  cmp    %edi,%ecx
  mov    $0x0,%ecx
  cmovge %ecx,%r12d
  lea    0x1(%rsi,%r12,1),%esi
L117:
  cmp    %r9d,%edx
  jge    L75
L355:
  movslq %esi,%r12
  movslq %edx,%rdi
  mov    %r9d,%ebx
  shl    $0x2,%r12
  lea    0x1(%rdi),%rcx
  sub    %edx,%ebx
  lea    (%r8,%r12,1),%r11
  lea    0x0(,%rcx,4),%r13
  lea    (%rax,%r13,1),%r15
  mov    %r11,%r14
  lea    -0x1(%rbx),%ebp
  sub    %r15,%r14
  cmp    $0x8,%r14
  jbe    L366
  cmp    $0x2,%ebp
  jbe    L366
  cmp    %r9d,%edx
  mov    $0x1,%ecx
  lea    -0x4(%rax,%r13,1),%r12
  cmovge %ecx,%ebx
  xor    %ecx,%ecx
  mov    %ebx,%edi
  shr    $0x2,%edi
  shl    $0x4,%rdi
  nopl   (%rax)
L289:
  movdqu (%r12,%rcx,1),%xmm2
  movups %xmm2,(%r11,%rcx,1)
  add    $0x10,%rcx
  cmp    %rdi,%rcx
  jne    L289
  mov    %ebx,%edi
  and    $0xfffffffc,%edi
  lea    (%rdx,%rdi,1),%ecx
  lea    (%rsi,%rdi,1),%r11d
  cmp    %edi,%ebx
  je     L101
  movslq %ecx,%r12
  lea    0x1(%r11),%ebx
  lea    0x1(%rcx),%edi
  movslq %r11d,%r11
  mov    (%rax,%r12,4),%r12d
  mov    %r12d,(%r8,%r11,4)
  cmp    %r9d,%edi
  jge    L101
  movslq %edi,%rdi
  movslq %ebx,%r11
  add    $0x2,%ecx
  lea    0x0(,%rdi,4),%r12
  mov    (%rax,%rdi,4),%edi
  lea    0x0(,%r11,4),%rbx
  mov    %edi,(%r8,%r11,4)
  cmp    %ecx,%r9d
  jle    L101
  mov    0x4(%rax,%r12,1),%ecx
  mov    %ecx,0x4(%r8,%rbx,1)
L101:
  cmp    %r9d,%edx
  mov    $0x0,%edx
  cmovge %edx,%ebp
  lea    0x1(%rsi,%rbp,1),%esi
L75:
  movslq %r10d,%rdx
  lea    0x4(%r8),%rcx
  lea    (%rax,%rdx,4),%rdi
  mov    %rdi,%rdx
  sub    %rcx,%rdx
  cmp    $0x8,%rdx
  jbe    L357
  lea    -0x1(%rsi),%edx
  cmp    $0x2,%edx
  jbe    L357
  mov    %esi,%ecx
  xor    %edx,%edx
  shr    $0x2,%ecx
  shl    $0x4,%rcx
  cs nopw 0x0(%rax,%rax,1)
L149:
  movdqu (%r8,%rdx,1),%xmm0
  movups %xmm0,(%rdi,%rdx,1)
  add    $0x10,%rdx
  cmp    %rcx,%rdx
  jne    L149
  mov    %esi,%edx
  and    $0xfffffffc,%edx
  test   $0x3,%sil
  je     L141
  mov    %edx,%ecx
  mov    (%r8,%rcx,4),%r9d
  lea    0x0(,%rcx,4),%rdi
  lea    (%r10,%rdx,1),%ecx
  movslq %ecx,%rcx
  mov    %r9d,(%rax,%rcx,4)
  lea    0x1(%rdx),%ecx
  cmp    %esi,%ecx
  jge    L141
  mov    0x4(%r8,%rdi,1),%r9d
  add    %r10d,%ecx
  add    $0x2,%edx
  movslq %ecx,%rcx
  mov    %r9d,(%rax,%rcx,4)
  cmp    %esi,%edx
  jge    L141
  mov    0x8(%r8,%rdi,1),%ecx
  add    %edx,%r10d
  movslq %r10d,%r10
  mov    %ecx,(%rax,%r10,4)
L141:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L357:
  mov    %esi,%esi
  xor    %eax,%eax
  nopl   0x0(%rax)
L327:
  mov    (%r8,%rax,4),%edx
  mov    %edx,(%rdi,%rax,4)
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L327
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L347:
  mov    -0x10(%rsp),%r15
  mov    %rbx,%rbp
  neg    %rbp
  lea    (%r15,%rbp,4),%r13
  add    %r8,%r13
  jmp    L23
  nopl   0x0(%rax)
L287:
  add    $0x1,%r11
L23:
  mov    (%rax,%rbx,4),%ebp
  mov    %ebp,0x0(%r13,%rbx,4)
  mov    %r11,%rbx
  cmp    %r11d,%edi
  jg     L287
  jmp    L299
  nopl   0x0(%rax)
L366:
  mov    %rdi,%r11
  neg    %r11
  lea    (%r12,%r11,4),%rbx
  add    %r8,%rbx
  jmp    L238
  nop
L376:
  add    $0x1,%rcx
L238:
  mov    (%rax,%rdi,4),%r11d
  mov    %r11d,(%rbx,%rdi,4)
  mov    %rcx,%rdi
  cmp    %ecx,%r9d
  jg     L376
  jmp    L101
  nopl   0x0(%rax)
L153:
  xor    %esi,%esi
  cmp    %edi,%r10d
  jl     L148
  cmp    %r9d,%edx
  jl     L355
  jmp    L141
```

assistant: ```c
void merge(int a[], int first, int mid, int last, int temp[]) {
  int i = first, j = mid + 1;
  int m = mid, n = last;
  int k = 0;
  while (i <= m && j <= n) {
    if (a[i] < a[j])
      temp[k++] = a[i++];
    else
      temp[k++] = a[j++];
  }
  while (i < m)
    temp[k++] = a[i++];
  while (j < n)
    temp[k++] = a[j++];
  for (i = 0; i < k; i++)
    a[first + i] = temp[i];
}
```