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

```asm
<sp_coletree>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %ecx,-0x4c(%rbp)
  mov    %r8d,-0x50(%rbp)
  mov    %r9,-0x58(%rbp)
  mov    -0x50(%rbp),%eax
  mov    %eax,%edi
  call   <mxCallocInt@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x50(%rbp),%eax
  mov    %eax,%edi
  call   <initialize_disjoint_sets@plt>
  mov    -0x4c(%rbp),%eax
  mov    %eax,%edi
  call   <mxCallocInt@plt>
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L14
L24:
  mov    -0x24(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x24(%rbp)
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x8(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%eax
  mov    %eax,(%rdx)
L14:
  mov    -0x24(%rbp),%eax
  cmp    -0x4c(%rbp),%eax
  jl     L24
  movl   $0x0,-0x20(%rbp)
  jmp    L45
L68:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L129
L63:
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rcx
  mov    -0x8(%rbp),%rax
  add    %rax,%rcx
  mov    -0x20(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  mov    %eax,(%rcx)
  addl   $0x1,-0x1c(%rbp)
L129:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jl     L63
  addl   $0x1,-0x20(%rbp)
L45:
  mov    -0x20(%rbp),%eax
  cmp    -0x50(%rbp),%eax
  jl     L68
  movl   $0x0,-0x20(%rbp)
  jmp    L126
L19:
  mov    -0x20(%rbp),%eax
  mov    %eax,%edi
  call   <make_set@plt>
  mov    %eax,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x10(%rbp),%rax
  add    %rax,%rdx
  mov    -0x20(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x58(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L64
L57:
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x24(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  jge    L90
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <find@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  cmp    -0x20(%rbp),%eax
  je     L28
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x58(%rbp),%rax
  add    %rax,%rdx
  mov    -0x20(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0x18(%rbp),%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <link@plt>
  mov    %eax,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x10(%rbp),%rax
  add    %rax,%rdx
  mov    -0x20(%rbp),%eax
  mov    %eax,(%rdx)
  jmp    L28
L90:
  nop
L28:
  addl   $0x1,-0x1c(%rbp)
L64:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x1c(%rbp)
  jl     L57
  addl   $0x1,-0x20(%rbp)
L126:
  mov    -0x20(%rbp),%eax
  cmp    -0x50(%rbp),%eax
  jl     L19
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <superlu_free@plt>
  mov    -0x8(%rbp),%rax
  mov    %rax,%rdi
  call   <superlu_free@plt>
  mov    $0x0,%eax
  call   <finalize_disjoint_sets@plt>
  mov    $0x0,%eax
  leave
  ret
```

assistant: ```c
int sp_coletree(int *acolst, int *acolend, int *arow, int nr, int nc, int *parent) {
  int *root;
  int *firstcol;
  int rset, cset;
  int row, col;
  int rroot;
  int p;
  root = mxCallocInt(nc);
  initialize_disjoint_sets(nc);
  firstcol = mxCallocInt(nr);
  for (row = 0; row < nr; firstcol[row++] = nc)
    ;
  for (col = 0; col < nc; col++)
    for (p = acolst[col]; p < acolend[col]; p++) {
      row = arow[p];
      firstcol[row] = ((firstcol[row]) < (col) ? (firstcol[row]) : (col));
    }
  for (col = 0; col < nc; col++) {
    cset = make_set(col);
    root[cset] = col;
    parent[col] = nc;
    for (p = acolst[col]; p < acolend[col]; p++) {
      row = firstcol[arow[p]];
      if (row >= col)
        continue;
      rset = find(row);
      rroot = root[rset];
      if (rroot != col) {
        parent[rroot] = col;
        cset = link(cset, rset);
        root[cset] = col;
      }
    }
  }
  superlu_free(root);
  superlu_free(firstcol);
  finalize_disjoint_sets();
  return 0;
}
```