Skip to content
Snippets Groups Projects
cpuid.c 1.69 KiB
Newer Older
  • Learn to ignore specific revisions
  • jansik's avatar
    jansik committed
    //by Branislav Jansik, IT4Innovations, 2015-2016
    #include <stdio.h>
    unsigned getbits(unsigned x, int p, int n)
    {
    return (x >> (p+1-n)) & ~(~0 << n);
    }
    
    void cpuid(unsigned infoa, unsigned infoc, unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
    {
        __asm__(
            "cpuid"                                           
            :"=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) /* outputs */
            :"a" (infoa), "c" (infoc)                           /* input: info into eax, ecx */
        );
    }
    
    int main(void) {
    unsigned eax, ebx, ecx, edx;
    
    cpuid(0x80000001,0,&eax,&ebx,&ecx,&edx);
    printf("x86_64    : %d\n", (int) getbits(edx,29,1));
    
    cpuid(1,0,&eax,&ebx,&ecx,&edx);
    
    printf("MMX       : %d\n", (int) getbits(edx,23,1));
    printf("SSE       : %d\n", (int) getbits(edx,25,1));
    printf("SSE2      : %d\n", (int) getbits(edx,26,1));
    printf("SSE3      : %d\n", (int) getbits(ecx,0,1));
    printf("SSE4.1    : %d\n", (int) getbits(ecx,19,1));
    printf("SSE4.2    : %d\n", (int) getbits(ecx,20,1));
    printf("AVX       : %d\n", (int) getbits(ecx,28,1));
    printf("FMA       : %d\n", (int) getbits(ecx,12,1));
    
    cpuid(7,0,&eax,&ebx,&ecx,&edx);
    
    printf("AVX512    : %d\n\n", (int) getbits(ebx,16,1));
    
    printf("AVX512f   : %d\n", (int) getbits(ebx,16,1));
    printf("AVX512dq  : %d\n", (int) getbits(ebx,17,1));
    printf("AVX512ifma: %d\n", (int) getbits(ebx,21,1));
    printf("AVX512pf  : %d\n", (int) getbits(ebx,26,1));
    printf("AVX512er  : %d\n", (int) getbits(ebx,27,1));
    printf("AVX512cd  : %d\n", (int) getbits(ebx,28,1));
    printf("AVX512bw  : %d\n", (int) getbits(ebx,30,1));
    printf("AVX512vi  : %d\n", (int) getbits(ebx,31,1));
    printf("AVX512vbmi: %d\n", (int) getbits(ecx,2,1));
    printf("AVX512vnni: %d\n", (int) getbits(ecx,11,1));
    
    return 0;
    }