summaryrefslogtreecommitdiff
path: root/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/bullet/LinearMath/btCpuFeatureUtility.h')
-rw-r--r--thirdparty/bullet/LinearMath/btCpuFeatureUtility.h92
1 files changed, 92 insertions, 0 deletions
diff --git a/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h b/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h
new file mode 100644
index 0000000000..d2cab52d48
--- /dev/null
+++ b/thirdparty/bullet/LinearMath/btCpuFeatureUtility.h
@@ -0,0 +1,92 @@
+
+#ifndef BT_CPU_UTILITY_H
+#define BT_CPU_UTILITY_H
+
+#include "LinearMath/btScalar.h"
+
+#include <string.h>//memset
+#ifdef USE_SIMD
+#include <emmintrin.h>
+#ifdef BT_ALLOW_SSE4
+#include <intrin.h>
+#endif //BT_ALLOW_SSE4
+#endif //USE_SIMD
+
+#if defined BT_USE_NEON
+#define ARM_NEON_GCC_COMPATIBILITY 1
+#include <arm_neon.h>
+#include <sys/types.h>
+#include <sys/sysctl.h> //for sysctlbyname
+#endif //BT_USE_NEON
+
+///Rudimentary btCpuFeatureUtility for CPU features: only report the features that Bullet actually uses (SSE4/FMA3, NEON_HPFP)
+///We assume SSE2 in case BT_USE_SSE2 is defined in LinearMath/btScalar.h
+class btCpuFeatureUtility
+{
+public:
+ enum btCpuFeature
+ {
+ CPU_FEATURE_FMA3=1,
+ CPU_FEATURE_SSE4_1=2,
+ CPU_FEATURE_NEON_HPFP=4
+ };
+
+ static int getCpuFeatures()
+ {
+
+ static int capabilities = 0;
+ static bool testedCapabilities = false;
+ if (0 != testedCapabilities)
+ {
+ return capabilities;
+ }
+
+#ifdef BT_USE_NEON
+ {
+ uint32_t hasFeature = 0;
+ size_t featureSize = sizeof(hasFeature);
+ int err = sysctlbyname("hw.optional.neon_hpfp", &hasFeature, &featureSize, NULL, 0);
+ if (0 == err && hasFeature)
+ capabilities |= CPU_FEATURE_NEON_HPFP;
+ }
+#endif //BT_USE_NEON
+
+#ifdef BT_ALLOW_SSE4
+ {
+ int cpuInfo[4];
+ memset(cpuInfo, 0, sizeof(cpuInfo));
+ unsigned long long sseExt = 0;
+ __cpuid(cpuInfo, 1);
+
+ bool osUsesXSAVE_XRSTORE = cpuInfo[2] & (1 << 27) || false;
+ bool cpuAVXSuport = cpuInfo[2] & (1 << 28) || false;
+
+ if (osUsesXSAVE_XRSTORE && cpuAVXSuport)
+ {
+ sseExt = _xgetbv(0);
+ }
+ const int OSXSAVEFlag = (1UL << 27);
+ const int AVXFlag = ((1UL << 28) | OSXSAVEFlag);
+ const int FMAFlag = ((1UL << 12) | AVXFlag | OSXSAVEFlag);
+ if ((cpuInfo[2] & FMAFlag) == FMAFlag && (sseExt & 6) == 6)
+ {
+ capabilities |= btCpuFeatureUtility::CPU_FEATURE_FMA3;
+ }
+
+ const int SSE41Flag = (1 << 19);
+ if (cpuInfo[2] & SSE41Flag)
+ {
+ capabilities |= btCpuFeatureUtility::CPU_FEATURE_SSE4_1;
+ }
+ }
+#endif//BT_ALLOW_SSE4
+
+ testedCapabilities = true;
+ return capabilities;
+ }
+
+
+};
+
+
+#endif //BT_CPU_UTILITY_H