+#define DEFINE_FEATURE_FUNC(NAME, REGISTER, TYPE) \
+ bool cpuid_has_##NAME(int feature) \
+ { \
+ static uint32_t REGISTER; \
+ if (REGISTER == 0) \
+ REGISTER = fetch_##REGISTER(TYPE); \
+ return !!(REGISTER & feature); \
+ }
+
+DEFINE_FEATURE_FUNC(ecxfeature, ecx, CPUID_PROCINFO_AND_FEATUREBITS)
+DEFINE_FEATURE_FUNC(edxfeature, edx, CPUID_PROCINFO_AND_FEATUREBITS)
+
+DEFINE_FEATURE_FUNC(ecxfeature_ext, ecx, CPUID_EXTENDED_PROC_INFO_FEATURE_BITS)
+DEFINE_FEATURE_FUNC(edxfeature_ext, edx, CPUID_EXTENDED_PROC_INFO_FEATURE_BITS)
+
+#undef DEFINE_FEATURE_FUNC