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

```asm
<stable_grail_merge_without_buffer>:
  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    L123
  jmp    L119
L52:
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x18(%rbp),%rdx
  mov    -0x20(%rbp),%eax
  mov    %eax,%esi
  mov    %rcx,%rdi
  call   <stable_grail_bin_search_left@plt>
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  je     L97
  mov    -0x4(%rbp),%edx
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <stable_grail_rotate@plt>
  mov    -0x4(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x18(%rbp)
  mov    -0x4(%rbp),%eax
  sub    %eax,-0x20(%rbp)
L97:
  cmpl   $0x0,-0x20(%rbp)
  je     L96
L138:
  addq   $0x8,-0x18(%rbp)
  subl   $0x1,-0x1c(%rbp)
  cmpl   $0x0,-0x1c(%rbp)
  je     L119
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    (%rax),%edx
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  mov    (%rax),%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  test   %eax,%eax
  jle    L138
L119:
  cmpl   $0x0,-0x1c(%rbp)
  jne    L52
  jmp    L57
L107:
  mov    -0x1c(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x1c(%rbp),%ecx
  mov    -0x18(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <stable_grail_bin_search_right@plt>
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  je     L143
  mov    -0x1c(%rbp),%eax
  sub    -0x4(%rbp),%eax
  mov    -0x4(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,8),%rcx
  mov    -0x18(%rbp),%rdx
  add    %rdx,%rcx
  mov    -0x20(%rbp),%edx
  mov    %eax,%esi
  mov    %rcx,%rdi
  call   <stable_grail_rotate@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
L143:
  cmpl   $0x0,-0x1c(%rbp)
  je     L44
L146:
  subl   $0x1,-0x20(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  je     L123
  mov    -0x1c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    (%rax),%edx
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x20(%rbp),%eax
  cltq
  add    %rcx,%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  mov    (%rax),%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  test   %eax,%eax
  jle    L146
L123:
  cmpl   $0x0,-0x20(%rbp)
  jne    L107
  jmp    L57
L96:
  nop
  jmp    L57
L44:
  nop
L57:
  nop
  leave
  ret
```

assistant: ```c
void stable_grail_merge_without_buffer(int **arr, int len1, int len2) {
  int h;
  if (len1 < len2) {
    while (len1) {
      h = stable_grail_bin_search_left(arr + len1, len2, arr);
      if (h != 0) {
        stable_grail_rotate(arr, len1, h);
        arr += h;
        len2 -= h;
      }
      if (len2 == 0) {
        break;
      }
      do {
        arr++;
        len1--;
      } while (len1 && (*(*(arr)) - *(*(arr + len1))) <= 0);
    }
  } else {
    while (len2) {
      h = stable_grail_bin_search_right(arr, len1, arr + (len1 + len2 - 1));
      if (h != len1) {
        stable_grail_rotate(arr + h, len1 - h, len2);
        len1 = h;
      }
      if (len1 == 0) {
        break;
      }
      do {
        len2--;
      } while (len2 && (*(*(arr + len1 - 1)) - *(*(arr + len1 + len2 - 1))) <= 0);
    }
  }
}
```