// File: /workspace/github_c_makefile_star2_O1/AlexCharlton[P]Hyperscene/hypermath/src/hypermath.c
// Function: hpmSlerp
void hpmSlerp(const float *quatA, const float *quatB, float t, float *result){
    HPMquat *a = (HPMquat *) quatA;
    HPMquat *b = (HPMquat *) quatB;
    HPMquat *r = (HPMquat *) result;
    float cosOmega = a->x*b->x + a->y*b->y + a->z*b->z + a->w*b->w;
    if (cosOmega < 0){
        b->x = -b->x;
        b->y = -b->y;
        b->z = -b->z;
        b->w = -b->w;
        cosOmega = -cosOmega;
    }
    float ka, kb;
    if (cosOmega > 0.9999){ // Linear interpolation when close
        ka = 1-t;
        kb = t;
    } else {
        float sinOmega = sqrt(1 - cosOmega*cosOmega);
        float omega = atan2(sinOmega, cosOmega);
        float oneOverSinOmega = 1/sinOmega;
        ka = sin((1-t) * omega) *oneOverSinOmega;
        kb = sin(t * omega) *oneOverSinOmega;
    }
    r->x = a->x*ka + b->x*kb;
    r->y = a->y*ka + b->y*kb;
    r->z = a->z*ka + b->z*kb;
    r->w = a->w*ka + b->w*kb;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x20, %rsp
movq %rdx, %rbx
movq %rsi, %r15
movq %rdi, %r14
movss (%rsi), %xmm6
movss 0x4(%rsi), %xmm2
movss 0x4(%rdi), %xmm1
mulss %xmm2, %xmm1
movss (%rdi), %xmm4
mulss %xmm6, %xmm4
addss %xmm1, %xmm4
movss 0x8(%rsi), %xmm3
movss 0x8(%rdi), %xmm5
mulss %xmm3, %xmm5
addss %xmm4, %xmm5
movss 0xc(%rsi), %xmm4
movss 0xc(%rdi), %xmm7
mulss %xmm4, %xmm7
addss %xmm5, %xmm7
xorps %xmm5, %xmm5
ucomiss %xmm7, %xmm5
jbe 0x51ca
unpcklps %xmm4, %xmm3            # xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
unpcklps %xmm2, %xmm6            # xmm6 = xmm6[0],xmm2[0],xmm6[1],xmm2[1]
movlhps %xmm3, %xmm6            # xmm6 = xmm6[0],xmm3[0]
xorps 0x5e91(%rip), %xmm6     # 0xb050
movups %xmm6, (%r15)
xorps 0x5e86(%rip), %xmm7     # 0xb050
xorps %xmm1, %xmm1
cvtss2sd %xmm7, %xmm1
ucomisd 0x5e3f(%rip), %xmm1     # 0xb018
jbe 0x51ec
movss 0x5e4d(%rip), %xmm3     # 0xb030
subss %xmm0, %xmm3
jmp 0x52a3
movss %xmm0, 0xc(%rsp)
mulss %xmm7, %xmm7
movss 0x5e32(%rip), %xmm0     # 0xb030
subss %xmm7, %xmm0
xorps %xmm2, %xmm2
ucomiss %xmm2, %xmm0
jb 0x5210
sqrtss %xmm0, %xmm0
jmp 0x5221
movsd %xmm1, 0x10(%rsp)
callq 0x42a0
movsd 0x10(%rsp), %xmm1
movss %xmm0, (%rsp)
cvtss2sd %xmm0, %xmm0
callq 0x40f0
xorps %xmm1, %xmm1
cvtsd2ss %xmm0, %xmm1
movss %xmm1, 0x10(%rsp)
movss 0x5dec(%rip), %xmm0     # 0xb030
movaps %xmm0, %xmm2
divss (%rsp), %xmm2
movss %xmm2, (%rsp)
subss 0xc(%rsp), %xmm0
mulss %xmm1, %xmm0
cvtss2sd %xmm0, %xmm0
callq 0x4210
xorps %xmm1, %xmm1
cvtss2sd (%rsp), %xmm1
movsd %xmm1, (%rsp)
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, 0x1c(%rsp)
movss 0x10(%rsp), %xmm0
mulss 0xc(%rsp), %xmm0
cvtss2sd %xmm0, %xmm0
callq 0x4210
movss 0x1c(%rsp), %xmm3
mulsd (%rsp), %xmm0
cvtsd2ss %xmm0, %xmm0
movss (%r15), %xmm2
mulss %xmm0, %xmm2
movss (%r14), %xmm1
mulss %xmm3, %xmm1
addss %xmm2, %xmm1
movss %xmm1, (%rbx)
movss 0x4(%r15), %xmm2
mulss %xmm0, %xmm2
movss 0x4(%r14), %xmm1
mulss %xmm3, %xmm1
addss %xmm2, %xmm1
movss %xmm1, 0x4(%rbx)
movss 0x8(%r15), %xmm2
mulss %xmm0, %xmm2
movss 0x8(%r14), %xmm1
mulss %xmm3, %xmm1
addss %xmm2, %xmm1
movss %xmm1, 0x8(%rbx)
mulss 0xc(%r15), %xmm0
mulss 0xc(%r14), %xmm3
addss %xmm0, %xmm3
movss %xmm3, 0xc(%rbx)
addq $0x20, %rsp
popq %rbx
popq %r14
popq %r15
retq