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

```asm
<mtx_3x3mult>:
  endbr64
  movq   $0x0,(%rdi)
  movsd  (%rsi),%xmm2
  pxor   %xmm0,%xmm0
  mulsd  (%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,(%rdi)
  movsd  0x8(%rsi),%xmm1
  mulsd  0x18(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,(%rdi)
  movsd  0x10(%rsi),%xmm2
  mulsd  0x30(%rdx),%xmm2
  movq   $0x0,0x8(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,(%rdi)
  movsd  (%rsi),%xmm2
  mulsd  0x8(%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x8(%rdi)
  movsd  0x8(%rsi),%xmm1
  mulsd  0x20(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x8(%rdi)
  movsd  0x10(%rsi),%xmm2
  mulsd  0x38(%rdx),%xmm2
  movq   $0x0,0x10(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x8(%rdi)
  movsd  (%rsi),%xmm2
  mulsd  0x10(%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x10(%rdi)
  movsd  0x8(%rsi),%xmm1
  mulsd  0x28(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x10(%rdi)
  movsd  0x10(%rsi),%xmm2
  mulsd  0x40(%rdx),%xmm2
  movq   $0x0,0x18(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x10(%rdi)
  movsd  0x18(%rsi),%xmm2
  mulsd  (%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x18(%rdi)
  movsd  0x20(%rsi),%xmm1
  mulsd  0x18(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x18(%rdi)
  movsd  0x28(%rsi),%xmm2
  mulsd  0x30(%rdx),%xmm2
  movq   $0x0,0x20(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x18(%rdi)
  movsd  0x18(%rsi),%xmm2
  mulsd  0x8(%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x20(%rdi)
  movsd  0x20(%rsi),%xmm1
  mulsd  0x20(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x20(%rdi)
  movsd  0x28(%rsi),%xmm2
  mulsd  0x38(%rdx),%xmm2
  movq   $0x0,0x28(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x20(%rdi)
  movsd  0x18(%rsi),%xmm2
  mulsd  0x10(%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x28(%rdi)
  movsd  0x20(%rsi),%xmm1
  mulsd  0x28(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x28(%rdi)
  movsd  0x28(%rsi),%xmm2
  mulsd  0x40(%rdx),%xmm2
  movq   $0x0,0x30(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x28(%rdi)
  movsd  0x30(%rsi),%xmm2
  mulsd  (%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x30(%rdi)
  movsd  0x38(%rsi),%xmm1
  mulsd  0x18(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x30(%rdi)
  movsd  0x40(%rsi),%xmm2
  mulsd  0x30(%rdx),%xmm2
  movq   $0x0,0x38(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x30(%rdi)
  movsd  0x30(%rsi),%xmm2
  mulsd  0x8(%rdx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x38(%rdi)
  movsd  0x38(%rsi),%xmm1
  mulsd  0x20(%rdx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x38(%rdi)
  movsd  0x40(%rsi),%xmm2
  mulsd  0x38(%rdx),%xmm2
  movq   $0x0,0x40(%rdi)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x38(%rdi)
  movsd  0x30(%rsi),%xmm1
  mulsd  0x10(%rdx),%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x40(%rdi)
  movsd  0x38(%rsi),%xmm0
  mulsd  0x28(%rdx),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x40(%rdi)
  movsd  0x40(%rsi),%xmm1
  mulsd  0x40(%rdx),%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x40(%rdi)
  ret
```

assistant: ```c
void mtx_3x3mult(double out[3][3], double m1[3][3], double m2[3][3]) {
  int i, j, k;
  for (i = 0; i < 3; ++i)
    for (j = 0; j < 3; ++j) {
      out[i][j] = 0.;
      for (k = 0; k < 3; ++k)
        out[i][j] += m1[i][k] * m2[k][j];
    }
}
```