#pragma once #include struct CPUVersion { unsigned int stepping : 4; unsigned int model : 4; unsigned int family : 4; unsigned int type : 2; unsigned int __unused_1 : 2; unsigned int model_ex : 4; unsigned int family_ex : 8; unsigned int __unused_2 : 4; } __attribute__((packed, aligned(__alignof__(unsigned int)))); _Static_assert(sizeof(struct CPUVersion) == sizeof(unsigned int), "cpuid version struct size"); unsigned int family(const struct CPUVersion v) { if (v.family == 0x0f) return v.family + v.family_ex; else return v.family; } unsigned int model(const struct CPUVersion v) { switch (v.family) { case 0x06: case 0x0f: return ((unsigned int)v.model_ex << 4) | v.model; default: return v.model; } }