user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<matmult_vp_notrans>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r13
  push   %r12
  push   %rbx
  mov    %rdi,-0x60(%rbp)
  mov    %rsi,-0x68(%rbp)
  mov    %rdx,-0x70(%rbp)
  movsd  %xmm0,-0x78(%rbp)
  mov    %ecx,-0x7c(%rbp)
  mov    %r8d,-0x80(%rbp)
  mov    %r9d,-0x84(%rbp)
  cmpl   $0x0,0x30(%rbp)
  jne    L99
  movl   $0x1e,0x30(%rbp)
L99:
  movl   $0x0,-0x48(%rbp)
  mov    -0x84(%rbp),%edx
  mov    0x30(%rbp),%eax
  cmp    %eax,%edx
  cmovle %edx,%eax
  mov    %eax,-0x44(%rbp)
  jmp    L90
L109:
  mov    0x10(%rbp),%eax
  imul   -0x7c(%rbp),%eax
  mov    %eax,%edx
  mov    0x20(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    0x10(%rbp),%eax
  imul   -0x84(%rbp),%eax
  mov    %eax,%edx
  mov    -0x48(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x48(%rbp),%eax
  imul   -0x7c(%rbp),%eax
  mov    %eax,%edx
  mov    0x20(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x20(%rbp)
  mov    0x10(%rbp),%eax
  mov    %eax,-0x50(%rbp)
  jmp    L98
L66:
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,-0x4c(%rbp)
  jmp    L72
L5:
  mov    -0x28(%rbp),%rbx
  mov    -0x30(%rbp),%r13
  mov    -0x38(%rbp),%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  ucomisd %xmm1,%xmm0
  jp     L93
  pxor   %xmm1,%xmm1
  ucomisd %xmm1,%xmm0
  je     L3
L93:
  mov    -0x38(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  -0x78(%rbp),%xmm0
  movapd %xmm0,%xmm3
  mov    0x20(%rbp),%r12d
  jmp    L104
L45:
  movsd  (%rbx),%xmm1
  movsd  0x0(%r13),%xmm0
  movapd %xmm3,%xmm2
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rbx)
  add    $0x8,%rbx
  add    $0x8,%r13
  add    $0x1,%r12d
L104:
  cmp    0x28(%rbp),%r12d
  jl     L45
L3:
  addq   $0x8,-0x38(%rbp)
  mov    -0x7c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x30(%rbp)
  addl   $0x1,-0x4c(%rbp)
L72:
  mov    -0x4c(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jl     L5
  mov    -0x7c(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x28(%rbp)
  mov    -0x84(%rbp),%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x40(%rbp)
  addl   $0x1,-0x50(%rbp)
L98:
  mov    -0x50(%rbp),%eax
  cmp    0x18(%rbp),%eax
  jl     L66
  mov    -0x44(%rbp),%eax
  mov    %eax,-0x48(%rbp)
  mov    0x30(%rbp),%eax
  add    %eax,-0x44(%rbp)
  mov    -0x44(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jle    L90
  mov    -0x84(%rbp),%eax
  mov    %eax,-0x44(%rbp)
L90:
  mov    -0x48(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jl     L109
  nop
  nop
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %rbp
  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;
    }
  }
}
```