// File: /workspace/github_c_makefile_star2_O1/Alessandro-Barbieri[P]SpaceLib/src/SPACELIB.c
// Function: mtoscrew
int mtoscrew (MAT4 Q, AXIS u, real *phi, real *h, POINT P)
{
	real a,b,c,s,co,d,v,t,t1;
	int i,j;
	int x,y,z;

	a = (real) 0.5*(Q[Z][Y]-Q[Y][Z]);
	b = (real) 0.5*(Q[X][Z]-Q[Z][X]);
	c = (real) 0.5*(Q[Y][X]-Q[X][Y]);
	s = (real) sqrt(a*a+b*b+c*c);
	co = (Q[X][X]+Q[Y][Y]+Q[Z][Z]-1.)/2.;
	*phi = (real) atan2(s,co);

	co = (real) min(1.,max(-1.,co));
	v = (real) 1.-co;

	if (aabs(s)>0.1)                            /* normal case */
	{
		u[X] = a/s; u[Y] = b/s; u[Z] = c/s;
	}
	else if ((*phi!=0) && (co>0))                /* phi small */
	{
		t= ((real)1./v);
		u[X] = (real)sign(Q[Z][Y]-Q[Y][Z])* (real) sqrt(aabs((Q[X][X]-co)*t));
		u[Y] = (real)sign(Q[X][Z]-Q[Z][X])* (real) sqrt(aabs((Q[Y][Y]-co)*t));
		u[Z] = (real)sign(Q[Y][X]-Q[X][Y])* (real) sqrt(aabs((Q[Z][Z]-co)*t));
	}
	else if ((*phi!=0) && (co<0))                /* phi nearly PIG (3.14) */
	{
		t= ((real)1./v);
		u[X]=(real) sqrt(aabs((Q[X][X]-co)*t));
		u[Y]=(real) sqrt(aabs((Q[Y][Y]-co)*t));
		u[Z]=(real) sqrt(aabs((Q[Z][Z]-co)*t));
		if ((u[X]>=u[Y])&&(u[X]>=u[Z]))
			x=X;
		else if ((u[Y]>=u[X])&&(u[Y]>=u[Z]))
			x=Y;
		else
			x=Z;
		y=(x+1)%3; z=(x+2)%3;
		s=((Q[z][y]-Q[y][z])>=0 ? 1 : -1);
		u[x] *= s;
		u[y] *= (real) sign(Q[y][x]+Q[x][y])*s;
		u[z] *= (real) sign(Q[z][x]+Q[x][z])*s;
	}
	else                                        /* phi==0 */
	{
		d=(real)sqrt(Q[X][U]*Q[X][U]+Q[Y][U]*Q[Y][U]+Q[Z][U]*Q[Z][U]);
		if (d==0)
		{
			u[X] = u[Y] = u[Z]= (real) 0.;
		}
		else
		{
			u[X]=Q[X][U]/d; u[Y]=Q[Y][U]/d; u[Z]=Q[Z][U]/d;
		}
	}

	*h = u[X]*Q[X][U] + u[Y]*Q[Y][U] + u[Z]*Q[Z][U];

	P[U]= (real) 1.;
	if (v== (real) 0.)
	{
		P[X]=P[Y]=P[Z]=(real) 0.;
		if (d!=(real)0.)
			return(OK);
		else
			return(NOTOK);
	};
	t1 = (real).5/v;
	for(i=X;i<U;i++)
	{
		for(j=X,t=0;j<U;j++)
			t += -Q[j][i] * Q[j][U];
		P[i] = (t + Q[i][U])*t1;
	}
	return(OK);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x50, %rsp
movq %r8, %rbx
movq %rcx, %r15
movq %rdx, %r13
movq %rsi, %r12
movq %rdi, %r14
movsd 0x48(%rdi), %xmm1
subsd 0x30(%rdi), %xmm1
movsd 0x2898(%rip), %xmm0     # 0xa098
mulsd %xmm0, %xmm1
movsd 0x10(%rdi), %xmm2
subsd 0x40(%rdi), %xmm2
movsd 0x20(%rdi), %xmm3
mulsd %xmm0, %xmm2
subsd 0x8(%rdi), %xmm3
mulsd %xmm0, %xmm3
movsd %xmm2, 0x48(%rsp)
movapd %xmm2, %xmm0
mulsd %xmm2, %xmm0
movsd %xmm1, 0x30(%rsp)
mulsd %xmm1, %xmm1
addsd %xmm0, %xmm1
movsd %xmm3, 0x40(%rsp)
movapd %xmm3, %xmm0
mulsd %xmm3, %xmm0
addsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x785e
sqrtsd %xmm0, %xmm0
jmp 0x7863
callq 0x23e0
movapd %xmm0, 0x10(%rsp)
movsd (%r14), %xmm1
addsd 0x28(%r14), %xmm1
addsd 0x50(%r14), %xmm1
addsd 0x29c6(%rip), %xmm1     # 0xa248
mulsd 0x280e(%rip), %xmm1     # 0xa098
movsd %xmm1, (%rsp)
callq 0x22b0
movapd 0x10(%rsp), %xmm3
movsd %xmm0, (%r13)
movsd 0x29a0(%rip), %xmm1     # 0xa248
maxsd (%rsp), %xmm1
movsd 0x27c3(%rip), %xmm4     # 0xa078
movapd %xmm4, %xmm5
minsd %xmm1, %xmm5
movapd %xmm4, %xmm7
subsd %xmm5, %xmm7
movapd 0x2733(%rip), %xmm1     # 0xa000
xorpd %xmm3, %xmm1
movapd %xmm3, %xmm2
maxsd %xmm1, %xmm2
ucomisd 0x2b27(%rip), %xmm2     # 0xa408
jbe 0x7913
movsd 0x30(%rsp), %xmm0
divsd %xmm3, %xmm0
movsd %xmm0, (%r12)
movsd 0x48(%rsp), %xmm0
divsd %xmm3, %xmm0
movsd %xmm0, 0x8(%r12)
movsd 0x40(%rsp), %xmm0
divsd %xmm3, %xmm0
jmp 0x7b98
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne 0x7923
jnp 0x79ad
ucomisd %xmm1, %xmm5
jbe 0x79ad
movsd (%r14), %xmm0
movsd 0x48(%r14), %xmm8
subsd 0x30(%r14), %xmm8
xorpd %xmm3, %xmm3
cmpltsd %xmm8, %xmm1
andpd %xmm4, %xmm1
divsd %xmm7, %xmm4
cmpltsd %xmm3, %xmm8
movapd %xmm8, %xmm2
andnpd %xmm1, %xmm2
movsd 0x28e1(%rip), %xmm6     # 0xa248
andpd %xmm6, %xmm8
orpd %xmm2, %xmm8
subsd %xmm5, %xmm0
mulsd %xmm4, %xmm0
movapd 0x267f(%rip), %xmm1     # 0xa000
xorpd %xmm0, %xmm1
maxsd %xmm1, %xmm0
ucomisd %xmm3, %xmm0
movapd %xmm7, (%rsp)
movapd %xmm4, 0x10(%rsp)
movapd %xmm5, 0x20(%rsp)
jb 0x7a3d
sqrtsd %xmm0, %xmm0
jmp 0x7a68
ucomisd %xmm1, %xmm0
jne 0x79b5
jnp 0x7a00
ucomisd %xmm5, %xmm1
jbe 0x7a00
divsd %xmm7, %xmm4
movsd (%r14), %xmm0
subsd %xmm5, %xmm0
mulsd %xmm4, %xmm0
movapd 0x262c(%rip), %xmm2     # 0xa000
xorpd %xmm0, %xmm2
maxsd %xmm2, %xmm0
ucomisd %xmm1, %xmm0
movapd %xmm7, (%rsp)
movapd %xmm4, 0x10(%rsp)
movapd %xmm5, 0x20(%rsp)
jb 0x7ca8
sqrtsd %xmm0, %xmm0
jmp 0x7cb9
movsd 0x18(%r14), %xmm1
movsd 0x38(%r14), %xmm0
mulsd %xmm0, %xmm0
mulsd %xmm1, %xmm1
addsd %xmm0, %xmm1
movsd 0x58(%r14), %xmm0
mulsd %xmm0, %xmm0
addsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x7c6b
sqrtsd %xmm0, %xmm0
jmp 0x7c7e
movapd %xmm8, 0x30(%rsp)
callq 0x23e0
movapd 0x30(%rsp), %xmm8
xorpd %xmm3, %xmm3
movsd 0x27ec(%rip), %xmm6     # 0xa248
movapd 0x20(%rsp), %xmm5
movapd 0x10(%rsp), %xmm4
mulsd %xmm8, %xmm0
movsd %xmm0, (%r12)
movsd 0x10(%r14), %xmm8
movsd 0x28(%r14), %xmm0
subsd 0x40(%r14), %xmm8
xorpd %xmm1, %xmm1
cmpltsd %xmm8, %xmm1
movsd 0x25e1(%rip), %xmm7     # 0xa078
andpd %xmm7, %xmm1
cmpltsd %xmm3, %xmm8
movapd %xmm8, %xmm2
andnpd %xmm1, %xmm2
andpd %xmm6, %xmm8
orpd %xmm2, %xmm8
subsd %xmm5, %xmm0
mulsd %xmm4, %xmm0
movapd 0x253c(%rip), %xmm1     # 0xa000
xorpd %xmm0, %xmm1
maxsd %xmm1, %xmm0
ucomisd %xmm3, %xmm0
jb 0x7ad8
sqrtsd %xmm0, %xmm0
jmp 0x7b07
movapd %xmm8, 0x30(%rsp)
callq 0x23e0
movapd 0x30(%rsp), %xmm8
movsd 0x2585(%rip), %xmm7     # 0xa078
movsd 0x274d(%rip), %xmm6     # 0xa248
movapd 0x20(%rsp), %xmm5
movapd 0x10(%rsp), %xmm4
mulsd %xmm8, %xmm0
movsd %xmm0, 0x8(%r12)
movsd 0x20(%r14), %xmm8
movsd 0x50(%r14), %xmm0
subsd 0x8(%r14), %xmm8
xorpd %xmm1, %xmm1
xorpd %xmm2, %xmm2
cmpltsd %xmm8, %xmm2
andpd %xmm7, %xmm2
cmpltsd %xmm1, %xmm8
movapd %xmm8, %xmm3
andnpd %xmm2, %xmm3
andpd %xmm6, %xmm8
orpd %xmm3, %xmm8
subsd %xmm5, %xmm0
mulsd %xmm0, %xmm4
movapd 0x24a0(%rip), %xmm0     # 0xa000
xorpd %xmm4, %xmm0
maxsd %xmm0, %xmm4
ucomisd %xmm1, %xmm4
jb 0x7b77
xorps %xmm0, %xmm0
sqrtsd %xmm4, %xmm0
jmp 0x7b8e
movapd %xmm4, %xmm0
movapd %xmm8, 0x10(%rsp)
callq 0x23e0
movapd 0x10(%rsp), %xmm8
movapd (%rsp), %xmm7
mulsd %xmm8, %xmm0
movsd %xmm0, 0x10(%r12)
movl $0x1, %eax
movsd (%r12), %xmm0
movsd 0x8(%r12), %xmm1
mulsd 0x38(%r14), %xmm1
mulsd 0x18(%r14), %xmm0
movsd 0x10(%r12), %xmm2
mulsd 0x58(%r14), %xmm2
addsd %xmm1, %xmm0
addsd %xmm0, %xmm2
movsd %xmm2, (%r15)
movabsq $0x3ff0000000000000, %rcx # imm = 0x3FF0000000000000
movq %rcx, 0x18(%rbx)
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm7
jne 0x7c03
jp 0x7c03
xorpd %xmm0, %xmm0
movupd %xmm0, (%rbx)
movq $0x0, 0x10(%rbx)
jmp 0x7c5d
movsd 0x248d(%rip), %xmm2     # 0xa098
divsd %xmm7, %xmm2
xorl %eax, %eax
movq %r14, %rcx
xorpd %xmm0, %xmm0
xorl %edx, %edx
movsd (%rcx,%rdx), %xmm1
mulsd 0x18(%r14,%rdx), %xmm1
subsd %xmm1, %xmm0
addq $0x20, %rdx
cmpq $0x60, %rdx
jne 0x7c1a
movq %rax, %rdx
shlq $0x5, %rdx
addsd 0x18(%r14,%rdx), %xmm0
mulsd %xmm2, %xmm0
movsd %xmm0, (%rbx,%rax,8)
incq %rax
addq $0x8, %rcx
cmpq $0x3, %rax
jne 0x7c14
movl $0x1, %eax
addq $0x50, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
movapd %xmm7, (%rsp)
callq 0x23e0
xorpd %xmm1, %xmm1
movapd (%rsp), %xmm7
ucomisd %xmm1, %xmm0
jne 0x7eab
jp 0x7eab
xorpd %xmm0, %xmm0
movupd %xmm0, (%r12)
movq $0x0, 0x10(%r12)
xorl %eax, %eax
jmp 0x7ba4
callq 0x23e0
movapd 0x20(%rsp), %xmm5
movapd 0x10(%rsp), %xmm4
movsd %xmm0, (%r12)
movsd 0x28(%r14), %xmm0
subsd %xmm5, %xmm0
mulsd %xmm4, %xmm0
movapd 0x232b(%rip), %xmm1     # 0xa000
xorpd %xmm0, %xmm1
maxsd %xmm1, %xmm0
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jb 0x7ced
sqrtsd %xmm0, %xmm0
jmp 0x7d02
callq 0x23e0
xorpd %xmm1, %xmm1
movapd 0x20(%rsp), %xmm5
movapd 0x10(%rsp), %xmm4
movsd %xmm0, 0x8(%r12)
movsd 0x50(%r14), %xmm0
subsd %xmm5, %xmm0
mulsd %xmm0, %xmm4
movapd 0x22e1(%rip), %xmm0     # 0xa000
xorpd %xmm4, %xmm0
maxsd %xmm0, %xmm4
ucomisd %xmm1, %xmm4
jb 0x7d36
xorps %xmm0, %xmm0
sqrtsd %xmm4, %xmm0
jmp 0x7d3f
movapd %xmm4, %xmm0
callq 0x23e0
movapd (%rsp), %xmm7
movsd %xmm0, 0x10(%r12)
movsd (%r12), %xmm1
movsd 0x8(%r12), %xmm2
movapd %xmm0, %xmm3
cmpnlepd %xmm1, %xmm3
movapd %xmm2, %xmm4
cmpnlepd %xmm1, %xmm4
orpd %xmm3, %xmm4
movd %xmm4, %edx
cmpnlepd %xmm2, %xmm0
cmpnlepd %xmm2, %xmm1
orpd %xmm0, %xmm1
movd %xmm1, %esi
movl $0x1, %eax
movl $0x1, %ecx
subl %esi, %ecx
xorl %esi, %esi
testb $0x1, %dl
cmovel %esi, %ecx
leal 0x1(%rcx), %r8d
cmpl $0x3, %r8d
cmovel %esi, %r8d
leal 0x2(%rcx), %edx
imulq $0x55555556, %rdx, %rdx # imm = 0x55555556
shrq $0x20, %rdx
leal (%rdx,%rdx,2), %edx
negl %edx
addl %ecx, %edx
addl $0x2, %edx
movl %edx, %esi
shll $0x5, %esi
addq %r14, %rsi
leal (,%r8,8), %edi
movsd (%rdi,%rsi), %xmm1
shll $0x5, %r8d
addq %r14, %r8
shll $0x3, %edx
subsd (%rdx,%r8), %xmm1
xorpd %xmm0, %xmm0
cmplesd %xmm1, %xmm0
movsd 0x2286(%rip), %xmm2     # 0xa078
movapd %xmm0, %xmm3
andpd %xmm2, %xmm3
movsd 0x2446(%rip), %xmm1     # 0xa248
andnpd %xmm1, %xmm0
orpd %xmm3, %xmm0
leal (,%rcx,8), %r9d
movsd (%r12,%r9), %xmm3
mulsd %xmm0, %xmm3
movsd %xmm3, (%r12,%r9)
movsd (%r9,%r8), %xmm3
shll $0x5, %ecx
addq %r14, %rcx
addsd (%rdi,%rcx), %xmm3
xorpd %xmm4, %xmm4
xorpd %xmm5, %xmm5
cmpltsd %xmm3, %xmm5
andpd %xmm2, %xmm5
cmpltsd %xmm4, %xmm3
movapd %xmm3, %xmm6
andnpd %xmm5, %xmm6
andpd %xmm1, %xmm3
orpd %xmm6, %xmm3
mulsd %xmm0, %xmm3
mulsd (%r12,%rdi), %xmm3
movsd %xmm3, (%r12,%rdi)
movsd (%r9,%rsi), %xmm3
addsd (%rdx,%rcx), %xmm3
xorpd %xmm5, %xmm5
cmpltsd %xmm3, %xmm5
andpd %xmm2, %xmm5
cmpltsd %xmm4, %xmm3
movapd %xmm3, %xmm2
andnpd %xmm5, %xmm2
andpd %xmm1, %xmm3
orpd %xmm2, %xmm3
mulsd %xmm0, %xmm3
mulsd (%r12,%rdx), %xmm3
movsd %xmm3, (%r12,%rdx)
jmp 0x7ba4
movsd 0x18(%r14), %xmm1
divsd %xmm0, %xmm1
movsd %xmm1, (%r12)
movsd 0x38(%r14), %xmm1
divsd %xmm0, %xmm1
movsd %xmm1, 0x8(%r12)
movsd 0x58(%r14), %xmm1
divsd %xmm0, %xmm1
movsd %xmm1, 0x10(%r12)
jmp 0x7b9f