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

```asm
<leftMatrixVector>:
  endbr64
  push   %r15
  movslq %esi,%rsi
  mov    %edi,%r15d
  mov    %r9,%rdi
  push   %r14
  mov    %edx,%r14d
  lea    0x0(,%rsi,8),%edx
  push   %r13
  and    $0xffffffdf,%r14d
  mov    %r8,%r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rcx,%rbp
  push   %rbx
  mov    %r9,%rbx
  sub    $0x38,%rsp
  mov    %rsi,(%rsp)
  xor    %esi,%esi
  call   <memset@plt>
  cmp    $0x54,%r14b
  je     L188
  test   %r12d,%r12d
  jle    L130
  test   %r15d,%r15d
  jle    L130
  movslq %r15d,%rax
  movslq %r12d,%rsi
  mov    %r15d,0x2c(%rsp)
  mov    %r13,%r8
  lea    (%rbx,%rax,8),%rdi
  mov    %rsi,%r14
  mov    %rbp,%r13
  xor    %r10d,%r10d
  lea    -0x8(,%rax,8),%rax
  mov    %rdi,0x20(%rsp)
  mov    %rsi,%rdi
  shl    $0x4,%r14
  imul   %rax,%rdi
  add    %rbx,%rax
  lea    0x0(,%rsi,8),%r9
  mov    %rax,0x10(%rsp)
  mov    %r15d,%eax
  shr    %eax
  mov    %rdi,0x8(%rsp)
  sub    $0x1,%eax
  mov    %r15d,%edi
  and    $0xfffffffe,%edi
  shl    $0x4,%rax
  mov    %edi,0x28(%rsp)
  imul   %edi,%r12d
  lea    0x10(%rbx,%rax,1),%r11
  mov    %edi,%eax
  lea    (%rbx,%rax,8),%rsi
  lea    -0x1(%r15),%eax
  mov    %eax,0x1c(%rsp)
  lea    0x8(%rbx,%rax,8),%rax
  mov    %rax,%r15
  nopl   0x0(%rax)
L117:
  mov    0x8(%rsp),%rcx
  lea    0x0(,%r10,8),%rdx
  mov    %r8,%rdi
  add    $0x8,%r8
  mov    %r10d,%eax
  add    %rdx,%rcx
  add    %rbp,%rcx
  cmp    %rcx,%rbx
  seta   %cl
  add    %rbp,%rdx
  cmp    %rdx,0x10(%rsp)
  setb   %dl
  or     %cl,%dl
  je     L121
  cmp    %r8,%rbx
  setae  %cl
  cmp    %rdi,0x20(%rsp)
  setbe  %dl
  or     %ecx,%edx
  cmpl   $0x1,0x1c(%rsp)
  seta   %cl
  test   %cl,%dl
  je     L121
  movsd  (%rdi),%xmm1
  mov    %r13,%rcx
  mov    %rbx,%rdx
  unpcklpd %xmm1,%xmm1
  nopl   0x0(%rax)
L175:
  movsd  (%rcx),%xmm0
  movupd (%rdx),%xmm3
  add    $0x10,%rdx
  movhpd (%rcx,%r9,1),%xmm0
  add    %r14,%rcx
  mulpd  %xmm1,%xmm0
  addpd  %xmm3,%xmm0
  movups %xmm0,-0x10(%rdx)
  cmp    %r11,%rdx
  jne    L175
  mov    0x28(%rsp),%edx
  cmp    %edx,0x2c(%rsp)
  je     L18
  add    %r12d,%eax
  cltq
  movsd  0x0(%rbp,%rax,8),%xmm0
  mulsd  (%rdi),%xmm0
  addsd  (%rsi),%xmm0
  movsd  %xmm0,(%rsi)
L18:
  add    $0x1,%r10
  add    $0x8,%r13
  cmp    (%rsp),%r10
  jne    L117
L130:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L188:
  test   %r15d,%r15d
  jle    L130
  test   %r12d,%r12d
  jle    L130
  lea    -0x1(%r15),%eax
  mov    %r13,%r8
  movslq %r12d,%r9
  mov    %r12d,%ecx
  lea    0x8(%r13,%rax,8),%r13
  mov    %r12d,%eax
  and    $0xfffffffe,%ecx
  mov    %rbp,%rdi
  shr    %eax
  lea    0x0(,%r9,8),%r11
  xor    %edx,%edx
  lea    -0x1(%rax),%esi
  lea    (%rbx,%r11,1),%r14
  mov    %ecx,%eax
  add    $0x1,%rsi
  mov    %r14,(%rsp)
  lea    (%rbx,%rax,8),%rax
  mov    %r9,%r14
  shl    $0x4,%rsi
  nopl   (%rax)
L115:
  lea    0x8(%rdi),%r10
  mov    %r8,%r9
  add    $0x8,%r8
  cmp    %r10,%rbx
  setne  %r15b
  cmp    $0x1,%r12d
  setne  %r10b
  test   %r10b,%r15b
  je     L41
  cmp    %r9,(%rsp)
  setbe  %r15b
  cmp    %r8,%rbx
  setae  %r10b
  or     %r15b,%r10b
  je     L41
  movsd  (%r9),%xmm1
  xor    %r10d,%r10d
  unpcklpd %xmm1,%xmm1
  nopw   0x0(%rax,%rax,1)
L73:
  movupd (%rdi,%r10,1),%xmm0
  movupd (%rbx,%r10,1),%xmm2
  mulpd  %xmm1,%xmm0
  addpd  %xmm2,%xmm0
  movups %xmm0,(%rbx,%r10,1)
  add    $0x10,%r10
  cmp    %r10,%rsi
  jne    L73
  cmp    %r12d,%ecx
  je     L53
  lea    (%rdx,%rcx,1),%r10d
  movslq %r10d,%r10
  movsd  0x0(%rbp,%r10,8),%xmm0
  mulsd  (%r9),%xmm0
  addsd  (%rax),%xmm0
  movsd  %xmm0,(%rax)
L53:
  add    %r11,%rdi
  add    %r12d,%edx
  cmp    %r8,%r13
  jne    L115
  jmp    L130
  cs nopw 0x0(%rax,%rax,1)
L121:
  mov    %r13,%rdx
  mov    %rbx,%rax
  cs nopw 0x0(%rax,%rax,1)
L93:
  movsd  (%rdi),%xmm0
  mulsd  (%rdx),%xmm0
  add    $0x8,%rax
  add    %r9,%rdx
  addsd  -0x8(%rax),%xmm0
  movsd  %xmm0,-0x8(%rax)
  cmp    %rax,%r15
  jne    L93
  jmp    L18
  nopl   0x0(%rax,%rax,1)
L41:
  xor    %r10d,%r10d
  nopl   0x0(%rax,%rax,1)
L164:
  movsd  (%rdi,%r10,8),%xmm0
  mulsd  (%r9),%xmm0
  addsd  (%rbx,%r10,8),%xmm0
  movsd  %xmm0,(%rbx,%r10,8)
  add    $0x1,%r10
  cmp    %r10,%r14
  jne    L164
  jmp    L53
```

assistant: ```c
void leftMatrixVector(int n, int p, char transA, double *A, double *v, double *C) {
  uint_fast16_t i, j;
  memset(C, 0, sizeof(double) * p);
  if (transA == 'T' || transA == 't') {
    for (i = 0; i < n; i++)
      for (j = 0; j < p; j++)
        C[j] += v[i] * A[i * p + j];
  } else {
    for (j = 0; j < p; j++)
      for (i = 0; i < n; i++)
        C[i] += v[j] * A[i * p + j];
  }
}
```