diff options
Diffstat (limited to 'extern/bullet2/src/LinearMath/btQuadWord.h')
-rw-r--r-- | extern/bullet2/src/LinearMath/btQuadWord.h | 108 |
1 files changed, 86 insertions, 22 deletions
diff --git a/extern/bullet2/src/LinearMath/btQuadWord.h b/extern/bullet2/src/LinearMath/btQuadWord.h index d5e9daa45a2..11067ef47d9 100644 --- a/extern/bullet2/src/LinearMath/btQuadWord.h +++ b/extern/bullet2/src/LinearMath/btQuadWord.h @@ -20,6 +20,9 @@ subject to the following restrictions: #include "btMinMax.h" + + + #if defined (__CELLOS_LV2) && defined (__SPU__) #include <altivec.h> #endif @@ -47,11 +50,53 @@ public: } protected: #else //__CELLOS_LV2__ __SPU__ + +#if defined(BT_USE_SSE) || defined(BT_USE_NEON) + union { + btSimdFloat4 mVec128; + btScalar m_floats[4]; + }; +public: + SIMD_FORCE_INLINE btSimdFloat4 get128() const + { + return mVec128; + } + SIMD_FORCE_INLINE void set128(btSimdFloat4 v128) + { + mVec128 = v128; + } +#else btScalar m_floats[4]; +#endif // BT_USE_SSE + #endif //__CELLOS_LV2__ __SPU__ public: +#if defined(BT_USE_SSE) || defined(BT_USE_NEON) + + // Set Vector + SIMD_FORCE_INLINE btQuadWord(const btSimdFloat4 vec) + { + mVec128 = vec; + } + + // Copy constructor + SIMD_FORCE_INLINE btQuadWord(const btQuadWord& rhs) + { + mVec128 = rhs.mVec128; + } + + // Assignment Operator + SIMD_FORCE_INLINE btQuadWord& + operator=(const btQuadWord& v) + { + mVec128 = v.mVec128; + + return *this; + } + +#endif /**@brief Return the x value */ SIMD_FORCE_INLINE const btScalar& getX() const { return m_floats[0]; } @@ -60,13 +105,13 @@ protected: /**@brief Return the z value */ SIMD_FORCE_INLINE const btScalar& getZ() const { return m_floats[2]; } /**@brief Set the x value */ - SIMD_FORCE_INLINE void setX(btScalar x) { m_floats[0] = x;}; + SIMD_FORCE_INLINE void setX(btScalar _x) { m_floats[0] = _x;}; /**@brief Set the y value */ - SIMD_FORCE_INLINE void setY(btScalar y) { m_floats[1] = y;}; + SIMD_FORCE_INLINE void setY(btScalar _y) { m_floats[1] = _y;}; /**@brief Set the z value */ - SIMD_FORCE_INLINE void setZ(btScalar z) { m_floats[2] = z;}; + SIMD_FORCE_INLINE void setZ(btScalar _z) { m_floats[2] = _z;}; /**@brief Set the w value */ - SIMD_FORCE_INLINE void setW(btScalar w) { m_floats[3] = w;}; + SIMD_FORCE_INLINE void setW(btScalar _w) { m_floats[3] = _w;}; /**@brief Return the x value */ SIMD_FORCE_INLINE const btScalar& x() const { return m_floats[0]; } /**@brief Return the y value */ @@ -84,7 +129,14 @@ protected: SIMD_FORCE_INLINE bool operator==(const btQuadWord& other) const { - return ((m_floats[3]==other.m_floats[3]) && (m_floats[2]==other.m_floats[2]) && (m_floats[1]==other.m_floats[1]) && (m_floats[0]==other.m_floats[0])); +#ifdef BT_USE_SSE + return (0xf == _mm_movemask_ps((__m128)_mm_cmpeq_ps(mVec128, other.mVec128))); +#else + return ((m_floats[3]==other.m_floats[3]) && + (m_floats[2]==other.m_floats[2]) && + (m_floats[1]==other.m_floats[1]) && + (m_floats[0]==other.m_floats[0])); +#endif } SIMD_FORCE_INLINE bool operator!=(const btQuadWord& other) const @@ -97,11 +149,11 @@ protected: * @param y Value of y * @param z Value of z */ - SIMD_FORCE_INLINE void setValue(const btScalar& x, const btScalar& y, const btScalar& z) + SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z) { - m_floats[0]=x; - m_floats[1]=y; - m_floats[2]=z; + m_floats[0]=_x; + m_floats[1]=_y; + m_floats[2]=_z; m_floats[3] = 0.f; } @@ -118,12 +170,12 @@ protected: * @param z Value of z * @param w Value of w */ - SIMD_FORCE_INLINE void setValue(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w) + SIMD_FORCE_INLINE void setValue(const btScalar& _x, const btScalar& _y, const btScalar& _z,const btScalar& _w) { - m_floats[0]=x; - m_floats[1]=y; - m_floats[2]=z; - m_floats[3]=w; + m_floats[0]=_x; + m_floats[1]=_y; + m_floats[2]=_z; + m_floats[3]=_w; } /**@brief No initialization constructor */ SIMD_FORCE_INLINE btQuadWord() @@ -136,9 +188,9 @@ protected: * @param y Value of y * @param z Value of z */ - SIMD_FORCE_INLINE btQuadWord(const btScalar& x, const btScalar& y, const btScalar& z) + SIMD_FORCE_INLINE btQuadWord(const btScalar& _x, const btScalar& _y, const btScalar& _z) { - m_floats[0] = x, m_floats[1] = y, m_floats[2] = z, m_floats[3] = 0.0f; + m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = 0.0f; } /**@brief Initializing constructor @@ -147,9 +199,9 @@ protected: * @param z Value of z * @param w Value of w */ - SIMD_FORCE_INLINE btQuadWord(const btScalar& x, const btScalar& y, const btScalar& z,const btScalar& w) + SIMD_FORCE_INLINE btQuadWord(const btScalar& _x, const btScalar& _y, const btScalar& _z,const btScalar& _w) { - m_floats[0] = x, m_floats[1] = y, m_floats[2] = z, m_floats[3] = w; + m_floats[0] = _x, m_floats[1] = _y, m_floats[2] = _z, m_floats[3] = _w; } /**@brief Set each element to the max of the current values and the values of another btQuadWord @@ -157,21 +209,33 @@ protected: */ SIMD_FORCE_INLINE void setMax(const btQuadWord& other) { - btSetMax(m_floats[0], other.m_floats[0]); + #ifdef BT_USE_SSE + mVec128 = _mm_max_ps(mVec128, other.mVec128); + #elif defined(BT_USE_NEON) + mVec128 = vmaxq_f32(mVec128, other.mVec128); + #else + btSetMax(m_floats[0], other.m_floats[0]); btSetMax(m_floats[1], other.m_floats[1]); btSetMax(m_floats[2], other.m_floats[2]); btSetMax(m_floats[3], other.m_floats[3]); - } + #endif + } /**@brief Set each element to the min of the current values and the values of another btQuadWord * @param other The other btQuadWord to compare with */ SIMD_FORCE_INLINE void setMin(const btQuadWord& other) { - btSetMin(m_floats[0], other.m_floats[0]); + #ifdef BT_USE_SSE + mVec128 = _mm_min_ps(mVec128, other.mVec128); + #elif defined(BT_USE_NEON) + mVec128 = vminq_f32(mVec128, other.mVec128); + #else + btSetMin(m_floats[0], other.m_floats[0]); btSetMin(m_floats[1], other.m_floats[1]); btSetMin(m_floats[2], other.m_floats[2]); btSetMin(m_floats[3], other.m_floats[3]); - } + #endif + } |