user: 请从给定的汇编指令推导出C源代码:

```asm
<matrix_multiply>:
  endbr64
  movsd  (%rsi),%xmm0
  movsd  0x8(%rsi),%xmm1
  mulsd  (%rdi),%xmm0
  mulsd  0x20(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x10(%rsi),%xmm1
  mulsd  0x40(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x18(%rsi),%xmm1
  mulsd  0x60(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rdx)
  movsd  0x20(%rsi),%xmm0
  movsd  0x28(%rsi),%xmm1
  mulsd  (%rdi),%xmm0
  mulsd  0x20(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x30(%rsi),%xmm1
  mulsd  0x40(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x38(%rsi),%xmm1
  mulsd  0x60(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x20(%rdx)
  movsd  0x40(%rsi),%xmm0
  movsd  0x48(%rsi),%xmm1
  mulsd  (%rdi),%xmm0
  mulsd  0x20(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x50(%rsi),%xmm1
  mulsd  0x40(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x58(%rsi),%xmm1
  mulsd  0x60(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x40(%rdx)
  movsd  0x60(%rsi),%xmm0
  movsd  0x68(%rsi),%xmm1
  mulsd  (%rdi),%xmm0
  mulsd  0x20(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x70(%rsi),%xmm1
  mulsd  0x40(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x78(%rsi),%xmm1
  mulsd  0x60(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x60(%rdx)
  movsd  (%rsi),%xmm0
  movsd  0x8(%rsi),%xmm1
  mulsd  0x8(%rdi),%xmm0
  mulsd  0x28(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x10(%rsi),%xmm1
  mulsd  0x48(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x18(%rsi),%xmm1
  mulsd  0x68(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x8(%rdx)
  movsd  0x20(%rsi),%xmm0
  movsd  0x28(%rsi),%xmm1
  mulsd  0x8(%rdi),%xmm0
  mulsd  0x28(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x30(%rsi),%xmm1
  mulsd  0x48(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x38(%rsi),%xmm1
  mulsd  0x68(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x28(%rdx)
  movsd  0x40(%rsi),%xmm0
  movsd  0x48(%rsi),%xmm1
  mulsd  0x8(%rdi),%xmm0
  mulsd  0x28(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x50(%rsi),%xmm1
  mulsd  0x48(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x58(%rsi),%xmm1
  mulsd  0x68(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x48(%rdx)
  movsd  0x60(%rsi),%xmm0
  mulsd  0x8(%rdi),%xmm0
  movsd  0x68(%rsi),%xmm1
  mulsd  0x28(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x70(%rsi),%xmm1
  mulsd  0x48(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x78(%rsi),%xmm1
  mulsd  0x68(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x68(%rdx)
  movsd  (%rsi),%xmm0
  movsd  0x8(%rsi),%xmm1
  mulsd  0x10(%rdi),%xmm0
  mulsd  0x30(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x10(%rsi),%xmm1
  mulsd  0x50(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x18(%rsi),%xmm1
  mulsd  0x70(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x10(%rdx)
  movsd  0x20(%rsi),%xmm0
  movsd  0x28(%rsi),%xmm1
  mulsd  0x10(%rdi),%xmm0
  mulsd  0x30(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x30(%rsi),%xmm1
  mulsd  0x50(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x38(%rsi),%xmm1
  mulsd  0x70(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x30(%rdx)
  movsd  0x40(%rsi),%xmm0
  movsd  0x48(%rsi),%xmm1
  mulsd  0x10(%rdi),%xmm0
  mulsd  0x30(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x50(%rsi),%xmm1
  mulsd  0x50(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x58(%rsi),%xmm1
  mulsd  0x70(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x50(%rdx)
  movsd  0x60(%rsi),%xmm0
  movsd  0x68(%rsi),%xmm1
  mulsd  0x10(%rdi),%xmm0
  mulsd  0x30(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x70(%rsi),%xmm1
  mulsd  0x50(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x78(%rsi),%xmm1
  mulsd  0x70(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x70(%rdx)
  movsd  (%rsi),%xmm0
  movsd  0x8(%rsi),%xmm1
  mulsd  0x18(%rdi),%xmm0
  mulsd  0x38(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x10(%rsi),%xmm1
  mulsd  0x58(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x18(%rsi),%xmm1
  mulsd  0x78(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x18(%rdx)
  movsd  0x20(%rsi),%xmm0
  movsd  0x28(%rsi),%xmm1
  mulsd  0x18(%rdi),%xmm0
  mulsd  0x38(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x30(%rsi),%xmm1
  mulsd  0x58(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x38(%rsi),%xmm1
  mulsd  0x78(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x38(%rdx)
  movsd  0x40(%rsi),%xmm0
  mulsd  0x18(%rdi),%xmm0
  movsd  0x48(%rsi),%xmm1
  mulsd  0x38(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x50(%rsi),%xmm1
  mulsd  0x58(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x58(%rsi),%xmm1
  mulsd  0x78(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x58(%rdx)
  movsd  0x60(%rsi),%xmm0
  movsd  0x68(%rsi),%xmm1
  mulsd  0x18(%rdi),%xmm0
  mulsd  0x38(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x70(%rsi),%xmm1
  mulsd  0x58(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x78(%rsi),%xmm1
  mulsd  0x78(%rdi),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,0x78(%rdx)
  ret
```

assistant: ```c
void matrix_multiply(const double *a, const double *b, double *output) {
  output[0] = (b[0] * a[0]) + (b[1] * a[4]) + (b[2] * a[8]) + (b[3] * a[12]);
  output[4] = (b[4] * a[0]) + (b[5] * a[4]) + (b[6] * a[8]) + (b[7] * a[12]);
  output[8] = (b[8] * a[0]) + (b[9] * a[4]) + (b[10] * a[8]) + (b[11] * a[12]);
  output[12] = (b[12] * a[0]) + (b[13] * a[4]) + (b[14] * a[8]) + (b[15] * a[12]);
  output[1] = (b[0] * a[1]) + (b[1] * a[5]) + (b[2] * a[9]) + (b[3] * a[13]);
  output[5] = (b[4] * a[1]) + (b[5] * a[5]) + (b[6] * a[9]) + (b[7] * a[13]);
  output[9] = (b[8] * a[1]) + (b[9] * a[5]) + (b[10] * a[9]) + (b[11] * a[13]);
  output[13] = (b[12] * a[1]) + (b[13] * a[5]) + (b[14] * a[9]) + (b[15] * a[13]);
  output[2] = (b[0] * a[2]) + (b[1] * a[6]) + (b[2] * a[10]) + (b[3] * a[14]);
  output[6] = (b[4] * a[2]) + (b[5] * a[6]) + (b[6] * a[10]) + (b[7] * a[14]);
  output[10] = (b[8] * a[2]) + (b[9] * a[6]) + (b[10] * a[10]) + (b[11] * a[14]);
  output[14] = (b[12] * a[2]) + (b[13] * a[6]) + (b[14] * a[10]) + (b[15] * a[14]);
  output[3] = (b[0] * a[3]) + (b[1] * a[7]) + (b[2] * a[11]) + (b[3] * a[15]);
  output[7] = (b[4] * a[3]) + (b[5] * a[7]) + (b[6] * a[11]) + (b[7] * a[15]);
  output[11] = (b[8] * a[3]) + (b[9] * a[7]) + (b[10] * a[11]) + (b[11] * a[15]);
  output[15] = (b[12] * a[3]) + (b[13] * a[7]) + (b[14] * a[11]) + (b[15] * a[15]);
}
```