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

```asm
<matrix3_concatenate>:
  endbr64
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x118,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x108(%rsp)
  xor    %eax,%eax
  call   <assert@plt>
  mov    %rbx,%rdi
  call   <assert@plt>
  lea    0x80(%rsp),%rdi
  mov    $0x80,%edx
  mov    %rbp,%rsi
  call   <memcpy@plt>
  lea    0x7f(%rbp),%rax
  sub    %rbx,%rax
  cmp    $0xfe,%rax
  jbe    L14
  movsd  0x50(%rbx),%xmm4
  movsd  0x38(%rbx),%xmm5
  movsd  0x18(%rbx),%xmm0
  movsd  0x30(%rbx),%xmm6
  unpcklpd %xmm4,%xmm4
  movsd  0x70(%rbx),%xmm3
  movsd  0x58(%rbx),%xmm9
  unpcklpd %xmm5,%xmm5
  movaps %xmm4,0x10(%rsp)
  unpcklpd %xmm0,%xmm0
  unpcklpd %xmm6,%xmm6
  movapd 0x80(%rsp),%xmm4
  movaps %xmm5,0x30(%rsp)
  unpcklpd %xmm3,%xmm3
  unpcklpd %xmm9,%xmm9
  movapd 0xa0(%rsp),%xmm5
  movaps %xmm0,0x60(%rsp)
  movsd  (%rbx),%xmm13
  movsd  0x40(%rbx),%xmm7
  movhpd 0x90(%rsp),%xmm4
  movsd  0x20(%rbx),%xmm8
  movaps %xmm6,(%rsp)
  movsd  0x78(%rbx),%xmm6
  movhpd 0xb0(%rsp),%xmm5
  movaps %xmm3,0x20(%rsp)
  unpcklpd %xmm13,%xmm13
  unpcklpd %xmm7,%xmm7
  movapd 0x90(%rsp),%xmm0
  movaps %xmm9,0x70(%rsp)
  movapd %xmm4,%xmm9
  unpckhpd %xmm5,%xmm4
  movlpd 0x88(%rsp),%xmm0
  unpcklpd %xmm5,%xmm9
  unpcklpd %xmm8,%xmm8
  unpcklpd %xmm6,%xmm6
  movapd 0xb0(%rsp),%xmm3
  movapd %xmm0,%xmm5
  movaps %xmm6,0x40(%rsp)
  movsd  0x60(%rbx),%xmm2
  movlpd 0xa8(%rsp),%xmm3
  movsd  0x8(%rbx),%xmm12
  movsd  0x28(%rbx),%xmm1
  unpcklpd %xmm3,%xmm5
  unpckhpd %xmm3,%xmm0
  unpcklpd %xmm2,%xmm2
  movsd  0x48(%rbx),%xmm11
  movapd %xmm5,%xmm6
  movapd %xmm13,%xmm3
  movapd %xmm8,%xmm5
  movsd  0x68(%rbx),%xmm10
  mulpd  %xmm9,%xmm3
  unpcklpd %xmm12,%xmm12
  unpcklpd %xmm1,%xmm1
  movsd  0x10(%rbx),%xmm15
  mulpd  %xmm6,%xmm5
  movapd %xmm1,%xmm14
  unpcklpd %xmm11,%xmm11
  mulpd  %xmm6,%xmm14
  unpcklpd %xmm10,%xmm10
  unpcklpd %xmm15,%xmm15
  movaps %xmm15,0x50(%rsp)
  mulpd  %xmm9,%xmm15
  addpd  %xmm3,%xmm5
  movapd %xmm7,%xmm3
  mulpd  %xmm4,%xmm3
  addpd  %xmm5,%xmm3
  movapd %xmm2,%xmm5
  mulpd  %xmm0,%xmm5
  addpd  %xmm5,%xmm3
  movapd %xmm12,%xmm5
  mulpd  %xmm9,%xmm5
  addpd  %xmm5,%xmm14
  movapd %xmm11,%xmm5
  mulpd  %xmm4,%xmm5
  addpd  %xmm14,%xmm5
  movapd %xmm10,%xmm14
  mulpd  %xmm0,%xmm14
  addpd  %xmm14,%xmm5
  movapd (%rsp),%xmm14
  mulpd  %xmm6,%xmm14
  mulpd  0x30(%rsp),%xmm6
  addpd  %xmm15,%xmm14
  movapd 0x10(%rsp),%xmm15
  mulpd  %xmm4,%xmm15
  addpd  %xmm14,%xmm15
  movapd 0x20(%rsp),%xmm14
  mulpd  %xmm0,%xmm14
  mulpd  0x40(%rsp),%xmm0
  addpd  %xmm15,%xmm14
  movapd 0x60(%rsp),%xmm15
  mulpd  %xmm15,%xmm9
  addpd  %xmm9,%xmm6
  movapd 0x70(%rsp),%xmm9
  mulpd  %xmm9,%xmm4
  addpd  %xmm6,%xmm4
  movapd %xmm5,%xmm6
  addpd  %xmm4,%xmm0
  movapd %xmm3,%xmm4
  unpckhpd %xmm14,%xmm3
  unpcklpd %xmm14,%xmm4
  unpcklpd %xmm0,%xmm6
  unpckhpd %xmm0,%xmm5
  movapd %xmm4,%xmm0
  unpcklpd %xmm6,%xmm0
  unpckhpd %xmm6,%xmm4
  movups %xmm0,0x0(%rbp)
  movapd %xmm3,%xmm0
  unpckhpd %xmm5,%xmm3
  unpcklpd %xmm5,%xmm0
  movups %xmm4,0x10(%rbp)
  movapd 0xc0(%rsp),%xmm4
  movapd 0xe0(%rsp),%xmm5
  movups %xmm0,0x20(%rbp)
  movapd 0xf0(%rsp),%xmm0
  movlpd 0xe8(%rsp),%xmm0
  movhpd 0xd0(%rsp),%xmm4
  movups %xmm3,0x30(%rbp)
  movapd 0xd0(%rsp),%xmm3
  movlpd 0xc8(%rsp),%xmm3
  movhpd 0xf0(%rsp),%xmm5
  movapd %xmm0,%xmm6
  movapd %xmm4,%xmm0
  unpcklpd %xmm5,%xmm0
  unpckhpd %xmm5,%xmm4
  movapd %xmm3,%xmm5
  mulpd  %xmm0,%xmm13
  unpcklpd %xmm6,%xmm5
  unpckhpd %xmm6,%xmm3
  movapd 0x50(%rsp),%xmm6
  mulpd  %xmm5,%xmm8
  mulpd  %xmm4,%xmm7
  mulpd  %xmm3,%xmm2
  mulpd  %xmm0,%xmm6
  mulpd  %xmm0,%xmm12
  addpd  %xmm13,%xmm8
  mulpd  %xmm5,%xmm1
  mulpd  %xmm15,%xmm0
  mulpd  %xmm4,%xmm11
  addpd  %xmm8,%xmm7
  mulpd  %xmm3,%xmm10
  addpd  %xmm12,%xmm1
  addpd  %xmm7,%xmm2
  movapd (%rsp),%xmm7
  mulpd  %xmm5,%xmm7
  addpd  %xmm11,%xmm1
  mulpd  0x30(%rsp),%xmm5
  addpd  %xmm10,%xmm1
  addpd  %xmm7,%xmm6
  movapd 0x10(%rsp),%xmm7
  addpd  %xmm5,%xmm0
  mulpd  %xmm4,%xmm7
  mulpd  %xmm9,%xmm4
  addpd  %xmm7,%xmm6
  movapd 0x20(%rsp),%xmm7
  addpd  %xmm4,%xmm0
  movapd %xmm1,%xmm4
  mulpd  %xmm3,%xmm7
  mulpd  0x40(%rsp),%xmm3
  addpd  %xmm7,%xmm6
  addpd  %xmm0,%xmm3
  movapd %xmm2,%xmm0
  unpcklpd %xmm6,%xmm0
  unpckhpd %xmm6,%xmm2
  unpcklpd %xmm3,%xmm4
  unpckhpd %xmm3,%xmm1
  movapd %xmm0,%xmm3
  unpckhpd %xmm4,%xmm0
  unpcklpd %xmm4,%xmm3
  movups %xmm0,0x50(%rbp)
  movapd %xmm2,%xmm0
  unpckhpd %xmm1,%xmm2
  unpcklpd %xmm1,%xmm0
  movups %xmm3,0x40(%rbp)
  movups %xmm0,0x60(%rbp)
  movups %xmm2,0x70(%rbp)
L2:
  mov    0x108(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L10
  add    $0x118,%rsp
  pop    %rbx
  pop    %rbp
  ret
L14:
  movsd  (%rbx),%xmm1
  movsd  0x20(%rbx),%xmm5
  movsd  0x80(%rsp),%xmm0
  movsd  0x88(%rsp),%xmm4
  movsd  0x90(%rsp),%xmm3
  movsd  0x98(%rsp),%xmm2
  mulsd  %xmm4,%xmm5
  mulsd  %xmm0,%xmm1
  addsd  %xmm5,%xmm1
  movsd  0x40(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x60(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x0(%rbp)
  movsd  0x8(%rbx),%xmm1
  movsd  0x28(%rbx),%xmm5
  mulsd  %xmm0,%xmm1
  mulsd  %xmm4,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x48(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x68(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x8(%rbp)
  movsd  0x10(%rbx),%xmm1
  movsd  0x30(%rbx),%xmm5
  mulsd  %xmm0,%xmm1
  mulsd  %xmm4,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x50(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x70(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x10(%rbp)
  mulsd  0x38(%rbx),%xmm4
  mulsd  0x18(%rbx),%xmm0
  mulsd  0x58(%rbx),%xmm3
  mulsd  0x78(%rbx),%xmm2
  addsd  %xmm4,%xmm0
  movsd  0xa8(%rsp),%xmm4
  addsd  %xmm3,%xmm0
  movsd  0xb0(%rsp),%xmm3
  addsd  %xmm2,%xmm0
  movsd  0xb8(%rsp),%xmm2
  movsd  %xmm0,0x18(%rbp)
  movsd  (%rbx),%xmm1
  movsd  0x20(%rbx),%xmm5
  movsd  0xa0(%rsp),%xmm0
  mulsd  %xmm4,%xmm5
  mulsd  %xmm0,%xmm1
  addsd  %xmm5,%xmm1
  movsd  0x40(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x60(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x20(%rbp)
  movsd  0x8(%rbx),%xmm1
  movsd  0x28(%rbx),%xmm5
  mulsd  %xmm0,%xmm1
  mulsd  %xmm4,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x48(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x68(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x28(%rbp)
  movsd  0x10(%rbx),%xmm1
  movsd  0x30(%rbx),%xmm5
  mulsd  %xmm0,%xmm1
  mulsd  %xmm4,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x50(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x70(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x30(%rbp)
  mulsd  0x38(%rbx),%xmm4
  mulsd  0x18(%rbx),%xmm0
  mulsd  0x58(%rbx),%xmm3
  mulsd  0x78(%rbx),%xmm2
  addsd  %xmm4,%xmm0
  movsd  0xc8(%rsp),%xmm4
  addsd  %xmm3,%xmm0
  movsd  0xd0(%rsp),%xmm3
  addsd  %xmm2,%xmm0
  movsd  0xd8(%rsp),%xmm2
  movsd  %xmm0,0x38(%rbp)
  movsd  (%rbx),%xmm1
  movsd  0x20(%rbx),%xmm5
  movsd  0xc0(%rsp),%xmm0
  mulsd  %xmm4,%xmm5
  mulsd  %xmm0,%xmm1
  addsd  %xmm5,%xmm1
  movsd  0x40(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x60(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x40(%rbp)
  movsd  0x8(%rbx),%xmm1
  movsd  0x28(%rbx),%xmm5
  mulsd  %xmm0,%xmm1
  mulsd  %xmm4,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x48(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x68(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x48(%rbp)
  movsd  0x10(%rbx),%xmm1
  movsd  0x30(%rbx),%xmm5
  mulsd  %xmm0,%xmm1
  mulsd  %xmm4,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x50(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x70(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x50(%rbp)
  mulsd  0x38(%rbx),%xmm4
  mulsd  0x18(%rbx),%xmm0
  mulsd  0x58(%rbx),%xmm3
  mulsd  0x78(%rbx),%xmm2
  addsd  %xmm4,%xmm0
  movsd  0xe8(%rsp),%xmm4
  addsd  %xmm3,%xmm0
  movsd  0xf0(%rsp),%xmm3
  addsd  %xmm2,%xmm0
  movsd  0xf8(%rsp),%xmm2
  movsd  %xmm0,0x58(%rbp)
  movsd  0x20(%rbx),%xmm1
  movsd  (%rbx),%xmm5
  movsd  0xe0(%rsp),%xmm0
  mulsd  %xmm4,%xmm1
  mulsd  %xmm0,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x40(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x60(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x60(%rbp)
  movsd  0x28(%rbx),%xmm1
  movsd  0x8(%rbx),%xmm5
  mulsd  %xmm4,%xmm1
  mulsd  %xmm0,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x48(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x68(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x68(%rbp)
  movsd  0x10(%rbx),%xmm1
  movsd  0x30(%rbx),%xmm5
  mulsd  %xmm0,%xmm1
  mulsd  %xmm4,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x50(%rbx),%xmm5
  mulsd  %xmm3,%xmm5
  addsd  %xmm5,%xmm1
  movsd  0x70(%rbx),%xmm5
  mulsd  %xmm2,%xmm5
  addsd  %xmm5,%xmm1
  movsd  %xmm1,0x70(%rbp)
  mulsd  0x18(%rbx),%xmm0
  mulsd  0x38(%rbx),%xmm4
  mulsd  0x58(%rbx),%xmm3
  mulsd  0x78(%rbx),%xmm2
  addsd  %xmm4,%xmm0
  addsd  %xmm3,%xmm0
  addsd  %xmm2,%xmm0
  movsd  %xmm0,0x78(%rbp)
  jmp    L2
L10:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void matrix3_concatenate(double dest[4][4], double src[4][4]) {
  register int i, j;
  double t[4][4];
  assert(dest);
  assert(src);
  memcpy(t, dest, 16 * sizeof(double));
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      dest[i][j] = t[i][0] * src[0][j] + t[i][1] * src[1][j] + t[i][2] * src[2][j] + t[i][3] * src[3][j];
    }
  }
}
```