user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<_glp_qmd_genqmd>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x88,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %rsi,0x18(%rsp)
  mov    %rdx,0x20(%rsp)
  mov    %rcx,%r12
  mov    %r8,%rbx
  mov    %r9,%r15
  mov    0xc0(%rsp),%r14
  mov    0xc8(%rsp),%rax
  mov    %rax,0x28(%rsp)
  mov    0xd0(%rsp),%rax
  mov    %rax,0x30(%rsp)
  mov    0xd8(%rsp),%r8
  mov    %r8,0x58(%rsp)
  mov    0xe0(%rsp),%r9
  mov    %r9,0x40(%rsp)
  mov    0xe8(%rsp),%rdx
  mov    %rdx,0x50(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  mov    (%rdi),%ecx
  mov    %ecx,0x10(%rsp)
  movl   $0x0,(%rdx)
  movl   $0x1,0x70(%rsp)
  cmpl   $0x0,(%rdi)
  jle    L145
  mov    $0x1,%eax
L134:
  mov    %eax,(%r12,%rax,4)
  mov    %eax,(%rbx,%rax,4)
  movl   $0x0,(%r14,%rax,4)
  movl   $0x1,(%r8,%rax,4)
  movl   $0x0,(%r9,%rax,4)
  mov    0x4(%rsi,%rax,4),%edx
  sub    (%rsi,%rax,4),%edx
  mov    %edx,(%r15,%rax,4)
  cmp    %edx,%ecx
  cmovg  %edx,%ecx
  add    $0x1,%rax
  cmp    %eax,(%rdi)
  jge    L134
  mov    %ecx,0x10(%rsp)
L145:
  movl   $0x0,0x14(%rsp)
  lea    0x74(%rsp),%rax
  mov    %rax,0x38(%rsp)
  lea    0x70(%rsp),%rax
  mov    %rax,0x48(%rsp)
  jmp    L80
L0:
  cmp    %edx,%r13d
  cmovg  %edx,%r13d
L167:
  add    $0x1,%rax
  cmp    %eax,%edi
  jl     L111
L135:
  mov    (%r12,%rax,4),%esi
  movslq %esi,%rdx
  lea    (%r14,%rdx,4),%rcx
  cmpl   $0x0,(%rcx)
  js     L167
  mov    (%r15,%rdx,4),%edx
  cmp    %edx,%r9d
  jl     L0
  mov    %eax,0x4(%rsp)
  mov    %esi,0x70(%rsp)
  mov    0x50(%rsp),%rax
  add    %edx,(%rax)
  movl   $0x1,(%rcx)
  sub    $0x8,%rsp
  push   0x38(%rsp)
  lea    0x7c(%rsp),%rax
  push   %rax
  push   0x40(%rsp)
  mov    0x58(%rsp),%r9
  mov    %r14,%r8
  mov    %r15,%rcx
  mov    0x40(%rsp),%rdx
  mov    0x38(%rsp),%rsi
  mov    0x68(%rsp),%rdi
  call   <_glp_qmd_qmdrch@plt>
  mov    0x90(%rsp),%edx
  movslq %ebp,%rbp
  add    $0x20,%rsp
  mov    0x40(%rsp),%r9
L87:
  mov    %ebp,%r10d
  movslq %edx,%rcx
  lea    (%rbx,%rcx,4),%rsi
  mov    (%rsi),%edi
  mov    (%r12,%rbp,4),%eax
  movslq %edi,%r8
  mov    %eax,(%r12,%r8,4)
  cltq
  mov    %edi,(%rbx,%rax,4)
  mov    %edx,(%r12,%rbp,4)
  mov    %ebp,(%rsi)
  movl   $0xffffffff,(%r15,%rcx,4)
  mov    (%r9,%rcx,4),%edx
  add    $0x1,%rbp
  test   %edx,%edx
  jg     L87
  mov    %r10d,0x14(%rsp)
  mov    0x74(%rsp),%eax
  test   %eax,%eax
  jg     L37
L148:
  mov    0x8(%rsp),%rax
  mov    0x14(%rsp),%edi
  cmp    %edi,(%rax)
  jg     L23
  mov    0x78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L83
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L111:
  mov    %r13d,0x10(%rsp)
L80:
  mov    0x8(%rsp),%rax
  mov    (%rax),%r13d
  movl   $0x1,0x4(%rsp)
L23:
  mov    0x14(%rsp),%eax
  lea    0x1(%rax),%ebp
  mov    0x4(%rsp),%eax
  cmp    %ebp,%eax
  cmovl  %ebp,%eax
  mov    0x8(%rsp),%rdi
  mov    (%rdi),%edi
  cmp    %edi,%eax
  jg     L111
  cltq
  mov    0x10(%rsp),%r9d
  jmp    L135
L37:
  movslq 0x6c(%rsp),%rdx
  mov    0x30(%rsp),%rdi
  lea    0x4(%rdi,%rdx,4),%rdx
  push   %rdx
  cltq
  mov    0x30(%rsp),%rbp
  lea    0x4(%rbp,%rax,4),%rax
  push   %rax
  push   %r14
  push   0x58(%rsp)
  mov    0x78(%rsp),%r9
  mov    %r15,%r8
  mov    %rbp,%rcx
  mov    0x58(%rsp),%rdx
  mov    0x40(%rsp),%rsi
  mov    0x38(%rsp),%rdi
  call   <_glp_qmd_qmdupd@plt>
  movslq 0x90(%rsp),%rax
  movl   $0x0,(%r14,%rax,4)
  mov    0x94(%rsp),%edx
  add    $0x20,%rsp
  test   %edx,%edx
  jle    L161
  lea    0x4(%rbp),%rax
  lea    -0x1(%rdx),%edx
  lea    0x8(%rbp,%rdx,4),%rsi
  mov    0x4(%rsp),%r8d
  mov    0x10(%rsp),%edi
  jmp    L74
L62:
  mov    (%rbx,%rdx,4),%r8d
  mov    %edi,%r13d
  mov    %ecx,%edi
L92:
  add    $0x4,%rax
  cmp    %rax,%rsi
  je     L89
L74:
  movslq (%rax),%rdx
  lea    (%r14,%rdx,4),%rcx
  cmpl   $0x0,(%rcx)
  js     L92
  movl   $0x0,(%rcx)
  mov    (%r15,%rdx,4),%ecx
  cmp    %edi,%ecx
  jle    L62
  cmp    %ecx,%r13d
  cmovg  %ecx,%r13d
  jmp    L92
L89:
  mov    %r8d,0x4(%rsp)
  mov    %edi,0x10(%rsp)
L161:
  cmpl   $0x0,0x6c(%rsp)
  jle    L148
  sub    $0x8,%rsp
  push   0x38(%rsp)
  mov    0x38(%rsp),%r9
  mov    0x48(%rsp),%r8
  mov    %r14,%rcx
  mov    0x30(%rsp),%rdx
  mov    0x28(%rsp),%rsi
  mov    0x58(%rsp),%rdi
  call   <_glp_qmd_qmdqt@plt>
  add    $0x10,%rsp
  jmp    L148
L83:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void _glp_qmd_genqmd(int *_neqns, int xadj[], int adjncy[], int perm[], int invp[], int deg[], int marker[], int rchset[], int nbrhd[], int qsize[], int qlink[], int *_nofsub) {
  int inode, ip, irch, j, mindeg, ndeg, nhdsze, node, np, num, nump1, nxnode, rchsze, search, thresh;
  mindeg = (*_neqns);
  (*_nofsub) = 0;
  for (node = 1; node <= (*_neqns); node++) {
    perm[node] = node;
    invp[node] = node;
    marker[node] = 0;
    qsize[node] = 1;
    qlink[node] = 0;
    ndeg = xadj[node + 1] - xadj[node];
    deg[node] = ndeg;
    if (ndeg < mindeg)
      mindeg = ndeg;
  }
  num = 0;
s200:
  search = 1;
  thresh = mindeg;
  mindeg = (*_neqns);
s300:
  nump1 = num + 1;
  if (nump1 > search)
    search = nump1;
  for (j = search; j <= (*_neqns); j++) {
    node = perm[j];
    if (marker[node] >= 0) {
      ndeg = deg[node];
      if (ndeg <= thresh)
        goto s500;
      if (ndeg < mindeg)
        mindeg = ndeg;
    }
  }
  goto s200;
s500:
  search = j;
  (*_nofsub) += deg[node];
  marker[node] = 1;
  _glp_qmd_qmdrch(&node, xadj, adjncy, deg, marker, &rchsze, rchset, &nhdsze, nbrhd);
  nxnode = node;
s600:
  num++;
  np = invp[nxnode];
  ip = perm[num];
  perm[np] = ip;
  invp[ip] = np;
  perm[num] = nxnode;
  invp[nxnode] = num;
  deg[nxnode] = -1;
  nxnode = qlink[nxnode];
  if (nxnode > 0)
    goto s600;
  if (rchsze > 0) {
    _glp_qmd_qmdupd(xadj, adjncy, &rchsze, rchset, deg, qsize, qlink, marker, &rchset[rchsze + 1], &nbrhd[nhdsze + 1]);
    marker[node] = 0;
    for (irch = 1; irch <= rchsze; irch++) {
      inode = rchset[irch];
      if (marker[inode] >= 0) {
        marker[inode] = 0;
        ndeg = deg[inode];
        if (ndeg < mindeg)
          mindeg = ndeg;
        if (ndeg <= thresh) {
          mindeg = thresh;
          thresh = ndeg;
          search = invp[inode];
        }
      }
    }
    if (nhdsze > 0)
      _glp_qmd_qmdqt(&node, xadj, adjncy, marker, &rchsze, rchset, nbrhd);
  }
  if (num < (*_neqns))
    goto s300;
  return;
}
```