// File: /workspace/github_cpp_makefile_star2_O3/tomfunkhouser[P]gaps/pkgs/R3Shapes/R3Quaternion.cpp
// Function: gaps::operator*(gaps::R3Quaternion const&, gaps::R3Vector const&)
R3Vector
operator*(const R3Quaternion& q, const R3Vector& v)
{
    // Compute quaternion representation of vector
    RNLength length = v.Length();
    if (RNIsZero(length)) return v;
    R3Quaternion vector(0, v[0] / length, v[1] / length, v[2] / length);

    // Compute quaternion representation of rotated vector
    R3Quaternion conjugate(q[0], -q[1], -q[2], -q[3]);
    R3Quaternion result = q;
    result.Multiply(vector);
    result.Multiply(conjugate);
    assert(RNIsZero(result[0]));

    // Return rotated vector
    return R3Vector(length * result[1], length * result[2], length * result[3]); 
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x10, %rsp
movq %rdx, %r15
movq %rsi, %r14
movq %rdi, %rbx
movq %rdx, %rdi
callq 0x3d0cc
leaq 0xb9bf3(%rip), %rax     # 0xe5b98
movsd (%rax), %xmm8
movapd 0x7606e(%rip), %xmm6    # 0xa2020
xorpd %xmm8, %xmm6
ucomisd %xmm6, %xmm0
jb 0x2bfd4
ucomisd %xmm0, %xmm8
jb 0x2bfd4
movq %rbx, %rdi
movq %r15, %rsi
callq 0x3cfd6
jmp 0x2c285
movupd (%r15), %xmm1
movapd %xmm0, %xmm2
unpcklpd %xmm0, %xmm2            # xmm2 = xmm2[0],xmm0[0]
divpd %xmm2, %xmm1
movsd 0x10(%r15), %xmm3
divsd %xmm0, %xmm3
movapd %xmm1, %xmm4
mulsd %xmm1, %xmm4
xorpd %xmm2, %xmm2
addsd %xmm2, %xmm4
movapd %xmm1, %xmm5
unpckhpd %xmm1, %xmm5            # xmm5 = xmm5[1],xmm1[1]
mulsd %xmm5, %xmm5
addsd %xmm4, %xmm5
movapd %xmm3, %xmm4
mulsd %xmm3, %xmm4
addsd %xmm5, %xmm4
sqrtsd %xmm4, %xmm4
movapd %xmm4, %xmm5
cmpnlepd %xmm8, %xmm5
movapd %xmm6, %xmm7
cmpnlepd %xmm4, %xmm7
orpd %xmm5, %xmm7
movd %xmm7, %eax
xorpd %xmm5, %xmm5
testb $0x1, %al
je 0x2c052
divsd %xmm4, %xmm5
divsd %xmm4, %xmm3
unpcklpd %xmm4, %xmm4            # xmm4 = xmm4[0,0]
divpd %xmm4, %xmm1
movsd (%r14), %xmm4
movsd 0x8(%r14), %xmm10
movapd 0x75fbb(%rip), %xmm7    # 0xa2020
movapd %xmm10, %xmm9
xorpd %xmm7, %xmm9
movupd 0x10(%r14), %xmm11
xorpd %xmm11, %xmm7
movapd %xmm4, %xmm12
mulsd %xmm4, %xmm12
addsd %xmm2, %xmm12
movapd %xmm10, %xmm2
mulsd %xmm10, %xmm2
addsd %xmm12, %xmm2
movapd %xmm11, %xmm12
mulsd %xmm11, %xmm12
addsd %xmm2, %xmm12
movapd %xmm11, %xmm2
unpckhpd %xmm11, %xmm2           # xmm2 = xmm2[1],xmm11[1]
movapd %xmm2, %xmm13
mulsd %xmm2, %xmm13
addsd %xmm12, %xmm13
xorps %xmm12, %xmm12
sqrtsd %xmm13, %xmm12
movapd %xmm12, %xmm13
cmpnlepd %xmm8, %xmm13
cmpnlepd %xmm12, %xmm6
orpd %xmm13, %xmm6
movd %xmm6, %eax
movapd %xmm4, %xmm6
testb $0x1, %al
jne 0x2c0f8
movapd %xmm7, %xmm8
movapd %xmm9, (%rsp)
jmp 0x2c117
divsd %xmm12, %xmm6
divsd %xmm12, %xmm9
movapd %xmm9, (%rsp)
unpcklpd %xmm12, %xmm12          # xmm12 = xmm12[0,0]
movapd %xmm7, %xmm8
divpd %xmm12, %xmm8
movapd %xmm1, %xmm12
mulsd %xmm10, %xmm12
movapd %xmm4, %xmm13
mulsd %xmm5, %xmm13
subsd %xmm12, %xmm13
movapd %xmm1, %xmm15
unpckhpd %xmm1, %xmm15           # xmm15 = xmm15[1],xmm1[1]
movapd %xmm7, %xmm14
mulsd %xmm15, %xmm14
addsd %xmm13, %xmm14
pshufd $0xee, %xmm7, %xmm12    # xmm12 = xmm7[2,3,2,3]
movdqa %xmm12, %xmm13
mulsd %xmm3, %xmm13
addsd %xmm14, %xmm13
movapd %xmm5, %xmm14
mulsd %xmm10, %xmm14
movapd %xmm4, %xmm9
mulsd %xmm1, %xmm9
addsd %xmm14, %xmm9
movapd %xmm11, %xmm14
mulsd %xmm3, %xmm14
addsd %xmm9, %xmm14
mulsd %xmm15, %xmm12
addsd %xmm14, %xmm12
movapd %xmm3, %xmm9
mulsd %xmm10, %xmm9
movapd %xmm4, %xmm14
mulsd %xmm15, %xmm14
subsd %xmm9, %xmm14
mulsd %xmm5, %xmm11
addsd %xmm14, %xmm11
movapd %xmm2, %xmm14
mulsd %xmm1, %xmm14
addsd %xmm11, %xmm14
mulsd %xmm10, %xmm15
mulsd %xmm3, %xmm4
addsd %xmm15, %xmm4
mulsd %xmm1, %xmm7
addsd %xmm4, %xmm7
mulsd %xmm5, %xmm2
addsd %xmm7, %xmm2
movapd %xmm12, %xmm1
mulsd %xmm6, %xmm1
movapd %xmm13, %xmm4
movapd (%rsp), %xmm7
mulsd %xmm7, %xmm4
addsd %xmm1, %xmm4
movapd %xmm8, %xmm5
unpckhpd %xmm8, %xmm5            # xmm5 = xmm5[1],xmm8[1]
movapd %xmm14, %xmm3
mulsd %xmm5, %xmm3
addsd %xmm4, %xmm3
movapd %xmm2, %xmm1
mulsd %xmm8, %xmm1
subsd %xmm1, %xmm3
movapd %xmm5, %xmm1
mulsd %xmm13, %xmm5
mulsd %xmm12, %xmm1
mulsd %xmm8, %xmm13
subsd %xmm1, %xmm13
movapd %xmm14, %xmm4
mulsd %xmm6, %xmm4
addsd %xmm13, %xmm4
movapd %xmm2, %xmm1
mulsd %xmm7, %xmm1
addsd %xmm4, %xmm1
mulsd %xmm8, %xmm12
addsd %xmm12, %xmm5
mulsd %xmm7, %xmm14
subsd %xmm14, %xmm5
mulsd %xmm6, %xmm2
addsd %xmm5, %xmm2
mulsd %xmm0, %xmm3
mulsd %xmm0, %xmm1
mulsd %xmm0, %xmm2
movq %rbx, %rdi
movapd %xmm3, %xmm0
callq 0x3cfc6
movq %rbx, %rax
addq $0x10, %rsp
popq %rbx
popq %r14
popq %r15
retq