// File: /workspace/github_c_makefile_star2_O0/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 %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movss %xmm0, -0x14(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movss (%rax), %xmm0
movq -0x30(%rbp), %rax
movss (%rax), %xmm2
movq -0x28(%rbp), %rax
movss 0x4(%rax), %xmm1
movq -0x30(%rbp), %rax
mulss 0x4(%rax), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x28(%rbp), %rax
movss 0x8(%rax), %xmm1
movq -0x30(%rbp), %rax
movss 0x8(%rax), %xmm2
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movq -0x28(%rbp), %rax
movss 0xc(%rax), %xmm0
movq -0x30(%rbp), %rax
movss 0xc(%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x3c(%rbp)
xorps %xmm0, %xmm0
ucomiss -0x3c(%rbp), %xmm0
jbe 0x5782
movq -0x30(%rbp), %rax
movss (%rax), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movq -0x30(%rbp), %rax
movss %xmm0, (%rax)
movq -0x30(%rbp), %rax
movss 0x4(%rax), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movq -0x30(%rbp), %rax
movss %xmm0, 0x4(%rax)
movq -0x30(%rbp), %rax
movss 0x8(%rax), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movq -0x30(%rbp), %rax
movss %xmm0, 0x8(%rax)
movq -0x30(%rbp), %rax
movss 0xc(%rax), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movq -0x30(%rbp), %rax
movss %xmm0, 0xc(%rax)
movss -0x3c(%rbp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss %xmm0, -0x3c(%rbp)
movss -0x3c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0x988d(%rip), %xmm1     # 0xf020
ucomisd %xmm1, %xmm0
jbe 0x57ba
movss 0x988f(%rip), %xmm0     # 0xf030
subss -0x14(%rbp), %xmm0
movss %xmm0, -0x40(%rbp)
movss -0x14(%rbp), %xmm0
movss %xmm0, -0x44(%rbp)
jmp 0x587f
movss -0x3c(%rbp), %xmm0
movss -0x3c(%rbp), %xmm1
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
mulss %xmm1, %xmm0
movss 0x9853(%rip), %xmm1     # 0xf030
addss %xmm1, %xmm0
cvtss2sd %xmm0, %xmm0
callq 0x44c0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x48(%rbp)
movss -0x48(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
movss -0x3c(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
callq 0x4110
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x4c(%rbp)
movss 0x9815(%rip), %xmm0     # 0xf030
divss -0x48(%rbp), %xmm0
movss %xmm0, -0x50(%rbp)
movss 0x9803(%rip), %xmm0     # 0xf030
subss -0x14(%rbp), %xmm0
mulss -0x4c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
callq 0x4290
movss -0x50(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x40(%rbp)
movss -0x14(%rbp), %xmm0
mulss -0x4c(%rbp), %xmm0
cvtss2sd %xmm0, %xmm0
callq 0x4290
movss -0x50(%rbp), %xmm1
cvtss2sd %xmm1, %xmm1
mulsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movss %xmm0, -0x44(%rbp)
movq -0x28(%rbp), %rax
movss (%rax), %xmm0
movss -0x40(%rbp), %xmm2
movq -0x30(%rbp), %rax
movss (%rax), %xmm1
mulss -0x44(%rbp), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x38(%rbp), %rax
movss %xmm0, (%rax)
movq -0x28(%rbp), %rax
movss 0x4(%rax), %xmm0
movss -0x40(%rbp), %xmm2
movq -0x30(%rbp), %rax
movss 0x4(%rax), %xmm1
mulss -0x44(%rbp), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x38(%rbp), %rax
movss %xmm0, 0x4(%rax)
movq -0x28(%rbp), %rax
movss 0x8(%rax), %xmm0
movss -0x40(%rbp), %xmm2
movq -0x30(%rbp), %rax
movss 0x8(%rax), %xmm1
mulss -0x44(%rbp), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x38(%rbp), %rax
movss %xmm0, 0x8(%rax)
movq -0x28(%rbp), %rax
movss 0xc(%rax), %xmm0
movss -0x40(%rbp), %xmm2
movq -0x30(%rbp), %rax
movss 0xc(%rax), %xmm1
mulss -0x44(%rbp), %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x38(%rbp), %rax
movss %xmm0, 0xc(%rax)
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)