aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/misc/mptCPU.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/misc/mptCPU.h')
-rw-r--r--Src/external_dependencies/openmpt-trunk/misc/mptCPU.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/misc/mptCPU.h b/Src/external_dependencies/openmpt-trunk/misc/mptCPU.h
new file mode 100644
index 00000000..e260c6f1
--- /dev/null
+++ b/Src/external_dependencies/openmpt-trunk/misc/mptCPU.h
@@ -0,0 +1,93 @@
+/*
+ * mptCPU.h
+ * --------
+ * Purpose: CPU feature detection.
+ * Notes : (currently none)
+ * Authors: OpenMPT Devs
+ * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
+ */
+
+
+#pragma once
+
+#include "openmpt/all/BuildSettings.hpp"
+
+
+OPENMPT_NAMESPACE_BEGIN
+
+
+namespace CPU
+{
+
+
+namespace feature {
+inline constexpr uint32 lm = 0x00004; // Processor supports long mode (amd64)
+inline constexpr uint32 mmx = 0x00010; // Processor supports MMX instructions
+inline constexpr uint32 sse = 0x00100; // Processor supports SSE instructions
+inline constexpr uint32 sse2 = 0x00200; // Processor supports SSE2 instructions
+inline constexpr uint32 sse3 = 0x00400; // Processor supports SSE3 instructions
+inline constexpr uint32 ssse3 = 0x00800; // Processor supports SSSE3 instructions
+inline constexpr uint32 sse4_1 = 0x01000; // Processor supports SSE4.1 instructions
+inline constexpr uint32 sse4_2 = 0x02000; // Processor supports SSE4.2 instructions
+inline constexpr uint32 avx = 0x10000; // Processor supports AVX instructions
+inline constexpr uint32 avx2 = 0x20000; // Processor supports AVX2 instructions
+} // namespace feature
+
+
+#ifdef MPT_ENABLE_ARCH_INTRINSICS
+
+
+extern uint32 EnabledFeatures;
+
+
+struct Info
+{
+public:
+ uint32 AvailableFeatures = 0;
+ uint32 CPUID = 0;
+ char VendorID[16+1] = {};
+ char BrandID[4*4*3+1] = {};
+ uint16 Family = 0;
+ uint8 Model = 0;
+ uint8 Stepping = 0;
+private:
+ Info();
+public:
+ static const Info & Get();
+};
+
+
+void EnableAvailableFeatures();
+
+
+struct AvailableFeaturesEnabler
+{
+ AvailableFeaturesEnabler()
+ {
+ EnableAvailableFeatures();
+ }
+};
+
+
+// enabled processor features for inline asm and intrinsics
+MPT_FORCEINLINE uint32 GetEnabledFeatures()
+{
+ return EnabledFeatures;
+}
+
+MPT_FORCEINLINE bool HasFeatureSet(uint32 features)
+{
+ return features == (GetEnabledFeatures() & features);
+}
+
+
+#endif // MPT_ENABLE_ARCH_INTRINSICS
+
+
+uint32 GetMinimumFeatures();
+
+
+} // namespace CPU
+
+
+OPENMPT_NAMESPACE_END