2
0
georges 25 жил өмнө
parent
commit
432777a74a

+ 40 - 0
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);
 }

+ 2 - 0
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.