diff --git a/include/cglm/quat.h b/include/cglm/quat.h index c76fa03..cec3a90 100644 --- a/include/cglm/quat.h +++ b/include/cglm/quat.h @@ -70,6 +70,10 @@ # include "simd/neon/quat.h" #endif +#ifdef CGLM_SIMD_WASM +# include "simd/wasm/quat.h" +#endif + CGLM_INLINE void glm_quat_normalize(versor q); /* @@ -252,6 +256,20 @@ glm_quat_normalize_to(versor q, versor dest) { } glmm_store(dest, _mm_div_ps(x0, _mm_sqrt_ps(xdot))); +#elif defined(__wasm__) && defined(__wasm_simd128__) + glmm_128 xdot, x0; + float dot; + + x0 = glmm_load(q); + xdot = glmm_vdot(x0, x0); + dot = _mm_cvtss_f32(xdot); + + if (dot <= 0.0f) { + glm_quat_identity(dest); + return; + } + + glmm_store(dest, wasm_f32x4_div(x0, wasm_f32x4_sqrt(xdot))); #else float dot; @@ -440,6 +458,8 @@ glm_quat_mul(versor p, versor q, versor dest) { */ #if defined( __SSE__ ) || defined( __SSE2__ ) glm_quat_mul_sse2(p, q, dest); +#elif defined(__wasm__) && defined(__wasm_simd128__) + glm_quat_mul_wasm(p, q, dest); #elif defined(CGLM_NEON_FP) glm_quat_mul_neon(p, q, dest); #else diff --git a/include/cglm/simd/wasm/quat.h b/include/cglm/simd/wasm/quat.h index a052189..8367214 100644 --- a/include/cglm/simd/wasm/quat.h +++ b/include/cglm/simd/wasm/quat.h @@ -14,7 +14,7 @@ CGLM_INLINE void -glm_quat_mul_sse2(versor p, versor q, versor dest) { +glm_quat_mul_wasm(versor p, versor q, versor dest) { /* + (a1 b2 + b1 a2 + c1 d2 − d1 c2)i + (a1 c2 − b1 d2 + c1 a2 + d1 b2)j @@ -26,7 +26,7 @@ glm_quat_mul_sse2(versor p, versor q, versor dest) { xp = glmm_load(p); /* 3 2 1 0 */ xq = glmm_load(q); - x1 = wasm_f32x4_make(-0.f, 0.f, -0.f, 0.f); /* TODO: _mm_set1_ss() + shuff ? */ + x1 = _mm_set_ps(-0.f, 0.f, -0.f, 0.f); /* TODO: _mm_set1_ss() + shuff ? */ r = wasm_f32x4_mul(glmm_splat_w(xp), xq); x2 = _mm_unpackhi_ps(x1, x1);