Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//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;
}