diff options
-rw-r--r-- | ARMeilleure/CodeGen/X86/HardwareCapabilities.cs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs b/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs index 63a9e46a2..07cdcd096 100644 --- a/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs +++ b/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs | |||
@@ -34,6 +34,12 @@ namespace ARMeilleure.CodeGen.X86 | |||
34 | 34 | ||
35 | private static uint GetXcr0Eax() | 35 | private static uint GetXcr0Eax() |
36 | { | 36 | { |
37 | if (!FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Xsave)) | ||
38 | { | ||
39 | // XSAVE feature required for xgetbv | ||
40 | return 0; | ||
41 | } | ||
42 | |||
37 | ReadOnlySpan<byte> asmGetXcr0 = new byte[] | 43 | ReadOnlySpan<byte> asmGetXcr0 = new byte[] |
38 | { | 44 | { |
39 | 0x31, 0xc9, // xor ecx, ecx | 45 | 0x31, 0xc9, // xor ecx, ecx |
@@ -70,6 +76,7 @@ namespace ARMeilleure.CodeGen.X86 | |||
70 | Sse42 = 1 << 20, | 76 | Sse42 = 1 << 20, |
71 | Popcnt = 1 << 23, | 77 | Popcnt = 1 << 23, |
72 | Aes = 1 << 25, | 78 | Aes = 1 << 25, |
79 | Xsave = 1 << 26, | ||
73 | Osxsave = 1 << 27, | 80 | Osxsave = 1 << 27, |
74 | Avx = 1 << 28, | 81 | Avx = 1 << 28, |
75 | F16c = 1 << 29 | 82 | F16c = 1 << 29 |
@@ -118,9 +125,9 @@ namespace ARMeilleure.CodeGen.X86 | |||
118 | public static bool SupportsSse42 => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Sse42); | 125 | public static bool SupportsSse42 => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Sse42); |
119 | public static bool SupportsPopcnt => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Popcnt); | 126 | public static bool SupportsPopcnt => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Popcnt); |
120 | public static bool SupportsAesni => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Aes); | 127 | public static bool SupportsAesni => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Aes); |
121 | public static bool SupportsAvx => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Avx | FeatureFlags1Ecx.Osxsave) && Xcr0InfoEax.HasFlag(Xcr0FlagsEax.Sse | Xcr0FlagsEax.YmmHi128); | 128 | public static bool SupportsAvx => FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Avx | FeatureFlags1Ecx.Xsave | FeatureFlags1Ecx.Osxsave) && Xcr0InfoEax.HasFlag(Xcr0FlagsEax.Sse | Xcr0FlagsEax.YmmHi128); |
122 | public static bool SupportsAvx2 => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx2) && SupportsAvx; | 129 | public static bool SupportsAvx2 => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx2) && SupportsAvx; |
123 | public static bool SupportsAvx512F => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx512f) && FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Osxsave) | 130 | public static bool SupportsAvx512F => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx512f) && FeatureInfo1Ecx.HasFlag(FeatureFlags1Ecx.Xsave | FeatureFlags1Ecx.Osxsave) |
124 | && Xcr0InfoEax.HasFlag(Xcr0FlagsEax.Sse | Xcr0FlagsEax.YmmHi128 | Xcr0FlagsEax.Opmask | Xcr0FlagsEax.ZmmHi256 | Xcr0FlagsEax.Hi16Zmm); | 131 | && Xcr0InfoEax.HasFlag(Xcr0FlagsEax.Sse | Xcr0FlagsEax.YmmHi128 | Xcr0FlagsEax.Opmask | Xcr0FlagsEax.ZmmHi256 | Xcr0FlagsEax.Hi16Zmm); |
125 | public static bool SupportsAvx512Vl => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx512vl) && SupportsAvx512F; | 132 | public static bool SupportsAvx512Vl => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx512vl) && SupportsAvx512F; |
126 | public static bool SupportsAvx512Bw => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx512bw) && SupportsAvx512F; | 133 | public static bool SupportsAvx512Bw => FeatureInfo7Ebx.HasFlag(FeatureFlags7Ebx.Avx512bw) && SupportsAvx512F; |