// File: /workspace/github_c_makefile_star2_O3/stetre[P]moonglmath/src/quat.c
// Function: moonglmath_quat_slerp
void quat_slerp(quat_t dst, quat_t q, quat_t p, double t)
/* Rfr: "3D Math Primer for Graphics and Game Development", by F. Dunn, I. Parberry,
 *      AK Peters/CRC Press, section 8.5.11.
 */
    {
    double c, s, theta, t0, t1;
    c = q[0]*p[0] + q[1]*p[1] + q[2]*p[2] + q[3]*p[3];
    if(c < 0.0f)
        {
        c = -c;
        p[0] = - p[0];
        p[1] = - p[1];
        p[2] = - p[2];
        p[3] = - p[3];
        }
    if(c > .9999f) // q and p are very close: use linear interpolation
        quat_mix(dst, q, p, t);
    else
        {
        s = sqrt(1.0f - c*c);
        theta = atan2(s, c);
        t0 = sin((1.0f - t)*theta)/s;
        t1 = sin(t*theta)/s;
        dst[0] = t0*q[0] + t1*p[0];
        dst[1] = t0*q[1] + t1*p[1];
        dst[2] = t0*q[2] + t1*p[2];
        dst[3] = t0*q[3] + t1*p[3];
        }
    }

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x30, %rsp
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
movupd (%rdx), %xmm4
movupd 0x10(%rdx), %xmm5
movapd %xmm4, %xmm2
unpckhpd %xmm4, %xmm2            # xmm2 = xmm2[1],xmm4[1]
mulsd 0x8(%rsi), %xmm2
movsd (%rsi), %xmm3
mulsd %xmm4, %xmm3
addsd %xmm2, %xmm3
movsd 0x10(%rsi), %xmm2
mulsd %xmm5, %xmm2
addsd %xmm3, %xmm2
movapd %xmm5, %xmm1
unpckhpd %xmm5, %xmm1            # xmm1 = xmm1[1],xmm5[1]
mulsd 0x18(%rsi), %xmm1
addsd %xmm2, %xmm1
xorpd %xmm2, %xmm2
ucomisd %xmm1, %xmm2
jbe 0x1191b
movapd 0x57cc(%rip), %xmm2     # 0x170d0
xorpd %xmm2, %xmm1
xorpd %xmm2, %xmm4
movupd %xmm4, (%r15)
xorpd %xmm2, %xmm5
movupd %xmm5, 0x10(%r15)
ucomisd 0x5e6d(%rip), %xmm1     # 0x17790
jbe 0x11985
movsd 0x5793(%rip), %xmm3     # 0x170c0
subsd %xmm0, %xmm3
mulsd %xmm0, %xmm4
movsd (%r14), %xmm1
mulsd %xmm3, %xmm1
addsd %xmm4, %xmm1
movsd %xmm1, (%rbx)
movsd 0x8(%r15), %xmm2
mulsd %xmm0, %xmm2
movsd 0x8(%r14), %xmm1
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
movsd %xmm1, 0x8(%rbx)
movsd 0x10(%r15), %xmm2
mulsd %xmm0, %xmm2
movsd 0x10(%r14), %xmm1
mulsd %xmm3, %xmm1
addsd %xmm2, %xmm1
movsd %xmm1, 0x10(%rbx)
jmp 0x11a69
movsd %xmm0, 0x8(%rsp)
movapd %xmm1, %xmm2
mulsd %xmm1, %xmm2
movsd 0x5725(%rip), %xmm0     # 0x170c0
subsd %xmm2, %xmm0
xorpd %xmm2, %xmm2
ucomisd %xmm2, %xmm0
jb 0x119af
sqrtsd %xmm0, %xmm0
jmp 0x119c0
movapd %xmm1, 0x10(%rsp)
callq 0x8cd0
movapd 0x10(%rsp), %xmm1
movsd %xmm0, 0x10(%rsp)
callq 0x8930
movapd %xmm0, %xmm1
movsd %xmm0, 0x28(%rsp)
movsd 0x56e3(%rip), %xmm0     # 0x170c0
subsd 0x8(%rsp), %xmm0
mulsd %xmm1, %xmm0
callq 0x8b80
divsd 0x10(%rsp), %xmm0
movsd %xmm0, 0x20(%rsp)
movsd 0x28(%rsp), %xmm0
mulsd 0x8(%rsp), %xmm0
callq 0x8b80
movsd 0x20(%rsp), %xmm3
divsd 0x10(%rsp), %xmm0
movsd (%r15), %xmm1
mulsd %xmm0, %xmm1
movsd (%r14), %xmm2
mulsd %xmm3, %xmm2
addsd %xmm1, %xmm2
movsd %xmm2, (%rbx)
movsd 0x8(%r15), %xmm1
mulsd %xmm0, %xmm1
movsd 0x8(%r14), %xmm2
mulsd %xmm3, %xmm2
addsd %xmm1, %xmm2
movsd %xmm2, 0x8(%rbx)
movsd 0x10(%r15), %xmm1
mulsd %xmm0, %xmm1
movsd 0x10(%r14), %xmm2
mulsd %xmm3, %xmm2
addsd %xmm1, %xmm2
movsd %xmm2, 0x10(%rbx)
mulsd 0x18(%r15), %xmm0
mulsd 0x18(%r14), %xmm3
addsd %xmm0, %xmm3
movsd %xmm3, 0x18(%rbx)
addq $0x30, %rsp
popq %rbx
popq %r14
popq %r15
retq