aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/CodeGen/X86/HardwareCapabilities.cs')
-rw-r--r--ARMeilleure/CodeGen/X86/HardwareCapabilities.cs52
1 files changed, 52 insertions, 0 deletions
diff --git a/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs b/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs
new file mode 100644
index 00000000..7f930d6b
--- /dev/null
+++ b/ARMeilleure/CodeGen/X86/HardwareCapabilities.cs
@@ -0,0 +1,52 @@
+using ARMeilleure.IntermediateRepresentation;
+using ARMeilleure.Translation;
+
+namespace ARMeilleure.CodeGen.X86
+{
+ static class HardwareCapabilities
+ {
+ private delegate ulong GetFeatureInfo();
+
+ private static ulong _featureInfo;
+
+ public static bool SupportsSse3 => (_featureInfo & (1UL << 0)) != 0;
+ public static bool SupportsPclmulqdq => (_featureInfo & (1UL << 1)) != 0;
+ public static bool SupportsSsse3 => (_featureInfo & (1UL << 9)) != 0;
+ public static bool SupportsFma => (_featureInfo & (1UL << 12)) != 0;
+ public static bool SupportsCx16 => (_featureInfo & (1UL << 13)) != 0;
+ public static bool SupportsSse41 => (_featureInfo & (1UL << 19)) != 0;
+ public static bool SupportsSse42 => (_featureInfo & (1UL << 20)) != 0;
+ public static bool SupportsPopcnt => (_featureInfo & (1UL << 23)) != 0;
+ public static bool SupportsAesni => (_featureInfo & (1UL << 25)) != 0;
+ public static bool SupportsAvx => (_featureInfo & (1UL << 28)) != 0;
+ public static bool SupportsF16c => (_featureInfo & (1UL << 29)) != 0;
+
+ public static bool SupportsSse => (_featureInfo & (1UL << 32 + 25)) != 0;
+ public static bool SupportsSse2 => (_featureInfo & (1UL << 32 + 26)) != 0;
+
+ public static bool ForceLegacySse { get; set; }
+
+ public static bool SupportsVexEncoding => !ForceLegacySse && SupportsAvx;
+
+ static HardwareCapabilities()
+ {
+ EmitterContext context = new EmitterContext();
+
+ Operand featureInfo = context.CpuId();
+
+ context.Return(featureInfo);
+
+ ControlFlowGraph cfg = context.GetControlFlowGraph();
+
+ OperandType[] argTypes = new OperandType[0];
+
+ GetFeatureInfo getFeatureInfo = Compiler.Compile<GetFeatureInfo>(
+ cfg,
+ argTypes,
+ OperandType.I64,
+ CompilerOptions.HighCq);
+
+ _featureInfo = getFeatureInfo();
+ }
+ }
+} \ No newline at end of file