123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- /*
- * 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
|