// File: /workspace/github_c_makefile_star2_O1/halcy[P]quasi_crystals_bot/Vector/Quaternion.c
// Function: quatmat3x3
quat_t quatmat3x3(mat3x3_t m)
{
	if(mat3x3_11(m)>mat3x3_22(m) && mat3x3_11(m)>mat3x3_33(m))
	{
		float r=sqrtf(1+mat3x3_11(m)-mat3x3_22(m)-mat3x3_33(m));
		if(r==0) return quatone;
		return quat(
			(mat3x3_32(m)-mat3x3_23(m))/(2*r),
			vec3(
				r/2,
				(mat3x3_12(m)+mat3x3_21(m))/(2*r),
				(mat3x3_31(m)+mat3x3_13(m))/(2*r)
			)
		);
	}
	else if(mat3x3_22(m)>mat3x3_11(m) && mat3x3_22(m)>mat3x3_33(m))
	{
		float r=sqrtf(1+mat3x3_22(m)-mat3x3_33(m)-mat3x3_11(m));
		if(r==0) return quatone;
		return quat(
			(mat3x3_13(m)-mat3x3_31(m))/(2*r),
			vec3(
				(mat3x3_12(m)+mat3x3_21(m))/(2*r),
				r/2,
				(mat3x3_23(m)+mat3x3_32(m))/(2*r)
			)
		);
	}
	else
	{
		float r=sqrtf(1+mat3x3_33(m)-mat3x3_11(m)-mat3x3_22(m));
		if(r==0) return quatone;
		return quat(
			(mat3x3_21(m)-mat3x3_12(m))/(2*r),
			vec3(
				(mat3x3_31(m)+mat3x3_13(m))/(2*r),
				(mat3x3_23(m)+mat3x3_32(m))/(2*r),
				r/2
			)
		);
	}
}

// Assembly:
leaq 0x8(%rsp), %rax
movss (%rax), %xmm0
movss 0x10(%rax), %xmm1
ucomiss %xmm1, %xmm0
jbe 0xd835
movss 0x20(%rax), %xmm2
ucomiss %xmm2, %xmm0
jbe 0xd835
addss 0x87f(%rip), %xmm0      # 0xe008
addss %xmm2, %xmm1
subss %xmm1, %xmm0
xorps %xmm1, %xmm1
rsqrtss %xmm0, %xmm1
movaps %xmm0, %xmm2
mulss %xmm1, %xmm2
movss 0x869(%rip), %xmm3      # 0xe010
mulss %xmm2, %xmm3
mulss %xmm1, %xmm2
addss 0x85d(%rip), %xmm2      # 0xe014
andps 0x872(%rip), %xmm0      # 0xe030
cmpltss 0x851(%rip), %xmm0      # 0xe018
mulss %xmm3, %xmm2
andnps %xmm2, %xmm0
xorps %xmm1, %xmm1
ucomiss %xmm1, %xmm0
je 0xd963
movaps %xmm0, %xmm1
addss %xmm0, %xmm1
movss 0x81f(%rip), %xmm2      # 0xe008
divss %xmm1, %xmm2
movss 0x14(%rax), %xmm1
movss 0x4(%rax), %xmm3
subss 0x1c(%rax), %xmm1
addss 0xc(%rax), %xmm3
movss 0x18(%rax), %xmm4
addss 0x8(%rax), %xmm4
mulss %xmm2, %xmm1
mulss 0xd29(%rip), %xmm0      # 0xe540
mulss %xmm2, %xmm3
mulss %xmm2, %xmm4
insertps $0x10, %xmm3, %xmm0     # xmm0 = xmm0[0],xmm3[0],xmm0[2,3]
movss %xmm1, -0x10(%rsp)
movlps %xmm0, -0xc(%rsp)
jmp 0xd8fb
ucomiss %xmm0, %xmm1
jbe 0xd906
movss 0x20(%rax), %xmm2
ucomiss %xmm2, %xmm1
jbe 0xd906
addss 0x7b4(%rip), %xmm1      # 0xe008
addss %xmm2, %xmm0
subss %xmm0, %xmm1
xorps %xmm0, %xmm0
rsqrtss %xmm1, %xmm0
movaps %xmm1, %xmm2
mulss %xmm0, %xmm2
movss 0x79e(%rip), %xmm3      # 0xe010
mulss %xmm2, %xmm3
mulss %xmm0, %xmm2
addss 0x792(%rip), %xmm2      # 0xe014
andps 0x7a7(%rip), %xmm1      # 0xe030
cmpltss 0x786(%rip), %xmm1      # 0xe018
mulss %xmm3, %xmm2
andnps %xmm2, %xmm1
xorps %xmm0, %xmm0
ucomiss %xmm0, %xmm1
je 0xd963
movaps %xmm1, %xmm0
addss %xmm1, %xmm0
movss 0x754(%rip), %xmm2      # 0xe008
divss %xmm0, %xmm2
movss 0x18(%rax), %xmm0
subss 0x8(%rax), %xmm0
movss 0x4(%rax), %xmm3
movss 0x14(%rax), %xmm4
addss 0xc(%rax), %xmm3
addss 0x1c(%rax), %xmm4
mulss %xmm2, %xmm0
mulss %xmm2, %xmm3
mulss 0xc5a(%rip), %xmm1      # 0xe540
mulss %xmm2, %xmm4
insertps $0x10, %xmm1, %xmm3     # xmm3 = xmm3[0],xmm1[0],xmm3[2,3]
movss %xmm0, -0x10(%rsp)
movlps %xmm3, -0xc(%rsp)
movss %xmm4, -0x4(%rsp)
jmp 0xd9d2
addss %xmm1, %xmm0
movss 0x6f6(%rip), %xmm2      # 0xe008
movaps %xmm2, %xmm1
subss %xmm0, %xmm1
addss 0x20(%rax), %xmm1
xorps %xmm0, %xmm0
rsqrtss %xmm1, %xmm0
movaps %xmm1, %xmm3
mulss %xmm0, %xmm3
movss 0x6dc(%rip), %xmm4      # 0xe010
mulss %xmm3, %xmm4
mulss %xmm0, %xmm3
addss 0x6d0(%rip), %xmm3      # 0xe014
andps 0x6e5(%rip), %xmm1      # 0xe030
cmpltss 0x6c4(%rip), %xmm1      # 0xe018
mulss %xmm4, %xmm3
andnps %xmm3, %xmm1
xorps %xmm0, %xmm0
ucomiss %xmm0, %xmm1
jne 0xd97e
movl $0x3f800000, -0x10(%rsp) # imm = 0x3F800000
movq $0x0, -0xc(%rsp)
movl $0x0, -0x4(%rsp)
jmp 0xd9d2
movaps %xmm1, %xmm0
addss %xmm1, %xmm0
divss %xmm0, %xmm2
movss 0x4(%rax), %xmm0
movss 0x14(%rax), %xmm3
subss 0xc(%rax), %xmm0
movss 0x18(%rax), %xmm4
addss 0x8(%rax), %xmm4
addss 0x1c(%rax), %xmm3
mulss %xmm2, %xmm0
mulss %xmm2, %xmm4
mulss %xmm2, %xmm3
mulss 0xb85(%rip), %xmm1      # 0xe540
insertps $0x10, %xmm3, %xmm4     # xmm4 = xmm4[0],xmm3[0],xmm4[2,3]
movss %xmm0, -0x10(%rsp)
movlps %xmm4, -0xc(%rsp)
movss %xmm1, -0x4(%rsp)
movsd -0x10(%rsp), %xmm0
movsd -0x8(%rsp), %xmm1
retq