user: 请从给定的汇编指令推导出C源代码：

```asm
<quickSortGlobalEdgeTablefromto>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %esi,0xc(%rsp)
  lea    0x1(%rdx),%r13d
  sub    %esi,%r13d
  cmp    $0x1,%r13d
  jle    L142
  mov    %rdi,%rbx
  mov    %esi,%eax
  mov    %edx,%r12d
  cltq
  lea    (%rdi,%rax,4),%r14
  mov    (%r14),%ebp
  movslq %edx,%rax
  lea    (%rdi,%rax,4),%r15
  mov    (%r15),%eax
  mov    %eax,0x18(%rsp)
  mov    %eax,%esi
  mov    %ebp,%edi
  call   <getSortsbefore@plt>
  test   %eax,%eax
  jne    L88
  mov    (%r14),%eax
  mov    (%r15),%edx
  mov    %edx,(%r14)
  mov    %eax,(%r15)
  mov    %ebp,%eax
  mov    0x18(%rsp),%ebp
  mov    %eax,0x18(%rsp)
L88:
  cmp    $0x2,%r13d
  jg     L58
L142:
  mov    $0x0,%eax
L120:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L58:
  mov    0xc(%rsp),%eax
  add    %r12d,%eax
  sar    %eax
  cltq
  lea    (%rbx,%rax,4),%rax
  mov    %rax,0x10(%rsp)
  mov    (%rax),%eax
  mov    %eax,0x1c(%rsp)
  mov    %eax,%esi
  mov    %ebp,%edi
  call   <getSortsbefore@plt>
  test   %eax,%eax
  jne    L117
  mov    (%r14),%eax
  mov    0x10(%rsp),%rcx
  mov    (%rcx),%edx
  mov    %edx,(%r14)
  mov    %eax,(%rcx)
L134:
  cmp    $0x3,%r13d
  jle    L142
  mov    %r12d,%r15d
  mov    0xc(%rsp),%r14d
  jmp    L83
L117:
  mov    0x18(%rsp),%r14d
  mov    %r14d,%esi
  mov    0x1c(%rsp),%ebp
  mov    %ebp,%edi
  call   <getSortsbefore@plt>
  test   %eax,%eax
  jne    L134
  mov    (%r15),%eax
  mov    0x10(%rsp),%rcx
  mov    (%rcx),%edx
  mov    %edx,(%r15)
  mov    %eax,(%rcx)
  mov    %r14d,%ebp
  jmp    L134
L150:
  cmp    %r13d,%r15d
  jl     L77
  movslq %r13d,%rax
  lea    (%rbx,%rax,4),%rdx
  mov    (%rdx),%ecx
  movslq %r15d,%rax
  lea    (%rbx,%rax,4),%rax
  mov    (%rax),%esi
  mov    %esi,(%rdx)
  mov    %ecx,(%rax)
L83:
  sub    $0x1,%r15d
  cmp    %r14d,%r15d
  jl     L123
  movslq %r15d,%r13
L49:
  mov    %r13d,%r15d
  mov    (%rbx,%r13,4),%esi
  mov    %ebp,%edi
  call   <getSortsbefore@plt>
  test   %eax,%eax
  je     L123
  lea    -0x1(%r13),%r15d
  sub    $0x1,%r13
  cmp    %r13d,%r14d
  jle    L49
L123:
  add    $0x1,%r14d
  cmp    %r14d,%r15d
  jl     L77
  movslq %r14d,%r13
L52:
  mov    %r13d,%r14d
  mov    (%rbx,%r13,4),%edi
  mov    %ebp,%esi
  call   <getSortsbefore@plt>
  test   %eax,%eax
  je     L150
  lea    0x1(%r13),%r14d
  add    $0x1,%r13
  cmp    %r13d,%r15d
  jge    L52
L77:
  mov    %r15d,%edx
  mov    0xc(%rsp),%esi
  mov    %rbx,%rdi
  call   <quickSortGlobalEdgeTablefromto>
  mov    %r12d,%edx
  mov    %r14d,%esi
  mov    %rbx,%rdi
  call   <quickSortGlobalEdgeTablefromto>
  jmp    L120
```

assistant: ```c
int quickSortGlobalEdgeTablefromto(int *array, int i, int j) {
  int k;
  int again;
  int tt;
  int di;
  int n;
  int l;
  int dj;
  int before;
  int dij;
  int ij;
  int tmp;
  if ((n = (j + 1) - i) <= 1) {
    return 0;
  }
  di = array[i];
  dj = array[j];
  before = getSortsbefore(di, dj);
  if (!(before)) {
    tmp = array[i];
    array[i] = (array[j]);
    array[j] = tmp;
    tt = di;
    di = dj;
    dj = tt;
  }
  if (n <= 2) {
    return 0;
  }
  ij = ((int)(i + j) >> 1);
  dij = array[ij];
  before = getSortsbefore(di, dij);
  if (before) {
    before = getSortsbefore(dij, dj);
    if (!(before)) {
      tmp = array[j];
      array[j] = (array[ij]);
      array[ij] = tmp;
      dij = dj;
    }
  } else {
    tmp = array[i];
    array[i] = (array[ij]);
    array[ij] = tmp;
    dij = di;
  }
  if (n <= 3) {
    return 0;
  }
  k = i;
  l = j;
  again = 1;
  while (again) {
    before = 1;
    while (before) {
      if (k <= (l -= 1)) {
        tmp = array[l];
        before = getSortsbefore(dij, tmp);
      } else {
        before = 0;
      }
    }
    before = 1;
    while (before) {
      if ((k += 1) <= l) {
        tmp = array[k];
        before = getSortsbefore(tmp, dij);
      } else {
        before = 0;
      }
    }
    again = k <= l;
    if (again) {
      tmp = array[k];
      array[k] = (array[l]);
      array[l] = tmp;
    }
  }
  quickSortGlobalEdgeTablefromto(array, i, l);
  quickSortGlobalEdgeTablefromto(array, k, j);
}
```