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

```asm
<mat_mult>:
  endbr64
  sub    $0x40,%rsp
  mov    (%rsi),%rax
  movupd (%rax),%xmm1
  movupd 0x10(%rax),%xmm0
  mov    0x8(%rsi),%rax
  movupd (%rax),%xmm10
  movupd 0x10(%rax),%xmm14
  mov    0x10(%rsi),%rax
  movupd (%rax),%xmm9
  movupd 0x10(%rax),%xmm7
  mov    0x18(%rsi),%rax
  movupd (%rax),%xmm8
  movupd 0x10(%rax),%xmm6
  mov    (%rdi),%rax
  movupd (%rax),%xmm2
  movupd 0x10(%rax),%xmm3
  mov    0x8(%rdi),%rax
  movapd %xmm2,%xmm12
  movapd %xmm3,%xmm5
  movupd (%rax),%xmm13
  movupd 0x10(%rax),%xmm4
  unpcklpd %xmm2,%xmm12
  unpckhpd %xmm2,%xmm2
  mov    0x10(%rdi),%rax
  unpcklpd %xmm3,%xmm5
  unpckhpd %xmm3,%xmm3
  movapd %xmm13,%xmm11
  movapd %xmm4,%xmm15
  unpcklpd %xmm13,%xmm11
  unpckhpd %xmm13,%xmm13
  unpcklpd %xmm4,%xmm15
  movaps %xmm13,-0x38(%rsp)
  movupd (%rax),%xmm13
  unpckhpd %xmm4,%xmm4
  movaps %xmm15,-0x68(%rsp)
  movaps %xmm4,-0x58(%rsp)
  movapd %xmm13,%xmm15
  movupd 0x10(%rax),%xmm4
  mov    0x18(%rdi),%rax
  unpcklpd %xmm13,%xmm15
  unpckhpd %xmm13,%xmm13
  movaps %xmm13,0x28(%rsp)
  movapd %xmm4,%xmm13
  unpcklpd %xmm4,%xmm13
  unpckhpd %xmm4,%xmm4
  movaps %xmm15,-0x18(%rsp)
  movaps %xmm13,-0x28(%rsp)
  movupd (%rax),%xmm13
  movaps %xmm4,-0x48(%rsp)
  movupd 0x10(%rax),%xmm4
  movapd %xmm13,%xmm15
  unpcklpd %xmm13,%xmm15
  unpckhpd %xmm13,%xmm13
  movaps %xmm15,0x8(%rsp)
  movapd %xmm10,%xmm15
  mov    (%rdx),%rax
  movaps %xmm13,-0x78(%rsp)
  mulpd  %xmm2,%xmm15
  movapd %xmm4,%xmm13
  mulpd  %xmm14,%xmm2
  unpcklpd %xmm4,%xmm13
  unpckhpd %xmm4,%xmm4
  movaps %xmm4,-0x8(%rsp)
  movapd %xmm1,%xmm4
  mulpd  %xmm12,%xmm4
  movaps %xmm13,0x18(%rsp)
  mulpd  %xmm0,%xmm12
  movapd %xmm4,%xmm13
  pxor   %xmm4,%xmm4
  addpd  %xmm4,%xmm13
  addpd  %xmm4,%xmm12
  addpd  %xmm13,%xmm15
  movapd %xmm9,%xmm13
  addpd  %xmm12,%xmm2
  movapd -0x58(%rsp),%xmm12
  mulpd  %xmm5,%xmm13
  mulpd  %xmm7,%xmm5
  addpd  %xmm15,%xmm13
  movapd %xmm8,%xmm15
  mulpd  %xmm3,%xmm15
  addpd  %xmm2,%xmm5
  movapd %xmm11,%xmm2
  mulpd  %xmm6,%xmm3
  mulpd  %xmm1,%xmm2
  mulpd  %xmm0,%xmm11
  addpd  %xmm15,%xmm13
  movapd -0x68(%rsp),%xmm15
  addpd  %xmm3,%xmm5
  addpd  %xmm4,%xmm2
  movups %xmm13,(%rax)
  addpd  %xmm4,%xmm11
  movups %xmm5,0x10(%rax)
  movapd -0x38(%rsp),%xmm5
  mov    0x8(%rdx),%rax
  movapd %xmm5,%xmm3
  mulpd  %xmm10,%xmm3
  mulpd  %xmm14,%xmm5
  addpd  %xmm2,%xmm3
  movapd %xmm15,%xmm2
  mulpd  %xmm9,%xmm2
  addpd  %xmm3,%xmm2
  movapd %xmm12,%xmm3
  mulpd  %xmm8,%xmm3
  addpd  %xmm3,%xmm2
  movapd %xmm15,%xmm3
  movapd -0x48(%rsp),%xmm15
  mulpd  %xmm7,%xmm3
  movups %xmm2,(%rax)
  movapd %xmm5,%xmm2
  movapd -0x18(%rsp),%xmm5
  addpd  %xmm11,%xmm2
  movapd 0x28(%rsp),%xmm11
  addpd  %xmm2,%xmm3
  movapd %xmm12,%xmm2
  movapd -0x28(%rsp),%xmm12
  mulpd  %xmm6,%xmm2
  addpd  %xmm2,%xmm3
  movapd %xmm5,%xmm2
  mulpd  %xmm1,%xmm2
  mulpd  %xmm0,%xmm5
  movups %xmm3,0x10(%rax)
  movapd %xmm11,%xmm3
  mov    0x10(%rdx),%rax
  mulpd  %xmm10,%xmm3
  addpd  %xmm4,%xmm2
  addpd  %xmm2,%xmm3
  movapd %xmm12,%xmm2
  mulpd  %xmm9,%xmm2
  addpd  %xmm3,%xmm2
  movapd %xmm15,%xmm3
  mulpd  %xmm8,%xmm3
  addpd  %xmm3,%xmm2
  movapd %xmm11,%xmm3
  mulpd  %xmm14,%xmm3
  movups %xmm2,(%rax)
  movapd %xmm5,%xmm2
  movapd -0x78(%rsp),%xmm5
  addpd  %xmm4,%xmm2
  mulpd  %xmm5,%xmm10
  addpd  %xmm2,%xmm3
  movapd %xmm12,%xmm2
  mulpd  %xmm7,%xmm2
  addpd  %xmm2,%xmm3
  movapd %xmm15,%xmm2
  mulpd  %xmm6,%xmm2
  addpd  %xmm2,%xmm3
  movapd 0x18(%rsp),%xmm2
  mulpd  %xmm2,%xmm9
  movups %xmm3,0x10(%rax)
  movapd 0x8(%rsp),%xmm3
  mulpd  %xmm2,%xmm7
  mov    0x18(%rdx),%rax
  mulpd  %xmm3,%xmm1
  mulpd  %xmm3,%xmm0
  addpd  %xmm4,%xmm1
  addpd  %xmm4,%xmm0
  addpd  %xmm1,%xmm10
  movapd %xmm5,%xmm1
  mulpd  %xmm14,%xmm1
  addpd  %xmm10,%xmm9
  movapd -0x8(%rsp),%xmm10
  mulpd  %xmm10,%xmm8
  addpd  %xmm1,%xmm0
  mulpd  %xmm10,%xmm6
  addpd  %xmm0,%xmm7
  addpd  %xmm9,%xmm8
  addpd  %xmm7,%xmm6
  movups %xmm8,(%rax)
  movups %xmm6,0x10(%rax)
  add    $0x40,%rsp
  ret
```

assistant: ```c
void mat_mult(double **m1, double **m2, double **m3) {
  int i, j, k;
  double temp[4][4];
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++) {
      temp[i][j] = 0;
      for (k = 0; k < 4; k++)
        temp[i][j] += m1[i][k] * m2[k][j];
    }
  for (i = 0; i < 4; i++)
    for (j = 0; j < 4; j++)
      m3[i][j] = temp[i][j];
}
```