HardwareCapabilities.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. using System.Runtime.Intrinsics.X86;
  3. namespace ARMeilleure.CodeGen.X86
  4. {
  5. static class HardwareCapabilities
  6. {
  7. static HardwareCapabilities()
  8. {
  9. if (!X86Base.IsSupported)
  10. {
  11. return;
  12. }
  13. (_, _, int ecx, int edx) = X86Base.CpuId(0x00000001, 0x00000000);
  14. FeatureInfoEdx = (FeatureFlagsEdx)edx;
  15. FeatureInfoEcx = (FeatureFlagsEcx)ecx;
  16. }
  17. [Flags]
  18. public enum FeatureFlagsEdx
  19. {
  20. Sse = 1 << 25,
  21. Sse2 = 1 << 26
  22. }
  23. [Flags]
  24. public enum FeatureFlagsEcx
  25. {
  26. Sse3 = 1 << 0,
  27. Pclmulqdq = 1 << 1,
  28. Ssse3 = 1 << 9,
  29. Fma = 1 << 12,
  30. Sse41 = 1 << 19,
  31. Sse42 = 1 << 20,
  32. Popcnt = 1 << 23,
  33. Aes = 1 << 25,
  34. Avx = 1 << 28,
  35. F16c = 1 << 29
  36. }
  37. public static FeatureFlagsEdx FeatureInfoEdx { get; }
  38. public static FeatureFlagsEcx FeatureInfoEcx { get; }
  39. public static bool SupportsSse => FeatureInfoEdx.HasFlag(FeatureFlagsEdx.Sse);
  40. public static bool SupportsSse2 => FeatureInfoEdx.HasFlag(FeatureFlagsEdx.Sse2);
  41. public static bool SupportsSse3 => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Sse3);
  42. public static bool SupportsPclmulqdq => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Pclmulqdq);
  43. public static bool SupportsSsse3 => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Ssse3);
  44. public static bool SupportsFma => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Fma);
  45. public static bool SupportsSse41 => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Sse41);
  46. public static bool SupportsSse42 => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Sse42);
  47. public static bool SupportsPopcnt => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Popcnt);
  48. public static bool SupportsAesni => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Aes);
  49. public static bool SupportsAvx => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.Avx);
  50. public static bool SupportsF16c => FeatureInfoEcx.HasFlag(FeatureFlagsEcx.F16c);
  51. public static bool ForceLegacySse { get; set; }
  52. public static bool SupportsVexEncoding => SupportsAvx && !ForceLegacySse;
  53. }
  54. }