From cf705d6fa4a4b1d6a51c18c79abe5c0865e573c8 Mon Sep 17 00:00:00 2001 From: Nassim Amar Date: Sun, 1 Feb 2015 05:41:07 -0800 Subject: [PATCH 1/2] Fix for 64bit builds btSqrt Fix issue with btSqrt with macro USE_APPROXIMATION turned on. --- src/LinearMath/btScalar.h | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/LinearMath/btScalar.h b/src/LinearMath/btScalar.h index fdb736272..356dda71c 100644 --- a/src/LinearMath/btScalar.h +++ b/src/LinearMath/btScalar.h @@ -418,21 +418,32 @@ SIMD_FORCE_INLINE btScalar btFmod(btScalar x,btScalar y) { return fmod(x,y); } SIMD_FORCE_INLINE btScalar btSqrt(btScalar y) { #ifdef USE_APPROXIMATION +#ifdef __arm__ double x, z, tempf; unsigned long *tfptr = ((unsigned long *)&tempf) + 1; - - tempf = y; - *tfptr = (0xbfcdd90a - *tfptr)>>1; /* estimate of 1/sqrt(y) */ - x = tempf; - z = y*btScalar(0.5); - x = (btScalar(1.5)*x)-(x*x)*(x*z); /* iteration formula */ - x = (btScalar(1.5)*x)-(x*x)*(x*z); - x = (btScalar(1.5)*x)-(x*x)*(x*z); - x = (btScalar(1.5)*x)-(x*x)*(x*z); - x = (btScalar(1.5)*x)-(x*x)*(x*z); - return x*y; + tempf = y; + *tfptr = (0xbfcdd90a - *tfptr)>>1; /* estimate of 1/sqrt(y) */ + x = tempf; + z = y*btScalar(0.5); + x = (btScalar(1.5)*x)-(x*x)*(x*z); /* iteration formula */ + x = (btScalar(1.5)*x)-(x*x)*(x*z); + x = (btScalar(1.5)*x)-(x*x)*(x*z); + x = (btScalar(1.5)*x)-(x*x)*(x*z); + x = (btScalar(1.5)*x)-(x*x)*(x*z); + return x*y; +#elif __arm64__ + float xhalf = 0.5f*y; + int i = *(int*)&y; + i = 0x5f375a86 - (i>>1); + y = *(float*)&i; + y = y*(1.5f - xhalf*y*y); + y = y*(1.5f - xhalf*y*y); + y = y*(1.5f - xhalf*y*y); + y=1/y; + return y; +#endif #else - return sqrtf(y); + return sqrtf(y); #endif } SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabsf(x); } From e9c7f3a0d2b6d08d05af732d30849b7d2d864fa7 Mon Sep 17 00:00:00 2001 From: Nassim Amar Date: Sun, 1 Feb 2015 14:32:37 -0800 Subject: [PATCH 2/2] Fixed macro's to detect 64bit --- src/LinearMath/btScalar.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/LinearMath/btScalar.h b/src/LinearMath/btScalar.h index 356dda71c..abed6cbdd 100644 --- a/src/LinearMath/btScalar.h +++ b/src/LinearMath/btScalar.h @@ -418,7 +418,17 @@ SIMD_FORCE_INLINE btScalar btFmod(btScalar x,btScalar y) { return fmod(x,y); } SIMD_FORCE_INLINE btScalar btSqrt(btScalar y) { #ifdef USE_APPROXIMATION -#ifdef __arm__ +#ifdef __LP64__ + float xhalf = 0.5f*y; + int i = *(int*)&y; + i = 0x5f375a86 - (i>>1); + y = *(float*)&i; + y = y*(1.5f - xhalf*y*y); + y = y*(1.5f - xhalf*y*y); + y = y*(1.5f - xhalf*y*y); + y=1/y; + return y; +#else double x, z, tempf; unsigned long *tfptr = ((unsigned long *)&tempf) + 1; tempf = y; @@ -431,19 +441,9 @@ SIMD_FORCE_INLINE btScalar btSqrt(btScalar y) x = (btScalar(1.5)*x)-(x*x)*(x*z); x = (btScalar(1.5)*x)-(x*x)*(x*z); return x*y; -#elif __arm64__ - float xhalf = 0.5f*y; - int i = *(int*)&y; - i = 0x5f375a86 - (i>>1); - y = *(float*)&i; - y = y*(1.5f - xhalf*y*y); - y = y*(1.5f - xhalf*y*y); - y = y*(1.5f - xhalf*y*y); - y=1/y; - return y; #endif #else - return sqrtf(y); + return sqrtf(y); #endif } SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabsf(x); }