user: Please show me the C implementation that matches the assembly code listed below:

```asm
<multiply_matrices>:
  endbr64
  push   %rbp
  mov    %rdi,%rbp
  mov    $0x48,%edi
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x8,%rsp
  call   <malloc@plt>
  pxor   %xmm0,%xmm0
  movq   $0x0,(%rax)
  movsd  (%rbx),%xmm2
  mulsd  0x0(%rbp),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,(%rax)
  movsd  0x8(%rbp),%xmm1
  mulsd  0x18(%rbx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,(%rax)
  movsd  0x10(%rbp),%xmm2
  mulsd  0x30(%rbx),%xmm2
  movq   $0x0,0x8(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,(%rax)
  movsd  0x0(%rbp),%xmm2
  mulsd  0x8(%rbx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x8(%rax)
  movsd  0x8(%rbp),%xmm1
  mulsd  0x20(%rbx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x8(%rax)
  movsd  0x10(%rbp),%xmm2
  mulsd  0x38(%rbx),%xmm2
  movq   $0x0,0x10(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x8(%rax)
  movsd  0x0(%rbp),%xmm2
  mulsd  0x10(%rbx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x10(%rax)
  movsd  0x8(%rbp),%xmm1
  mulsd  0x28(%rbx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x10(%rax)
  movsd  0x10(%rbp),%xmm2
  mulsd  0x40(%rbx),%xmm2
  movq   $0x0,0x18(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x10(%rax)
  movsd  0x18(%rbp),%xmm2
  mulsd  (%rbx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x18(%rax)
  movsd  0x20(%rbp),%xmm1
  mulsd  0x18(%rbx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x18(%rax)
  movsd  0x28(%rbp),%xmm2
  mulsd  0x30(%rbx),%xmm2
  movq   $0x0,0x20(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x18(%rax)
  movsd  0x18(%rbp),%xmm2
  mulsd  0x8(%rbx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x20(%rax)
  movsd  0x20(%rbp),%xmm1
  mulsd  0x20(%rbx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x20(%rax)
  movsd  0x28(%rbp),%xmm2
  mulsd  0x38(%rbx),%xmm2
  movq   $0x0,0x28(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x20(%rax)
  movsd  0x18(%rbp),%xmm2
  mulsd  0x10(%rbx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x28(%rax)
  movsd  0x28(%rbx),%xmm1
  mulsd  0x20(%rbp),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x28(%rax)
  movsd  0x28(%rbp),%xmm2
  mulsd  0x40(%rbx),%xmm2
  movq   $0x0,0x30(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x28(%rax)
  movsd  0x30(%rbp),%xmm2
  mulsd  (%rbx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x30(%rax)
  movsd  0x38(%rbp),%xmm1
  mulsd  0x18(%rbx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x30(%rax)
  movsd  0x40(%rbp),%xmm2
  mulsd  0x30(%rbx),%xmm2
  movq   $0x0,0x38(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x30(%rax)
  movsd  0x30(%rbp),%xmm2
  mulsd  0x8(%rbx),%xmm2
  addsd  %xmm0,%xmm2
  movsd  %xmm2,0x38(%rax)
  movsd  0x38(%rbp),%xmm1
  mulsd  0x20(%rbx),%xmm1
  addsd  %xmm2,%xmm1
  movsd  %xmm1,0x38(%rax)
  movsd  0x40(%rbp),%xmm2
  mulsd  0x38(%rbx),%xmm2
  movq   $0x0,0x40(%rax)
  addsd  %xmm1,%xmm2
  movsd  %xmm2,0x38(%rax)
  movsd  0x30(%rbp),%xmm1
  mulsd  0x10(%rbx),%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x40(%rax)
  movsd  0x38(%rbp),%xmm0
  mulsd  0x28(%rbx),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x40(%rax)
  movsd  0x40(%rbp),%xmm1
  mulsd  0x40(%rbx),%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x40(%rax)
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
```

assistant: ```c
double *multiply_matrices(const double *L, const double *R) {
  int i, j, k;
  double *M;
  M = (double *)malloc(sizeof(double) * 9);
  for (i = 0; i < 3; i++) {
    for (j = 0; j < 3; j++) {
      M[i * 3 + j] = 0;
      for (k = 0; k < 3; k++) {
        M[i * 3 + j] += L[i * 3 + k] * R[k * 3 + j];
      }
    }
  }
  return M;
}
```