user: Demonstrate the C code that generates the assembly output below:

```asm
<pinv>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    %r8,-0x88(%rbp)
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rax
  cmp    %rax,%rdx
  cmovge %rdx,%rax
  add    $0x1,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x70(%rbp),%rax
  imul   %rax,%rax
  mov    %rax,%rdx
  mov    -0x70(%rbp),%rax
  imul   -0x78(%rbp),%rax
  add    %rax,%rdx
  mov    -0x78(%rbp),%rax
  imul   %rax,%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x38(%rbp),%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  add    %rcx,%rax
  shl    $0x3,%rax
  mov    %rax,%rdi
  call   <malloc@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x70(%rbp),%rax
  imul   %rax,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x70(%rbp),%rax
  imul   -0x78(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x78(%rbp),%rax
  imul   %rax,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x38(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x10(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x88(%rbp),%rax
  mov    -0x78(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x88(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rax,(%rdx)
  mov    -0x70(%rbp),%rax
  imul   -0x78(%rbp),%rax
  shl    $0x3,%rax
  mov    %rax,%rdx
  mov    -0x68(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x18(%rbp),%r8
  mov    -0x20(%rbp),%rdi
  mov    -0x28(%rbp),%rcx
  mov    -0x30(%rbp),%rdx
  mov    -0x78(%rbp),%rsi
  mov    -0x70(%rbp),%rax
  sub    $0x8,%rsp
  push   $0x64
  push   -0x8(%rbp)
  push   -0x10(%rbp)
  mov    %r8,%r9
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <uav@plt>
  add    $0x20,%rsp
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x70(%rbp),%rax
  cmp    -0x78(%rbp),%rax
  jge    L93
  mov    -0x70(%rbp),%rax
  mov    %rax,-0x58(%rbp)
L93:
  subq   $0x1,-0x58(%rbp)
  movq   $0x0,-0x50(%rbp)
  jmp    L34
L66:
  addq   $0x1,-0x50(%rbp)
L34:
  mov    -0x50(%rbp),%rax
  cmp    -0x58(%rbp),%rax
  jg     L52
  mov    -0x50(%rbp),%rax
  imul   -0x78(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x50(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L66
  pxor   %xmm1,%xmm1
  ucomisd %xmm1,%xmm0
  jne    L66
L52:
  subq   $0x1,-0x50(%rbp)
  movq   $0x0,-0x60(%rbp)
  jmp    L94
L13:
  movq   $0x0,-0x58(%rbp)
  jmp    L68
L50:
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movq   $0x0,-0x48(%rbp)
  jmp    L106
L73:
  mov    -0x48(%rbp),%rax
  imul   -0x78(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  mov    -0x58(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  imul   -0x78(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm1
  divsd  %xmm1,%xmm0
  movsd  -0x40(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  addq   $0x1,-0x48(%rbp)
L106:
  mov    -0x48(%rbp),%rax
  cmp    -0x50(%rbp),%rax
  jle    L73
  mov    -0x60(%rbp),%rax
  imul   -0x70(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x80(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x40(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addq   $0x1,-0x58(%rbp)
L68:
  mov    -0x70(%rbp),%rax
  cmp    -0x58(%rbp),%rax
  jg     L50
  addq   $0x1,-0x60(%rbp)
L94:
  mov    -0x78(%rbp),%rax
  cmp    -0x60(%rbp),%rax
  jg     L13
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  nop
  leave
  ret
```

assistant: ```c
void pinv(double *A, int32_t m, int32_t n, double *Y, int32_t *size) {
  int32_t ka = ((((m) > (n)) ? (m) : (n)) + 1);
  double *u = (double *)malloc(((m * m) + (m * n) + (n * n) + ka * 3) * sizeof(double));
  double *a = u + m * m;
  double *v = a + m * n;
  double *s = v + n * n;
  double *e = s + ka;
  double *w = e + ka;
  size[0] = n;
  size[1] = m;
  int32_t i, j, k, l;
  memcpy(a, A, m * n * sizeof(double));
  uav(m, n, u, a, v, s, e, w, 100);
  j = n;
  if (m < n)
    j = m;
  j = j - 1;
  k = 0;
  while ((k <= j) && (a[k * n + k] != 0.0))
    k = k + 1;
  k = k - 1;
  double sum;
  for (i = 0; i <= n - 1; i++)
    for (j = 0; j <= m - 1; j++) {
      sum = 0.0;
      for (l = 0; l <= k; l++)
        sum += v[l * n + i] * u[j * m + l] / a[l * n + l];
      Y[i * m + j] = sum;
    }
  free(u);
}
```