| 76 | } |
| 77 | |
| 78 | CPUFeatures::CPUFeatures(FEXCore::Context::Context& CTX) { |
| 79 | #ifdef _M_ARM_64EC |
| 80 | // Report as a 64-bit host for ARM64EC. |
| 81 | CpuInfo.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64; |
| 82 | #else |
| 83 | // Report as a 32-bit host for WoW64. |
| 84 | CpuInfo.ProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL; |
| 85 | #endif |
| 86 | |
| 87 | // Baseline FEX feature-set |
| 88 | CpuInfo.ProcessorFeatureBits = CPU_FEATURE_VME | CPU_FEATURE_TSC | CPU_FEATURE_CMOV | CPU_FEATURE_PGE | CPU_FEATURE_PSE | CPU_FEATURE_MTRR | |
| 89 | CPU_FEATURE_CX8 | CPU_FEATURE_MMX | CPU_FEATURE_X86 | CPU_FEATURE_PAT | CPU_FEATURE_FXSR | CPU_FEATURE_SEP | |
| 90 | CPU_FEATURE_SSE | CPU_FEATURE_3DNOW | CPU_FEATURE_SSE2 | CPU_FEATURE_SSE3 | CPU_FEATURE_CX128 | |
| 91 | CPU_FEATURE_NX | CPU_FEATURE_SSSE3 | CPU_FEATURE_SSE41 | CPU_FEATURE_PAE | CPU_FEATURE_DAZ; |
| 92 | |
| 93 | // Features that require specific host CPU support |
| 94 | const auto CPUIDResult01 = CTX.RunCPUIDFunction(0x01, 0); |
| 95 | if (CPUIDResult01.ecx & (1 << 20)) { |
| 96 | CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_SSE42; |
| 97 | } |
| 98 | if (CPUIDResult01.ecx & (1 << 27)) { |
| 99 | CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_XSAVE; |
| 100 | } |
| 101 | if (CPUIDResult01.ecx & (1 << 28)) { |
| 102 | CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_AVX; |
| 103 | } |
| 104 | |
| 105 | const auto CPUIDResult07 = CTX.RunCPUIDFunction(0x07, 0); |
| 106 | if (CPUIDResult07.ebx & (1 << 5)) { |
| 107 | CpuInfo.ProcessorFeatureBits |= CPU_FEATURE_AVX2; |
| 108 | } |
| 109 | |
| 110 | const auto FamilyIdentifier = CPUIDResult01.eax; |
| 111 | CpuInfo.ProcessorLevel = ((FamilyIdentifier >> 8) & 0xf) + ((FamilyIdentifier >> 20) & 0xff); // Family |
| 112 | CpuInfo.ProcessorRevision = (FamilyIdentifier & 0xf0000) >> 4; // Extended Model |
| 113 | CpuInfo.ProcessorRevision |= (FamilyIdentifier & 0xf0) << 4; // Model |
| 114 | CpuInfo.ProcessorRevision |= FamilyIdentifier & 0xf; // Stepping |
| 115 | } |
| 116 | |
| 117 | bool CPUFeatures::IsFeaturePresent(uint32_t Feature) { |
| 118 | switch (Feature) { |
nothing calls this directly
no test coverage detected