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

```asm
<PB_Cnumroc>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  mov    %edx,-0x1c(%rbp)
  mov    %ecx,-0x20(%rbp)
  mov    %r8d,-0x24(%rbp)
  mov    %r9d,-0x28(%rbp)
  cmpl   $0xffffffff,-0x28(%rbp)
  je     L17
  cmpl   $0x1,0x10(%rbp)
  jne    L224
L17:
  mov    -0x14(%rbp),%eax
  jmp    L246
L224:
  mov    -0x18(%rbp),%eax
  sub    %eax,-0x1c(%rbp)
  cmpl   $0x0,-0x1c(%rbp)
  jg     L10
  mov    -0x1c(%rbp),%eax
  neg    %eax
  cltd
  idivl  -0x20(%rbp)
  add    $0x1,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  add    %eax,-0x28(%rbp)
  mov    -0x28(%rbp),%eax
  cltd
  idivl  0x10(%rbp)
  mov    %edx,-0x28(%rbp)
  mov    -0x8(%rbp),%eax
  imul   -0x20(%rbp),%eax
  add    %eax,-0x1c(%rbp)
L10:
  mov    -0x24(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jne    L162
  mov    -0x14(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jg     L197
  mov    -0x14(%rbp),%eax
  jmp    L246
L197:
  mov    -0x14(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  cltd
  idivl  -0x20(%rbp)
  add    $0x1,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  cmp    0x10(%rbp),%eax
  jge    L80
  mov    -0x1c(%rbp),%eax
  jmp    L246
L80:
  mov    -0x8(%rbp),%eax
  cltd
  idivl  0x10(%rbp)
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  imul   0x10(%rbp),%eax
  cmp    %eax,-0x8(%rbp)
  je     L158
  mov    -0x4(%rbp),%eax
  imul   -0x20(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  jmp    L246
L158:
  mov    -0x4(%rbp),%eax
  sub    -0x8(%rbp),%eax
  imul   -0x20(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  jmp    L246
L162:
  mov    -0x14(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jg     L81
  mov    $0x0,%eax
  jmp    L246
L81:
  mov    -0x14(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  cltd
  idivl  -0x20(%rbp)
  add    $0x1,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x24(%rbp),%eax
  sub    -0x28(%rbp),%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x0,-0xc(%rbp)
  jns    L176
  mov    0x10(%rbp),%eax
  add    %eax,-0xc(%rbp)
L176:
  mov    -0x8(%rbp),%eax
  cmp    0x10(%rbp),%eax
  jge    L127
  mov    -0xc(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jl     L153
  mov    -0xc(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jg     L41
  mov    -0x14(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    $0x1,%eax
  sub    -0x8(%rbp),%eax
  imul   -0x20(%rbp),%eax
  add    %edx,%eax
  jmp    L246
L41:
  mov    $0x0,%eax
  jmp    L246
L153:
  mov    -0x20(%rbp),%eax
  jmp    L246
L127:
  mov    -0x8(%rbp),%eax
  cltd
  idivl  0x10(%rbp)
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  imul   0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  sub    %edx,%eax
  sub    %eax,-0xc(%rbp)
  cmpl   $0x0,-0xc(%rbp)
  jns    L225
  mov    -0x4(%rbp),%eax
  add    $0x1,%eax
  imul   -0x20(%rbp),%eax
  jmp    L230
L225:
  cmpl   $0x0,-0xc(%rbp)
  jle    L152
  mov    -0x4(%rbp),%eax
  imul   -0x20(%rbp),%eax
  jmp    L230
L152:
  mov    -0x14(%rbp),%eax
  sub    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  sub    -0x8(%rbp),%eax
  add    $0x1,%eax
  imul   -0x20(%rbp),%eax
  add    %edx,%eax
L230:
  nop
L246:
  pop    %rbp
  ret
```

assistant: ```c
int PB_Cnumroc(int N, int I, int INB, int NB, int PROC, int SRCPROC, int NPROCS) {
  int ilocblk, mydist, nblocks;
  if ((SRCPROC == -1) || (NPROCS == 1))
    return (N);
  if ((INB -= I) <= 0) {
    nblocks = (-INB) / NB + 1;
    SRCPROC += nblocks;
    SRCPROC -= (SRCPROC / NPROCS) * NPROCS;
    INB += nblocks * NB;
  }
  if (PROC == SRCPROC) {
    if (N <= INB)
      return (N);
    nblocks = (N - INB) / NB + 1;
    if (nblocks < NPROCS)
      return (INB);
    ilocblk = nblocks / NPROCS;
    return ((nblocks - ilocblk * NPROCS) ? INB + ilocblk * NB : N + (ilocblk - nblocks) * NB);
  } else {
    if (N <= INB)
      return (0);
    nblocks = (N - INB) / NB + 1;
    if ((mydist = PROC - SRCPROC) < 0)
      mydist += NPROCS;
    if (nblocks < NPROCS)
      return ((mydist < nblocks) ? NB : ((mydist > nblocks) ? 0 : N - INB + NB * (1 - nblocks)));
    ilocblk = nblocks / NPROCS;
    mydist -= nblocks - ilocblk * NPROCS;
    return ((mydist < 0) ? (ilocblk + 1) * NB : ((mydist > 0) ? ilocblk * NB : N - INB + NB * (ilocblk - nblocks + 1)));
  }
}
```