]> wimlib.net Git - wimlib/blobdiff - include/wimlib/x86_cpu_features.h
Add support for runtime x86 CPU feature detection
[wimlib] / include / wimlib / x86_cpu_features.h
diff --git a/include/wimlib/x86_cpu_features.h b/include/wimlib/x86_cpu_features.h
new file mode 100644 (file)
index 0000000..e57742b
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef _WIMLIB_X86_CPU_FEATURES_H
+#define _WIMLIB_X86_CPU_FEATURES_H
+
+#include "wimlib/types.h"
+
+#if defined(__i386__) || defined(__x86_64__)
+
+#define X86_CPU_FEATURE_SSE            0x00000001
+#define X86_CPU_FEATURE_SSE2           0x00000002
+#define X86_CPU_FEATURE_SSE3           0x00000004
+#define X86_CPU_FEATURE_SSSE3          0x00000008
+#define X86_CPU_FEATURE_SSE4_1         0x00000010
+#define X86_CPU_FEATURE_SSE4_2         0x00000020
+#define X86_CPU_FEATURE_AVX            0x00000040
+#define X86_CPU_FEATURE_BMI            0x00000080
+#define X86_CPU_FEATURE_AVX2           0x00000100
+#define X86_CPU_FEATURE_BMI2           0x00000200
+
+#define X86_CPU_FEATURES_KNOWN         0x80000000
+
+extern u32 _x86_cpu_features;
+
+extern void
+x86_setup_cpu_features(void);
+
+/* Does the processor has the specified feature?  */
+static inline bool
+x86_have_cpu_feature(u32 feature)
+{
+       if (!(_x86_cpu_features & X86_CPU_FEATURES_KNOWN))
+               x86_setup_cpu_features();
+       return _x86_cpu_features & feature;
+}
+
+#else
+
+static inline bool
+x86_have_cpu_feature(u32 feature)
+{
+       return false;
+}
+
+#endif /* __i386__ || __x86_64__ */
+
+#endif /* _WIMLIB_X86_CPU_FEATURES_H */