user: 请将以下的汇编代码转换成C语言代码:

```asm
<matrix_multiply_4x4_4x4>:
  endbr64
  lea    0x7f(%rdx),%rcx
  mov    %rsi,%rax
  sub    %rsi,%rcx
  cmp    $0xfe,%rcx
  jbe    L25
  lea    0x3f(%rdx),%rcx
  sub    %rdi,%rcx
  cmp    $0x7e,%rcx
  jbe    L25
  sub    $0x20,%rsp
  movsd  0x30(%rsi),%xmm4
  movsd  0x50(%rsi),%xmm3
  movsd  0x18(%rsi),%xmm5
  movsd  0x38(%rsi),%xmm0
  unpcklpd %xmm4,%xmm4
  unpcklpd %xmm3,%xmm3
  movsd  0x10(%rsi),%xmm6
  movsd  0x70(%rsi),%xmm7
  movaps %xmm4,-0x68(%rsp)
  movsd  0x78(%rsi),%xmm4
  unpcklpd %xmm5,%xmm5
  unpcklpd %xmm0,%xmm0
  movaps %xmm3,-0x58(%rsp)
  movupd (%rdi),%xmm3
  movsd  0x58(%rsi),%xmm8
  unpcklpd %xmm6,%xmm6
  movaps %xmm5,0x8(%rsp)
  unpcklpd %xmm4,%xmm4
  movupd 0x20(%rdi),%xmm5
  unpcklpd %xmm7,%xmm7
  movhpd 0x10(%rdi),%xmm3
  movaps %xmm0,-0x38(%rsp)
  unpcklpd %xmm8,%xmm8
  movupd 0x10(%rdi),%xmm0
  movaps %xmm4,-0x18(%rsp)
  movlpd 0x8(%rdi),%xmm0
  movapd %xmm3,%xmm4
  movhpd 0x30(%rdi),%xmm5
  movaps %xmm6,-0x78(%rsp)
  movsd  (%rsi),%xmm13
  movsd  0x20(%rsi),%xmm12
  movapd %xmm4,%xmm14
  movaps %xmm7,-0x48(%rsp)
  movsd  0x40(%rsi),%xmm11
  movsd  0x60(%rsi),%xmm1
  unpcklpd %xmm5,%xmm14
  movaps %xmm8,-0x28(%rsp)
  movsd  0x8(%rsi),%xmm10
  movsd  0x48(%rsi),%xmm2
  movapd %xmm0,%xmm7
  movsd  0x28(%rsi),%xmm9
  movsd  0x68(%rsi),%xmm15
  unpcklpd %xmm13,%xmm13
  unpckhpd %xmm5,%xmm4
  movupd 0x30(%rdi),%xmm3
  movlpd 0x28(%rdi),%xmm3
  unpcklpd %xmm12,%xmm12
  pxor   %xmm6,%xmm6
  unpcklpd %xmm11,%xmm11
  unpcklpd %xmm1,%xmm1
  unpcklpd %xmm10,%xmm10
  unpcklpd %xmm3,%xmm7
  unpckhpd %xmm3,%xmm0
  movapd %xmm14,%xmm3
  mulpd  %xmm13,%xmm3
  movapd %xmm7,%xmm5
  movapd %xmm14,%xmm8
  mulpd  %xmm12,%xmm5
  unpcklpd %xmm9,%xmm9
  unpcklpd %xmm2,%xmm2
  unpcklpd %xmm15,%xmm15
  movaps %xmm15,-0x8(%rsp)
  addpd  %xmm6,%xmm3
  addpd  %xmm3,%xmm5
  movapd %xmm4,%xmm3
  mulpd  %xmm11,%xmm3
  addpd  %xmm5,%xmm3
  movapd %xmm0,%xmm5
  mulpd  %xmm1,%xmm5
  addpd  %xmm5,%xmm3
  movapd %xmm14,%xmm5
  movapd %xmm7,%xmm14
  mulpd  %xmm10,%xmm5
  mulpd  %xmm9,%xmm14
  addpd  %xmm6,%xmm5
  addpd  %xmm5,%xmm14
  movapd %xmm4,%xmm5
  mulpd  %xmm2,%xmm5
  addpd  %xmm14,%xmm5
  movapd %xmm15,%xmm14
  movapd -0x78(%rsp),%xmm15
  mulpd  %xmm0,%xmm14
  mulpd  %xmm8,%xmm15
  addpd  %xmm14,%xmm5
  movapd -0x68(%rsp),%xmm14
  addpd  %xmm6,%xmm15
  mulpd  %xmm7,%xmm14
  mulpd  -0x38(%rsp),%xmm7
  addpd  %xmm15,%xmm14
  movapd -0x58(%rsp),%xmm15
  mulpd  %xmm4,%xmm15
  mulpd  -0x28(%rsp),%xmm4
  addpd  %xmm14,%xmm15
  movapd -0x48(%rsp),%xmm14
  mulpd  %xmm0,%xmm14
  mulpd  -0x18(%rsp),%xmm0
  addpd  %xmm15,%xmm14
  movapd 0x8(%rsp),%xmm15
  mulpd  %xmm15,%xmm8
  addpd  %xmm6,%xmm8
  addpd  %xmm8,%xmm7
  movapd -0x68(%rsp),%xmm8
  addpd  %xmm7,%xmm4
  movapd %xmm5,%xmm7
  addpd  %xmm4,%xmm0
  movapd %xmm3,%xmm4
  unpckhpd %xmm14,%xmm3
  unpcklpd %xmm14,%xmm4
  unpcklpd %xmm0,%xmm7
  unpckhpd %xmm0,%xmm5
  movapd %xmm4,%xmm0
  unpcklpd %xmm7,%xmm0
  unpckhpd %xmm7,%xmm4
  movups %xmm0,(%rdx)
  movapd %xmm3,%xmm0
  unpckhpd %xmm5,%xmm3
  unpcklpd %xmm5,%xmm0
  movups %xmm4,0x10(%rdx)
  movups %xmm0,0x20(%rdx)
  movups %xmm3,0x30(%rdx)
  movupd 0x40(%rdi),%xmm3
  movupd 0x50(%rdi),%xmm5
  movupd 0x60(%rdi),%xmm7
  movupd 0x70(%rdi),%xmm0
  movapd %xmm3,%xmm4
  unpckhpd %xmm5,%xmm3
  unpcklpd %xmm5,%xmm4
  movapd %xmm7,%xmm5
  unpckhpd %xmm0,%xmm7
  unpcklpd %xmm0,%xmm5
  movapd %xmm4,%xmm0
  unpcklpd %xmm5,%xmm0
  unpckhpd %xmm5,%xmm4
  movapd %xmm3,%xmm5
  mulpd  %xmm0,%xmm10
  unpcklpd %xmm7,%xmm5
  unpckhpd %xmm7,%xmm3
  movapd -0x8(%rsp),%xmm7
  mulpd  %xmm5,%xmm9
  mulpd  %xmm4,%xmm2
  mulpd  %xmm3,%xmm7
  mulpd  %xmm5,%xmm8
  addpd  %xmm6,%xmm10
  mulpd  %xmm0,%xmm13
  mulpd  %xmm5,%xmm12
  mulpd  -0x38(%rsp),%xmm5
  addpd  %xmm10,%xmm9
  mulpd  %xmm4,%xmm11
  mulpd  %xmm3,%xmm1
  addpd  %xmm6,%xmm13
  addpd  %xmm9,%xmm2
  addpd  %xmm13,%xmm12
  addpd  %xmm7,%xmm2
  movapd -0x78(%rsp),%xmm7
  mulpd  %xmm0,%xmm7
  addpd  %xmm12,%xmm11
  mulpd  %xmm15,%xmm0
  addpd  %xmm11,%xmm1
  addpd  %xmm6,%xmm7
  addpd  %xmm6,%xmm0
  addpd  %xmm8,%xmm7
  movapd -0x58(%rsp),%xmm8
  addpd  %xmm0,%xmm5
  movapd %xmm1,%xmm0
  mulpd  %xmm4,%xmm8
  mulpd  -0x28(%rsp),%xmm4
  addpd  %xmm8,%xmm7
  movapd -0x48(%rsp),%xmm8
  addpd  %xmm5,%xmm4
  mulpd  %xmm3,%xmm8
  mulpd  -0x18(%rsp),%xmm3
  addpd  %xmm8,%xmm7
  addpd  %xmm4,%xmm3
  movapd %xmm2,%xmm4
  unpcklpd %xmm7,%xmm0
  unpckhpd %xmm7,%xmm1
  unpcklpd %xmm3,%xmm4
  unpckhpd %xmm3,%xmm2
  movapd %xmm0,%xmm3
  unpckhpd %xmm4,%xmm0
  unpcklpd %xmm4,%xmm3
  movups %xmm0,0x50(%rdx)
  movapd %xmm1,%xmm0
  unpckhpd %xmm2,%xmm1
  unpcklpd %xmm2,%xmm0
  movups %xmm3,0x40(%rdx)
  movups %xmm0,0x60(%rdx)
  movups %xmm1,0x70(%rdx)
  add    $0x20,%rsp
  ret
L25:
  mov    %rdi,%rcx
  lea    0x80(%rdi),%rsi
  pxor   %xmm2,%xmm2
L6:
  movsd  (%rax),%xmm1
  mulsd  (%rcx),%xmm1
  add    $0x20,%rcx
  add    $0x20,%rdx
  movsd  0x20(%rax),%xmm0
  mulsd  -0x18(%rcx),%xmm0
  addsd  %xmm2,%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x40(%rax),%xmm1
  mulsd  -0x10(%rcx),%xmm1
  addsd  %xmm0,%xmm1
  movsd  0x60(%rax),%xmm0
  mulsd  -0x8(%rcx),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x20(%rdx)
  movsd  0x8(%rax),%xmm1
  mulsd  -0x20(%rcx),%xmm1
  movsd  -0x18(%rcx),%xmm0
  mulsd  0x28(%rax),%xmm0
  addsd  %xmm2,%xmm1
  addsd  %xmm1,%xmm0
  movsd  0x48(%rax),%xmm1
  mulsd  -0x10(%rcx),%xmm1
  addsd  %xmm0,%xmm1
  movsd  -0x8(%rcx),%xmm0
  mulsd  0x68(%rax),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rdx)
  movsd  -0x20(%rcx),%xmm1
  mulsd  0x10(%rax),%xmm1
  movsd  -0x18(%rcx),%xmm0
  mulsd  0x30(%rax),%xmm0
  addsd  %xmm2,%xmm1
  addsd  %xmm1,%xmm0
  movsd  -0x10(%rcx),%xmm1
  mulsd  0x50(%rax),%xmm1
  addsd  %xmm0,%xmm1
  movsd  -0x8(%rcx),%xmm0
  mulsd  0x70(%rax),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rdx)
  movsd  -0x20(%rcx),%xmm1
  mulsd  0x18(%rax),%xmm1
  movsd  -0x18(%rcx),%xmm0
  mulsd  0x38(%rax),%xmm0
  addsd  %xmm2,%xmm1
  addsd  %xmm1,%xmm0
  movsd  -0x10(%rcx),%xmm1
  mulsd  0x58(%rax),%xmm1
  addsd  %xmm0,%xmm1
  movsd  -0x8(%rcx),%xmm0
  mulsd  0x78(%rax),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rdx)
  cmp    %rsi,%rcx
  jne    L6
  ret
```

assistant: ```c
void matrix_multiply_4x4_4x4(const double a[16], const double b[16], double r[16]) {
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
      double acc = 0;
      for (int k = 0; k < 4; k++)
        acc += a[4 * i + k] * b[j + 4 * k];
      r[i * 4 + j] = acc;
    }
  }
}
```