// File: /workspace/github_c_makefile_star2_O1/halcy[P]quasi_crystals_bot/Vector/QuaternionDouble.c
// Function: dquatmat3x3
dquat_t dquatmat3x3(dmat3x3_t m)
{
	if(dmat3x3_11(m)>dmat3x3_22(m) && dmat3x3_11(m)>dmat3x3_33(m))
	{
		double r=sqrt(1+dmat3x3_11(m)-dmat3x3_22(m)-dmat3x3_33(m));
		if(r==0) return dquatone;
		return dquat(
			(dmat3x3_32(m)-dmat3x3_23(m))/(2*r),
			dvec3(
				r/2,
				(dmat3x3_12(m)+dmat3x3_21(m))/(2*r),
				(dmat3x3_31(m)+dmat3x3_13(m))/(2*r)
			)
		);
	}
	else if(dmat3x3_22(m)>dmat3x3_11(m) && dmat3x3_22(m)>dmat3x3_33(m))
	{
		double r=sqrt(1+dmat3x3_22(m)-dmat3x3_33(m)-dmat3x3_11(m));
		if(r==0) return dquatone;
		return dquat(
			(dmat3x3_13(m)-dmat3x3_31(m))/(2*r),
			dvec3(
				(dmat3x3_12(m)+dmat3x3_21(m))/(2*r),
				r/2,
				(dmat3x3_23(m)+dmat3x3_32(m))/(2*r)
			)
		);
	}
	else
	{
		double r=sqrt(1+dmat3x3_33(m)-dmat3x3_11(m)-dmat3x3_22(m));
		if(r==0) return dquatone;
		return dquat(
			(dmat3x3_21(m)-dmat3x3_12(m))/(2*r),
			dvec3(
				(dmat3x3_31(m)+dmat3x3_13(m))/(2*r),
				(dmat3x3_23(m)+dmat3x3_32(m))/(2*r),
				r/2
			)
		);
	}
}

// Assembly:
leaq 0x8(%rsp), %rcx
movsd (%rcx), %xmm0
movsd 0x20(%rcx), %xmm1
ucomisd %xmm1, %xmm0
movq %rdi, %rax
jbe 0xdb7d
movsd 0x40(%rcx), %xmm2
ucomisd %xmm2, %xmm0
jbe 0xdb7d
addsd 0x546(%rip), %xmm0      # 0xe050
addsd %xmm2, %xmm1
subsd %xmm1, %xmm0
sqrtsd %xmm0, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
je 0xdc3b
movapd %xmm0, %xmm1
addsd %xmm0, %xmm1
movsd 0x51c(%rip), %xmm2      # 0xe050
divsd %xmm1, %xmm2
movsd 0x8(%rcx), %xmm1
movsd 0x28(%rcx), %xmm3
subsd 0x38(%rcx), %xmm3
movsd 0x30(%rcx), %xmm4
addsd 0x18(%rcx), %xmm1
addsd 0x10(%rcx), %xmm4
mulsd %xmm2, %xmm3
mulsd 0x5a6(%rip), %xmm0      # 0xe108
mulsd %xmm2, %xmm1
mulsd %xmm2, %xmm4
movsd %xmm3, (%rax)
movsd %xmm0, 0x8(%rax)
movsd %xmm1, 0x10(%rax)
jmp 0xdc0b
ucomisd %xmm0, %xmm1
jbe 0xdc11
movsd 0x40(%rcx), %xmm2
ucomisd %xmm2, %xmm1
jbe 0xdc11
addsd 0x4b6(%rip), %xmm1      # 0xe050
addsd %xmm2, %xmm0
subsd %xmm0, %xmm1
xorps %xmm0, %xmm0
sqrtsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
je 0xdc3b
movapd %xmm0, %xmm1
addsd %xmm0, %xmm1
movsd 0x489(%rip), %xmm2      # 0xe050
divsd %xmm1, %xmm2
movsd 0x30(%rcx), %xmm1
subsd 0x10(%rcx), %xmm1
movsd 0x8(%rcx), %xmm3
movsd 0x28(%rcx), %xmm4
addsd 0x18(%rcx), %xmm3
addsd 0x38(%rcx), %xmm4
mulsd %xmm2, %xmm1
mulsd %xmm2, %xmm3
mulsd 0x50f(%rip), %xmm0      # 0xe108
mulsd %xmm2, %xmm4
movsd %xmm1, (%rax)
movsd %xmm3, 0x8(%rax)
movsd %xmm0, 0x10(%rax)
movsd %xmm4, 0x18(%rax)
retq
addsd %xmm1, %xmm0
movsd 0x433(%rip), %xmm1      # 0xe050
movapd %xmm1, %xmm2
subsd %xmm0, %xmm2
addsd 0x40(%rcx), %xmm2
xorps %xmm0, %xmm0
sqrtsd %xmm2, %xmm0
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm0
jne 0xdc5a
movabsq $0x3ff0000000000000, %rcx # imm = 0x3FF0000000000000
movq %rcx, (%rax)
xorpd %xmm0, %xmm0
movupd %xmm0, 0x8(%rax)
movq $0x0, 0x18(%rax)
retq
movapd %xmm0, %xmm2
addsd %xmm0, %xmm2
divsd %xmm2, %xmm1
movsd 0x8(%rcx), %xmm2
movsd 0x28(%rcx), %xmm3
movsd 0x30(%rcx), %xmm4
subsd 0x18(%rcx), %xmm2
addsd 0x10(%rcx), %xmm4
addsd 0x38(%rcx), %xmm3
mulsd %xmm1, %xmm2
mulsd %xmm1, %xmm4
mulsd %xmm1, %xmm3
mulsd 0x470(%rip), %xmm0      # 0xe108
movsd %xmm2, (%rax)
movsd %xmm4, 0x8(%rax)
movsd %xmm3, 0x10(%rax)
movsd %xmm0, 0x18(%rax)
retq