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

```asm
<matmult_vp_notrans>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    0x58(%rsp),%eax
  mov    0x48(%rsp),%r15d
  test   %eax,%eax
  mov    %rdx,-0x28(%rsp)
  mov    $0x1e,%edx
  cmovne 0x58(%rsp),%edx
  mov    %rsi,-0x30(%rsp)
  mov    %r9d,%esi
  cmp    %r9d,%edx
  mov    %ecx,-0x20(%rsp)
  cmovle %edx,%esi
  mov    %r9d,-0x1c(%rsp)
  mov    %edx,0x58(%rsp)
  mov    %esi,-0x38(%rsp)
  test   %r9d,%r9d
  jle    L36
  mov    0x38(%rsp),%edx
  movslq %ecx,%r10
  mov    %r9d,%ebx
  movslq %r9d,%rax
  imul   0x38(%rsp),%ebx
  shl    $0x3,%rax
  imul   %r10d,%edx
  mov    %rax,-0x40(%rsp)
  shl    $0x3,%r10
  mov    0x40(%rsp),%eax
  mov    %ebx,-0x34(%rsp)
  add    %r15d,%edx
  movslq %edx,%rdx
  lea    (%rdi,%rdx,8),%rcx
  mov    %rcx,-0x18(%rsp)
  cmp    %eax,0x38(%rsp)
  jge    L36
  mov    0x50(%rsp),%eax
  mov    0x50(%rsp),%ebp
  movapd %xmm0,%xmm4
  pxor   %xmm3,%xmm3
  sub    $0x1,%eax
  sub    %r15d,%ebp
  sub    %r15d,%eax
  lea    0x8(%rcx,%rax,8),%rax
  mov    %rax,-0x10(%rsp)
  mov    %ebp,%eax
  shr    %eax
  lea    -0x1(%rax),%r11d
  mov    %ebp,%eax
  and    $0xfffffffe,%eax
  add    $0x1,%r11
  mov    %eax,%r14d
  mov    %eax,-0x4c(%rsp)
  shl    $0x4,%r11
  xor    %eax,%eax
  shl    $0x3,%r14
L62:
  mov    -0x34(%rsp),%ebx
  lea    (%rbx,%rax,1),%edx
  mov    -0x28(%rsp),%rbx
  movslq %edx,%rdx
  lea    (%rbx,%rdx,8),%r12
  mov    -0x20(%rsp),%edx
  mov    -0x30(%rsp),%rbx
  imul   %eax,%edx
  add    %r15d,%edx
  movslq %edx,%rdx
  lea    (%rbx,%rdx,8),%rbx
  mov    %rbx,-0x48(%rsp)
  mov    -0x38(%rsp),%ebx
  cmp    %ebx,%eax
  jge    L54
  lea    -0x1(%rbx),%edx
  mov    -0x18(%rsp),%rcx
  mov    -0x10(%rsp),%rbx
  sub    %eax,%edx
  mov    0x38(%rsp),%r13d
  lea    0x8(%r12,%rdx,8),%r9
  nopl   0x0(%rax)
L92:
  mov    -0x48(%rsp),%rdx
  lea    (%rcx,%r14,1),%rsi
  mov    %r12,%rax
  jmp    L6
L156:
  add    $0x8,%rax
  add    %r10,%rdx
  cmp    %r9,%rax
  je     L89
  xchg   %ax,%ax
L6:
  movsd  (%rax),%xmm0
  ucomisd %xmm3,%xmm0
  jp     L176
  je     L156
L176:
  mulsd  %xmm4,%xmm0
  cmp    0x50(%rsp),%r15d
  jge    L156
  lea    0x8(%rdx),%rdi
  cmp    %rdi,%rcx
  je     L146
  cmp    $0x1,%ebp
  je     L146
  movapd %xmm0,%xmm2
  xor    %edi,%edi
  unpcklpd %xmm2,%xmm2
  nopw   0x0(%rax,%rax,1)
L14:
  movupd (%rdx,%rdi,1),%xmm1
  movupd (%rcx,%rdi,1),%xmm5
  mulpd  %xmm2,%xmm1
  addpd  %xmm5,%xmm1
  movups %xmm1,(%rcx,%rdi,1)
  add    $0x10,%rdi
  cmp    %rdi,%r11
  jne    L14
  lea    (%rdx,%r14,1),%rdi
  cmp    -0x4c(%rsp),%ebp
  je     L156
  mulsd  (%rdi),%xmm0
  add    $0x8,%rax
  add    %r10,%rdx
  addsd  (%rsi),%xmm0
  movsd  %xmm0,(%rsi)
  cmp    %r9,%rax
  jne    L6
L89:
  mov    -0x40(%rsp),%rax
  add    %r10,%rcx
  add    $0x1,%r13d
  add    %r10,%rbx
  add    %rax,%r12
  add    %rax,%r9
  cmp    %r13d,0x40(%rsp)
  jne    L92
L54:
  mov    -0x38(%rsp),%eax
  mov    0x58(%rsp),%edx
  mov    -0x1c(%rsp),%ebx
  add    %eax,%edx
  cmp    %ebx,%edx
  cmovg  %ebx,%edx
  cmp    %eax,%ebx
  jle    L36
  mov    %edx,-0x38(%rsp)
  jmp    L62
  nopl   (%rax)
L146:
  mov    %rcx,%rdi
  mov    %rdx,%r8
  xchg   %ax,%ax
L115:
  movsd  (%r8),%xmm1
  add    $0x8,%rdi
  add    $0x8,%r8
  mulsd  %xmm0,%xmm1
  addsd  -0x8(%rdi),%xmm1
  movsd  %xmm1,-0x8(%rdi)
  cmp    %rbx,%rdi
  jne    L115
  jmp    L156
L36:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void matmult_vp_notrans(double *C, const double *A, const double *B, double alpha, int M, int N, int P, int S, int L, int R, int E, int vlen) {
  int j, k, vpS, vpL;
  const double *Bc, *Br, *Ac, *AvpS;
  double *Cc;
  register const double *Ar;
  register int i;
  register double *Cr;
  register double coeff;
  if (vlen == 0) {
    vlen = 30;
  }
  vpS = 0;
  vpL = vlen < P ? vlen : P;
  while (vpS < P) {
    Cc = &C[S * M + R];
    Bc = &B[S * P + vpS];
    AvpS = &A[vpS * M + R];
    for (j = S; j < L; j++) {
      Ac = AvpS;
      Br = Bc;
      for (k = vpS; k < vpL; k++) {
        Cr = Cc;
        Ar = Ac;
        if (*Br != 0.0) {
          coeff = (*Br) * alpha;
          for (i = R; i < E; i++) {
            *Cr += (*Ar) * coeff;
            Cr++;
            Ar++;
          }
        }
        Br++;
        Ac += M;
      }
      Cc += M;
      Bc += P;
    }
    vpS = vpL;
    vpL += vlen;
    if (vpL > P) {
      vpL = P;
    }
  }
}
```