// File: 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
subq $0x80, %rsp
movq %rdi, -0x8(%rbp)
movsd %xmm0, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x8(%rbp), %rax
movsd (%rax), %xmm1
movq -0x8(%rbp), %rax
movsd (%rax), %xmm2
movq -0x8(%rbp), %rax
movsd 0x8(%rax), %xmm0
movq -0x8(%rbp), %rax
mulsd 0x8(%rax), %xmm0
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm0
movq -0x8(%rbp), %rax
movsd 0x10(%rax), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
callq 0x3200
movsd %xmm0, -0x20(%rbp)
movsd 0x253a(%rip), %xmm0     # 0xd418
mulsd -0x20(%rbp), %xmm0
mulsd -0x10(%rbp), %xmm0
callq 0x30a0
movsd %xmm0, -0x28(%rbp)
movsd 0x251e(%rip), %xmm0     # 0xd418
mulsd -0x20(%rbp), %xmm0
mulsd -0x10(%rbp), %xmm0
callq 0x3460
movsd %xmm0, -0x30(%rbp)
movsd -0x28(%rbp), %xmm0
movq -0x8(%rbp), %rax
mulsd (%rax), %xmm0
divsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x50(%rbp)
movsd -0x28(%rbp), %xmm0
movq -0x8(%rbp), %rax
mulsd 0x8(%rax), %xmm0
divsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x48(%rbp)
movsd -0x28(%rbp), %xmm0
movq -0x8(%rbp), %rax
mulsd 0x10(%rax), %xmm0
divsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x40(%rbp)
movsd -0x30(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd (%rax), %xmm2
movsd -0x50(%rbp), %xmm1
movq -0x18(%rbp), %rax
mulsd 0x8(%rax), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd -0x48(%rbp), %xmm1
movq -0x18(%rbp), %rax
movsd 0x10(%rax), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x40(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd 0x18(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x70(%rbp)
movsd -0x30(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm2
movsd -0x50(%rbp), %xmm1
movq -0x18(%rbp), %rax
mulsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd -0x48(%rbp), %xmm1
movq -0x18(%rbp), %rax
movsd 0x18(%rax), %xmm2
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x40(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd 0x10(%rax), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x68(%rbp)
movsd -0x30(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd 0x10(%rax), %xmm2
movsd -0x48(%rbp), %xmm1
movq -0x18(%rbp), %rax
mulsd (%rax), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd -0x50(%rbp), %xmm1
movq -0x18(%rbp), %rax
movsd 0x18(%rax), %xmm2
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x40(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm2
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x60(%rbp)
movsd -0x30(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd 0x18(%rax), %xmm2
movsd -0x50(%rbp), %xmm1
movq -0x18(%rbp), %rax
mulsd 0x10(%rax), %xmm1
movq %xmm1, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd -0x48(%rbp), %xmm1
movq -0x18(%rbp), %rax
movsd 0x8(%rax), %xmm2
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x40(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd (%rax), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd %xmm0, -0x58(%rbp)
movsd -0x70(%rbp), %xmm0
movsd -0x70(%rbp), %xmm2
movsd -0x68(%rbp), %xmm1
mulsd -0x68(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
movsd -0x60(%rbp), %xmm1
movsd -0x60(%rbp), %xmm2
mulsd %xmm2, %xmm1
addsd %xmm0, %xmm1
movsd -0x58(%rbp), %xmm0
movsd -0x58(%rbp), %xmm2
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
callq 0x3200
movsd %xmm0, -0x78(%rbp)
movsd -0x70(%rbp), %xmm0
divsd -0x78(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, (%rax)
movsd -0x68(%rbp), %xmm0
divsd -0x78(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x8(%rax)
movsd -0x60(%rbp), %xmm0
divsd -0x78(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x10(%rax)
movsd -0x58(%rbp), %xmm0
divsd -0x78(%rbp), %xmm0
movq -0x18(%rbp), %rax
movsd %xmm0, 0x18(%rax)
addq $0x80, %rsp
popq %rbp
retq
nopl (%rax)