#include <stdint.h>
void cpuid(uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) {
#ifdef _MSC_VER
uint32_t regs[4];
__cpuidex((int *)regs, *eax, *ecx);
*eax = regs[0], *ebx = regs[1], *ecx = regs[2], *edx = regs[3];
#else
asm volatile(
#if defined(__i386__) && defined(__PIC__)
"mov %%ebx, %%edi;"
"cpuid;"
"xchgl %%ebx, %%edi;"
:
"+a" (*eax),
"=D" (*ebx),
#else
"cpuid"
:
"+a"(*eax),
"=b"(*ebx),
#endif
"+c"(*ecx),
"=d"(*edx));
#endif
}