// File: /workspace/github_c_makefile_star2_O0/halcy[P]quasi_crystals_bot/Vector/MatrixDouble.c
// Function: dmat4x4inverse
dmat4x4_t dmat4x4inverse(dmat4x4_t m)
{
	dmat4x4_t res;

	double a0=m.m[0]*m.m[5]-m.m[1]*m.m[4];
	double a1=m.m[0]*m.m[6]-m.m[2]*m.m[4];
	double a2=m.m[0]*m.m[7]-m.m[3]*m.m[4];
	double a3=m.m[1]*m.m[6]-m.m[2]*m.m[5];
	double a4=m.m[1]*m.m[7]-m.m[3]*m.m[5];
	double a5=m.m[2]*m.m[7]-m.m[3]*m.m[6];
	double b0=m.m[8]*m.m[13]-m.m[9]*m.m[12];
	double b1=m.m[8]*m.m[14]-m.m[10]*m.m[12];
	double b2=m.m[8]*m.m[15]-m.m[11]*m.m[12];
	double b3=m.m[9]*m.m[14]-m.m[10]*m.m[13];
	double b4=m.m[9]*m.m[15]-m.m[11]*m.m[13];
	double b5=m.m[10]*m.m[15]-m.m[11]*m.m[14];
	double det=a0*b5-a1*b4+a2*b3+a3*b2-a4*b1+a5*b0;
	// singular if det==0

	res.m[0]=(m.m[5]*b5-m.m[6]*b4+m.m[7]*b3)/det;
	res.m[4]=-(m.m[4]*b5-m.m[6]*b2+m.m[7]*b1)/det;
	res.m[8]=(m.m[4]*b4-m.m[5]*b2+m.m[7]*b0)/det;
	res.m[12]=-(m.m[4]*b3-m.m[5]*b1+m.m[6]*b0)/det;

	res.m[1]=-(m.m[1]*b5-m.m[2]*b4+m.m[3]*b3)/det;
	res.m[5]=(m.m[0]*b5-m.m[2]*b2+m.m[3]*b1)/det;
	res.m[9]=-(m.m[0]*b4-m.m[1]*b2+m.m[3]*b0)/det;
	res.m[13]=(m.m[0]*b3-m.m[1]*b1+m.m[2]*b0)/det;

	res.m[2]=(m.m[13]*a5-m.m[14]*a4+m.m[15]*a3)/det;
	res.m[6]=-(m.m[12]*a5-m.m[14]*a2+m.m[15]*a1)/det;
	res.m[10]=(m.m[12]*a4-m.m[13]*a2+m.m[15]*a0)/det;
	res.m[14]=-(m.m[12]*a3-m.m[13]*a1+m.m[14]*a0)/det;

	res.m[3]=-(m.m[9]*a5-m.m[10]*a4+m.m[11]*a3)/det;
	res.m[7]=(m.m[8]*a5-m.m[10]*a2+m.m[11]*a1)/det;
	res.m[11]=-(m.m[8]*a4-m.m[9]*a2+m.m[11]*a0)/det;
	res.m[15]=(m.m[8]*a3-m.m[9]*a1+m.m[10]*a0)/det;

	return res;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq %rdi, %rax
leaq 0x10(%rbp), %rcx
movsd (%rcx), %xmm0
mulsd 0x28(%rcx), %xmm0
movsd 0x8(%rcx), %xmm1
mulsd 0x20(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x8(%rbp)
movsd (%rcx), %xmm0
mulsd 0x30(%rcx), %xmm0
movsd 0x10(%rcx), %xmm1
mulsd 0x20(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x10(%rbp)
movsd (%rcx), %xmm0
mulsd 0x38(%rcx), %xmm0
movsd 0x18(%rcx), %xmm1
mulsd 0x20(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x18(%rbp)
movsd 0x8(%rcx), %xmm0
mulsd 0x30(%rcx), %xmm0
movsd 0x10(%rcx), %xmm1
mulsd 0x28(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x20(%rbp)
movsd 0x8(%rcx), %xmm0
mulsd 0x38(%rcx), %xmm0
movsd 0x18(%rcx), %xmm1
mulsd 0x28(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x28(%rbp)
movsd 0x10(%rcx), %xmm0
mulsd 0x38(%rcx), %xmm0
movsd 0x18(%rcx), %xmm1
mulsd 0x30(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x30(%rbp)
movsd 0x40(%rcx), %xmm0
mulsd 0x68(%rcx), %xmm0
movsd 0x48(%rcx), %xmm1
mulsd 0x60(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x38(%rbp)
movsd 0x40(%rcx), %xmm0
mulsd 0x70(%rcx), %xmm0
movsd 0x50(%rcx), %xmm1
mulsd 0x60(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x40(%rbp)
movsd 0x40(%rcx), %xmm0
mulsd 0x78(%rcx), %xmm0
movsd 0x58(%rcx), %xmm1
mulsd 0x60(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x48(%rbp)
movsd 0x48(%rcx), %xmm0
mulsd 0x70(%rcx), %xmm0
movsd 0x50(%rcx), %xmm1
mulsd 0x68(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x50(%rbp)
movsd 0x48(%rcx), %xmm0
mulsd 0x78(%rcx), %xmm0
movsd 0x58(%rcx), %xmm1
mulsd 0x68(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd 0x50(%rcx), %xmm0
mulsd 0x78(%rcx), %xmm0
movsd 0x58(%rcx), %xmm1
mulsd 0x70(%rcx), %xmm1
subsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x8(%rbp), %xmm0
mulsd -0x60(%rbp), %xmm0
movsd -0x10(%rbp), %xmm1
mulsd -0x58(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd -0x18(%rbp), %xmm1
mulsd -0x50(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd -0x20(%rbp), %xmm1
mulsd -0x48(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd -0x28(%rbp), %xmm1
mulsd -0x40(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd -0x30(%rbp), %xmm1
mulsd -0x38(%rbp), %xmm1
addsd %xmm1, %xmm0
movsd %xmm0, -0x68(%rbp)
movsd 0x28(%rcx), %xmm0
mulsd -0x60(%rbp), %xmm0
movsd 0x30(%rcx), %xmm1
mulsd -0x58(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x38(%rcx), %xmm1
mulsd -0x50(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, (%rdi)
movsd 0x20(%rcx), %xmm0
mulsd -0x60(%rbp), %xmm0
movsd 0x30(%rcx), %xmm1
mulsd -0x48(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x38(%rcx), %xmm1
mulsd -0x40(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x20(%rdi)
movsd 0x20(%rcx), %xmm0
mulsd -0x58(%rbp), %xmm0
movsd 0x28(%rcx), %xmm1
mulsd -0x48(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x38(%rcx), %xmm1
mulsd -0x38(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x40(%rdi)
movsd 0x20(%rcx), %xmm0
mulsd -0x50(%rbp), %xmm0
movsd 0x28(%rcx), %xmm1
mulsd -0x40(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x30(%rcx), %xmm1
mulsd -0x38(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x60(%rdi)
movsd 0x8(%rcx), %xmm0
mulsd -0x60(%rbp), %xmm0
movsd 0x10(%rcx), %xmm1
mulsd -0x58(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x18(%rcx), %xmm1
mulsd -0x50(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x8(%rdi)
movsd (%rcx), %xmm0
mulsd -0x60(%rbp), %xmm0
movsd 0x10(%rcx), %xmm1
mulsd -0x48(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x18(%rcx), %xmm1
mulsd -0x40(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x28(%rdi)
movsd (%rcx), %xmm0
mulsd -0x58(%rbp), %xmm0
movsd 0x8(%rcx), %xmm1
mulsd -0x48(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x18(%rcx), %xmm1
mulsd -0x38(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x48(%rdi)
movsd (%rcx), %xmm0
mulsd -0x50(%rbp), %xmm0
movsd 0x8(%rcx), %xmm1
mulsd -0x40(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x10(%rcx), %xmm1
mulsd -0x38(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x68(%rdi)
movsd 0x68(%rcx), %xmm0
mulsd -0x30(%rbp), %xmm0
movsd 0x70(%rcx), %xmm1
mulsd -0x28(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x78(%rcx), %xmm1
mulsd -0x20(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x10(%rdi)
movsd 0x60(%rcx), %xmm0
mulsd -0x30(%rbp), %xmm0
movsd 0x70(%rcx), %xmm1
mulsd -0x18(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x78(%rcx), %xmm1
mulsd -0x10(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x30(%rdi)
movsd 0x60(%rcx), %xmm0
mulsd -0x28(%rbp), %xmm0
movsd 0x68(%rcx), %xmm1
mulsd -0x18(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x78(%rcx), %xmm1
mulsd -0x8(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x50(%rdi)
movsd 0x60(%rcx), %xmm0
mulsd -0x20(%rbp), %xmm0
movsd 0x68(%rcx), %xmm1
mulsd -0x10(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x70(%rcx), %xmm1
mulsd -0x8(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x70(%rdi)
movsd 0x48(%rcx), %xmm0
mulsd -0x30(%rbp), %xmm0
movsd 0x50(%rcx), %xmm1
mulsd -0x28(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x58(%rcx), %xmm1
mulsd -0x20(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x18(%rdi)
movsd 0x40(%rcx), %xmm0
mulsd -0x30(%rbp), %xmm0
movsd 0x50(%rcx), %xmm1
mulsd -0x18(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x58(%rcx), %xmm1
mulsd -0x10(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x38(%rdi)
movsd 0x40(%rcx), %xmm0
mulsd -0x28(%rbp), %xmm0
movsd 0x48(%rcx), %xmm1
mulsd -0x18(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x58(%rcx), %xmm1
mulsd -0x8(%rbp), %xmm1
addsd %xmm1, %xmm0
movq %xmm0, %rdx
movabsq $-0x8000000000000000, %rsi # imm = 0x8000000000000000
xorq %rsi, %rdx
movq %rdx, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x58(%rdi)
movsd 0x40(%rcx), %xmm0
mulsd -0x20(%rbp), %xmm0
movsd 0x48(%rcx), %xmm1
mulsd -0x10(%rbp), %xmm1
subsd %xmm1, %xmm0
movsd 0x50(%rcx), %xmm1
mulsd -0x8(%rbp), %xmm1
addsd %xmm1, %xmm0
divsd -0x68(%rbp), %xmm0
movsd %xmm0, 0x78(%rdi)
popq %rbp
retq
nop