diff --git a/panda/src/linmath/cmath.I b/panda/src/linmath/cmath.I index 0ce5c2a28e..c7614c8136 100644 --- a/panda/src/linmath/cmath.I +++ b/panda/src/linmath/cmath.I @@ -21,6 +21,46 @@ INLINE float ccos(float v) { return cosf(v); } +INLINE void +sincosf(float v, float *pSinResult, float *pCosResult) { + +// msvc defines _M_IX86 for x86 +#ifdef _M_IX86 +#define fsincos __asm _emit 0xd9 __asm _emit 0xfb + __asm { + mov eax, pSinResult + mov edx, pCosResult + fld v + fsincos + fstp DWORD ptr [edx] + fstp DWORD ptr [eax] + } +#undef fsincos +#else //!_X86_ + *pSinResult = sinf(v); + *pCosResult = cosf(v); +#endif //!_X86_ +} + +INLINE void +sincos(double v, double *pSinResult, double *pCosResult) { +#ifdef _M_IX86 +#define sincos __asm _emit 0xd9 __asm _emit 0xfb + __asm { + mov eax, pSinResult + mov edx, pCosResult + fld v + fsincos + fstp QWORD ptr [edx] + fstp QWORD ptr [eax] + } +#undef sincos +#else //!_X86_ + *pSinResult = sin(v); + *pCosResult = cos(v); +#endif //!_X86_ +} + INLINE float cabs(float v) { return fabs(v); } diff --git a/panda/src/linmath/cmath.h b/panda/src/linmath/cmath.h index d7121b14a3..060dd18af1 100644 --- a/panda/src/linmath/cmath.h +++ b/panda/src/linmath/cmath.h @@ -17,6 +17,7 @@ INLINE float csqrt(float v); INLINE float csin(float v); INLINE float ccos(float v); +INLINE void csincos(float v, float *pSinResult, float *pCosResult); // does both at once (faster on x86) INLINE float cabs(float v); INLINE float catan2(float y, float x); @@ -25,6 +26,7 @@ INLINE double csin(double v); INLINE double ccos(double v); INLINE double cabs(double v); INLINE double catan2(double y, double x); +INLINE void csincos(double v, double *pSinResult, double *pCosResult); // does both at once (faster on x86) // Returns true if the number is nan, false if it's a genuine number // or infinity.