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

```asm
<mul4>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xc0,%rsp
  mov    %rdi,-0xa8(%rbp)
  mov    %rsi,-0xb0(%rbp)
  mov    %rdx,-0xb8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xb0(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x90(%rbp)
  mov    -0xb0(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x88(%rbp)
  mov    -0xb0(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  mov    -0xb0(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x78(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x70(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x60(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x58(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x48(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x40(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x38(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x30(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  (%rax),%xmm1
  mov    -0xb8(%rbp),%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x8(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x20,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x10(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x40,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  mov    -0xb0(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm2
  mov    -0xb8(%rbp),%rax
  add    $0x60,%rax
  movsd  0x18(%rax),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movl   $0x0,-0x94(%rbp)
  jmp    L6
L28:
  mov    -0x94(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0xa8(%rbp),%rax
  add    %rax,%rdx
  mov    -0x94(%rbp),%eax
  movsd  -0x90(%rbp,%rax,8),%xmm0
  movsd  %xmm0,(%rdx)
  addl   $0x1,-0x94(%rbp)
L6:
  cmpl   $0xf,-0x94(%rbp)
  jbe    L28
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L11
  call   <__stack_chk_fail@plt>
L11:
  leave
  ret
```

assistant: ```c
void mul4(double *Out, const double A[4][4], const double B[4][4]) {
  unsigned n;
  double Res[16];
  Res[0] = A[0][0] * B[0][0] + A[0][1] * B[1][0] + A[0][2] * B[2][0] + A[0][3] * B[3][0];
  Res[1] = A[0][0] * B[0][1] + A[0][1] * B[1][1] + A[0][2] * B[2][1] + A[0][3] * B[3][1];
  Res[2] = A[0][0] * B[0][2] + A[0][1] * B[1][2] + A[0][2] * B[2][2] + A[0][3] * B[3][2];
  Res[3] = A[0][0] * B[0][3] + A[0][1] * B[1][3] + A[0][2] * B[2][3] + A[0][3] * B[3][3];
  Res[4] = A[1][0] * B[0][0] + A[1][1] * B[1][0] + A[1][2] * B[2][0] + A[1][3] * B[3][0];
  Res[5] = A[1][0] * B[0][1] + A[1][1] * B[1][1] + A[1][2] * B[2][1] + A[1][3] * B[3][1];
  Res[6] = A[1][0] * B[0][2] + A[1][1] * B[1][2] + A[1][2] * B[2][2] + A[1][3] * B[3][2];
  Res[7] = A[1][0] * B[0][3] + A[1][1] * B[1][3] + A[1][2] * B[2][3] + A[1][3] * B[3][3];
  Res[8] = A[2][0] * B[0][0] + A[2][1] * B[1][0] + A[2][2] * B[2][0] + A[2][3] * B[3][0];
  Res[9] = A[2][0] * B[0][1] + A[2][1] * B[1][1] + A[2][2] * B[2][1] + A[2][3] * B[3][1];
  Res[10] = A[2][0] * B[0][2] + A[2][1] * B[1][2] + A[2][2] * B[2][2] + A[2][3] * B[3][2];
  Res[11] = A[2][0] * B[0][3] + A[2][1] * B[1][3] + A[2][2] * B[2][3] + A[2][3] * B[3][3];
  Res[12] = A[3][0] * B[0][0] + A[3][1] * B[1][0] + A[3][2] * B[2][0] + A[3][3] * B[3][0];
  Res[13] = A[3][0] * B[0][1] + A[3][1] * B[1][1] + A[3][2] * B[2][1] + A[3][3] * B[3][1];
  Res[14] = A[3][0] * B[0][2] + A[3][1] * B[1][2] + A[3][2] * B[2][2] + A[3][3] * B[3][2];
  Res[15] = A[3][0] * B[0][3] + A[3][1] * B[1][3] + A[3][2] * B[2][3] + A[3][3] * B[3][3];
  for (n = 0; n < 16; ++n)
    Out[n] = Res[n];
}
```