--- /dev/null
+#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 */