diff --git a/include/bx/inline/simd128_neon.inl b/include/bx/inline/simd128_neon.inl index 8dd9f1f..207f2e7 100644 --- a/include/bx/inline/simd128_neon.inl +++ b/include/bx/inline/simd128_neon.inl @@ -536,7 +536,13 @@ BX_SIMD128_IMPLEMENT_TEST(yzw, yzww); template<> BX_SIMD_FORCE_INLINE simd128_neon_t simd_rcp(simd128_neon_t _a) { - return simd_rcp_ni(_a); + const simd128_neon_t tmp0 = simd_rcp_est(_a); + const simd128_neon_t tmp1 = vrecpsq_f32(_a, tmp0); + const simd128_neon_t tmp2 = simd_mul(tmp0, tmp1); + const simd128_neon_t tmp3 = vrecpsq_f32(_a, tmp2); + const simd128_neon_t result = simd_mul(tmp2, tmp3); + + return result; } template<> @@ -620,13 +626,21 @@ BX_SIMD128_IMPLEMENT_TEST(yzw, yzww); template<> BX_SIMD_FORCE_INLINE simd128_neon_t simd_rsqrt(simd128_neon_t _a) { - return simd_rsqrt_ni(_a); + const simd128_neon_t tmp0 = simd_rsqrt_est(_a); + const simd128_neon_t tmp1 = simd_mul(_a, tmp0); + const simd128_neon_t tmp2 = vrsqrtsq_f32(tmp1, tmp0); + const simd128_neon_t tmp3 = simd_mul(tmp0, tmp2); + const simd128_neon_t tmp4 = simd_mul(_a, tmp3); + const simd128_neon_t tmp5 = vrsqrtsq_f32(tmp4, tmp3); + const simd128_neon_t result = simd_mul(tmp3, tmp5); + + return result; } template<> BX_SIMD_FORCE_INLINE simd128_neon_t simd_rsqrt_nr(simd128_neon_t _a) { - return simd_rsqrt_nr_ni(_a); + return simd_rsqrt(_a); } template<> @@ -636,15 +650,18 @@ BX_SIMD128_IMPLEMENT_TEST(yzw, yzww); } template<> - BX_SIMD_FORCE_INLINE simd128_neon_t simd_sqrt_nr(simd128_neon_t _a) + BX_SIMD_FORCE_INLINE simd128_neon_t simd_sqrt(simd128_neon_t _a) { - return simd_sqrt_nr_ni(_a); + const simd128_neon_t rsqrt = simd_rsqrt(_a); + const simd128_neon_t result = simd_rcp(rsqrt); + + return result; } template<> - BX_SIMD_FORCE_INLINE simd128_neon_t simd_sqrt(simd128_neon_t _a) + BX_SIMD_FORCE_INLINE simd128_neon_t simd_sqrt_nr(simd128_neon_t _a) { - return simd_sqrt_nr_ni(_a); + return simd_sqrt(_a); } template<> diff --git a/tests/math_test.cpp b/tests/math_test.cpp index 4f1af15..5c98f6e 100644 --- a/tests/math_test.cpp +++ b/tests/math_test.cpp @@ -268,6 +268,15 @@ void mtxCheck(const float* _a, const float* _b) } } +TEST_CASE("vec3", "") +{ + bx::Vec3 normalized = bx::normalize({0.0f, 1.0f, 0.0f}); + REQUIRE(bx::isEqual(normalized, {0.0f, 1.0f, 0.0f}, 0.0f) ); + + float length = bx::length(normalized); + REQUIRE(bx::isEqual(length, 1.0f, 0.0f) ); +} + TEST_CASE("quaternion", "") { float mtxQ[16];