// File: /workspace/github_cpp_makefile_star2_O2/srajangarg[P]raytracer/src/core/Algebra3.hpp
// Function: operator*(Mat4 const&, Mat4 const&)
inline Mat4 operator * (Mat4 const & a, Mat4 const & b)
{
#define ALG3_ROWCOL(i, j) a.v[i].n[0]*b.v[0][j] + a.v[i].n[1]*b.v[1][j] + \
                          a.v[i].n[2]*b.v[2][j] + a.v[i].n[3]*b.v[3][j]
  return Mat4(
    Vec4(ALG3_ROWCOL(0,0), ALG3_ROWCOL(0,1), ALG3_ROWCOL(0,2), ALG3_ROWCOL(0,3)),
    Vec4(ALG3_ROWCOL(1,0), ALG3_ROWCOL(1,1), ALG3_ROWCOL(1,2), ALG3_ROWCOL(1,3)),
    Vec4(ALG3_ROWCOL(2,0), ALG3_ROWCOL(2,1), ALG3_ROWCOL(2,2), ALG3_ROWCOL(2,3)),
    Vec4(ALG3_ROWCOL(3,0), ALG3_ROWCOL(3,1), ALG3_ROWCOL(3,2), ALG3_ROWCOL(3,3))
  );
#undef ALG3_ROWCOL
}

// Assembly:
pushq %rbx
subq $0x80, %rsp
movq %rdi, %rbx
movupd (%rsi), %xmm10
movupd 0x8(%rsi), %xmm11
movupd 0x10(%rsi), %xmm8
movupd 0x18(%rsi), %xmm9
unpcklpd %xmm11, %xmm11          # xmm11 = xmm11[0,0]
movupd (%rdx), %xmm2
movupd 0x20(%rdx), %xmm3
movupd 0x40(%rdx), %xmm1
movupd 0x60(%rdx), %xmm0
movapd %xmm11, %xmm4
mulpd %xmm3, %xmm4
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
movapd %xmm10, %xmm5
mulpd %xmm2, %xmm5
addpd %xmm4, %xmm5
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
movapd %xmm8, %xmm4
mulpd %xmm1, %xmm4
addpd %xmm5, %xmm4
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
movapd %xmm9, %xmm5
mulpd %xmm0, %xmm5
addpd %xmm4, %xmm5
leaq 0x60(%rsp), %rax
movapd %xmm5, (%rax)
movupd 0x10(%rdx), %xmm6
movupd 0x30(%rdx), %xmm7
movupd 0x50(%rdx), %xmm5
movupd 0x70(%rdx), %xmm4
mulpd %xmm7, %xmm11
mulpd %xmm6, %xmm10
addpd %xmm11, %xmm10
mulpd %xmm5, %xmm8
addpd %xmm10, %xmm8
mulpd %xmm4, %xmm9
addpd %xmm8, %xmm9
movapd %xmm9, 0x10(%rax)
movupd 0x20(%rsi), %xmm10
movupd 0x28(%rsi), %xmm11
movupd 0x30(%rsi), %xmm8
movupd 0x38(%rsi), %xmm9
unpcklpd %xmm11, %xmm11          # xmm11 = xmm11[0,0]
movapd %xmm3, %xmm12
mulpd %xmm11, %xmm12
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
movapd %xmm10, %xmm13
mulpd %xmm2, %xmm13
addpd %xmm12, %xmm13
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
movapd %xmm8, %xmm12
mulpd %xmm1, %xmm12
addpd %xmm13, %xmm12
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
movapd %xmm9, %xmm13
mulpd %xmm0, %xmm13
addpd %xmm12, %xmm13
leaq 0x40(%rsp), %rdx
movapd %xmm13, (%rdx)
mulpd %xmm7, %xmm11
mulpd %xmm6, %xmm10
addpd %xmm11, %xmm10
mulpd %xmm5, %xmm8
addpd %xmm10, %xmm8
mulpd %xmm4, %xmm9
addpd %xmm8, %xmm9
movapd %xmm9, 0x10(%rdx)
movupd 0x40(%rsi), %xmm10
movupd 0x48(%rsi), %xmm11
movupd 0x50(%rsi), %xmm8
movupd 0x58(%rsi), %xmm9
unpcklpd %xmm11, %xmm11          # xmm11 = xmm11[0,0]
movapd %xmm3, %xmm12
mulpd %xmm11, %xmm12
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
movapd %xmm10, %xmm13
mulpd %xmm2, %xmm13
addpd %xmm12, %xmm13
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
movapd %xmm8, %xmm12
mulpd %xmm1, %xmm12
addpd %xmm13, %xmm12
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
movapd %xmm9, %xmm13
mulpd %xmm0, %xmm13
addpd %xmm12, %xmm13
leaq 0x20(%rsp), %rcx
movapd %xmm13, (%rcx)
mulpd %xmm7, %xmm11
mulpd %xmm6, %xmm10
addpd %xmm11, %xmm10
mulpd %xmm5, %xmm8
addpd %xmm10, %xmm8
mulpd %xmm4, %xmm9
addpd %xmm8, %xmm9
movapd %xmm9, 0x10(%rcx)
movupd 0x60(%rsi), %xmm9
movupd 0x68(%rsi), %xmm10
movupd 0x70(%rsi), %xmm8
unpcklpd %xmm10, %xmm10          # xmm10 = xmm10[0,0]
mulpd %xmm10, %xmm3
unpcklpd %xmm9, %xmm9            # xmm9 = xmm9[0,0]
mulpd %xmm9, %xmm2
addpd %xmm3, %xmm2
unpcklpd %xmm8, %xmm8            # xmm8 = xmm8[0,0]
mulpd %xmm8, %xmm1
addpd %xmm2, %xmm1
movsd 0x78(%rsi), %xmm2
unpcklpd %xmm2, %xmm2            # xmm2 = xmm2[0,0]
mulpd %xmm2, %xmm0
addpd %xmm1, %xmm0
movq %rsp, %r8
movapd %xmm0, (%r8)
mulpd %xmm7, %xmm10
mulpd %xmm6, %xmm9
addpd %xmm10, %xmm9
mulpd %xmm5, %xmm8
addpd %xmm9, %xmm8
mulpd %xmm4, %xmm2
addpd %xmm8, %xmm2
movapd %xmm2, 0x10(%r8)
movq %rax, %rsi
callq 0x64c6
movq %rbx, %rax
addq $0x80, %rsp
popq %rbx
retq