Skip to content

Instantly share code, notes, and snippets.

@pedrogk
Created November 12, 2013 07:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pedrogk/7427009 to your computer and use it in GitHub Desktop.
Save pedrogk/7427009 to your computer and use it in GitHub Desktop.
Código para parsear la salida del comando cpuid y determinar las capacidades del procesador.
#include <stdio.h>
#define HT_FLAG 0x10000000
#define SSE_FLAG 0x02000000
#define SSE2_FLAG 0x04000000
#define SSSE3_FLAG 0x00000200
#define SSE4_1_FLAG 0x00080000
#define SSE4_2_FLAG 0x00100000
void cpuid(unsigned info, unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
{
*eax = info;
asm volatile(
"mov %%ebx, %%edi;"
"cpuid;"
"mov %%ebx, %%esi;"
"mov %%edi, %%ebx;"
:"+a" (*eax), "=S" (*ebx), "=c" (*ecx), "=d" (*edx)
: :"edi");
}
void cpuid_parse(char *buf)
{
unsigned eax, ebx, ecx, edx;
int i=0;
cpuid(1, &eax, &ebx, &ecx, &edx);
i+=sprintf(buf+i, "CPUID Features(EAX=1): ECX=0x%08x EDX=0x%08x\n", ecx, edx);
if (edx & HT_FLAG) i+=sprintf(buf+i, "HT: YES\n"); else i+=sprintf(buf+i, "HT: NO\n");
if (edx & SSE_FLAG) i+=sprintf(buf+i, "SSE: YES\n"); else i+=sprintf(buf+i, "SSE: NO\n");
if (edx & SSE2_FLAG) i+=sprintf(buf+i, "SSE2: YES\n"); else i+=sprintf(buf+i, "SSE2: NO\n");
if (ecx & SSSE3_FLAG) i+=sprintf(buf+i, "SSSE3: YES\n"); else i+=sprintf(buf+i, "SSE3: NO\n");
if (ecx & SSE4_1_FLAG) i+=sprintf(buf+i, "SSE4_1: YES\n"); else i+=sprintf(buf+i, "SSE4_1: NO\n");
if (ecx & SSE4_2_FLAG) i+=sprintf(buf+i, "SSE4_2: YES\n"); else i+=sprintf(buf+i, "SSE4_2: NO\n");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment