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

```asm
<cmatrix_mrotz>:
  endbr64
  push   %r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x70,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  cmp    %rdi,%rsi
  je     L46
L8:
  lea    0x10(%rsp),%rsi
  lea    0x18(%rsp),%rdi
  call   <sincos@plt>
  lea    0x40(%rbx),%rcx
  lea    0x18(%rbp),%rax
  movsd  0x10(%rsp),%xmm2
  cmp    %rax,%rcx
  lea    0x28(%rbp),%rax
  movsd  0x18(%rsp),%xmm0
  setbe  %dl
  cmp    %rax,%rbx
  setae  %al
  or     %eax,%edx
  lea    0x10(%rbp),%rax
  cmp    %rax,%rbx
  setae  %al
  cmp    %rcx,%rbp
  setae  %sil
  or     %esi,%eax
  test   %al,%dl
  je     L41
  lea    0x30(%rbp),%rax
  lea    0x40(%rbp),%rdx
  cmp    %rax,%rcx
  setbe  %al
  cmp    %rdx,%rbx
  setae  %dl
  or     %dl,%al
  je     L41
  movupd 0x0(%rbp),%xmm1
  movupd 0x18(%rbp),%xmm3
  movapd %xmm2,%xmm4
  movapd %xmm0,%xmm5
  unpcklpd %xmm4,%xmm4
  unpcklpd %xmm5,%xmm5
  mulpd  %xmm5,%xmm3
  mulpd  %xmm4,%xmm1
  subpd  %xmm3,%xmm1
  movups %xmm1,(%rbx)
  movupd 0x0(%rbp),%xmm1
  movupd 0x18(%rbp),%xmm3
  mulpd  %xmm5,%xmm1
  mulpd  %xmm4,%xmm3
  addpd  %xmm3,%xmm1
  movups %xmm1,0x18(%rbx)
  movupd 0x30(%rbp),%xmm6
  movups %xmm6,0x30(%rbx)
L0:
  movsd  0x10(%rbp),%xmm1
  movsd  0x28(%rbp),%xmm3
  mulsd  %xmm2,%xmm1
  mulsd  %xmm0,%xmm3
  subsd  %xmm3,%xmm1
  movsd  %xmm1,0x10(%rbx)
  mulsd  0x10(%rbp),%xmm0
  mulsd  0x28(%rbp),%xmm2
  addsd  %xmm2,%xmm0
  movsd  %xmm0,0x28(%rbx)
  movsd  0x40(%rbp),%xmm0
  movsd  %xmm0,0x40(%rbx)
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L9
  add    $0x70,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L41:
  movsd  0x0(%rbp),%xmm1
  movsd  0x18(%rbp),%xmm3
  mulsd  %xmm2,%xmm1
  mulsd  %xmm0,%xmm3
  subsd  %xmm3,%xmm1
  movsd  %xmm1,(%rbx)
  movsd  0x0(%rbp),%xmm1
  movsd  0x18(%rbp),%xmm3
  mulsd  %xmm0,%xmm1
  mulsd  %xmm2,%xmm3
  addsd  %xmm3,%xmm1
  movsd  %xmm1,0x18(%rbx)
  movsd  0x30(%rbp),%xmm1
  movsd  %xmm1,0x30(%rbx)
  movsd  0x8(%rbp),%xmm1
  movsd  0x20(%rbp),%xmm3
  mulsd  %xmm2,%xmm1
  mulsd  %xmm0,%xmm3
  subsd  %xmm3,%xmm1
  movsd  %xmm1,0x8(%rbx)
  movsd  0x8(%rbp),%xmm1
  movsd  0x20(%rbp),%xmm3
  mulsd  %xmm0,%xmm1
  mulsd  %xmm2,%xmm3
  addsd  %xmm3,%xmm1
  movsd  %xmm1,0x20(%rbx)
  movsd  0x38(%rbp),%xmm1
  movsd  %xmm1,0x38(%rbx)
  jmp    L0
  nopl   0x0(%rax)
L46:
  lea    0x20(%rsp),%r12
  mov    $0x48,%edx
  movsd  %xmm0,0x8(%rsp)
  mov    %r12,%rdi
  mov    %r12,%rbp
  call   <memcpy@plt>
  movsd  0x8(%rsp),%xmm0
  jmp    L8
L9:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void cmatrix_mrotz(double *mdest, const double *morg, double angle) {
  double temp[3 * 3];
  if (morg == mdest) {
    memcpy(temp, morg, sizeof(temp));
    morg = temp;
  }
  double cosa = cos(angle);
  double sina = sin(angle);
  for (int k = 1; k <= 3; k++) {
    mdest[((((1) - 1) * 3) + ((k)-1))] = cosa * morg[((((1) - 1) * 3) + ((k)-1))] - sina * morg[((((2) - 1) * 3) + ((k)-1))];
    mdest[((((2) - 1) * 3) + ((k)-1))] = sina * morg[((((1) - 1) * 3) + ((k)-1))] + cosa * morg[((((2) - 1) * 3) + ((k)-1))];
    mdest[((((3) - 1) * 3) + ((k)-1))] = morg[((((3) - 1) * 3) + ((k)-1))];
  }
}
```