// File: /workspace/github_c_makefile_star2_O2/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
movq %rdi, %rax
movsd (%rcx), %xmm1
movsd 0x20(%rcx), %xmm0
ucomisd %xmm0, %xmm1
jbe 0xadc1
movsd 0x40(%rcx), %xmm2
ucomisd %xmm2, %xmm1
jbe 0xadc1
addsd 0x1302(%rip), %xmm1     # 0xc050
addsd %xmm2, %xmm0
subsd %xmm0, %xmm1
sqrtsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
je 0xae7a
movapd %xmm0, %xmm1
movsd 0x12dc(%rip), %xmm2     # 0xc050
movsd 0x8(%rcx), %xmm3
addsd %xmm0, %xmm1
movhpd 0x30(%rcx), %xmm3       # xmm3 = xmm3[0],mem[0]
mulsd 0x137e(%rip), %xmm0     # 0xc108
divsd %xmm1, %xmm2
movupd 0x10(%rcx), %xmm1
shufpd $0x1, %xmm1, %xmm1      # xmm1 = xmm1[1,0]
addpd %xmm3, %xmm1
movsd 0x28(%rcx), %xmm3
subsd 0x38(%rcx), %xmm3
movddup %xmm2, %xmm4            # xmm4 = xmm2[0,0]
mulsd %xmm2, %xmm3
mulpd %xmm4, %xmm1
movsd %xmm3, (%rax)
movsd %xmm0, 0x8(%rax)
movupd %xmm1, 0x10(%rax)
retq
ucomisd %xmm1, %xmm0
movsd 0x40(%rcx), %xmm2
jbe 0xae54
ucomisd %xmm2, %xmm0
jbe 0xae54
addsd 0x1272(%rip), %xmm0     # 0xc050
addsd %xmm2, %xmm1
subsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
sqrtsd %xmm0, %xmm0
ucomisd %xmm1, %xmm0
je 0xae7a
movapd %xmm0, %xmm1
movsd 0x124c(%rip), %xmm2     # 0xc050
movupd 0x10(%rcx), %xmm3
movddup 0x8(%rcx), %xmm4        # xmm4 = mem[0,0]
addsd %xmm0, %xmm1
mulsd 0x12ee(%rip), %xmm0     # 0xc108
addpd %xmm3, %xmm4
divsd %xmm1, %xmm2
movupd 0x30(%rcx), %xmm1
subpd %xmm3, %xmm1
movsd 0x28(%rcx), %xmm3
addsd 0x38(%rcx), %xmm3
movsd %xmm1, %xmm4            # xmm4 = xmm1[0],xmm4[1]
movddup %xmm2, %xmm1            # xmm1 = xmm2[0,0]
mulsd %xmm2, %xmm3
mulpd %xmm4, %xmm1
movupd %xmm1, (%rax)
movsd %xmm0, 0x10(%rax)
movsd %xmm3, 0x18(%rax)
retq
addsd %xmm0, %xmm1
movsd 0x11f0(%rip), %xmm0     # 0xc050
movapd %xmm0, %xmm3
subsd %xmm1, %xmm3
addsd %xmm2, %xmm3
xorpd %xmm2, %xmm2
sqrtsd %xmm3, %xmm1
ucomisd %xmm2, %xmm1
jne 0xae96
movabsq $0x3ff0000000000000, %rcx # imm = 0x3FF0000000000000
xorpd %xmm0, %xmm0
movq %rcx, (%rax)
movupd %xmm0, 0x8(%rax)
andq $0x0, 0x18(%rax)
retq
movapd %xmm1, %xmm2
movupd 0x18(%rcx), %xmm3
movddup 0x30(%rcx), %xmm4       # xmm4 = mem[0,0]
addsd %xmm1, %xmm2
mulsd 0x1258(%rip), %xmm1     # 0xc108
divsd %xmm2, %xmm0
movupd 0x8(%rcx), %xmm2
addpd %xmm2, %xmm4
subpd %xmm3, %xmm2
movsd 0x28(%rcx), %xmm3
addsd 0x38(%rcx), %xmm3
movsd %xmm2, %xmm4            # xmm4 = xmm2[0],xmm4[1]
movddup %xmm0, %xmm2            # xmm2 = xmm0[0,0]
mulsd %xmm0, %xmm3
mulpd %xmm4, %xmm2
movupd %xmm2, (%rax)
movsd %xmm3, 0x10(%rax)
movsd %xmm1, 0x18(%rax)
retq