user: What would the C source look like for the assembly code provided here?

```asm
<primePart>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %ecx,-0x28(%rbp)
  cmpl   $0x1,-0x24(%rbp)
  jg     L116
  mov    $0x0,%eax
  jmp    L89
L116:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L86
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x2,%eax
  mov    %eax,%edx
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x30(%rbp),%rax
  lea    (%rcx,%rax,1),%rbx
  mov    %edx,%edi
  call   <malloc@plt>
  mov    %rax,(%rbx)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  mov    -0x28(%rbp),%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movl   $0x0,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  jmp    L11
L86:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  jmp    L89
L29:
  mov    -0x20(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x24(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,-0x18(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  js     L51
  cmpl   $0x0,-0x18(%rbp)
  jne    L92
  addl   $0x1,-0x1c(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rax,%rdx
  mov    -0x1c(%rbp),%eax
  mov    %eax,(%rdx)
  jmp    L73
L92:
  mov    -0x20(%rbp),%ecx
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    -0x18(%rbp),%eax
  mov    %eax,%edi
  call   <primePart>
  mov    %eax,-0x14(%rbp)
  mov    -0x14(%rbp),%eax
  add    %eax,-0x1c(%rbp)
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rax,%rdx
  mov    -0x1c(%rbp),%eax
  mov    %eax,(%rdx)
L73:
  addl   $0x1,-0x20(%rbp)
L11:
  mov    -0x20(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jne    L29
  jmp    L40
L51:
  nop
  jmp    L40
L90:
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x20(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rax,%rdx
  mov    -0x1c(%rbp),%eax
  mov    %eax,(%rdx)
  addl   $0x1,-0x20(%rbp)
L40:
  mov    -0x20(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jne    L90
  mov    -0x1c(%rbp),%eax
L89:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int primePart(int n, int **ctx, int *prime, int primes_n) {
  if (n <= 1) {
    return 0;
  }
  if (ctx[n] == NULL) {
    ctx[n] = malloc(sizeof(int) * primes_n);
    memset(ctx[n], 0, primes_n);
  } else {
    return ctx[n][primes_n];
  }
  int i, sum;
  for (i = sum = 0; i != primes_n; i++) {
    int r = n - prime[i];
    if (r < 0) {
      break;
    } else if (r == 0) {
      sum += 1;
      ctx[n][i] = sum;
    } else {
      int d = primePart(r, ctx, prime, i);
      sum += d;
      ctx[n][i] = sum;
    }
  }
  for (; i != primes_n; i++) {
    ctx[n][i] = sum;
  }
  return sum;
}
```