ソースを参照

Neon: Fixed sqrt.

Бранимир Караџић 2 年 前
コミット
746747f01f
2 ファイル変更9 行追加1 行削除
  1. 1 1
      include/bx/inline/simd128_neon.inl
  2. 8 0
      tests/math_test.cpp

+ 1 - 1
include/bx/inline/simd128_neon.inl

@@ -653,7 +653,7 @@ BX_SIMD128_IMPLEMENT_TEST(yzw, yzww);
 	BX_SIMD_FORCE_INLINE simd128_neon_t simd_sqrt(simd128_neon_t _a)
 	{
 		const simd128_neon_t rsqrt  = simd_rsqrt(_a);
-		const simd128_neon_t result = simd_rcp(rsqrt);
+		const simd128_neon_t result = simd_mul(_a, rsqrt);
 
 		return result;
 	}

+ 8 - 0
tests/math_test.cpp

@@ -17,9 +17,13 @@ TEST_CASE("isFinite, isInfinite, isNan", "")
 	{
 		union { uint32_t ui; float f; } u = { uint32_t(ii) };
 
+#if BX_PLATFORM_OSX
+		BX_UNUSED(u);
+#else
 		REQUIRE(::isnanf(u.f)  == bx::isNan(u.f) );
 		REQUIRE(::finitef(u.f) == bx::isFinite(u.f) );
 		REQUIRE(::isinff(u.f)  == bx::isInfinite(u.f) );
+#endif // BX_PLATFORM_OSX
 	}
 }
 
@@ -106,6 +110,10 @@ TEST_CASE("libm", "")
 		REQUIRE(bx::isEqual(bx::rsqrt(xx), 1.0f/::sqrtf(xx), 0.00001f) );
 	}
 
+	REQUIRE(bx::isNan(bx::sqrt(-1.0f) ) );
+	REQUIRE(bx::isEqual(bx::sqrt(0.0f), 0.0f, 0.0f) );
+	REQUIRE(bx::isEqual(bx::sqrt(1.0f), 1.0f, 0.0f) );
+
 	for (float xx = 0.0f; xx < 1000000.0f; xx += 1000.f)
 	{
 		bx::write(writer, &err, "sqrt(%f) == %f (expected: %f)\n", xx, bx::sqrt(xx), ::sqrtf(xx) );