// File: /workspace/github_cpp_makefile_star2_O2/logicx24[P]RayTracer/./algebra3.h
// Function: operator*(mat4 const&, mat4 const&)
inline mat4 operator * (const mat4& a, const mat4& b) {
    #define 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(ROWCOL(0,0), ROWCOL(0,1), ROWCOL(0,2), ROWCOL(0,3)),
    vec4(ROWCOL(1,0), ROWCOL(1,1), ROWCOL(1,2), ROWCOL(1,3)),
    vec4(ROWCOL(2,0), ROWCOL(2,1), ROWCOL(2,2), ROWCOL(2,3)),
    vec4(ROWCOL(3,0), ROWCOL(3,1), ROWCOL(3,2), ROWCOL(3,3))
    );
	#undef ROWCOL
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $0xe8, %rsp
movq %rdi, %rbx
movsd (%rsi), %xmm15
movsd 0x8(%rsi), %xmm14
movsd 0x20(%rdx), %xmm1
movapd %xmm14, %xmm0
mulsd %xmm1, %xmm0
movapd %xmm1, %xmm7
movsd %xmm1, -0x50(%rbp)
movsd (%rdx), %xmm1
movsd %xmm1, -0x10(%rbp)
movsd 0x8(%rdx), %xmm5
movsd %xmm5, -0x30(%rbp)
movapd %xmm15, %xmm2
mulsd %xmm1, %xmm2
addsd %xmm0, %xmm2
movsd 0x10(%rsi), %xmm1
movsd 0x40(%rdx), %xmm13
movapd %xmm1, %xmm3
mulsd %xmm13, %xmm3
addsd %xmm2, %xmm3
movsd 0x18(%rsi), %xmm0
movsd 0x60(%rdx), %xmm4
movsd %xmm4, -0x38(%rbp)
movapd %xmm0, %xmm2
mulsd %xmm4, %xmm2
addsd %xmm3, %xmm2
movsd 0x28(%rdx), %xmm4
movsd %xmm4, -0x18(%rbp)
movapd %xmm14, %xmm3
mulsd %xmm4, %xmm3
movapd %xmm15, %xmm4
mulsd %xmm5, %xmm4
addsd %xmm3, %xmm4
movsd 0x48(%rdx), %xmm12
movapd %xmm1, %xmm5
mulsd %xmm12, %xmm5
addsd %xmm4, %xmm5
movsd 0x68(%rdx), %xmm4
movsd %xmm4, -0x60(%rbp)
movapd %xmm0, %xmm3
mulsd %xmm4, %xmm3
addsd %xmm5, %xmm3
movsd 0x30(%rdx), %xmm5
movsd %xmm5, -0x58(%rbp)
movapd %xmm14, %xmm4
mulsd %xmm5, %xmm4
movsd 0x10(%rdx), %xmm10
movapd %xmm15, %xmm5
mulsd %xmm10, %xmm5
addsd %xmm4, %xmm5
movsd 0x50(%rdx), %xmm11
movapd %xmm1, %xmm4
mulsd %xmm11, %xmm4
addsd %xmm5, %xmm4
movsd 0x70(%rdx), %xmm6
movapd %xmm0, %xmm5
mulsd %xmm6, %xmm5
movapd %xmm6, %xmm8
movsd %xmm6, -0x48(%rbp)
addsd %xmm4, %xmm5
movsd 0x38(%rdx), %xmm4
movsd %xmm4, -0x28(%rbp)
mulsd %xmm4, %xmm14
movsd 0x18(%rdx), %xmm9
mulsd %xmm9, %xmm15
movsd %xmm9, -0x68(%rbp)
addsd %xmm14, %xmm15
movsd 0x58(%rdx), %xmm4
movsd %xmm4, -0x20(%rbp)
mulsd %xmm4, %xmm1
addsd %xmm15, %xmm1
movsd 0x78(%rdx), %xmm4
movsd %xmm4, -0x40(%rbp)
mulsd %xmm4, %xmm0
addsd %xmm1, %xmm0
leaq -0xe8(%rbp), %rax
movsd %xmm2, (%rax)
movsd %xmm3, 0x8(%rax)
movsd %xmm5, 0x10(%rax)
movsd %xmm0, 0x18(%rax)
movsd 0x28(%rsi), %xmm6
movapd %xmm7, %xmm0
mulsd %xmm6, %xmm0
movsd 0x20(%rsi), %xmm5
movapd %xmm5, %xmm3
mulsd -0x10(%rbp), %xmm3
addsd %xmm0, %xmm3
movsd 0x30(%rsi), %xmm1
movapd %xmm1, %xmm2
mulsd %xmm13, %xmm2
addsd %xmm3, %xmm2
movsd 0x38(%rsi), %xmm0
movapd %xmm0, %xmm7
movsd -0x38(%rbp), %xmm14
mulsd %xmm14, %xmm7
addsd %xmm2, %xmm7
movsd -0x18(%rbp), %xmm2
mulsd %xmm6, %xmm2
movapd %xmm5, %xmm3
movsd -0x30(%rbp), %xmm15
mulsd %xmm15, %xmm3
addsd %xmm2, %xmm3
movapd %xmm1, %xmm2
mulsd %xmm12, %xmm2
addsd %xmm3, %xmm2
movapd %xmm0, %xmm3
mulsd -0x60(%rbp), %xmm3
addsd %xmm2, %xmm3
movsd -0x58(%rbp), %xmm2
mulsd %xmm6, %xmm2
movapd %xmm5, %xmm4
mulsd %xmm10, %xmm4
addsd %xmm2, %xmm4
movapd %xmm1, %xmm2
mulsd %xmm11, %xmm2
addsd %xmm4, %xmm2
movapd %xmm0, %xmm4
mulsd %xmm8, %xmm4
addsd %xmm2, %xmm4
movsd -0x28(%rbp), %xmm8
mulsd %xmm8, %xmm6
mulsd %xmm9, %xmm5
addsd %xmm6, %xmm5
movsd -0x20(%rbp), %xmm9
mulsd %xmm9, %xmm1
addsd %xmm5, %xmm1
mulsd -0x40(%rbp), %xmm0
addsd %xmm1, %xmm0
leaq -0xc8(%rbp), %rdx
movsd %xmm7, (%rdx)
movsd %xmm3, 0x8(%rdx)
movsd %xmm4, 0x10(%rdx)
movsd %xmm0, 0x18(%rdx)
movsd 0x48(%rsi), %xmm1
movsd -0x50(%rbp), %xmm2
mulsd %xmm1, %xmm2
movsd 0x40(%rsi), %xmm0
movapd %xmm0, %xmm3
mulsd -0x10(%rbp), %xmm3
addsd %xmm2, %xmm3
movsd 0x50(%rsi), %xmm2
movapd %xmm2, %xmm5
mulsd %xmm13, %xmm5
addsd %xmm3, %xmm5
movsd 0x58(%rsi), %xmm3
movapd %xmm3, %xmm4
mulsd %xmm14, %xmm4
addsd %xmm5, %xmm4
movsd -0x18(%rbp), %xmm5
mulsd %xmm1, %xmm5
movapd %xmm0, %xmm6
mulsd %xmm15, %xmm6
addsd %xmm5, %xmm6
movapd %xmm2, %xmm7
mulsd %xmm12, %xmm7
addsd %xmm6, %xmm7
movapd %xmm3, %xmm5
movsd -0x60(%rbp), %xmm14
mulsd %xmm14, %xmm5
addsd %xmm7, %xmm5
movsd -0x58(%rbp), %xmm15
movapd %xmm15, %xmm6
mulsd %xmm1, %xmm6
movapd %xmm0, %xmm7
mulsd %xmm10, %xmm7
addsd %xmm6, %xmm7
movapd %xmm2, %xmm6
mulsd %xmm11, %xmm6
addsd %xmm7, %xmm6
movapd %xmm3, %xmm7
mulsd -0x48(%rbp), %xmm7
addsd %xmm6, %xmm7
mulsd %xmm8, %xmm1
movsd -0x68(%rbp), %xmm8
mulsd %xmm8, %xmm0
addsd %xmm1, %xmm0
mulsd %xmm9, %xmm2
addsd %xmm0, %xmm2
movsd -0x40(%rbp), %xmm9
mulsd %xmm9, %xmm3
addsd %xmm2, %xmm3
leaq -0xa8(%rbp), %rcx
movsd %xmm4, (%rcx)
movsd %xmm5, 0x8(%rcx)
movsd %xmm7, 0x10(%rcx)
movsd %xmm3, 0x18(%rcx)
movsd 0x68(%rsi), %xmm3
movsd -0x50(%rbp), %xmm1
mulsd %xmm3, %xmm1
movsd 0x60(%rsi), %xmm0
movsd -0x10(%rbp), %xmm2
mulsd %xmm0, %xmm2
addsd %xmm1, %xmm2
movsd 0x70(%rsi), %xmm1
mulsd %xmm1, %xmm13
addsd %xmm2, %xmm13
movsd 0x78(%rsi), %xmm2
movsd -0x38(%rbp), %xmm4
mulsd %xmm2, %xmm4
addsd %xmm13, %xmm4
movsd -0x18(%rbp), %xmm6
mulsd %xmm3, %xmm6
movsd -0x30(%rbp), %xmm5
mulsd %xmm0, %xmm5
addsd %xmm6, %xmm5
mulsd %xmm1, %xmm12
addsd %xmm5, %xmm12
mulsd %xmm2, %xmm14
addsd %xmm12, %xmm14
mulsd %xmm3, %xmm15
mulsd %xmm0, %xmm10
addsd %xmm15, %xmm10
mulsd %xmm1, %xmm11
addsd %xmm10, %xmm11
movsd -0x48(%rbp), %xmm6
mulsd %xmm2, %xmm6
addsd %xmm11, %xmm6
movapd %xmm6, %xmm7
movsd -0x28(%rbp), %xmm6
mulsd %xmm3, %xmm6
mulsd %xmm8, %xmm0
addsd %xmm6, %xmm0
mulsd -0x20(%rbp), %xmm1
addsd %xmm0, %xmm1
mulsd %xmm9, %xmm2
addsd %xmm1, %xmm2
leaq -0x88(%rbp), %r8
movsd %xmm4, (%r8)
movsd %xmm14, 0x8(%r8)
movsd %xmm7, 0x10(%r8)
movsd %xmm2, 0x18(%r8)
movq %rax, %rsi
callq 0x66a4
movq %rbx, %rax
addq $0xe8, %rsp
popq %rbx
popq %rbp
retq
nop