// File: /workspace/github_cpp_makefile_star2_O3/rachit31[P]CubeSatADCS/propagateANDupdate.cpp
// Function: quatProp(double const (&) [3], double, double (&) [4])
void quatProp(const double (&wbi_B)[3], const double dtGyro, double (&q_BI)[4])
 {
	 double wmag = sqrt(wbi_B[0]*wbi_B[0]+wbi_B[1]*wbi_B[1]+wbi_B[2]*wbi_B[2]);
		
	 double s = sin(0.5*wmag*dtGyro);
     double c = cos(0.5*wmag*dtGyro);
		
     double psi[3];
		
     psi[0] = s*wbi_B[0]/wmag;
     psi[1] = s*wbi_B[1]/wmag;
     psi[2] = s*wbi_B[2]/wmag;
		
     double qnew_BI[4];
		
     qnew_BI[0] = c*q_BI[0] - psi[0]*q_BI[1] - psi[1]*q_BI[2] - psi[2]*q_BI[3];
     qnew_BI[1] = c*q_BI[1] + psi[0]*q_BI[0] - psi[1]*q_BI[3] + psi[2]*q_BI[2];
     qnew_BI[2] = c*q_BI[2] + psi[1]*q_BI[0] + psi[0]*q_BI[3] - psi[2]*q_BI[1];
     qnew_BI[3] = c*q_BI[3] - psi[0]*q_BI[2] + psi[1]*q_BI[1] + psi[2]*q_BI[0];
		
     double qmag = sqrt(qnew_BI[0]*qnew_BI[0]+qnew_BI[1]*qnew_BI[1]+qnew_BI[2]*qnew_BI[2]+qnew_BI[3]*qnew_BI[3]);
		
     q_BI[0] = qnew_BI[0]/qmag;
     q_BI[1] = qnew_BI[1]/qmag;
     q_BI[2] = qnew_BI[2]/qmag;
     q_BI[3] = qnew_BI[3]/qmag;
 }

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r14
pushq %rbx
subq $0x20, %rsp
movq %rsi, %rbx
movq %rdi, %r14
movsd (%rdi), %xmm2
movsd 0x8(%rdi), %xmm1
mulsd %xmm1, %xmm1
mulsd %xmm2, %xmm2
addsd %xmm1, %xmm2
movsd 0x10(%rdi), %xmm1
mulsd %xmm1, %xmm1
addsd %xmm2, %xmm1
xorps %xmm2, %xmm2
sqrtsd %xmm1, %xmm2
movsd %xmm2, -0x28(%rbp)
movsd 0x146f(%rip), %xmm1     # 0x8410
mulsd %xmm2, %xmm1
mulsd %xmm1, %xmm0
movsd %xmm0, -0x18(%rbp)
callq 0x2090
movsd %xmm0, -0x20(%rbp)
movsd -0x18(%rbp), %xmm0
callq 0x23d0
movsd (%r14), %xmm1
movsd -0x20(%rbp), %xmm12
mulsd %xmm12, %xmm1
movsd -0x28(%rbp), %xmm3
divsd %xmm3, %xmm1
movsd 0x8(%r14), %xmm2
mulsd %xmm12, %xmm2
divsd %xmm3, %xmm2
mulsd 0x10(%r14), %xmm12
divsd %xmm3, %xmm12
movsd (%rbx), %xmm3
movsd 0x8(%rbx), %xmm4
movapd %xmm2, %xmm6
movapd %xmm0, %xmm5
mulsd %xmm4, %xmm5
movapd %xmm2, %xmm7
movapd %xmm2, %xmm8
movapd %xmm12, %xmm9
mulsd %xmm4, %xmm9
mulsd %xmm4, %xmm2
movapd %xmm4, %xmm10
mulsd %xmm1, %xmm10
movapd %xmm0, %xmm4
mulsd %xmm3, %xmm4
subsd %xmm10, %xmm4
movsd 0x10(%rbx), %xmm10
mulsd %xmm10, %xmm6
subsd %xmm6, %xmm4
movsd 0x18(%rbx), %xmm11
movapd %xmm12, %xmm6
mulsd %xmm11, %xmm6
subsd %xmm6, %xmm4
movapd %xmm1, %xmm6
mulsd %xmm3, %xmm6
addsd %xmm6, %xmm5
mulsd %xmm11, %xmm7
subsd %xmm7, %xmm5
movapd %xmm12, %xmm6
mulsd %xmm10, %xmm6
addsd %xmm5, %xmm6
mulsd %xmm3, %xmm8
movapd %xmm0, %xmm5
mulsd %xmm10, %xmm5
addsd %xmm8, %xmm5
mulsd %xmm1, %xmm10
mulsd %xmm11, %xmm1
addsd %xmm5, %xmm1
subsd %xmm9, %xmm1
mulsd %xmm11, %xmm0
subsd %xmm10, %xmm0
addsd %xmm0, %xmm2
mulsd %xmm3, %xmm12
addsd %xmm2, %xmm12
movapd %xmm6, %xmm0
mulsd %xmm6, %xmm0
movapd %xmm4, %xmm2
mulsd %xmm4, %xmm2
addsd %xmm0, %xmm2
movapd %xmm1, %xmm0
mulsd %xmm1, %xmm0
addsd %xmm2, %xmm0
movapd %xmm12, %xmm2
mulsd %xmm12, %xmm2
addsd %xmm0, %xmm2
xorps %xmm0, %xmm0
sqrtsd %xmm2, %xmm0
divsd %xmm0, %xmm4
movsd %xmm4, (%rbx)
divsd %xmm0, %xmm6
movsd %xmm6, 0x8(%rbx)
divsd %xmm0, %xmm1
movsd %xmm1, 0x10(%rbx)
divsd %xmm0, %xmm12
movsd %xmm12, 0x18(%rbx)
addq $0x20, %rsp
popq %rbx
popq %r14
popq %rbp
retq