user: Translate the below assembly code into C programming language:

```asm
<matmult_vp_notrans>:
  endbr64
  push   %r15
  push   %r14
  mov    %r9d,%r14d
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    0x58(%rsp),%eax
  mov    0x48(%rsp),%ebp
  mov    0x50(%rsp),%r12d
  test   %eax,%eax
  mov    %rdx,-0x20(%rsp)
  mov    $0x1e,%edx
  cmovne 0x58(%rsp),%edx
  mov    %rsi,-0x28(%rsp)
  cmp    %r9d,%edx
  mov    %ecx,-0x18(%rsp)
  mov    %r9d,-0x14(%rsp)
  cmovle %edx,%r14d
  mov    %edx,0x58(%rsp)
  test   %r9d,%r9d
  jle    L30
  mov    0x38(%rsp),%edx
  mov    %r9d,%ebx
  imul   0x38(%rsp),%ebx
  movslq %r9d,%r13
  movslq %ecx,%r8
  movapd %xmm0,%xmm3
  shl    $0x3,%r13
  xor    %r15d,%r15d
  imul   %ecx,%edx
  shl    $0x3,%r8
  pxor   %xmm2,%xmm2
  mov    %ebx,-0x2c(%rsp)
  add    %ebp,%edx
  movslq %edx,%rdx
  lea    (%rdi,%rdx,8),%rax
  mov    %rax,-0x8(%rsp)
  lea    -0x1(%r12),%eax
  sub    %ebp,%eax
  lea    0x8(,%rax,8),%rax
  mov    %rax,-0x10(%rsp)
L11:
  mov    -0x2c(%rsp),%eax
  mov    -0x20(%rsp),%rbx
  add    %r15d,%eax
  cltq
  lea    (%rbx,%rax,8),%r11
  mov    -0x18(%rsp),%eax
  mov    -0x28(%rsp),%rbx
  imul   %r15d,%eax
  add    %ebp,%eax
  cltq
  lea    (%rbx,%rax,8),%rbx
  mov    0x40(%rsp),%eax
  mov    %rbx,-0x40(%rsp)
  cmp    %eax,0x38(%rsp)
  jge    L31
  add    -0x10(%rsp),%rbx
  lea    -0x1(%r14),%eax
  mov    -0x8(%rsp),%r10
  mov    %rbx,-0x38(%rsp)
  sub    %r15d,%eax
  mov    0x38(%rsp),%ebx
  lea    0x8(%r11,%rax,8),%r9
  nopl   0x0(%rax,%rax,1)
L56:
  mov    -0x38(%rsp),%rcx
  mov    -0x40(%rsp),%rdi
  mov    %r11,%rsi
  cmp    %r14d,%r15d
  jl     L100
  jmp    L111
  nopl   0x0(%rax)
L65:
  add    $0x8,%rsi
  add    %r8,%rdi
  add    %r8,%rcx
  cmp    %r9,%rsi
  je     L111
L100:
  movsd  (%rsi),%xmm1
  ucomisd %xmm2,%xmm1
  jp     L94
  je     L65
L94:
  mulsd  %xmm3,%xmm1
  cmp    %r12d,%ebp
  jge    L65
  mov    %r10,%rdx
  mov    %rdi,%rax
  nopw   0x0(%rax,%rax,1)
L109:
  movsd  (%rax),%xmm0
  add    $0x8,%rax
  add    $0x8,%rdx
  mulsd  %xmm1,%xmm0
  addsd  -0x8(%rdx),%xmm0
  movsd  %xmm0,-0x8(%rdx)
  cmp    %rcx,%rax
  jne    L109
  add    $0x8,%rsi
  add    %r8,%rdi
  add    %r8,%rcx
  cmp    %r9,%rsi
  jne    L100
L111:
  add    %r8,%r10
  add    %r13,%r11
  add    $0x1,%ebx
  add    %r13,%r9
  cmp    %ebx,0x40(%rsp)
  jne    L56
L31:
  mov    0x58(%rsp),%eax
  mov    -0x14(%rsp),%ebx
  mov    %r14d,%r15d
  add    %r14d,%eax
  cmp    %ebx,%eax
  cmovg  %ebx,%eax
  cmp    %r14d,%ebx
  jle    L30
  mov    %eax,%r14d
  jmp    L11
L30:
  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;
    }
  }
}
```