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

```asm
<dtrsm_l_u_n_n_3l>:
  endbr64
  push   %r15
  movslq %edi,%rax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %esi,-0x40(%rsp)
  mov    %r9d,-0x3c(%rsp)
  test   %eax,%eax
  je     L102
  test   %esi,%esi
  jle    L102
  mov    %eax,%ebx
  sub    $0x1,%ebx
  mov    %ebx,-0x34(%rsp)
  js     L102
  mov    %ecx,%r14d
  mov    %rdx,%rbp
  movslq %r9d,%rdi
  mov    %r8,%r10
  mov    %r14d,%edx
  mov    %rdi,-0x20(%rsp)
  shl    $0x3,%rdi
  lea    -0x10(,%rax,8),%rax
  not    %edx
  mov    %rdi,-0x18(%rsp)
  lea    0x8(%r8),%rcx
  mov    $0x8,%r13d
  movslq %edx,%rdx
  movl   $0x0,-0x4c(%rsp)
  lea    0x0(,%rdx,8),%rdi
  mov    %rax,-0x10(%rsp)
  mov    %rdi,-0x58(%rsp)
  mov    %ebx,%edi
  imul   %r14d,%ebx
  movq   $0x0,-0x48(%rsp)
  movslq %edi,%rsi
  movslq %ebx,%rdx
  mov    %ebx,-0x38(%rsp)
  add    %rdx,%rsi
  lea    0x0(%rbp,%rsi,8),%rbx
  mov    %r14d,%esi
  neg    %esi
  mov    %rbx,-0x30(%rsp)
  movslq %esi,%rsi
  lea    0x0(,%rsi,8),%rbx
  mov    %rbx,-0x60(%rsp)
  lea    0x0(%rbp,%rdx,8),%rbx
  mov    %rbx,-0x28(%rsp)
  xor    %ebx,%ebx
  xchg   %ax,%ax
L21:
  mov    -0x48(%rsp),%rsi
  mov    -0x10(%rsp),%rax
  mov    -0x38(%rsp),%edi
  mov    -0x28(%rsp),%r9
  add    $0x1,%rsi
  lea    (%rax,%r13,1),%rdx
  mov    -0x30(%rsp),%r12
  mov    -0x34(%rsp),%eax
  mov    %rsi,-0x68(%rsp)
  nopl   0x0(%rax)
L42:
  movsd  (%r8,%rdx,1),%xmm0
  lea    -0x1(%rax),%r11d
  divsd  (%r12),%xmm0
  movsd  %xmm0,(%r8,%rdx,1)
  test   %eax,%eax
  jle    L88
  mulsd  (%r9),%xmm0
  movsd  (%r10),%xmm1
  subsd  %xmm0,%xmm1
  movsd  %xmm1,(%r10)
  cmp    $0x1,%eax
  je     L14
  mov    %r11d,%esi
  add    -0x68(%rsp),%rsi
  shl    $0x3,%rsi
  cmp    %rdx,%rsi
  lea    0x8(%rdx),%rsi
  setle  %r15b
  cmp    %r13,%rsi
  setle  %sil
  or     %r15b,%sil
  je     L70
  lea    0x10(%r9),%rsi
  cmp    %rsi,%rcx
  setne  %r15b
  cmp    $0x2,%eax
  setne  %sil
  test   %sil,%r15b
  je     L70
  movsd  (%r8,%rdx,1),%xmm2
  mov    %r11d,%esi
  lea    0x8(%r9),%r15
  xor    %eax,%eax
  shr    %esi
  unpcklpd %xmm2,%xmm2
  shl    $0x4,%rsi
  nopl   (%rax)
L108:
  movupd (%r15,%rax,1),%xmm1
  movupd (%rcx,%rax,1),%xmm0
  mulpd  %xmm2,%xmm1
  subpd  %xmm1,%xmm0
  movups %xmm0,(%rcx,%rax,1)
  add    $0x10,%rax
  cmp    %rsi,%rax
  jne    L108
  mov    %r11d,%eax
  or     $0x1,%eax
  test   $0x1,%r11b
  je     L14
  lea    (%rbx,%rax,1),%esi
  add    %edi,%eax
  cltq
  movslq %esi,%rsi
  movsd  0x0(%rbp,%rax,8),%xmm1
  mulsd  (%r8,%rdx,1),%xmm1
  lea    (%r8,%rsi,8),%rsi
  movsd  (%rsi),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%rsi)
L14:
  add    -0x58(%rsp),%r12
  add    -0x60(%rsp),%r9
  sub    %r14d,%edi
  mov    %r11d,%eax
  sub    $0x8,%rdx
  jmp    L42
  nopl   0x0(%rax,%rax,1)
L70:
  lea    -0x2(%rax),%esi
  mov    $0x1,%eax
  add    $0x2,%rsi
  nopl   0x0(%rax)
L121:
  movsd  (%r9,%rax,8),%xmm1
  mulsd  (%r8,%rdx,1),%xmm1
  movsd  (%r10,%rax,8),%xmm0
  subsd  %xmm1,%xmm0
  movsd  %xmm0,(%r10,%rax,8)
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L121
  jmp    L14
  nop
L88:
  test   %r11d,%r11d
  jns    L14
  mov    -0x18(%rsp),%rdi
  addl   $0x1,-0x4c(%rsp)
  mov    -0x20(%rsp),%rsi
  mov    -0x4c(%rsp),%eax
  add    %rsi,-0x48(%rsp)
  add    -0x3c(%rsp),%ebx
  add    %rdi,%r10
  add    %rdi,%r13
  add    %rdi,%rcx
  cmp    %eax,-0x40(%rsp)
  jne    L21
L102:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void dtrsm_l_u_n_n_3l(int m, int n, double *A, int lda, double *B, int ldb) {
  if (m == 0 || n == 0)
    return;
  int i, j, k;
  for (j = 0; j < n; j++) {
    for (k = m - 1; k >= 0; k--) {
      B[k + ldb * j] /= A[k + lda * k];
      for (i = 0; i < k; i++) {
        B[i + ldb * j] -= B[k + ldb * j] * A[i + lda * k];
      }
    }
  }
  return;
}
```