• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <stdlib.h>
3 
4 #include <cpuinfo.h>
5 
main(int argc,char ** argv)6 int main(int argc, char** argv) {
7 	if (!cpuinfo_initialize()) {
8 		fprintf(stderr, "failed to initialize CPU information\n");
9 		exit(EXIT_FAILURE);
10 	}
11 
12 #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
13 
14 	printf("Scalar instructions:\n");
15 #if CPUINFO_ARCH_X86
16 	printf("\tx87 FPU: %s\n", cpuinfo_has_x86_fpu() ? "yes" : "no");
17 	printf("\tCMOV: %s\n", cpuinfo_has_x86_cmov() ? "yes" : "no");
18 #endif
19 	printf("\tLAHF/SAHF: %s\n", cpuinfo_has_x86_lahf_sahf() ? "yes" : "no");
20 	printf("\tLZCNT: %s\n", cpuinfo_has_x86_lzcnt() ? "yes" : "no");
21 	printf("\tPOPCNT: %s\n", cpuinfo_has_x86_popcnt() ? "yes" : "no");
22 	printf("\tTBM: %s\n", cpuinfo_has_x86_tbm() ? "yes" : "no");
23 	printf("\tBMI: %s\n", cpuinfo_has_x86_bmi() ? "yes" : "no");
24 	printf("\tBMI2: %s\n", cpuinfo_has_x86_bmi2() ? "yes" : "no");
25 	printf("\tADCX/ADOX: %s\n", cpuinfo_has_x86_adx() ? "yes" : "no");
26 
27 	printf("Memory instructions:\n");
28 	printf("\tMOVBE: %s\n", cpuinfo_has_x86_movbe() ? "yes" : "no");
29 	printf("\tPREFETCH: %s\n", cpuinfo_has_x86_prefetch() ? "yes" : "no");
30 	printf("\tPREFETCHW: %s\n", cpuinfo_has_x86_prefetchw() ? "yes" : "no");
31 	printf("\tPREFETCHWT1: %s\n", cpuinfo_has_x86_prefetchwt1() ? "yes" : "no");
32 	printf("\tCLZERO: %s\n", cpuinfo_has_x86_clzero() ? "yes" : "no");
33 
34 	printf("SIMD extensions:\n");
35 	printf("\tMMX: %s\n", cpuinfo_has_x86_mmx() ? "yes" : "no");
36 	printf("\tMMX+: %s\n", cpuinfo_has_x86_mmx_plus() ? "yes" : "no");
37 	printf("\t3dnow!: %s\n", cpuinfo_has_x86_3dnow() ? "yes" : "no");
38 	printf("\t3dnow!+: %s\n", cpuinfo_has_x86_3dnow_plus() ? "yes" : "no");
39 	printf("\t3dnow! Geode: %s\n", cpuinfo_has_x86_3dnow_geode() ? "yes" : "no");
40 	printf("\tDAZ: %s\n", cpuinfo_has_x86_daz() ? "yes" : "no");
41 	printf("\tSSE: %s\n", cpuinfo_has_x86_sse() ? "yes" : "no");
42 	printf("\tSSE2: %s\n", cpuinfo_has_x86_sse2() ? "yes" : "no");
43 	printf("\tSSE3: %s\n", cpuinfo_has_x86_sse3() ? "yes" : "no");
44 	printf("\tSSSE3: %s\n", cpuinfo_has_x86_ssse3() ? "yes" : "no");
45 	printf("\tSSE4.1: %s\n", cpuinfo_has_x86_sse4_1() ? "yes" : "no");
46 	printf("\tSSE4.2: %s\n", cpuinfo_has_x86_sse4_2() ? "yes" : "no");
47 	printf("\tSSE4a: %s\n", cpuinfo_has_x86_sse4a() ? "yes" : "no");
48 	printf("\tMisaligned SSE: %s\n", cpuinfo_has_x86_misaligned_sse() ? "yes" : "no");
49 	printf("\tAVX: %s\n", cpuinfo_has_x86_avx() ? "yes" : "no");
50 	printf("\tFMA3: %s\n", cpuinfo_has_x86_fma3() ? "yes" : "no");
51 	printf("\tFMA4: %s\n", cpuinfo_has_x86_fma4() ? "yes" : "no");
52 	printf("\tXOP: %s\n", cpuinfo_has_x86_xop() ? "yes" : "no");
53 	printf("\tF16C: %s\n", cpuinfo_has_x86_f16c() ? "yes" : "no");
54 	printf("\tAVX2: %s\n", cpuinfo_has_x86_avx2() ? "yes" : "no");
55 	printf("\tAVX512F: %s\n", cpuinfo_has_x86_avx512f() ? "yes" : "no");
56 	printf("\tAVX512PF: %s\n", cpuinfo_has_x86_avx512pf() ? "yes" : "no");
57 	printf("\tAVX512ER: %s\n", cpuinfo_has_x86_avx512er() ? "yes" : "no");
58 	printf("\tAVX512CD: %s\n", cpuinfo_has_x86_avx512cd() ? "yes" : "no");
59 	printf("\tAVX512DQ: %s\n", cpuinfo_has_x86_avx512dq() ? "yes" : "no");
60 	printf("\tAVX512BW: %s\n", cpuinfo_has_x86_avx512bw() ? "yes" : "no");
61 	printf("\tAVX512VL: %s\n", cpuinfo_has_x86_avx512vl() ? "yes" : "no");
62 	printf("\tAVX512IFMA: %s\n", cpuinfo_has_x86_avx512ifma() ? "yes" : "no");
63 	printf("\tAVX512VBMI: %s\n", cpuinfo_has_x86_avx512vbmi() ? "yes" : "no");
64 	printf("\tAVX512VBMI2: %s\n", cpuinfo_has_x86_avx512vbmi2() ? "yes" : "no");
65 	printf("\tAVX512BITALG: %s\n", cpuinfo_has_x86_avx512bitalg() ? "yes" : "no");
66 	printf("\tAVX512VPOPCNTDQ: %s\n", cpuinfo_has_x86_avx512vpopcntdq() ? "yes" : "no");
67 	printf("\tAVX512VNNI: %s\n", cpuinfo_has_x86_avx512vnni() ? "yes" : "no");
68 	printf("\tAVX512BF16: %s\n", cpuinfo_has_x86_avx512bf16() ? "yes" : "no");
69 	printf("\tAVX512FP16: %s\n", cpuinfo_has_x86_avx512fp16() ? "yes" : "no");
70 	printf("\tAVX512VP2INTERSECT: %s\n", cpuinfo_has_x86_avx512vp2intersect() ? "yes" : "no");
71 	printf("\tAVX512_4VNNIW: %s\n", cpuinfo_has_x86_avx512_4vnniw() ? "yes" : "no");
72 	printf("\tAVX512_4FMAPS: %s\n", cpuinfo_has_x86_avx512_4fmaps() ? "yes" : "no");
73 	printf("\tAMX_BF16: %s\n", cpuinfo_has_x86_amx_bf16() ? "yes" : "no");
74 	printf("\tAMX_TILE: %s\n", cpuinfo_has_x86_amx_tile() ? "yes" : "no");
75 	printf("\tAMX_INT8: %s\n", cpuinfo_has_x86_amx_int8() ? "yes" : "no");
76 	printf("\tAMX_FP16: %s\n", cpuinfo_has_x86_amx_fp16() ? "yes" : "no");
77 	printf("\tAVXVNNI: %s\n", cpuinfo_has_x86_avxvnni() ? "yes" : "no");
78 	printf("\tAVX_VNNI_INT8: %s\n", cpuinfo_has_x86_avx_vnni_int8() ? "yes" : "no");
79 	printf("\tAVX_VNNI_INT16: %s\n", cpuinfo_has_x86_avx_vnni_int16() ? "yes" : "no");
80 	printf("\tAVX_NE_CONVERT: %s\n", cpuinfo_has_x86_avx_ne_convert() ? "yes" : "no");
81 
82 	printf("Multi-threading extensions:\n");
83 	printf("\tMONITOR/MWAIT: %s\n", cpuinfo_has_x86_mwait() ? "yes" : "no");
84 	printf("\tMONITORX/MWAITX: %s\n", cpuinfo_has_x86_mwaitx() ? "yes" : "no");
85 #if CPUINFO_ARCH_X86
86 	printf("\tCMPXCHG8B: %s\n", cpuinfo_has_x86_cmpxchg8b() ? "yes" : "no");
87 #endif
88 	printf("\tCMPXCHG16B: %s\n", cpuinfo_has_x86_cmpxchg16b() ? "yes" : "no");
89 	printf("\tHLE: %s\n", cpuinfo_has_x86_hle() ? "yes" : "no");
90 	printf("\tRTM: %s\n", cpuinfo_has_x86_rtm() ? "yes" : "no");
91 	printf("\tXTEST: %s\n", cpuinfo_has_x86_xtest() ? "yes" : "no");
92 	printf("\tRDPID: %s\n", cpuinfo_has_x86_rdpid() ? "yes" : "no");
93 
94 	printf("Cryptography extensions:\n");
95 	printf("\tAES: %s\n", cpuinfo_has_x86_aes() ? "yes" : "no");
96 	printf("\tVAES: %s\n", cpuinfo_has_x86_vaes() ? "yes" : "no");
97 	printf("\tPCLMULQDQ: %s\n", cpuinfo_has_x86_pclmulqdq() ? "yes" : "no");
98 	printf("\tVPCLMULQDQ: %s\n", cpuinfo_has_x86_vpclmulqdq() ? "yes" : "no");
99 	printf("\tGFNI: %s\n", cpuinfo_has_x86_gfni() ? "yes" : "no");
100 	printf("\tRDRAND: %s\n", cpuinfo_has_x86_rdrand() ? "yes" : "no");
101 	printf("\tRDSEED: %s\n", cpuinfo_has_x86_rdseed() ? "yes" : "no");
102 	printf("\tSHA: %s\n", cpuinfo_has_x86_sha() ? "yes" : "no");
103 
104 	printf("Profiling instructions:\n");
105 #if CPUINFO_ARCH_X86
106 	printf("\tRDTSC: %s\n", cpuinfo_has_x86_rdtsc() ? "yes" : "no");
107 #endif
108 	printf("\tRDTSCP: %s\n", cpuinfo_has_x86_rdtscp() ? "yes" : "no");
109 	printf("\tMPX: %s\n", cpuinfo_has_x86_mpx() ? "yes" : "no");
110 
111 	printf("System instructions:\n");
112 	printf("\tCLWB: %s\n", cpuinfo_has_x86_clwb() ? "yes" : "no");
113 	printf("\tFXSAVE/FXSTOR: %s\n", cpuinfo_has_x86_fxsave() ? "yes" : "no");
114 	printf("\tXSAVE/XSTOR: %s\n", cpuinfo_has_x86_xsave() ? "yes" : "no");
115 
116 #endif /* CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64 */
117 
118 #if CPUINFO_ARCH_ARM
119 	printf("Instruction sets:\n");
120 	printf("\tThumb: %s\n", cpuinfo_has_arm_thumb() ? "yes" : "no");
121 	printf("\tThumb 2: %s\n", cpuinfo_has_arm_thumb2() ? "yes" : "no");
122 	printf("\tARMv5E: %s\n", cpuinfo_has_arm_v5e() ? "yes" : "no");
123 	printf("\tARMv6: %s\n", cpuinfo_has_arm_v6() ? "yes" : "no");
124 	printf("\tARMv6-K: %s\n", cpuinfo_has_arm_v6k() ? "yes" : "no");
125 	printf("\tARMv7: %s\n", cpuinfo_has_arm_v7() ? "yes" : "no");
126 	printf("\tARMv7 MP: %s\n", cpuinfo_has_arm_v7mp() ? "yes" : "no");
127 	printf("\tARMv8: %s\n", cpuinfo_has_arm_v8() ? "yes" : "no");
128 	printf("\tIDIV: %s\n", cpuinfo_has_arm_idiv() ? "yes" : "no");
129 
130 	printf("Floating-Point support:\n");
131 	printf("\tVFPv2: %s\n", cpuinfo_has_arm_vfpv2() ? "yes" : "no");
132 	printf("\tVFPv3: %s\n", cpuinfo_has_arm_vfpv3() ? "yes" : "no");
133 	printf("\tVFPv3+D32: %s\n", cpuinfo_has_arm_vfpv3_d32() ? "yes" : "no");
134 	printf("\tVFPv3+FP16: %s\n", cpuinfo_has_arm_vfpv3_fp16() ? "yes" : "no");
135 	printf("\tVFPv3+FP16+D32: %s\n", cpuinfo_has_arm_vfpv3_fp16_d32() ? "yes" : "no");
136 	printf("\tVFPv4: %s\n", cpuinfo_has_arm_vfpv4() ? "yes" : "no");
137 	printf("\tVFPv4+D32: %s\n", cpuinfo_has_arm_vfpv4_d32() ? "yes" : "no");
138 	printf("\tVJCVT: %s\n", cpuinfo_has_arm_jscvt() ? "yes" : "no");
139 
140 	printf("SIMD extensions:\n");
141 	printf("\tWMMX: %s\n", cpuinfo_has_arm_wmmx() ? "yes" : "no");
142 	printf("\tWMMX 2: %s\n", cpuinfo_has_arm_wmmx2() ? "yes" : "no");
143 	printf("\tNEON: %s\n", cpuinfo_has_arm_neon() ? "yes" : "no");
144 	printf("\tNEON-FP16: %s\n", cpuinfo_has_arm_neon_fp16() ? "yes" : "no");
145 	printf("\tNEON-FMA: %s\n", cpuinfo_has_arm_neon_fma() ? "yes" : "no");
146 	printf("\tNEON VQRDMLAH/VQRDMLSH: %s\n", cpuinfo_has_arm_neon_rdm() ? "yes" : "no");
147 	printf("\tNEON FP16 arithmetics: %s\n", cpuinfo_has_arm_neon_fp16_arith() ? "yes" : "no");
148 	printf("\tNEON complex: %s\n", cpuinfo_has_arm_fcma() ? "yes" : "no");
149 	printf("\tNEON VSDOT/VUDOT: %s\n", cpuinfo_has_arm_neon_dot() ? "yes" : "no");
150 	printf("\tNEON VFMLAL/VFMLSL: %s\n", cpuinfo_has_arm_fhm() ? "yes" : "no");
151 
152 	printf("Cryptography extensions:\n");
153 	printf("\tAES: %s\n", cpuinfo_has_arm_aes() ? "yes" : "no");
154 	printf("\tSHA1: %s\n", cpuinfo_has_arm_sha1() ? "yes" : "no");
155 	printf("\tSHA2: %s\n", cpuinfo_has_arm_sha2() ? "yes" : "no");
156 	printf("\tPMULL: %s\n", cpuinfo_has_arm_pmull() ? "yes" : "no");
157 	printf("\tCRC32: %s\n", cpuinfo_has_arm_crc32() ? "yes" : "no");
158 #endif /* CPUINFO_ARCH_ARM */
159 #if CPUINFO_ARCH_ARM64
160 	printf("Instruction sets:\n");
161 	printf("\tARM v8.1 atomics: %s\n", cpuinfo_has_arm_atomics() ? "yes" : "no");
162 	printf("\tARM v8.1 SQRDMLxH: %s\n", cpuinfo_has_arm_neon_rdm() ? "yes" : "no");
163 	printf("\tARM v8.2 FP16 arithmetics: %s\n", cpuinfo_has_arm_fp16_arith() ? "yes" : "no");
164 	printf("\tARM v8.2 FHM: %s\n", cpuinfo_has_arm_fhm() ? "yes" : "no");
165 	printf("\tARM v8.2 BF16: %s\n", cpuinfo_has_arm_bf16() ? "yes" : "no");
166 	printf("\tARM v8.2 Int8 dot product: %s\n", cpuinfo_has_arm_neon_dot() ? "yes" : "no");
167 	printf("\tARM v8.2 Int8 matrix multiplication: %s\n", cpuinfo_has_arm_i8mm() ? "yes" : "no");
168 	printf("\tARM v8.3 JS conversion: %s\n", cpuinfo_has_arm_jscvt() ? "yes" : "no");
169 	printf("\tARM v8.3 complex: %s\n", cpuinfo_has_arm_fcma() ? "yes" : "no");
170 
171 	printf("SIMD extensions:\n");
172 	printf("\tARM SVE: %s\n", cpuinfo_has_arm_sve() ? "yes" : "no");
173 	printf("\tARM SVE 2: %s\n", cpuinfo_has_arm_sve2() ? "yes" : "no");
174 
175 	printf("ARM SVE Capabilities:\n");
176 	printf("\tSVE max length: %d\n", cpuinfo_get_max_arm_sve_length());
177 
178 	printf("Cryptography extensions:\n");
179 	printf("\tAES: %s\n", cpuinfo_has_arm_aes() ? "yes" : "no");
180 	printf("\tSHA1: %s\n", cpuinfo_has_arm_sha1() ? "yes" : "no");
181 	printf("\tSHA2: %s\n", cpuinfo_has_arm_sha2() ? "yes" : "no");
182 	printf("\tPMULL: %s\n", cpuinfo_has_arm_pmull() ? "yes" : "no");
183 	printf("\tCRC32: %s\n", cpuinfo_has_arm_crc32() ? "yes" : "no");
184 #endif
185 #if CPUINFO_ARCH_RISCV32 || CPUINFO_ARCH_RISCV64
186 	printf("Instruction sets:\n");
187 	printf("\tBase Integer: %s\n", cpuinfo_has_riscv_i() ? "yes" : "no");
188 	printf("\tInteger Multiply/Divide: %s\n", cpuinfo_has_riscv_m() ? "yes" : "no");
189 	printf("\tAtomics: %s\n", cpuinfo_has_riscv_a() ? "yes" : "no");
190 	printf("\tSingle-Precision Floating-Point: %s\n", cpuinfo_has_riscv_f() ? "yes" : "no");
191 	printf("\tDouble-Precision Floating-Point: %s\n", cpuinfo_has_riscv_d() ? "yes" : "no");
192 	printf("\tCompressed: %s\n", cpuinfo_has_riscv_c() ? "yes" : "no");
193 	printf("\tVector: %s\n", cpuinfo_has_riscv_v() ? "yes" : "no");
194 #endif
195 }
196