diff options
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/misc/mptCPU.h')
-rw-r--r-- | Src/external_dependencies/openmpt-trunk/misc/mptCPU.h | 93 |
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 |