xref: /aosp_15_r20/external/cpuinfo/include/cpuinfo.h (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #pragma once
2*2b54f0dbSXin Li #ifndef CPUINFO_H
3*2b54f0dbSXin Li #define CPUINFO_H
4*2b54f0dbSXin Li 
5*2b54f0dbSXin Li #ifndef __cplusplus
6*2b54f0dbSXin Li 	#include <stdbool.h>
7*2b54f0dbSXin Li #endif
8*2b54f0dbSXin Li 
9*2b54f0dbSXin Li #ifdef __APPLE__
10*2b54f0dbSXin Li 	#include <TargetConditionals.h>
11*2b54f0dbSXin Li #endif
12*2b54f0dbSXin Li 
13*2b54f0dbSXin Li #include <stdint.h>
14*2b54f0dbSXin Li 
15*2b54f0dbSXin Li /* Identify architecture and define corresponding macro */
16*2b54f0dbSXin Li 
17*2b54f0dbSXin Li #if defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) || defined(_M_IX86)
18*2b54f0dbSXin Li 	#define CPUINFO_ARCH_X86 1
19*2b54f0dbSXin Li #endif
20*2b54f0dbSXin Li 
21*2b54f0dbSXin Li #if defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
22*2b54f0dbSXin Li 	#define CPUINFO_ARCH_X86_64 1
23*2b54f0dbSXin Li #endif
24*2b54f0dbSXin Li 
25*2b54f0dbSXin Li #if defined(__arm__) || defined(_M_ARM)
26*2b54f0dbSXin Li 	#define CPUINFO_ARCH_ARM 1
27*2b54f0dbSXin Li #endif
28*2b54f0dbSXin Li 
29*2b54f0dbSXin Li #if defined(__aarch64__) || defined(_M_ARM64)
30*2b54f0dbSXin Li 	#define CPUINFO_ARCH_ARM64 1
31*2b54f0dbSXin Li #endif
32*2b54f0dbSXin Li 
33*2b54f0dbSXin Li #if defined(__PPC64__) || defined(__powerpc64__) || defined(_ARCH_PPC64)
34*2b54f0dbSXin Li 	#define CPUINFO_ARCH_PPC64 1
35*2b54f0dbSXin Li #endif
36*2b54f0dbSXin Li 
37*2b54f0dbSXin Li #if defined(__asmjs__)
38*2b54f0dbSXin Li 	#define CPUINFO_ARCH_ASMJS 1
39*2b54f0dbSXin Li #endif
40*2b54f0dbSXin Li 
41*2b54f0dbSXin Li #if defined(__wasm__)
42*2b54f0dbSXin Li 	#if defined(__wasm_simd128__)
43*2b54f0dbSXin Li 		#define CPUINFO_ARCH_WASMSIMD 1
44*2b54f0dbSXin Li 	#else
45*2b54f0dbSXin Li 		#define CPUINFO_ARCH_WASM 1
46*2b54f0dbSXin Li 	#endif
47*2b54f0dbSXin Li #endif
48*2b54f0dbSXin Li 
49*2b54f0dbSXin Li /* Define other architecture-specific macros as 0 */
50*2b54f0dbSXin Li 
51*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_X86
52*2b54f0dbSXin Li 	#define CPUINFO_ARCH_X86 0
53*2b54f0dbSXin Li #endif
54*2b54f0dbSXin Li 
55*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_X86_64
56*2b54f0dbSXin Li 	#define CPUINFO_ARCH_X86_64 0
57*2b54f0dbSXin Li #endif
58*2b54f0dbSXin Li 
59*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_ARM
60*2b54f0dbSXin Li 	#define CPUINFO_ARCH_ARM 0
61*2b54f0dbSXin Li #endif
62*2b54f0dbSXin Li 
63*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_ARM64
64*2b54f0dbSXin Li 	#define CPUINFO_ARCH_ARM64 0
65*2b54f0dbSXin Li #endif
66*2b54f0dbSXin Li 
67*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_PPC64
68*2b54f0dbSXin Li 	#define CPUINFO_ARCH_PPC64 0
69*2b54f0dbSXin Li #endif
70*2b54f0dbSXin Li 
71*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_ASMJS
72*2b54f0dbSXin Li 	#define CPUINFO_ARCH_ASMJS 0
73*2b54f0dbSXin Li #endif
74*2b54f0dbSXin Li 
75*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_WASM
76*2b54f0dbSXin Li 	#define CPUINFO_ARCH_WASM 0
77*2b54f0dbSXin Li #endif
78*2b54f0dbSXin Li 
79*2b54f0dbSXin Li #ifndef CPUINFO_ARCH_WASMSIMD
80*2b54f0dbSXin Li 	#define CPUINFO_ARCH_WASMSIMD 0
81*2b54f0dbSXin Li #endif
82*2b54f0dbSXin Li 
83*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 && defined(_MSC_VER)
84*2b54f0dbSXin Li 	#define CPUINFO_ABI __cdecl
85*2b54f0dbSXin Li #elif CPUINFO_ARCH_X86 && defined(__GNUC__)
86*2b54f0dbSXin Li 	#define CPUINFO_ABI __attribute__((__cdecl__))
87*2b54f0dbSXin Li #else
88*2b54f0dbSXin Li 	#define CPUINFO_ABI
89*2b54f0dbSXin Li #endif
90*2b54f0dbSXin Li 
91*2b54f0dbSXin Li #define CPUINFO_CACHE_UNIFIED          0x00000001
92*2b54f0dbSXin Li #define CPUINFO_CACHE_INCLUSIVE        0x00000002
93*2b54f0dbSXin Li #define CPUINFO_CACHE_COMPLEX_INDEXING 0x00000004
94*2b54f0dbSXin Li 
95*2b54f0dbSXin Li struct cpuinfo_cache {
96*2b54f0dbSXin Li 	/** Cache size in bytes */
97*2b54f0dbSXin Li 	uint32_t size;
98*2b54f0dbSXin Li 	/** Number of ways of associativity */
99*2b54f0dbSXin Li 	uint32_t associativity;
100*2b54f0dbSXin Li 	/** Number of sets */
101*2b54f0dbSXin Li 	uint32_t sets;
102*2b54f0dbSXin Li 	/** Number of partitions */
103*2b54f0dbSXin Li 	uint32_t partitions;
104*2b54f0dbSXin Li 	/** Line size in bytes */
105*2b54f0dbSXin Li 	uint32_t line_size;
106*2b54f0dbSXin Li 	/**
107*2b54f0dbSXin Li 	 * Binary characteristics of the cache (unified cache, inclusive cache, cache with complex indexing).
108*2b54f0dbSXin Li 	 *
109*2b54f0dbSXin Li 	 * @see CPUINFO_CACHE_UNIFIED, CPUINFO_CACHE_INCLUSIVE, CPUINFO_CACHE_COMPLEX_INDEXING
110*2b54f0dbSXin Li 	 */
111*2b54f0dbSXin Li 	uint32_t flags;
112*2b54f0dbSXin Li 	/** Index of the first logical processor that shares this cache */
113*2b54f0dbSXin Li 	uint32_t processor_start;
114*2b54f0dbSXin Li 	/** Number of logical processors that share this cache */
115*2b54f0dbSXin Li 	uint32_t processor_count;
116*2b54f0dbSXin Li };
117*2b54f0dbSXin Li 
118*2b54f0dbSXin Li struct cpuinfo_trace_cache {
119*2b54f0dbSXin Li 	uint32_t uops;
120*2b54f0dbSXin Li 	uint32_t associativity;
121*2b54f0dbSXin Li };
122*2b54f0dbSXin Li 
123*2b54f0dbSXin Li #define CPUINFO_PAGE_SIZE_4KB  0x1000
124*2b54f0dbSXin Li #define CPUINFO_PAGE_SIZE_1MB  0x100000
125*2b54f0dbSXin Li #define CPUINFO_PAGE_SIZE_2MB  0x200000
126*2b54f0dbSXin Li #define CPUINFO_PAGE_SIZE_4MB  0x400000
127*2b54f0dbSXin Li #define CPUINFO_PAGE_SIZE_16MB 0x1000000
128*2b54f0dbSXin Li #define CPUINFO_PAGE_SIZE_1GB  0x40000000
129*2b54f0dbSXin Li 
130*2b54f0dbSXin Li struct cpuinfo_tlb {
131*2b54f0dbSXin Li 	uint32_t entries;
132*2b54f0dbSXin Li 	uint32_t associativity;
133*2b54f0dbSXin Li 	uint64_t pages;
134*2b54f0dbSXin Li };
135*2b54f0dbSXin Li 
136*2b54f0dbSXin Li /** Vendor of processor core design */
137*2b54f0dbSXin Li enum cpuinfo_vendor {
138*2b54f0dbSXin Li 	/** Processor vendor is not known to the library, or the library failed to get vendor information from the OS. */
139*2b54f0dbSXin Li 	cpuinfo_vendor_unknown = 0,
140*2b54f0dbSXin Li 
141*2b54f0dbSXin Li 	/* Active vendors of modern CPUs */
142*2b54f0dbSXin Li 
143*2b54f0dbSXin Li 	/**
144*2b54f0dbSXin Li 	 * Intel Corporation. Vendor of x86, x86-64, IA64, and ARM processor microarchitectures.
145*2b54f0dbSXin Li 	 *
146*2b54f0dbSXin Li 	 * Sold its ARM design subsidiary in 2006. The last ARM processor design was released in 2004.
147*2b54f0dbSXin Li 	 */
148*2b54f0dbSXin Li 	cpuinfo_vendor_intel    = 1,
149*2b54f0dbSXin Li 	/** Advanced Micro Devices, Inc. Vendor of x86 and x86-64 processor microarchitectures. */
150*2b54f0dbSXin Li 	cpuinfo_vendor_amd      = 2,
151*2b54f0dbSXin Li 	/** ARM Holdings plc. Vendor of ARM and ARM64 processor microarchitectures. */
152*2b54f0dbSXin Li 	cpuinfo_vendor_arm      = 3,
153*2b54f0dbSXin Li 	/** Qualcomm Incorporated. Vendor of ARM and ARM64 processor microarchitectures. */
154*2b54f0dbSXin Li 	cpuinfo_vendor_qualcomm = 4,
155*2b54f0dbSXin Li 	/** Apple Inc. Vendor of ARM and ARM64 processor microarchitectures. */
156*2b54f0dbSXin Li 	cpuinfo_vendor_apple    = 5,
157*2b54f0dbSXin Li 	/** Samsung Electronics Co., Ltd. Vendir if ARM64 processor microarchitectures. */
158*2b54f0dbSXin Li 	cpuinfo_vendor_samsung  = 6,
159*2b54f0dbSXin Li 	/** Nvidia Corporation. Vendor of ARM64-compatible processor microarchitectures. */
160*2b54f0dbSXin Li 	cpuinfo_vendor_nvidia   = 7,
161*2b54f0dbSXin Li 	/** MIPS Technologies, Inc. Vendor of MIPS processor microarchitectures. */
162*2b54f0dbSXin Li 	cpuinfo_vendor_mips     = 8,
163*2b54f0dbSXin Li 	/** International Business Machines Corporation. Vendor of PowerPC processor microarchitectures. */
164*2b54f0dbSXin Li 	cpuinfo_vendor_ibm      = 9,
165*2b54f0dbSXin Li 	/** Ingenic Semiconductor. Vendor of MIPS processor microarchitectures. */
166*2b54f0dbSXin Li 	cpuinfo_vendor_ingenic  = 10,
167*2b54f0dbSXin Li 	/**
168*2b54f0dbSXin Li 	 * VIA Technologies, Inc. Vendor of x86 and x86-64 processor microarchitectures.
169*2b54f0dbSXin Li 	 *
170*2b54f0dbSXin Li 	 * Processors are designed by Centaur Technology, a subsidiary of VIA Technologies.
171*2b54f0dbSXin Li 	 */
172*2b54f0dbSXin Li 	cpuinfo_vendor_via      = 11,
173*2b54f0dbSXin Li 	/** Cavium, Inc. Vendor of ARM64 processor microarchitectures. */
174*2b54f0dbSXin Li 	cpuinfo_vendor_cavium   = 12,
175*2b54f0dbSXin Li 	/** Broadcom, Inc. Vendor of ARM processor microarchitectures. */
176*2b54f0dbSXin Li 	cpuinfo_vendor_broadcom = 13,
177*2b54f0dbSXin Li 	/** Applied Micro Circuits Corporation (APM). Vendor of ARM64 processor microarchitectures. */
178*2b54f0dbSXin Li 	cpuinfo_vendor_apm      = 14,
179*2b54f0dbSXin Li 	/**
180*2b54f0dbSXin Li 	 * Huawei Technologies Co., Ltd. Vendor of ARM64 processor microarchitectures.
181*2b54f0dbSXin Li 	 *
182*2b54f0dbSXin Li 	 * Processors are designed by HiSilicon, a subsidiary of Huawei.
183*2b54f0dbSXin Li 	 */
184*2b54f0dbSXin Li 	cpuinfo_vendor_huawei   = 15,
185*2b54f0dbSXin Li 	/**
186*2b54f0dbSXin Li 	 * Hygon (Chengdu Haiguang Integrated Circuit Design Co., Ltd), Vendor of x86-64 processor microarchitectures.
187*2b54f0dbSXin Li 	 *
188*2b54f0dbSXin Li 	 * Processors are variants of AMD cores.
189*2b54f0dbSXin Li 	 */
190*2b54f0dbSXin Li 	cpuinfo_vendor_hygon    = 16,
191*2b54f0dbSXin Li 
192*2b54f0dbSXin Li 	/* Active vendors of embedded CPUs */
193*2b54f0dbSXin Li 
194*2b54f0dbSXin Li 	/** Texas Instruments Inc. Vendor of ARM processor microarchitectures. */
195*2b54f0dbSXin Li 	cpuinfo_vendor_texas_instruments = 30,
196*2b54f0dbSXin Li 	/** Marvell Technology Group Ltd. Vendor of ARM processor microarchitectures. */
197*2b54f0dbSXin Li 	cpuinfo_vendor_marvell           = 31,
198*2b54f0dbSXin Li 	/** RDC Semiconductor Co., Ltd. Vendor of x86 processor microarchitectures. */
199*2b54f0dbSXin Li 	cpuinfo_vendor_rdc               = 32,
200*2b54f0dbSXin Li 	/** DM&P Electronics Inc. Vendor of x86 processor microarchitectures. */
201*2b54f0dbSXin Li 	cpuinfo_vendor_dmp               = 33,
202*2b54f0dbSXin Li 	/** Motorola, Inc. Vendor of PowerPC and ARM processor microarchitectures. */
203*2b54f0dbSXin Li 	cpuinfo_vendor_motorola          = 34,
204*2b54f0dbSXin Li 
205*2b54f0dbSXin Li 	/* Defunct CPU vendors */
206*2b54f0dbSXin Li 
207*2b54f0dbSXin Li 	/**
208*2b54f0dbSXin Li 	 * Transmeta Corporation. Vendor of x86 processor microarchitectures.
209*2b54f0dbSXin Li 	 *
210*2b54f0dbSXin Li 	 * Now defunct. The last processor design was released in 2004.
211*2b54f0dbSXin Li 	 * Transmeta processors implemented VLIW ISA and used binary translation to execute x86 code.
212*2b54f0dbSXin Li 	 */
213*2b54f0dbSXin Li 	cpuinfo_vendor_transmeta = 50,
214*2b54f0dbSXin Li 	/**
215*2b54f0dbSXin Li 	 * Cyrix Corporation. Vendor of x86 processor microarchitectures.
216*2b54f0dbSXin Li 	 *
217*2b54f0dbSXin Li 	 * Now defunct. The last processor design was released in 1996.
218*2b54f0dbSXin Li 	 */
219*2b54f0dbSXin Li 	cpuinfo_vendor_cyrix     = 51,
220*2b54f0dbSXin Li 	/**
221*2b54f0dbSXin Li 	 * Rise Technology. Vendor of x86 processor microarchitectures.
222*2b54f0dbSXin Li 	 *
223*2b54f0dbSXin Li 	 * Now defunct. The last processor design was released in 1999.
224*2b54f0dbSXin Li 	 */
225*2b54f0dbSXin Li 	cpuinfo_vendor_rise      = 52,
226*2b54f0dbSXin Li 	/**
227*2b54f0dbSXin Li 	 * National Semiconductor. Vendor of x86 processor microarchitectures.
228*2b54f0dbSXin Li 	 *
229*2b54f0dbSXin Li 	 * Sold its x86 design subsidiary in 1999. The last processor design was released in 1998.
230*2b54f0dbSXin Li 	 */
231*2b54f0dbSXin Li 	cpuinfo_vendor_nsc       = 53,
232*2b54f0dbSXin Li 	/**
233*2b54f0dbSXin Li 	 * Silicon Integrated Systems. Vendor of x86 processor microarchitectures.
234*2b54f0dbSXin Li 	 *
235*2b54f0dbSXin Li 	 * Sold its x86 design subsidiary in 2001. The last processor design was released in 2001.
236*2b54f0dbSXin Li 	 */
237*2b54f0dbSXin Li 	cpuinfo_vendor_sis       = 54,
238*2b54f0dbSXin Li 	/**
239*2b54f0dbSXin Li 	 * NexGen. Vendor of x86 processor microarchitectures.
240*2b54f0dbSXin Li 	 *
241*2b54f0dbSXin Li 	 * Now defunct. The last processor design was released in 1994.
242*2b54f0dbSXin Li 	 * NexGen designed the first x86 microarchitecture which decomposed x86 instructions into simple microoperations.
243*2b54f0dbSXin Li 	 */
244*2b54f0dbSXin Li 	cpuinfo_vendor_nexgen    = 55,
245*2b54f0dbSXin Li 	/**
246*2b54f0dbSXin Li 	 * United Microelectronics Corporation. Vendor of x86 processor microarchitectures.
247*2b54f0dbSXin Li 	 *
248*2b54f0dbSXin Li 	 * Ceased x86 in the early 1990s. The last processor design was released in 1991.
249*2b54f0dbSXin Li 	 * Designed U5C and U5D processors. Both are 486 level.
250*2b54f0dbSXin Li 	 */
251*2b54f0dbSXin Li 	cpuinfo_vendor_umc       = 56,
252*2b54f0dbSXin Li 	/**
253*2b54f0dbSXin Li 	 * Digital Equipment Corporation. Vendor of ARM processor microarchitecture.
254*2b54f0dbSXin Li 	 *
255*2b54f0dbSXin Li 	 * Sold its ARM designs in 1997. The last processor design was released in 1997.
256*2b54f0dbSXin Li 	 */
257*2b54f0dbSXin Li 	cpuinfo_vendor_dec       = 57,
258*2b54f0dbSXin Li };
259*2b54f0dbSXin Li 
260*2b54f0dbSXin Li /**
261*2b54f0dbSXin Li  * Processor microarchitecture
262*2b54f0dbSXin Li  *
263*2b54f0dbSXin Li  * Processors with different microarchitectures often have different instruction performance characteristics,
264*2b54f0dbSXin Li  * and may have dramatically different pipeline organization.
265*2b54f0dbSXin Li  */
266*2b54f0dbSXin Li enum cpuinfo_uarch {
267*2b54f0dbSXin Li 	/** Microarchitecture is unknown, or the library failed to get information about the microarchitecture from OS */
268*2b54f0dbSXin Li 	cpuinfo_uarch_unknown = 0,
269*2b54f0dbSXin Li 
270*2b54f0dbSXin Li 	/** Pentium and Pentium MMX microarchitecture. */
271*2b54f0dbSXin Li 	cpuinfo_uarch_p5    = 0x00100100,
272*2b54f0dbSXin Li 	/** Intel Quark microarchitecture. */
273*2b54f0dbSXin Li 	cpuinfo_uarch_quark = 0x00100101,
274*2b54f0dbSXin Li 
275*2b54f0dbSXin Li 	/** Pentium Pro, Pentium II, and Pentium III. */
276*2b54f0dbSXin Li 	cpuinfo_uarch_p6           = 0x00100200,
277*2b54f0dbSXin Li 	/** Pentium M. */
278*2b54f0dbSXin Li 	cpuinfo_uarch_dothan       = 0x00100201,
279*2b54f0dbSXin Li 	/** Intel Core microarchitecture. */
280*2b54f0dbSXin Li 	cpuinfo_uarch_yonah        = 0x00100202,
281*2b54f0dbSXin Li 	/** Intel Core 2 microarchitecture on 65 nm process. */
282*2b54f0dbSXin Li 	cpuinfo_uarch_conroe       = 0x00100203,
283*2b54f0dbSXin Li 	/** Intel Core 2 microarchitecture on 45 nm process. */
284*2b54f0dbSXin Li 	cpuinfo_uarch_penryn       = 0x00100204,
285*2b54f0dbSXin Li 	/** Intel Nehalem and Westmere microarchitectures (Core i3/i5/i7 1st gen). */
286*2b54f0dbSXin Li 	cpuinfo_uarch_nehalem      = 0x00100205,
287*2b54f0dbSXin Li 	/** Intel Sandy Bridge microarchitecture (Core i3/i5/i7 2nd gen). */
288*2b54f0dbSXin Li 	cpuinfo_uarch_sandy_bridge = 0x00100206,
289*2b54f0dbSXin Li 	/** Intel Ivy Bridge microarchitecture (Core i3/i5/i7 3rd gen). */
290*2b54f0dbSXin Li 	cpuinfo_uarch_ivy_bridge   = 0x00100207,
291*2b54f0dbSXin Li 	/** Intel Haswell microarchitecture (Core i3/i5/i7 4th gen). */
292*2b54f0dbSXin Li 	cpuinfo_uarch_haswell      = 0x00100208,
293*2b54f0dbSXin Li 	/** Intel Broadwell microarchitecture. */
294*2b54f0dbSXin Li 	cpuinfo_uarch_broadwell    = 0x00100209,
295*2b54f0dbSXin Li 	/** Intel Sky Lake microarchitecture (14 nm, including Kaby/Coffee/Whiskey/Amber/Comet/Cascade/Cooper Lake). */
296*2b54f0dbSXin Li 	cpuinfo_uarch_sky_lake     = 0x0010020A,
297*2b54f0dbSXin Li 	/** DEPRECATED (Intel Kaby Lake microarchitecture). */
298*2b54f0dbSXin Li 	cpuinfo_uarch_kaby_lake    = 0x0010020A,
299*2b54f0dbSXin Li 	/** Intel Palm Cove microarchitecture (10 nm, Cannon Lake). */
300*2b54f0dbSXin Li 	cpuinfo_uarch_palm_cove    = 0x0010020B,
301*2b54f0dbSXin Li 	/** Intel Sunny Cove microarchitecture (10 nm, Ice Lake). */
302*2b54f0dbSXin Li 	cpuinfo_uarch_sunny_cove   = 0x0010020C,
303*2b54f0dbSXin Li 
304*2b54f0dbSXin Li 	/** Pentium 4 with Willamette, Northwood, or Foster cores. */
305*2b54f0dbSXin Li 	cpuinfo_uarch_willamette = 0x00100300,
306*2b54f0dbSXin Li 	/** Pentium 4 with Prescott and later cores. */
307*2b54f0dbSXin Li 	cpuinfo_uarch_prescott   = 0x00100301,
308*2b54f0dbSXin Li 
309*2b54f0dbSXin Li 	/** Intel Atom on 45 nm process. */
310*2b54f0dbSXin Li 	cpuinfo_uarch_bonnell       = 0x00100400,
311*2b54f0dbSXin Li 	/** Intel Atom on 32 nm process. */
312*2b54f0dbSXin Li 	cpuinfo_uarch_saltwell      = 0x00100401,
313*2b54f0dbSXin Li 	/** Intel Silvermont microarchitecture (22 nm out-of-order Atom). */
314*2b54f0dbSXin Li 	cpuinfo_uarch_silvermont    = 0x00100402,
315*2b54f0dbSXin Li 	/** Intel Airmont microarchitecture (14 nm out-of-order Atom). */
316*2b54f0dbSXin Li 	cpuinfo_uarch_airmont       = 0x00100403,
317*2b54f0dbSXin Li 	/** Intel Goldmont microarchitecture (Denverton, Apollo Lake). */
318*2b54f0dbSXin Li 	cpuinfo_uarch_goldmont      = 0x00100404,
319*2b54f0dbSXin Li 	/** Intel Goldmont Plus microarchitecture (Gemini Lake). */
320*2b54f0dbSXin Li 	cpuinfo_uarch_goldmont_plus = 0x00100405,
321*2b54f0dbSXin Li 
322*2b54f0dbSXin Li 	/** Intel Knights Ferry HPC boards. */
323*2b54f0dbSXin Li 	cpuinfo_uarch_knights_ferry   = 0x00100500,
324*2b54f0dbSXin Li 	/** Intel Knights Corner HPC boards (aka Xeon Phi). */
325*2b54f0dbSXin Li 	cpuinfo_uarch_knights_corner  = 0x00100501,
326*2b54f0dbSXin Li 	/** Intel Knights Landing microarchitecture (second-gen MIC). */
327*2b54f0dbSXin Li 	cpuinfo_uarch_knights_landing = 0x00100502,
328*2b54f0dbSXin Li 	/** Intel Knights Hill microarchitecture (third-gen MIC). */
329*2b54f0dbSXin Li 	cpuinfo_uarch_knights_hill    = 0x00100503,
330*2b54f0dbSXin Li 	/** Intel Knights Mill Xeon Phi. */
331*2b54f0dbSXin Li 	cpuinfo_uarch_knights_mill    = 0x00100504,
332*2b54f0dbSXin Li 
333*2b54f0dbSXin Li 	/** Intel/Marvell XScale series. */
334*2b54f0dbSXin Li 	cpuinfo_uarch_xscale = 0x00100600,
335*2b54f0dbSXin Li 
336*2b54f0dbSXin Li 	/** AMD K5. */
337*2b54f0dbSXin Li 	cpuinfo_uarch_k5        = 0x00200100,
338*2b54f0dbSXin Li 	/** AMD K6 and alike. */
339*2b54f0dbSXin Li 	cpuinfo_uarch_k6        = 0x00200101,
340*2b54f0dbSXin Li 	/** AMD Athlon and Duron. */
341*2b54f0dbSXin Li 	cpuinfo_uarch_k7        = 0x00200102,
342*2b54f0dbSXin Li 	/** AMD Athlon 64, Opteron 64. */
343*2b54f0dbSXin Li 	cpuinfo_uarch_k8        = 0x00200103,
344*2b54f0dbSXin Li 	/** AMD Family 10h (Barcelona, Istambul, Magny-Cours). */
345*2b54f0dbSXin Li 	cpuinfo_uarch_k10       = 0x00200104,
346*2b54f0dbSXin Li 	/**
347*2b54f0dbSXin Li 	 * AMD Bulldozer microarchitecture
348*2b54f0dbSXin Li 	 * Zambezi FX-series CPUs, Zurich, Valencia and Interlagos Opteron CPUs.
349*2b54f0dbSXin Li 	 */
350*2b54f0dbSXin Li 	cpuinfo_uarch_bulldozer = 0x00200105,
351*2b54f0dbSXin Li 	/**
352*2b54f0dbSXin Li 	 * AMD Piledriver microarchitecture
353*2b54f0dbSXin Li 	 * Vishera FX-series CPUs, Trinity and Richland APUs, Delhi, Seoul, Abu Dhabi Opteron CPUs.
354*2b54f0dbSXin Li 	 */
355*2b54f0dbSXin Li 	cpuinfo_uarch_piledriver  = 0x00200106,
356*2b54f0dbSXin Li 	/** AMD Steamroller microarchitecture (Kaveri APUs). */
357*2b54f0dbSXin Li 	cpuinfo_uarch_steamroller = 0x00200107,
358*2b54f0dbSXin Li 	/** AMD Excavator microarchitecture (Carizzo APUs). */
359*2b54f0dbSXin Li 	cpuinfo_uarch_excavator   = 0x00200108,
360*2b54f0dbSXin Li 	/** AMD Zen microarchitecture (12/14 nm Ryzen and EPYC CPUs). */
361*2b54f0dbSXin Li 	cpuinfo_uarch_zen         = 0x00200109,
362*2b54f0dbSXin Li 	/** AMD Zen 2 microarchitecture (7 nm Ryzen and EPYC CPUs). */
363*2b54f0dbSXin Li 	cpuinfo_uarch_zen2        = 0x0020010A,
364*2b54f0dbSXin Li 	/** AMD Zen 3 microarchitecture. */
365*2b54f0dbSXin Li 	cpuinfo_uarch_zen3        = 0x0020010B,
366*2b54f0dbSXin Li 
367*2b54f0dbSXin Li 	/** NSC Geode and AMD Geode GX and LX. */
368*2b54f0dbSXin Li 	cpuinfo_uarch_geode  = 0x00200200,
369*2b54f0dbSXin Li 	/** AMD Bobcat mobile microarchitecture. */
370*2b54f0dbSXin Li 	cpuinfo_uarch_bobcat = 0x00200201,
371*2b54f0dbSXin Li 	/** AMD Jaguar mobile microarchitecture. */
372*2b54f0dbSXin Li 	cpuinfo_uarch_jaguar = 0x00200202,
373*2b54f0dbSXin Li 	/** AMD Puma mobile microarchitecture. */
374*2b54f0dbSXin Li 	cpuinfo_uarch_puma   = 0x00200203,
375*2b54f0dbSXin Li 
376*2b54f0dbSXin Li 	/** ARM7 series. */
377*2b54f0dbSXin Li 	cpuinfo_uarch_arm7  = 0x00300100,
378*2b54f0dbSXin Li 	/** ARM9 series. */
379*2b54f0dbSXin Li 	cpuinfo_uarch_arm9  = 0x00300101,
380*2b54f0dbSXin Li 	/** ARM 1136, ARM 1156, ARM 1176, or ARM 11MPCore. */
381*2b54f0dbSXin Li 	cpuinfo_uarch_arm11 = 0x00300102,
382*2b54f0dbSXin Li 
383*2b54f0dbSXin Li 	/** ARM Cortex-A5. */
384*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a5  = 0x00300205,
385*2b54f0dbSXin Li 	/** ARM Cortex-A7. */
386*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a7  = 0x00300207,
387*2b54f0dbSXin Li 	/** ARM Cortex-A8. */
388*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a8  = 0x00300208,
389*2b54f0dbSXin Li 	/** ARM Cortex-A9. */
390*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a9  = 0x00300209,
391*2b54f0dbSXin Li 	/** ARM Cortex-A12. */
392*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a12 = 0x00300212,
393*2b54f0dbSXin Li 	/** ARM Cortex-A15. */
394*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a15 = 0x00300215,
395*2b54f0dbSXin Li 	/** ARM Cortex-A17. */
396*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a17 = 0x00300217,
397*2b54f0dbSXin Li 
398*2b54f0dbSXin Li 	/** ARM Cortex-A32. */
399*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a32   = 0x00300332,
400*2b54f0dbSXin Li 	/** ARM Cortex-A35. */
401*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a35   = 0x00300335,
402*2b54f0dbSXin Li 	/** ARM Cortex-A53. */
403*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a53   = 0x00300353,
404*2b54f0dbSXin Li 	/** ARM Cortex-A55 revision 0 (restricted dual-issue capabilities compared to revision 1+). */
405*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a55r0 = 0x00300354,
406*2b54f0dbSXin Li 	/** ARM Cortex-A55. */
407*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a55   = 0x00300355,
408*2b54f0dbSXin Li 	/** ARM Cortex-A57. */
409*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a57   = 0x00300357,
410*2b54f0dbSXin Li 	/** ARM Cortex-A65. */
411*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a65   = 0x00300365,
412*2b54f0dbSXin Li 	/** ARM Cortex-A72. */
413*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a72   = 0x00300372,
414*2b54f0dbSXin Li 	/** ARM Cortex-A73. */
415*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a73   = 0x00300373,
416*2b54f0dbSXin Li 	/** ARM Cortex-A75. */
417*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a75   = 0x00300375,
418*2b54f0dbSXin Li 	/** ARM Cortex-A76. */
419*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a76   = 0x00300376,
420*2b54f0dbSXin Li 	/** ARM Cortex-A77. */
421*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a77   = 0x00300377,
422*2b54f0dbSXin Li 	/** ARM Cortex-A78. */
423*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a78   = 0x00300378,
424*2b54f0dbSXin Li 
425*2b54f0dbSXin Li 	/** ARM Neoverse N1. */
426*2b54f0dbSXin Li 	cpuinfo_uarch_neoverse_n1  = 0x00300400,
427*2b54f0dbSXin Li 	/** ARM Neoverse E1. */
428*2b54f0dbSXin Li 	cpuinfo_uarch_neoverse_e1  = 0x00300401,
429*2b54f0dbSXin Li 	/** ARM Neoverse V1. */
430*2b54f0dbSXin Li 	cpuinfo_uarch_neoverse_v1  = 0x00300402,
431*2b54f0dbSXin Li 	/** ARM Neoverse N2. */
432*2b54f0dbSXin Li 	cpuinfo_uarch_neoverse_n2  = 0x00300403,
433*2b54f0dbSXin Li 
434*2b54f0dbSXin Li 	/** ARM Cortex-X1. */
435*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_x1    = 0x00300501,
436*2b54f0dbSXin Li 	/** ARM Cortex-X2. */
437*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_x2    = 0x00300502,
438*2b54f0dbSXin Li 
439*2b54f0dbSXin Li 	/** ARM Cortex-A510. */
440*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a510  = 0x00300551,
441*2b54f0dbSXin Li 	/** ARM Cortex-A710. */
442*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a710  = 0x00300571,
443*2b54f0dbSXin Li 
444*2b54f0dbSXin Li 	/** Qualcomm Scorpion. */
445*2b54f0dbSXin Li 	cpuinfo_uarch_scorpion = 0x00400100,
446*2b54f0dbSXin Li 	/** Qualcomm Krait. */
447*2b54f0dbSXin Li 	cpuinfo_uarch_krait    = 0x00400101,
448*2b54f0dbSXin Li 	/** Qualcomm Kryo. */
449*2b54f0dbSXin Li 	cpuinfo_uarch_kryo     = 0x00400102,
450*2b54f0dbSXin Li 	/** Qualcomm Falkor. */
451*2b54f0dbSXin Li 	cpuinfo_uarch_falkor   = 0x00400103,
452*2b54f0dbSXin Li 	/** Qualcomm Saphira. */
453*2b54f0dbSXin Li 	cpuinfo_uarch_saphira  = 0x00400104,
454*2b54f0dbSXin Li 
455*2b54f0dbSXin Li 	/** Nvidia Denver. */
456*2b54f0dbSXin Li 	cpuinfo_uarch_denver   = 0x00500100,
457*2b54f0dbSXin Li 	/** Nvidia Denver 2. */
458*2b54f0dbSXin Li 	cpuinfo_uarch_denver2  = 0x00500101,
459*2b54f0dbSXin Li 	/** Nvidia Carmel. */
460*2b54f0dbSXin Li 	cpuinfo_uarch_carmel   = 0x00500102,
461*2b54f0dbSXin Li 
462*2b54f0dbSXin Li 	/** Samsung Exynos M1 (Exynos 8890 big cores). */
463*2b54f0dbSXin Li 	cpuinfo_uarch_exynos_m1 = 0x00600100,
464*2b54f0dbSXin Li 	/** Samsung Exynos M2 (Exynos 8895 big cores). */
465*2b54f0dbSXin Li 	cpuinfo_uarch_exynos_m2 = 0x00600101,
466*2b54f0dbSXin Li 	/** Samsung Exynos M3 (Exynos 9810 big cores). */
467*2b54f0dbSXin Li 	cpuinfo_uarch_exynos_m3  = 0x00600102,
468*2b54f0dbSXin Li 	/** Samsung Exynos M4 (Exynos 9820 big cores). */
469*2b54f0dbSXin Li 	cpuinfo_uarch_exynos_m4  = 0x00600103,
470*2b54f0dbSXin Li 	/** Samsung Exynos M5 (Exynos 9830 big cores). */
471*2b54f0dbSXin Li 	cpuinfo_uarch_exynos_m5  = 0x00600104,
472*2b54f0dbSXin Li 
473*2b54f0dbSXin Li 	/* Deprecated synonym for Cortex-A76 */
474*2b54f0dbSXin Li 	cpuinfo_uarch_cortex_a76ae = 0x00300376,
475*2b54f0dbSXin Li 	/* Deprecated names for Exynos. */
476*2b54f0dbSXin Li 	cpuinfo_uarch_mongoose_m1 = 0x00600100,
477*2b54f0dbSXin Li 	cpuinfo_uarch_mongoose_m2 = 0x00600101,
478*2b54f0dbSXin Li 	cpuinfo_uarch_meerkat_m3  = 0x00600102,
479*2b54f0dbSXin Li 	cpuinfo_uarch_meerkat_m4  = 0x00600103,
480*2b54f0dbSXin Li 
481*2b54f0dbSXin Li 	/** Apple A6 and A6X processors. */
482*2b54f0dbSXin Li 	cpuinfo_uarch_swift     = 0x00700100,
483*2b54f0dbSXin Li 	/** Apple A7 processor. */
484*2b54f0dbSXin Li 	cpuinfo_uarch_cyclone   = 0x00700101,
485*2b54f0dbSXin Li 	/** Apple A8 and A8X processor. */
486*2b54f0dbSXin Li 	cpuinfo_uarch_typhoon   = 0x00700102,
487*2b54f0dbSXin Li 	/** Apple A9 and A9X processor. */
488*2b54f0dbSXin Li 	cpuinfo_uarch_twister   = 0x00700103,
489*2b54f0dbSXin Li 	/** Apple A10 and A10X processor. */
490*2b54f0dbSXin Li 	cpuinfo_uarch_hurricane = 0x00700104,
491*2b54f0dbSXin Li 	/** Apple A11 processor (big cores). */
492*2b54f0dbSXin Li 	cpuinfo_uarch_monsoon   = 0x00700105,
493*2b54f0dbSXin Li 	/** Apple A11 processor (little cores). */
494*2b54f0dbSXin Li 	cpuinfo_uarch_mistral   = 0x00700106,
495*2b54f0dbSXin Li 	/** Apple A12 processor (big cores). */
496*2b54f0dbSXin Li 	cpuinfo_uarch_vortex    = 0x00700107,
497*2b54f0dbSXin Li 	/** Apple A12 processor (little cores). */
498*2b54f0dbSXin Li 	cpuinfo_uarch_tempest   = 0x00700108,
499*2b54f0dbSXin Li 	/** Apple A13 processor (big cores). */
500*2b54f0dbSXin Li 	cpuinfo_uarch_lightning = 0x00700109,
501*2b54f0dbSXin Li 	/** Apple A13 processor (little cores). */
502*2b54f0dbSXin Li 	cpuinfo_uarch_thunder   = 0x0070010A,
503*2b54f0dbSXin Li 	/** Apple A14 / M1 processor (big cores). */
504*2b54f0dbSXin Li 	cpuinfo_uarch_firestorm = 0x0070010B,
505*2b54f0dbSXin Li 	/** Apple A14 / M1 processor (little cores). */
506*2b54f0dbSXin Li 	cpuinfo_uarch_icestorm  = 0x0070010C,
507*2b54f0dbSXin Li 	/** Apple A15 / M2 processor (big cores). */
508*2b54f0dbSXin Li 	cpuinfo_uarch_avalanche = 0x0070010D,
509*2b54f0dbSXin Li 	/** Apple A15 / M2 processor (little cores). */
510*2b54f0dbSXin Li 	cpuinfo_uarch_blizzard  = 0x0070010E,
511*2b54f0dbSXin Li 
512*2b54f0dbSXin Li 	/** Cavium ThunderX. */
513*2b54f0dbSXin Li 	cpuinfo_uarch_thunderx = 0x00800100,
514*2b54f0dbSXin Li 	/** Cavium ThunderX2 (originally Broadcom Vulkan). */
515*2b54f0dbSXin Li 	cpuinfo_uarch_thunderx2 = 0x00800200,
516*2b54f0dbSXin Li 
517*2b54f0dbSXin Li 	/** Marvell PJ4. */
518*2b54f0dbSXin Li 	cpuinfo_uarch_pj4 = 0x00900100,
519*2b54f0dbSXin Li 
520*2b54f0dbSXin Li 	/** Broadcom Brahma B15. */
521*2b54f0dbSXin Li 	cpuinfo_uarch_brahma_b15 = 0x00A00100,
522*2b54f0dbSXin Li 	/** Broadcom Brahma B53. */
523*2b54f0dbSXin Li 	cpuinfo_uarch_brahma_b53 = 0x00A00101,
524*2b54f0dbSXin Li 
525*2b54f0dbSXin Li 	/** Applied Micro X-Gene. */
526*2b54f0dbSXin Li 	cpuinfo_uarch_xgene = 0x00B00100,
527*2b54f0dbSXin Li 
528*2b54f0dbSXin Li 	/* Hygon Dhyana (a modification of AMD Zen for Chinese market). */
529*2b54f0dbSXin Li 	cpuinfo_uarch_dhyana = 0x01000100,
530*2b54f0dbSXin Li 
531*2b54f0dbSXin Li 	/** HiSilicon TaiShan v110 (Huawei Kunpeng 920 series processors). */
532*2b54f0dbSXin Li 	cpuinfo_uarch_taishan_v110 = 0x00C00100,
533*2b54f0dbSXin Li };
534*2b54f0dbSXin Li 
535*2b54f0dbSXin Li struct cpuinfo_processor {
536*2b54f0dbSXin Li 	/** SMT (hyperthread) ID within a core */
537*2b54f0dbSXin Li 	uint32_t smt_id;
538*2b54f0dbSXin Li 	/** Core containing this logical processor */
539*2b54f0dbSXin Li 	const struct cpuinfo_core* core;
540*2b54f0dbSXin Li 	/** Cluster of cores containing this logical processor */
541*2b54f0dbSXin Li 	const struct cpuinfo_cluster* cluster;
542*2b54f0dbSXin Li 	/** Physical package containing this logical processor */
543*2b54f0dbSXin Li 	const struct cpuinfo_package* package;
544*2b54f0dbSXin Li #if defined(__linux__)
545*2b54f0dbSXin Li 	/**
546*2b54f0dbSXin Li 	 * Linux-specific ID for the logical processor:
547*2b54f0dbSXin Li 	 * - Linux kernel exposes information about this logical processor in /sys/devices/system/cpu/cpu<linux_id>/
548*2b54f0dbSXin Li 	 * - Bit <linux_id> in the cpu_set_t identifies this logical processor
549*2b54f0dbSXin Li 	 */
550*2b54f0dbSXin Li 	int linux_id;
551*2b54f0dbSXin Li #endif
552*2b54f0dbSXin Li #if defined(_WIN32) || defined(__CYGWIN__)
553*2b54f0dbSXin Li 	/** Windows-specific ID for the group containing the logical processor. */
554*2b54f0dbSXin Li 	uint16_t windows_group_id;
555*2b54f0dbSXin Li 	/**
556*2b54f0dbSXin Li 	 * Windows-specific ID of the logical processor within its group:
557*2b54f0dbSXin Li 	 * - Bit <windows_processor_id> in the KAFFINITY mask identifies this logical processor within its group.
558*2b54f0dbSXin Li 	 */
559*2b54f0dbSXin Li 	uint16_t windows_processor_id;
560*2b54f0dbSXin Li #endif
561*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
562*2b54f0dbSXin Li 	/** APIC ID (unique x86-specific ID of the logical processor) */
563*2b54f0dbSXin Li 	uint32_t apic_id;
564*2b54f0dbSXin Li #endif
565*2b54f0dbSXin Li 	struct {
566*2b54f0dbSXin Li 		/** Level 1 instruction cache */
567*2b54f0dbSXin Li 		const struct cpuinfo_cache* l1i;
568*2b54f0dbSXin Li 		/** Level 1 data cache */
569*2b54f0dbSXin Li 		const struct cpuinfo_cache* l1d;
570*2b54f0dbSXin Li 		/** Level 2 unified or data cache */
571*2b54f0dbSXin Li 		const struct cpuinfo_cache* l2;
572*2b54f0dbSXin Li 		/** Level 3 unified or data cache */
573*2b54f0dbSXin Li 		const struct cpuinfo_cache* l3;
574*2b54f0dbSXin Li 		/** Level 4 unified or data cache */
575*2b54f0dbSXin Li 		const struct cpuinfo_cache* l4;
576*2b54f0dbSXin Li 	} cache;
577*2b54f0dbSXin Li };
578*2b54f0dbSXin Li 
579*2b54f0dbSXin Li struct cpuinfo_core {
580*2b54f0dbSXin Li 	/** Index of the first logical processor on this core. */
581*2b54f0dbSXin Li 	uint32_t processor_start;
582*2b54f0dbSXin Li 	/** Number of logical processors on this core */
583*2b54f0dbSXin Li 	uint32_t processor_count;
584*2b54f0dbSXin Li 	/** Core ID within a package */
585*2b54f0dbSXin Li 	uint32_t core_id;
586*2b54f0dbSXin Li 	/** Cluster containing this core */
587*2b54f0dbSXin Li 	const struct cpuinfo_cluster* cluster;
588*2b54f0dbSXin Li 	/** Physical package containing this core. */
589*2b54f0dbSXin Li 	const struct cpuinfo_package* package;
590*2b54f0dbSXin Li 	/** Vendor of the CPU microarchitecture for this core */
591*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor;
592*2b54f0dbSXin Li 	/** CPU microarchitecture for this core */
593*2b54f0dbSXin Li 	enum cpuinfo_uarch uarch;
594*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
595*2b54f0dbSXin Li 	/** Value of CPUID leaf 1 EAX register for this core */
596*2b54f0dbSXin Li 	uint32_t cpuid;
597*2b54f0dbSXin Li #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
598*2b54f0dbSXin Li 	/** Value of Main ID Register (MIDR) for this core */
599*2b54f0dbSXin Li 	uint32_t midr;
600*2b54f0dbSXin Li #endif
601*2b54f0dbSXin Li 	/** Clock rate (non-Turbo) of the core, in Hz */
602*2b54f0dbSXin Li 	uint64_t frequency;
603*2b54f0dbSXin Li };
604*2b54f0dbSXin Li 
605*2b54f0dbSXin Li struct cpuinfo_cluster {
606*2b54f0dbSXin Li 	/** Index of the first logical processor in the cluster */
607*2b54f0dbSXin Li 	uint32_t processor_start;
608*2b54f0dbSXin Li 	/** Number of logical processors in the cluster */
609*2b54f0dbSXin Li 	uint32_t processor_count;
610*2b54f0dbSXin Li 	/** Index of the first core in the cluster */
611*2b54f0dbSXin Li 	uint32_t core_start;
612*2b54f0dbSXin Li 	/** Number of cores on the cluster */
613*2b54f0dbSXin Li 	uint32_t core_count;
614*2b54f0dbSXin Li 	/** Cluster ID within a package */
615*2b54f0dbSXin Li 	uint32_t cluster_id;
616*2b54f0dbSXin Li 	/** Physical package containing the cluster */
617*2b54f0dbSXin Li 	const struct cpuinfo_package* package;
618*2b54f0dbSXin Li 	/** CPU microarchitecture vendor of the cores in the cluster */
619*2b54f0dbSXin Li 	enum cpuinfo_vendor vendor;
620*2b54f0dbSXin Li 	/** CPU microarchitecture of the cores in the cluster */
621*2b54f0dbSXin Li 	enum cpuinfo_uarch uarch;
622*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
623*2b54f0dbSXin Li 	/** Value of CPUID leaf 1 EAX register of the cores in the cluster */
624*2b54f0dbSXin Li 	uint32_t cpuid;
625*2b54f0dbSXin Li #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
626*2b54f0dbSXin Li 	/** Value of Main ID Register (MIDR) of the cores in the cluster */
627*2b54f0dbSXin Li 	uint32_t midr;
628*2b54f0dbSXin Li #endif
629*2b54f0dbSXin Li 	/** Clock rate (non-Turbo) of the cores in the cluster, in Hz */
630*2b54f0dbSXin Li 	uint64_t frequency;
631*2b54f0dbSXin Li };
632*2b54f0dbSXin Li 
633*2b54f0dbSXin Li #define CPUINFO_PACKAGE_NAME_MAX 48
634*2b54f0dbSXin Li 
635*2b54f0dbSXin Li struct cpuinfo_package {
636*2b54f0dbSXin Li 	/** SoC or processor chip model name */
637*2b54f0dbSXin Li 	char name[CPUINFO_PACKAGE_NAME_MAX];
638*2b54f0dbSXin Li 	/** Index of the first logical processor on this physical package */
639*2b54f0dbSXin Li 	uint32_t processor_start;
640*2b54f0dbSXin Li 	/** Number of logical processors on this physical package */
641*2b54f0dbSXin Li 	uint32_t processor_count;
642*2b54f0dbSXin Li 	/** Index of the first core on this physical package */
643*2b54f0dbSXin Li 	uint32_t core_start;
644*2b54f0dbSXin Li 	/** Number of cores on this physical package */
645*2b54f0dbSXin Li 	uint32_t core_count;
646*2b54f0dbSXin Li 	/** Index of the first cluster of cores on this physical package */
647*2b54f0dbSXin Li 	uint32_t cluster_start;
648*2b54f0dbSXin Li 	/** Number of clusters of cores on this physical package */
649*2b54f0dbSXin Li 	uint32_t cluster_count;
650*2b54f0dbSXin Li };
651*2b54f0dbSXin Li 
652*2b54f0dbSXin Li struct cpuinfo_uarch_info {
653*2b54f0dbSXin Li 	/** Type of CPU microarchitecture */
654*2b54f0dbSXin Li 	enum cpuinfo_uarch uarch;
655*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
656*2b54f0dbSXin Li 	/** Value of CPUID leaf 1 EAX register for the microarchitecture */
657*2b54f0dbSXin Li 	uint32_t cpuid;
658*2b54f0dbSXin Li #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
659*2b54f0dbSXin Li 	/** Value of Main ID Register (MIDR) for the microarchitecture */
660*2b54f0dbSXin Li 	uint32_t midr;
661*2b54f0dbSXin Li #endif
662*2b54f0dbSXin Li 	/** Number of logical processors with the microarchitecture */
663*2b54f0dbSXin Li 	uint32_t processor_count;
664*2b54f0dbSXin Li 	/** Number of cores with the microarchitecture */
665*2b54f0dbSXin Li 	uint32_t core_count;
666*2b54f0dbSXin Li };
667*2b54f0dbSXin Li 
668*2b54f0dbSXin Li #ifdef __cplusplus
669*2b54f0dbSXin Li extern "C" {
670*2b54f0dbSXin Li #endif
671*2b54f0dbSXin Li 
672*2b54f0dbSXin Li bool CPUINFO_ABI cpuinfo_initialize(void);
673*2b54f0dbSXin Li 
674*2b54f0dbSXin Li void CPUINFO_ABI cpuinfo_deinitialize(void);
675*2b54f0dbSXin Li 
676*2b54f0dbSXin Li #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
677*2b54f0dbSXin Li 	/* This structure is not a part of stable API. Use cpuinfo_has_x86_* functions instead. */
678*2b54f0dbSXin Li 	struct cpuinfo_x86_isa {
679*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86
680*2b54f0dbSXin Li 			bool rdtsc;
681*2b54f0dbSXin Li 		#endif
682*2b54f0dbSXin Li 		bool rdtscp;
683*2b54f0dbSXin Li 		bool rdpid;
684*2b54f0dbSXin Li 		bool sysenter;
685*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86
686*2b54f0dbSXin Li 			bool syscall;
687*2b54f0dbSXin Li 		#endif
688*2b54f0dbSXin Li 		bool msr;
689*2b54f0dbSXin Li 		bool clzero;
690*2b54f0dbSXin Li 		bool clflush;
691*2b54f0dbSXin Li 		bool clflushopt;
692*2b54f0dbSXin Li 		bool mwait;
693*2b54f0dbSXin Li 		bool mwaitx;
694*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86
695*2b54f0dbSXin Li 			bool emmx;
696*2b54f0dbSXin Li 		#endif
697*2b54f0dbSXin Li 		bool fxsave;
698*2b54f0dbSXin Li 		bool xsave;
699*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86
700*2b54f0dbSXin Li 			bool fpu;
701*2b54f0dbSXin Li 			bool mmx;
702*2b54f0dbSXin Li 			bool mmx_plus;
703*2b54f0dbSXin Li 		#endif
704*2b54f0dbSXin Li 		bool three_d_now;
705*2b54f0dbSXin Li 		bool three_d_now_plus;
706*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86
707*2b54f0dbSXin Li 			bool three_d_now_geode;
708*2b54f0dbSXin Li 		#endif
709*2b54f0dbSXin Li 		bool prefetch;
710*2b54f0dbSXin Li 		bool prefetchw;
711*2b54f0dbSXin Li 		bool prefetchwt1;
712*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86
713*2b54f0dbSXin Li 			bool daz;
714*2b54f0dbSXin Li 			bool sse;
715*2b54f0dbSXin Li 			bool sse2;
716*2b54f0dbSXin Li 		#endif
717*2b54f0dbSXin Li 		bool sse3;
718*2b54f0dbSXin Li 		bool ssse3;
719*2b54f0dbSXin Li 		bool sse4_1;
720*2b54f0dbSXin Li 		bool sse4_2;
721*2b54f0dbSXin Li 		bool sse4a;
722*2b54f0dbSXin Li 		bool misaligned_sse;
723*2b54f0dbSXin Li 		bool avx;
724*2b54f0dbSXin Li 		bool fma3;
725*2b54f0dbSXin Li 		bool fma4;
726*2b54f0dbSXin Li 		bool xop;
727*2b54f0dbSXin Li 		bool f16c;
728*2b54f0dbSXin Li 		bool avx2;
729*2b54f0dbSXin Li 		bool avx512f;
730*2b54f0dbSXin Li 		bool avx512pf;
731*2b54f0dbSXin Li 		bool avx512er;
732*2b54f0dbSXin Li 		bool avx512cd;
733*2b54f0dbSXin Li 		bool avx512dq;
734*2b54f0dbSXin Li 		bool avx512bw;
735*2b54f0dbSXin Li 		bool avx512vl;
736*2b54f0dbSXin Li 		bool avx512ifma;
737*2b54f0dbSXin Li 		bool avx512vbmi;
738*2b54f0dbSXin Li 		bool avx512vbmi2;
739*2b54f0dbSXin Li 		bool avx512bitalg;
740*2b54f0dbSXin Li 		bool avx512vpopcntdq;
741*2b54f0dbSXin Li 		bool avx512vnni;
742*2b54f0dbSXin Li 		bool avx512bf16;
743*2b54f0dbSXin Li 		bool avx512vp2intersect;
744*2b54f0dbSXin Li 		bool avx512_4vnniw;
745*2b54f0dbSXin Li 		bool avx512_4fmaps;
746*2b54f0dbSXin Li 		bool hle;
747*2b54f0dbSXin Li 		bool rtm;
748*2b54f0dbSXin Li 		bool xtest;
749*2b54f0dbSXin Li 		bool mpx;
750*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86
751*2b54f0dbSXin Li 			bool cmov;
752*2b54f0dbSXin Li 			bool cmpxchg8b;
753*2b54f0dbSXin Li 		#endif
754*2b54f0dbSXin Li 		bool cmpxchg16b;
755*2b54f0dbSXin Li 		bool clwb;
756*2b54f0dbSXin Li 		bool movbe;
757*2b54f0dbSXin Li 		#if CPUINFO_ARCH_X86_64
758*2b54f0dbSXin Li 			bool lahf_sahf;
759*2b54f0dbSXin Li 		#endif
760*2b54f0dbSXin Li 		bool fs_gs_base;
761*2b54f0dbSXin Li 		bool lzcnt;
762*2b54f0dbSXin Li 		bool popcnt;
763*2b54f0dbSXin Li 		bool tbm;
764*2b54f0dbSXin Li 		bool bmi;
765*2b54f0dbSXin Li 		bool bmi2;
766*2b54f0dbSXin Li 		bool adx;
767*2b54f0dbSXin Li 		bool aes;
768*2b54f0dbSXin Li 		bool vaes;
769*2b54f0dbSXin Li 		bool pclmulqdq;
770*2b54f0dbSXin Li 		bool vpclmulqdq;
771*2b54f0dbSXin Li 		bool gfni;
772*2b54f0dbSXin Li 		bool rdrand;
773*2b54f0dbSXin Li 		bool rdseed;
774*2b54f0dbSXin Li 		bool sha;
775*2b54f0dbSXin Li 		bool rng;
776*2b54f0dbSXin Li 		bool ace;
777*2b54f0dbSXin Li 		bool ace2;
778*2b54f0dbSXin Li 		bool phe;
779*2b54f0dbSXin Li 		bool pmm;
780*2b54f0dbSXin Li 		bool lwp;
781*2b54f0dbSXin Li 	};
782*2b54f0dbSXin Li 
783*2b54f0dbSXin Li 	extern struct cpuinfo_x86_isa cpuinfo_isa;
784*2b54f0dbSXin Li #endif
785*2b54f0dbSXin Li 
cpuinfo_has_x86_rdtsc(void)786*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_rdtsc(void) {
787*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
788*2b54f0dbSXin Li 		return true;
789*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
790*2b54f0dbSXin Li 		#if defined(__ANDROID__)
791*2b54f0dbSXin Li 			return true;
792*2b54f0dbSXin Li 		#else
793*2b54f0dbSXin Li 			return cpuinfo_isa.rdtsc;
794*2b54f0dbSXin Li 		#endif
795*2b54f0dbSXin Li 	#else
796*2b54f0dbSXin Li 		return false;
797*2b54f0dbSXin Li 	#endif
798*2b54f0dbSXin Li }
799*2b54f0dbSXin Li 
cpuinfo_has_x86_rdtscp(void)800*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_rdtscp(void) {
801*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
802*2b54f0dbSXin Li 		return cpuinfo_isa.rdtscp;
803*2b54f0dbSXin Li 	#else
804*2b54f0dbSXin Li 		return false;
805*2b54f0dbSXin Li 	#endif
806*2b54f0dbSXin Li }
807*2b54f0dbSXin Li 
cpuinfo_has_x86_rdpid(void)808*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_rdpid(void) {
809*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
810*2b54f0dbSXin Li 		return cpuinfo_isa.rdpid;
811*2b54f0dbSXin Li 	#else
812*2b54f0dbSXin Li 		return false;
813*2b54f0dbSXin Li 	#endif
814*2b54f0dbSXin Li }
815*2b54f0dbSXin Li 
cpuinfo_has_x86_clzero(void)816*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_clzero(void) {
817*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
818*2b54f0dbSXin Li 		return cpuinfo_isa.clzero;
819*2b54f0dbSXin Li 	#else
820*2b54f0dbSXin Li 		return false;
821*2b54f0dbSXin Li 	#endif
822*2b54f0dbSXin Li }
823*2b54f0dbSXin Li 
cpuinfo_has_x86_mwait(void)824*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_mwait(void) {
825*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
826*2b54f0dbSXin Li 		return cpuinfo_isa.mwait;
827*2b54f0dbSXin Li 	#else
828*2b54f0dbSXin Li 		return false;
829*2b54f0dbSXin Li 	#endif
830*2b54f0dbSXin Li }
831*2b54f0dbSXin Li 
cpuinfo_has_x86_mwaitx(void)832*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_mwaitx(void) {
833*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
834*2b54f0dbSXin Li 		return cpuinfo_isa.mwaitx;
835*2b54f0dbSXin Li 	#else
836*2b54f0dbSXin Li 		return false;
837*2b54f0dbSXin Li 	#endif
838*2b54f0dbSXin Li }
839*2b54f0dbSXin Li 
cpuinfo_has_x86_fxsave(void)840*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_fxsave(void) {
841*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
842*2b54f0dbSXin Li 		return cpuinfo_isa.fxsave;
843*2b54f0dbSXin Li 	#else
844*2b54f0dbSXin Li 		return false;
845*2b54f0dbSXin Li 	#endif
846*2b54f0dbSXin Li }
847*2b54f0dbSXin Li 
cpuinfo_has_x86_xsave(void)848*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_xsave(void) {
849*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
850*2b54f0dbSXin Li 		return cpuinfo_isa.xsave;
851*2b54f0dbSXin Li 	#else
852*2b54f0dbSXin Li 		return false;
853*2b54f0dbSXin Li 	#endif
854*2b54f0dbSXin Li }
855*2b54f0dbSXin Li 
cpuinfo_has_x86_fpu(void)856*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_fpu(void) {
857*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
858*2b54f0dbSXin Li 		return true;
859*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
860*2b54f0dbSXin Li 		#if defined(__ANDROID__)
861*2b54f0dbSXin Li 			return true;
862*2b54f0dbSXin Li 		#else
863*2b54f0dbSXin Li 			return cpuinfo_isa.fpu;
864*2b54f0dbSXin Li 		#endif
865*2b54f0dbSXin Li 	#else
866*2b54f0dbSXin Li 		return false;
867*2b54f0dbSXin Li 	#endif
868*2b54f0dbSXin Li }
869*2b54f0dbSXin Li 
cpuinfo_has_x86_mmx(void)870*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_mmx(void) {
871*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
872*2b54f0dbSXin Li 		return true;
873*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
874*2b54f0dbSXin Li 		#if defined(__ANDROID__)
875*2b54f0dbSXin Li 			return true;
876*2b54f0dbSXin Li 		#else
877*2b54f0dbSXin Li 			return cpuinfo_isa.mmx;
878*2b54f0dbSXin Li 		#endif
879*2b54f0dbSXin Li 	#else
880*2b54f0dbSXin Li 		return false;
881*2b54f0dbSXin Li 	#endif
882*2b54f0dbSXin Li }
883*2b54f0dbSXin Li 
cpuinfo_has_x86_mmx_plus(void)884*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_mmx_plus(void) {
885*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
886*2b54f0dbSXin Li 		return true;
887*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
888*2b54f0dbSXin Li 		#if defined(__ANDROID__)
889*2b54f0dbSXin Li 			return true;
890*2b54f0dbSXin Li 		#else
891*2b54f0dbSXin Li 			return cpuinfo_isa.mmx_plus;
892*2b54f0dbSXin Li 		#endif
893*2b54f0dbSXin Li 	#else
894*2b54f0dbSXin Li 		return false;
895*2b54f0dbSXin Li 	#endif
896*2b54f0dbSXin Li }
897*2b54f0dbSXin Li 
cpuinfo_has_x86_3dnow(void)898*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_3dnow(void) {
899*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
900*2b54f0dbSXin Li 		return cpuinfo_isa.three_d_now;
901*2b54f0dbSXin Li 	#else
902*2b54f0dbSXin Li 		return false;
903*2b54f0dbSXin Li 	#endif
904*2b54f0dbSXin Li }
905*2b54f0dbSXin Li 
cpuinfo_has_x86_3dnow_plus(void)906*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_3dnow_plus(void) {
907*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
908*2b54f0dbSXin Li 		return cpuinfo_isa.three_d_now_plus;
909*2b54f0dbSXin Li 	#else
910*2b54f0dbSXin Li 		return false;
911*2b54f0dbSXin Li 	#endif
912*2b54f0dbSXin Li }
913*2b54f0dbSXin Li 
cpuinfo_has_x86_3dnow_geode(void)914*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_3dnow_geode(void) {
915*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
916*2b54f0dbSXin Li 		return false;
917*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
918*2b54f0dbSXin Li 		#if defined(__ANDROID__)
919*2b54f0dbSXin Li 			return false;
920*2b54f0dbSXin Li 		#else
921*2b54f0dbSXin Li 			return cpuinfo_isa.three_d_now_geode;
922*2b54f0dbSXin Li 		#endif
923*2b54f0dbSXin Li 	#else
924*2b54f0dbSXin Li 		return false;
925*2b54f0dbSXin Li 	#endif
926*2b54f0dbSXin Li }
927*2b54f0dbSXin Li 
cpuinfo_has_x86_prefetch(void)928*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_prefetch(void) {
929*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
930*2b54f0dbSXin Li 		return cpuinfo_isa.prefetch;
931*2b54f0dbSXin Li 	#else
932*2b54f0dbSXin Li 		return false;
933*2b54f0dbSXin Li 	#endif
934*2b54f0dbSXin Li }
935*2b54f0dbSXin Li 
cpuinfo_has_x86_prefetchw(void)936*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_prefetchw(void) {
937*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
938*2b54f0dbSXin Li 		return cpuinfo_isa.prefetchw;
939*2b54f0dbSXin Li 	#else
940*2b54f0dbSXin Li 		return false;
941*2b54f0dbSXin Li 	#endif
942*2b54f0dbSXin Li }
943*2b54f0dbSXin Li 
cpuinfo_has_x86_prefetchwt1(void)944*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_prefetchwt1(void) {
945*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
946*2b54f0dbSXin Li 		return cpuinfo_isa.prefetchwt1;
947*2b54f0dbSXin Li 	#else
948*2b54f0dbSXin Li 		return false;
949*2b54f0dbSXin Li 	#endif
950*2b54f0dbSXin Li }
951*2b54f0dbSXin Li 
cpuinfo_has_x86_daz(void)952*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_daz(void) {
953*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
954*2b54f0dbSXin Li 		return true;
955*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
956*2b54f0dbSXin Li 		#if defined(__ANDROID__)
957*2b54f0dbSXin Li 			return true;
958*2b54f0dbSXin Li 		#else
959*2b54f0dbSXin Li 			return cpuinfo_isa.daz;
960*2b54f0dbSXin Li 		#endif
961*2b54f0dbSXin Li 	#else
962*2b54f0dbSXin Li 		return false;
963*2b54f0dbSXin Li 	#endif
964*2b54f0dbSXin Li }
965*2b54f0dbSXin Li 
cpuinfo_has_x86_sse(void)966*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_sse(void) {
967*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
968*2b54f0dbSXin Li 		return true;
969*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
970*2b54f0dbSXin Li 		#if defined(__ANDROID__)
971*2b54f0dbSXin Li 			return true;
972*2b54f0dbSXin Li 		#else
973*2b54f0dbSXin Li 			return cpuinfo_isa.sse;
974*2b54f0dbSXin Li 		#endif
975*2b54f0dbSXin Li 	#else
976*2b54f0dbSXin Li 		return false;
977*2b54f0dbSXin Li 	#endif
978*2b54f0dbSXin Li }
979*2b54f0dbSXin Li 
cpuinfo_has_x86_sse2(void)980*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_sse2(void) {
981*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
982*2b54f0dbSXin Li 		return true;
983*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
984*2b54f0dbSXin Li 		#if defined(__ANDROID__)
985*2b54f0dbSXin Li 			return true;
986*2b54f0dbSXin Li 		#else
987*2b54f0dbSXin Li 			return cpuinfo_isa.sse2;
988*2b54f0dbSXin Li 		#endif
989*2b54f0dbSXin Li 	#else
990*2b54f0dbSXin Li 		return false;
991*2b54f0dbSXin Li 	#endif
992*2b54f0dbSXin Li }
993*2b54f0dbSXin Li 
cpuinfo_has_x86_sse3(void)994*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_sse3(void) {
995*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
996*2b54f0dbSXin Li 		#if defined(__ANDROID__)
997*2b54f0dbSXin Li 			return true;
998*2b54f0dbSXin Li 		#else
999*2b54f0dbSXin Li 			return cpuinfo_isa.sse3;
1000*2b54f0dbSXin Li 		#endif
1001*2b54f0dbSXin Li 	#else
1002*2b54f0dbSXin Li 		return false;
1003*2b54f0dbSXin Li 	#endif
1004*2b54f0dbSXin Li }
1005*2b54f0dbSXin Li 
cpuinfo_has_x86_ssse3(void)1006*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_ssse3(void) {
1007*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1008*2b54f0dbSXin Li 		#if defined(__ANDROID__)
1009*2b54f0dbSXin Li 			return true;
1010*2b54f0dbSXin Li 		#else
1011*2b54f0dbSXin Li 			return cpuinfo_isa.ssse3;
1012*2b54f0dbSXin Li 		#endif
1013*2b54f0dbSXin Li 	#else
1014*2b54f0dbSXin Li 		return false;
1015*2b54f0dbSXin Li 	#endif
1016*2b54f0dbSXin Li }
1017*2b54f0dbSXin Li 
cpuinfo_has_x86_sse4_1(void)1018*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_sse4_1(void) {
1019*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
1020*2b54f0dbSXin Li 		#if defined(__ANDROID__)
1021*2b54f0dbSXin Li 			return true;
1022*2b54f0dbSXin Li 		#else
1023*2b54f0dbSXin Li 			return cpuinfo_isa.sse4_1;
1024*2b54f0dbSXin Li 		#endif
1025*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
1026*2b54f0dbSXin Li 		return cpuinfo_isa.sse4_1;
1027*2b54f0dbSXin Li 	#else
1028*2b54f0dbSXin Li 		return false;
1029*2b54f0dbSXin Li 	#endif
1030*2b54f0dbSXin Li }
1031*2b54f0dbSXin Li 
cpuinfo_has_x86_sse4_2(void)1032*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_sse4_2(void) {
1033*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
1034*2b54f0dbSXin Li 		#if defined(__ANDROID__)
1035*2b54f0dbSXin Li 			return true;
1036*2b54f0dbSXin Li 		#else
1037*2b54f0dbSXin Li 			return cpuinfo_isa.sse4_2;
1038*2b54f0dbSXin Li 		#endif
1039*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
1040*2b54f0dbSXin Li 		return cpuinfo_isa.sse4_2;
1041*2b54f0dbSXin Li 	#else
1042*2b54f0dbSXin Li 		return false;
1043*2b54f0dbSXin Li 	#endif
1044*2b54f0dbSXin Li }
1045*2b54f0dbSXin Li 
cpuinfo_has_x86_sse4a(void)1046*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_sse4a(void) {
1047*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1048*2b54f0dbSXin Li 		return cpuinfo_isa.sse4a;
1049*2b54f0dbSXin Li 	#else
1050*2b54f0dbSXin Li 		return false;
1051*2b54f0dbSXin Li 	#endif
1052*2b54f0dbSXin Li }
1053*2b54f0dbSXin Li 
cpuinfo_has_x86_misaligned_sse(void)1054*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_misaligned_sse(void) {
1055*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1056*2b54f0dbSXin Li 		return cpuinfo_isa.misaligned_sse;
1057*2b54f0dbSXin Li 	#else
1058*2b54f0dbSXin Li 		return false;
1059*2b54f0dbSXin Li 	#endif
1060*2b54f0dbSXin Li }
1061*2b54f0dbSXin Li 
cpuinfo_has_x86_avx(void)1062*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx(void) {
1063*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1064*2b54f0dbSXin Li 		return cpuinfo_isa.avx;
1065*2b54f0dbSXin Li 	#else
1066*2b54f0dbSXin Li 		return false;
1067*2b54f0dbSXin Li 	#endif
1068*2b54f0dbSXin Li }
1069*2b54f0dbSXin Li 
cpuinfo_has_x86_fma3(void)1070*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_fma3(void) {
1071*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1072*2b54f0dbSXin Li 		return cpuinfo_isa.fma3;
1073*2b54f0dbSXin Li 	#else
1074*2b54f0dbSXin Li 		return false;
1075*2b54f0dbSXin Li 	#endif
1076*2b54f0dbSXin Li }
1077*2b54f0dbSXin Li 
cpuinfo_has_x86_fma4(void)1078*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_fma4(void) {
1079*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1080*2b54f0dbSXin Li 		return cpuinfo_isa.fma4;
1081*2b54f0dbSXin Li 	#else
1082*2b54f0dbSXin Li 		return false;
1083*2b54f0dbSXin Li 	#endif
1084*2b54f0dbSXin Li }
1085*2b54f0dbSXin Li 
cpuinfo_has_x86_xop(void)1086*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_xop(void) {
1087*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1088*2b54f0dbSXin Li 		return cpuinfo_isa.xop;
1089*2b54f0dbSXin Li 	#else
1090*2b54f0dbSXin Li 		return false;
1091*2b54f0dbSXin Li 	#endif
1092*2b54f0dbSXin Li }
1093*2b54f0dbSXin Li 
cpuinfo_has_x86_f16c(void)1094*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_f16c(void) {
1095*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1096*2b54f0dbSXin Li 		return cpuinfo_isa.f16c;
1097*2b54f0dbSXin Li 	#else
1098*2b54f0dbSXin Li 		return false;
1099*2b54f0dbSXin Li 	#endif
1100*2b54f0dbSXin Li }
1101*2b54f0dbSXin Li 
cpuinfo_has_x86_avx2(void)1102*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx2(void) {
1103*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1104*2b54f0dbSXin Li 		return cpuinfo_isa.avx2;
1105*2b54f0dbSXin Li 	#else
1106*2b54f0dbSXin Li 		return false;
1107*2b54f0dbSXin Li 	#endif
1108*2b54f0dbSXin Li }
1109*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512f(void)1110*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512f(void) {
1111*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1112*2b54f0dbSXin Li 		return cpuinfo_isa.avx512f;
1113*2b54f0dbSXin Li 	#else
1114*2b54f0dbSXin Li 		return false;
1115*2b54f0dbSXin Li 	#endif
1116*2b54f0dbSXin Li }
1117*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512pf(void)1118*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512pf(void) {
1119*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1120*2b54f0dbSXin Li 		return cpuinfo_isa.avx512pf;
1121*2b54f0dbSXin Li 	#else
1122*2b54f0dbSXin Li 		return false;
1123*2b54f0dbSXin Li 	#endif
1124*2b54f0dbSXin Li }
1125*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512er(void)1126*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512er(void) {
1127*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1128*2b54f0dbSXin Li 		return cpuinfo_isa.avx512er;
1129*2b54f0dbSXin Li 	#else
1130*2b54f0dbSXin Li 		return false;
1131*2b54f0dbSXin Li 	#endif
1132*2b54f0dbSXin Li }
1133*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512cd(void)1134*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512cd(void) {
1135*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1136*2b54f0dbSXin Li 		return cpuinfo_isa.avx512cd;
1137*2b54f0dbSXin Li 	#else
1138*2b54f0dbSXin Li 		return false;
1139*2b54f0dbSXin Li 	#endif
1140*2b54f0dbSXin Li }
1141*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512dq(void)1142*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512dq(void) {
1143*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1144*2b54f0dbSXin Li 		return cpuinfo_isa.avx512dq;
1145*2b54f0dbSXin Li 	#else
1146*2b54f0dbSXin Li 		return false;
1147*2b54f0dbSXin Li 	#endif
1148*2b54f0dbSXin Li }
1149*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512bw(void)1150*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512bw(void) {
1151*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1152*2b54f0dbSXin Li 		return cpuinfo_isa.avx512bw;
1153*2b54f0dbSXin Li 	#else
1154*2b54f0dbSXin Li 		return false;
1155*2b54f0dbSXin Li 	#endif
1156*2b54f0dbSXin Li }
1157*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512vl(void)1158*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512vl(void) {
1159*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1160*2b54f0dbSXin Li 		return cpuinfo_isa.avx512vl;
1161*2b54f0dbSXin Li 	#else
1162*2b54f0dbSXin Li 		return false;
1163*2b54f0dbSXin Li 	#endif
1164*2b54f0dbSXin Li }
1165*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512ifma(void)1166*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512ifma(void) {
1167*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1168*2b54f0dbSXin Li 		return cpuinfo_isa.avx512ifma;
1169*2b54f0dbSXin Li 	#else
1170*2b54f0dbSXin Li 		return false;
1171*2b54f0dbSXin Li 	#endif
1172*2b54f0dbSXin Li }
1173*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512vbmi(void)1174*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512vbmi(void) {
1175*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1176*2b54f0dbSXin Li 		return cpuinfo_isa.avx512vbmi;
1177*2b54f0dbSXin Li 	#else
1178*2b54f0dbSXin Li 		return false;
1179*2b54f0dbSXin Li 	#endif
1180*2b54f0dbSXin Li }
1181*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512vbmi2(void)1182*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512vbmi2(void) {
1183*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1184*2b54f0dbSXin Li 		return cpuinfo_isa.avx512vbmi2;
1185*2b54f0dbSXin Li 	#else
1186*2b54f0dbSXin Li 		return false;
1187*2b54f0dbSXin Li 	#endif
1188*2b54f0dbSXin Li }
1189*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512bitalg(void)1190*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512bitalg(void) {
1191*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1192*2b54f0dbSXin Li 		return cpuinfo_isa.avx512bitalg;
1193*2b54f0dbSXin Li 	#else
1194*2b54f0dbSXin Li 		return false;
1195*2b54f0dbSXin Li 	#endif
1196*2b54f0dbSXin Li }
1197*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512vpopcntdq(void)1198*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512vpopcntdq(void) {
1199*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1200*2b54f0dbSXin Li 		return cpuinfo_isa.avx512vpopcntdq;
1201*2b54f0dbSXin Li 	#else
1202*2b54f0dbSXin Li 		return false;
1203*2b54f0dbSXin Li 	#endif
1204*2b54f0dbSXin Li }
1205*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512vnni(void)1206*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512vnni(void) {
1207*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1208*2b54f0dbSXin Li 		return cpuinfo_isa.avx512vnni;
1209*2b54f0dbSXin Li 	#else
1210*2b54f0dbSXin Li 		return false;
1211*2b54f0dbSXin Li 	#endif
1212*2b54f0dbSXin Li }
1213*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512bf16(void)1214*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512bf16(void) {
1215*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1216*2b54f0dbSXin Li 		return cpuinfo_isa.avx512bf16;
1217*2b54f0dbSXin Li 	#else
1218*2b54f0dbSXin Li 		return false;
1219*2b54f0dbSXin Li 	#endif
1220*2b54f0dbSXin Li }
1221*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512vp2intersect(void)1222*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512vp2intersect(void) {
1223*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1224*2b54f0dbSXin Li 		return cpuinfo_isa.avx512vp2intersect;
1225*2b54f0dbSXin Li 	#else
1226*2b54f0dbSXin Li 		return false;
1227*2b54f0dbSXin Li 	#endif
1228*2b54f0dbSXin Li }
1229*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512_4vnniw(void)1230*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512_4vnniw(void) {
1231*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1232*2b54f0dbSXin Li 		return cpuinfo_isa.avx512_4vnniw;
1233*2b54f0dbSXin Li 	#else
1234*2b54f0dbSXin Li 		return false;
1235*2b54f0dbSXin Li 	#endif
1236*2b54f0dbSXin Li }
1237*2b54f0dbSXin Li 
cpuinfo_has_x86_avx512_4fmaps(void)1238*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_avx512_4fmaps(void) {
1239*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1240*2b54f0dbSXin Li 		return cpuinfo_isa.avx512_4fmaps;
1241*2b54f0dbSXin Li 	#else
1242*2b54f0dbSXin Li 		return false;
1243*2b54f0dbSXin Li 	#endif
1244*2b54f0dbSXin Li }
1245*2b54f0dbSXin Li 
cpuinfo_has_x86_hle(void)1246*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_hle(void) {
1247*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1248*2b54f0dbSXin Li 		return cpuinfo_isa.hle;
1249*2b54f0dbSXin Li 	#else
1250*2b54f0dbSXin Li 		return false;
1251*2b54f0dbSXin Li 	#endif
1252*2b54f0dbSXin Li }
1253*2b54f0dbSXin Li 
cpuinfo_has_x86_rtm(void)1254*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_rtm(void) {
1255*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1256*2b54f0dbSXin Li 		return cpuinfo_isa.rtm;
1257*2b54f0dbSXin Li 	#else
1258*2b54f0dbSXin Li 		return false;
1259*2b54f0dbSXin Li 	#endif
1260*2b54f0dbSXin Li }
1261*2b54f0dbSXin Li 
cpuinfo_has_x86_xtest(void)1262*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_xtest(void) {
1263*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1264*2b54f0dbSXin Li 		return cpuinfo_isa.xtest;
1265*2b54f0dbSXin Li 	#else
1266*2b54f0dbSXin Li 		return false;
1267*2b54f0dbSXin Li 	#endif
1268*2b54f0dbSXin Li }
1269*2b54f0dbSXin Li 
cpuinfo_has_x86_mpx(void)1270*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_mpx(void) {
1271*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1272*2b54f0dbSXin Li 		return cpuinfo_isa.mpx;
1273*2b54f0dbSXin Li 	#else
1274*2b54f0dbSXin Li 		return false;
1275*2b54f0dbSXin Li 	#endif
1276*2b54f0dbSXin Li }
1277*2b54f0dbSXin Li 
cpuinfo_has_x86_cmov(void)1278*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_cmov(void) {
1279*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
1280*2b54f0dbSXin Li 		return true;
1281*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
1282*2b54f0dbSXin Li 		return cpuinfo_isa.cmov;
1283*2b54f0dbSXin Li 	#else
1284*2b54f0dbSXin Li 		return false;
1285*2b54f0dbSXin Li 	#endif
1286*2b54f0dbSXin Li }
1287*2b54f0dbSXin Li 
cpuinfo_has_x86_cmpxchg8b(void)1288*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_cmpxchg8b(void) {
1289*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
1290*2b54f0dbSXin Li 		return true;
1291*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
1292*2b54f0dbSXin Li 		return cpuinfo_isa.cmpxchg8b;
1293*2b54f0dbSXin Li 	#else
1294*2b54f0dbSXin Li 		return false;
1295*2b54f0dbSXin Li 	#endif
1296*2b54f0dbSXin Li }
1297*2b54f0dbSXin Li 
cpuinfo_has_x86_cmpxchg16b(void)1298*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_cmpxchg16b(void) {
1299*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
1300*2b54f0dbSXin Li 		return cpuinfo_isa.cmpxchg16b;
1301*2b54f0dbSXin Li 	#else
1302*2b54f0dbSXin Li 		return false;
1303*2b54f0dbSXin Li 	#endif
1304*2b54f0dbSXin Li }
1305*2b54f0dbSXin Li 
cpuinfo_has_x86_clwb(void)1306*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_clwb(void) {
1307*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1308*2b54f0dbSXin Li 		return cpuinfo_isa.clwb;
1309*2b54f0dbSXin Li 	#else
1310*2b54f0dbSXin Li 		return false;
1311*2b54f0dbSXin Li 	#endif
1312*2b54f0dbSXin Li }
1313*2b54f0dbSXin Li 
cpuinfo_has_x86_movbe(void)1314*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_movbe(void) {
1315*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1316*2b54f0dbSXin Li 		return cpuinfo_isa.movbe;
1317*2b54f0dbSXin Li 	#else
1318*2b54f0dbSXin Li 		return false;
1319*2b54f0dbSXin Li 	#endif
1320*2b54f0dbSXin Li }
1321*2b54f0dbSXin Li 
cpuinfo_has_x86_lahf_sahf(void)1322*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_lahf_sahf(void) {
1323*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86
1324*2b54f0dbSXin Li 		return true;
1325*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86_64
1326*2b54f0dbSXin Li 		return cpuinfo_isa.lahf_sahf;
1327*2b54f0dbSXin Li 	#else
1328*2b54f0dbSXin Li 		return false;
1329*2b54f0dbSXin Li 	#endif
1330*2b54f0dbSXin Li }
1331*2b54f0dbSXin Li 
cpuinfo_has_x86_lzcnt(void)1332*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_lzcnt(void) {
1333*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1334*2b54f0dbSXin Li 		return cpuinfo_isa.lzcnt;
1335*2b54f0dbSXin Li 	#else
1336*2b54f0dbSXin Li 		return false;
1337*2b54f0dbSXin Li 	#endif
1338*2b54f0dbSXin Li }
1339*2b54f0dbSXin Li 
cpuinfo_has_x86_popcnt(void)1340*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_popcnt(void) {
1341*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86_64
1342*2b54f0dbSXin Li 		#if defined(__ANDROID__)
1343*2b54f0dbSXin Li 			return true;
1344*2b54f0dbSXin Li 		#else
1345*2b54f0dbSXin Li 			return cpuinfo_isa.popcnt;
1346*2b54f0dbSXin Li 		#endif
1347*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_X86
1348*2b54f0dbSXin Li 		return cpuinfo_isa.popcnt;
1349*2b54f0dbSXin Li 	#else
1350*2b54f0dbSXin Li 		return false;
1351*2b54f0dbSXin Li 	#endif
1352*2b54f0dbSXin Li }
1353*2b54f0dbSXin Li 
cpuinfo_has_x86_tbm(void)1354*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_tbm(void) {
1355*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1356*2b54f0dbSXin Li 		return cpuinfo_isa.tbm;
1357*2b54f0dbSXin Li 	#else
1358*2b54f0dbSXin Li 		return false;
1359*2b54f0dbSXin Li 	#endif
1360*2b54f0dbSXin Li }
1361*2b54f0dbSXin Li 
cpuinfo_has_x86_bmi(void)1362*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_bmi(void) {
1363*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1364*2b54f0dbSXin Li 		return cpuinfo_isa.bmi;
1365*2b54f0dbSXin Li 	#else
1366*2b54f0dbSXin Li 		return false;
1367*2b54f0dbSXin Li 	#endif
1368*2b54f0dbSXin Li }
1369*2b54f0dbSXin Li 
cpuinfo_has_x86_bmi2(void)1370*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_bmi2(void) {
1371*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1372*2b54f0dbSXin Li 		return cpuinfo_isa.bmi2;
1373*2b54f0dbSXin Li 	#else
1374*2b54f0dbSXin Li 		return false;
1375*2b54f0dbSXin Li 	#endif
1376*2b54f0dbSXin Li }
1377*2b54f0dbSXin Li 
cpuinfo_has_x86_adx(void)1378*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_adx(void) {
1379*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1380*2b54f0dbSXin Li 		return cpuinfo_isa.adx;
1381*2b54f0dbSXin Li 	#else
1382*2b54f0dbSXin Li 		return false;
1383*2b54f0dbSXin Li 	#endif
1384*2b54f0dbSXin Li }
1385*2b54f0dbSXin Li 
cpuinfo_has_x86_aes(void)1386*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_aes(void) {
1387*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1388*2b54f0dbSXin Li 		return cpuinfo_isa.aes;
1389*2b54f0dbSXin Li 	#else
1390*2b54f0dbSXin Li 		return false;
1391*2b54f0dbSXin Li 	#endif
1392*2b54f0dbSXin Li }
1393*2b54f0dbSXin Li 
cpuinfo_has_x86_vaes(void)1394*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_vaes(void) {
1395*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1396*2b54f0dbSXin Li 		return cpuinfo_isa.vaes;
1397*2b54f0dbSXin Li 	#else
1398*2b54f0dbSXin Li 		return false;
1399*2b54f0dbSXin Li 	#endif
1400*2b54f0dbSXin Li }
1401*2b54f0dbSXin Li 
cpuinfo_has_x86_pclmulqdq(void)1402*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_pclmulqdq(void) {
1403*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1404*2b54f0dbSXin Li 		return cpuinfo_isa.pclmulqdq;
1405*2b54f0dbSXin Li 	#else
1406*2b54f0dbSXin Li 		return false;
1407*2b54f0dbSXin Li 	#endif
1408*2b54f0dbSXin Li }
1409*2b54f0dbSXin Li 
cpuinfo_has_x86_vpclmulqdq(void)1410*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_vpclmulqdq(void) {
1411*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1412*2b54f0dbSXin Li 		return cpuinfo_isa.vpclmulqdq;
1413*2b54f0dbSXin Li 	#else
1414*2b54f0dbSXin Li 		return false;
1415*2b54f0dbSXin Li 	#endif
1416*2b54f0dbSXin Li }
1417*2b54f0dbSXin Li 
cpuinfo_has_x86_gfni(void)1418*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_gfni(void) {
1419*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1420*2b54f0dbSXin Li 		return cpuinfo_isa.gfni;
1421*2b54f0dbSXin Li 	#else
1422*2b54f0dbSXin Li 		return false;
1423*2b54f0dbSXin Li 	#endif
1424*2b54f0dbSXin Li }
1425*2b54f0dbSXin Li 
cpuinfo_has_x86_rdrand(void)1426*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_rdrand(void) {
1427*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1428*2b54f0dbSXin Li 		return cpuinfo_isa.rdrand;
1429*2b54f0dbSXin Li 	#else
1430*2b54f0dbSXin Li 		return false;
1431*2b54f0dbSXin Li 	#endif
1432*2b54f0dbSXin Li }
1433*2b54f0dbSXin Li 
cpuinfo_has_x86_rdseed(void)1434*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_rdseed(void) {
1435*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1436*2b54f0dbSXin Li 		return cpuinfo_isa.rdseed;
1437*2b54f0dbSXin Li 	#else
1438*2b54f0dbSXin Li 		return false;
1439*2b54f0dbSXin Li 	#endif
1440*2b54f0dbSXin Li }
1441*2b54f0dbSXin Li 
cpuinfo_has_x86_sha(void)1442*2b54f0dbSXin Li static inline bool cpuinfo_has_x86_sha(void) {
1443*2b54f0dbSXin Li 	#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1444*2b54f0dbSXin Li 		return cpuinfo_isa.sha;
1445*2b54f0dbSXin Li 	#else
1446*2b54f0dbSXin Li 		return false;
1447*2b54f0dbSXin Li 	#endif
1448*2b54f0dbSXin Li }
1449*2b54f0dbSXin Li 
1450*2b54f0dbSXin Li #if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1451*2b54f0dbSXin Li 	/* This structure is not a part of stable API. Use cpuinfo_has_arm_* functions instead. */
1452*2b54f0dbSXin Li 	struct cpuinfo_arm_isa {
1453*2b54f0dbSXin Li 		#if CPUINFO_ARCH_ARM
1454*2b54f0dbSXin Li 			bool thumb;
1455*2b54f0dbSXin Li 			bool thumb2;
1456*2b54f0dbSXin Li 			bool thumbee;
1457*2b54f0dbSXin Li 			bool jazelle;
1458*2b54f0dbSXin Li 			bool armv5e;
1459*2b54f0dbSXin Li 			bool armv6;
1460*2b54f0dbSXin Li 			bool armv6k;
1461*2b54f0dbSXin Li 			bool armv7;
1462*2b54f0dbSXin Li 			bool armv7mp;
1463*2b54f0dbSXin Li 			bool armv8;
1464*2b54f0dbSXin Li 			bool idiv;
1465*2b54f0dbSXin Li 
1466*2b54f0dbSXin Li 			bool vfpv2;
1467*2b54f0dbSXin Li 			bool vfpv3;
1468*2b54f0dbSXin Li 			bool d32;
1469*2b54f0dbSXin Li 			bool fp16;
1470*2b54f0dbSXin Li 			bool fma;
1471*2b54f0dbSXin Li 
1472*2b54f0dbSXin Li 			bool wmmx;
1473*2b54f0dbSXin Li 			bool wmmx2;
1474*2b54f0dbSXin Li 			bool neon;
1475*2b54f0dbSXin Li 		#endif
1476*2b54f0dbSXin Li 		#if CPUINFO_ARCH_ARM64
1477*2b54f0dbSXin Li 			bool atomics;
1478*2b54f0dbSXin Li 			bool bf16;
1479*2b54f0dbSXin Li 			bool sve;
1480*2b54f0dbSXin Li 			bool sve2;
1481*2b54f0dbSXin Li 			bool i8mm;
1482*2b54f0dbSXin Li 		#endif
1483*2b54f0dbSXin Li 		bool rdm;
1484*2b54f0dbSXin Li 		bool fp16arith;
1485*2b54f0dbSXin Li 		bool dot;
1486*2b54f0dbSXin Li 		bool jscvt;
1487*2b54f0dbSXin Li 		bool fcma;
1488*2b54f0dbSXin Li 		bool fhm;
1489*2b54f0dbSXin Li 
1490*2b54f0dbSXin Li 		bool aes;
1491*2b54f0dbSXin Li 		bool sha1;
1492*2b54f0dbSXin Li 		bool sha2;
1493*2b54f0dbSXin Li 		bool pmull;
1494*2b54f0dbSXin Li 		bool crc32;
1495*2b54f0dbSXin Li 	};
1496*2b54f0dbSXin Li 
1497*2b54f0dbSXin Li 	extern struct cpuinfo_arm_isa cpuinfo_isa;
1498*2b54f0dbSXin Li #endif
1499*2b54f0dbSXin Li 
cpuinfo_has_arm_thumb(void)1500*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_thumb(void) {
1501*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1502*2b54f0dbSXin Li 		return cpuinfo_isa.thumb;
1503*2b54f0dbSXin Li 	#else
1504*2b54f0dbSXin Li 		return false;
1505*2b54f0dbSXin Li 	#endif
1506*2b54f0dbSXin Li }
1507*2b54f0dbSXin Li 
cpuinfo_has_arm_thumb2(void)1508*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_thumb2(void) {
1509*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1510*2b54f0dbSXin Li 		return cpuinfo_isa.thumb2;
1511*2b54f0dbSXin Li 	#else
1512*2b54f0dbSXin Li 		return false;
1513*2b54f0dbSXin Li 	#endif
1514*2b54f0dbSXin Li }
1515*2b54f0dbSXin Li 
cpuinfo_has_arm_v5e(void)1516*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_v5e(void) {
1517*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1518*2b54f0dbSXin Li 		return cpuinfo_isa.armv5e;
1519*2b54f0dbSXin Li 	#else
1520*2b54f0dbSXin Li 		return false;
1521*2b54f0dbSXin Li 	#endif
1522*2b54f0dbSXin Li }
1523*2b54f0dbSXin Li 
cpuinfo_has_arm_v6(void)1524*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_v6(void) {
1525*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1526*2b54f0dbSXin Li 		return cpuinfo_isa.armv6;
1527*2b54f0dbSXin Li 	#else
1528*2b54f0dbSXin Li 		return false;
1529*2b54f0dbSXin Li 	#endif
1530*2b54f0dbSXin Li }
1531*2b54f0dbSXin Li 
cpuinfo_has_arm_v6k(void)1532*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_v6k(void) {
1533*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1534*2b54f0dbSXin Li 		return cpuinfo_isa.armv6k;
1535*2b54f0dbSXin Li 	#else
1536*2b54f0dbSXin Li 		return false;
1537*2b54f0dbSXin Li 	#endif
1538*2b54f0dbSXin Li }
1539*2b54f0dbSXin Li 
cpuinfo_has_arm_v7(void)1540*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_v7(void) {
1541*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1542*2b54f0dbSXin Li 		return cpuinfo_isa.armv7;
1543*2b54f0dbSXin Li 	#else
1544*2b54f0dbSXin Li 		return false;
1545*2b54f0dbSXin Li 	#endif
1546*2b54f0dbSXin Li }
1547*2b54f0dbSXin Li 
cpuinfo_has_arm_v7mp(void)1548*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_v7mp(void) {
1549*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1550*2b54f0dbSXin Li 		return cpuinfo_isa.armv7mp;
1551*2b54f0dbSXin Li 	#else
1552*2b54f0dbSXin Li 		return false;
1553*2b54f0dbSXin Li 	#endif
1554*2b54f0dbSXin Li }
1555*2b54f0dbSXin Li 
cpuinfo_has_arm_v8(void)1556*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_v8(void) {
1557*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1558*2b54f0dbSXin Li 		return true;
1559*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1560*2b54f0dbSXin Li 		return cpuinfo_isa.armv8;
1561*2b54f0dbSXin Li 	#else
1562*2b54f0dbSXin Li 		return false;
1563*2b54f0dbSXin Li 	#endif
1564*2b54f0dbSXin Li }
1565*2b54f0dbSXin Li 
cpuinfo_has_arm_idiv(void)1566*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_idiv(void) {
1567*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1568*2b54f0dbSXin Li 		return true;
1569*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1570*2b54f0dbSXin Li 		return cpuinfo_isa.idiv;
1571*2b54f0dbSXin Li 	#else
1572*2b54f0dbSXin Li 		return false;
1573*2b54f0dbSXin Li 	#endif
1574*2b54f0dbSXin Li }
1575*2b54f0dbSXin Li 
cpuinfo_has_arm_vfpv2(void)1576*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_vfpv2(void) {
1577*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1578*2b54f0dbSXin Li 		return cpuinfo_isa.vfpv2;
1579*2b54f0dbSXin Li 	#else
1580*2b54f0dbSXin Li 		return false;
1581*2b54f0dbSXin Li 	#endif
1582*2b54f0dbSXin Li }
1583*2b54f0dbSXin Li 
cpuinfo_has_arm_vfpv3(void)1584*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_vfpv3(void) {
1585*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1586*2b54f0dbSXin Li 		return true;
1587*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1588*2b54f0dbSXin Li 		return cpuinfo_isa.vfpv3;
1589*2b54f0dbSXin Li 	#else
1590*2b54f0dbSXin Li 		return false;
1591*2b54f0dbSXin Li 	#endif
1592*2b54f0dbSXin Li }
1593*2b54f0dbSXin Li 
cpuinfo_has_arm_vfpv3_d32(void)1594*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_vfpv3_d32(void) {
1595*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1596*2b54f0dbSXin Li 		return true;
1597*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1598*2b54f0dbSXin Li 		return cpuinfo_isa.vfpv3 && cpuinfo_isa.d32;
1599*2b54f0dbSXin Li 	#else
1600*2b54f0dbSXin Li 		return false;
1601*2b54f0dbSXin Li 	#endif
1602*2b54f0dbSXin Li }
1603*2b54f0dbSXin Li 
cpuinfo_has_arm_vfpv3_fp16(void)1604*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_vfpv3_fp16(void) {
1605*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1606*2b54f0dbSXin Li 		return true;
1607*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1608*2b54f0dbSXin Li 		return cpuinfo_isa.vfpv3 && cpuinfo_isa.fp16;
1609*2b54f0dbSXin Li 	#else
1610*2b54f0dbSXin Li 		return false;
1611*2b54f0dbSXin Li 	#endif
1612*2b54f0dbSXin Li }
1613*2b54f0dbSXin Li 
cpuinfo_has_arm_vfpv3_fp16_d32(void)1614*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_vfpv3_fp16_d32(void) {
1615*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1616*2b54f0dbSXin Li 		return true;
1617*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1618*2b54f0dbSXin Li 		return cpuinfo_isa.vfpv3 && cpuinfo_isa.fp16 && cpuinfo_isa.d32;
1619*2b54f0dbSXin Li 	#else
1620*2b54f0dbSXin Li 		return false;
1621*2b54f0dbSXin Li 	#endif
1622*2b54f0dbSXin Li }
1623*2b54f0dbSXin Li 
cpuinfo_has_arm_vfpv4(void)1624*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_vfpv4(void) {
1625*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1626*2b54f0dbSXin Li 		return true;
1627*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1628*2b54f0dbSXin Li 		return cpuinfo_isa.vfpv3 && cpuinfo_isa.fma;
1629*2b54f0dbSXin Li 	#else
1630*2b54f0dbSXin Li 		return false;
1631*2b54f0dbSXin Li 	#endif
1632*2b54f0dbSXin Li }
1633*2b54f0dbSXin Li 
cpuinfo_has_arm_vfpv4_d32(void)1634*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_vfpv4_d32(void) {
1635*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1636*2b54f0dbSXin Li 		return true;
1637*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1638*2b54f0dbSXin Li 		return cpuinfo_isa.vfpv3 && cpuinfo_isa.fma && cpuinfo_isa.d32;
1639*2b54f0dbSXin Li 	#else
1640*2b54f0dbSXin Li 		return false;
1641*2b54f0dbSXin Li 	#endif
1642*2b54f0dbSXin Li }
1643*2b54f0dbSXin Li 
cpuinfo_has_arm_fp16_arith(void)1644*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_fp16_arith(void) {
1645*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1646*2b54f0dbSXin Li 		return cpuinfo_isa.fp16arith;
1647*2b54f0dbSXin Li 	#else
1648*2b54f0dbSXin Li 		return false;
1649*2b54f0dbSXin Li 	#endif
1650*2b54f0dbSXin Li }
1651*2b54f0dbSXin Li 
cpuinfo_has_arm_bf16(void)1652*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_bf16(void) {
1653*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1654*2b54f0dbSXin Li 		return cpuinfo_isa.bf16;
1655*2b54f0dbSXin Li 	#else
1656*2b54f0dbSXin Li 		return false;
1657*2b54f0dbSXin Li 	#endif
1658*2b54f0dbSXin Li }
1659*2b54f0dbSXin Li 
cpuinfo_has_arm_wmmx(void)1660*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_wmmx(void) {
1661*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1662*2b54f0dbSXin Li 		return cpuinfo_isa.wmmx;
1663*2b54f0dbSXin Li 	#else
1664*2b54f0dbSXin Li 		return false;
1665*2b54f0dbSXin Li 	#endif
1666*2b54f0dbSXin Li }
1667*2b54f0dbSXin Li 
cpuinfo_has_arm_wmmx2(void)1668*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_wmmx2(void) {
1669*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1670*2b54f0dbSXin Li 		return cpuinfo_isa.wmmx2;
1671*2b54f0dbSXin Li 	#else
1672*2b54f0dbSXin Li 		return false;
1673*2b54f0dbSXin Li 	#endif
1674*2b54f0dbSXin Li }
1675*2b54f0dbSXin Li 
cpuinfo_has_arm_neon(void)1676*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon(void) {
1677*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1678*2b54f0dbSXin Li 		return true;
1679*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1680*2b54f0dbSXin Li 		return cpuinfo_isa.neon;
1681*2b54f0dbSXin Li 	#else
1682*2b54f0dbSXin Li 		return false;
1683*2b54f0dbSXin Li 	#endif
1684*2b54f0dbSXin Li }
1685*2b54f0dbSXin Li 
cpuinfo_has_arm_neon_fp16(void)1686*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon_fp16(void) {
1687*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1688*2b54f0dbSXin Li 		return true;
1689*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1690*2b54f0dbSXin Li 		return cpuinfo_isa.neon && cpuinfo_isa.fp16;
1691*2b54f0dbSXin Li 	#else
1692*2b54f0dbSXin Li 		return false;
1693*2b54f0dbSXin Li 	#endif
1694*2b54f0dbSXin Li }
1695*2b54f0dbSXin Li 
cpuinfo_has_arm_neon_fma(void)1696*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon_fma(void) {
1697*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1698*2b54f0dbSXin Li 		return true;
1699*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1700*2b54f0dbSXin Li 		return cpuinfo_isa.neon && cpuinfo_isa.fma;
1701*2b54f0dbSXin Li 	#else
1702*2b54f0dbSXin Li 		return false;
1703*2b54f0dbSXin Li 	#endif
1704*2b54f0dbSXin Li }
1705*2b54f0dbSXin Li 
cpuinfo_has_arm_neon_v8(void)1706*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon_v8(void) {
1707*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1708*2b54f0dbSXin Li 		return true;
1709*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM
1710*2b54f0dbSXin Li 		return cpuinfo_isa.neon && cpuinfo_isa.armv8;
1711*2b54f0dbSXin Li 	#else
1712*2b54f0dbSXin Li 		return false;
1713*2b54f0dbSXin Li 	#endif
1714*2b54f0dbSXin Li }
1715*2b54f0dbSXin Li 
cpuinfo_has_arm_atomics(void)1716*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_atomics(void) {
1717*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1718*2b54f0dbSXin Li 		return cpuinfo_isa.atomics;
1719*2b54f0dbSXin Li 	#else
1720*2b54f0dbSXin Li 		return false;
1721*2b54f0dbSXin Li 	#endif
1722*2b54f0dbSXin Li }
1723*2b54f0dbSXin Li 
cpuinfo_has_arm_neon_rdm(void)1724*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon_rdm(void) {
1725*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1726*2b54f0dbSXin Li 		return cpuinfo_isa.rdm;
1727*2b54f0dbSXin Li 	#else
1728*2b54f0dbSXin Li 		return false;
1729*2b54f0dbSXin Li 	#endif
1730*2b54f0dbSXin Li }
1731*2b54f0dbSXin Li 
cpuinfo_has_arm_neon_fp16_arith(void)1732*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon_fp16_arith(void) {
1733*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM
1734*2b54f0dbSXin Li 		return cpuinfo_isa.neon && cpuinfo_isa.fp16arith;
1735*2b54f0dbSXin Li 	#elif CPUINFO_ARCH_ARM64
1736*2b54f0dbSXin Li 		return cpuinfo_isa.fp16arith;
1737*2b54f0dbSXin Li 	#else
1738*2b54f0dbSXin Li 		return false;
1739*2b54f0dbSXin Li 	#endif
1740*2b54f0dbSXin Li }
1741*2b54f0dbSXin Li 
cpuinfo_has_arm_fhm(void)1742*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_fhm(void) {
1743*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1744*2b54f0dbSXin Li 		return cpuinfo_isa.fhm;
1745*2b54f0dbSXin Li 	#else
1746*2b54f0dbSXin Li 		return false;
1747*2b54f0dbSXin Li 	#endif
1748*2b54f0dbSXin Li }
1749*2b54f0dbSXin Li 
cpuinfo_has_arm_neon_dot(void)1750*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon_dot(void) {
1751*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1752*2b54f0dbSXin Li 		return cpuinfo_isa.dot;
1753*2b54f0dbSXin Li 	#else
1754*2b54f0dbSXin Li 		return false;
1755*2b54f0dbSXin Li 	#endif
1756*2b54f0dbSXin Li }
1757*2b54f0dbSXin Li 
cpuinfo_has_arm_neon_bf16(void)1758*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_neon_bf16(void) {
1759*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1760*2b54f0dbSXin Li 		return cpuinfo_isa.bf16;
1761*2b54f0dbSXin Li 	#else
1762*2b54f0dbSXin Li 		return false;
1763*2b54f0dbSXin Li 	#endif
1764*2b54f0dbSXin Li }
1765*2b54f0dbSXin Li 
cpuinfo_has_arm_jscvt(void)1766*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_jscvt(void) {
1767*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1768*2b54f0dbSXin Li 		return cpuinfo_isa.jscvt;
1769*2b54f0dbSXin Li 	#else
1770*2b54f0dbSXin Li 		return false;
1771*2b54f0dbSXin Li 	#endif
1772*2b54f0dbSXin Li }
1773*2b54f0dbSXin Li 
cpuinfo_has_arm_fcma(void)1774*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_fcma(void) {
1775*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1776*2b54f0dbSXin Li 		return cpuinfo_isa.fcma;
1777*2b54f0dbSXin Li 	#else
1778*2b54f0dbSXin Li 		return false;
1779*2b54f0dbSXin Li 	#endif
1780*2b54f0dbSXin Li }
1781*2b54f0dbSXin Li 
cpuinfo_has_arm_i8mm(void)1782*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_i8mm(void) {
1783*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1784*2b54f0dbSXin Li 		return cpuinfo_isa.i8mm;
1785*2b54f0dbSXin Li 	#else
1786*2b54f0dbSXin Li 		return false;
1787*2b54f0dbSXin Li 	#endif
1788*2b54f0dbSXin Li }
1789*2b54f0dbSXin Li 
cpuinfo_has_arm_aes(void)1790*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_aes(void) {
1791*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1792*2b54f0dbSXin Li 		return cpuinfo_isa.aes;
1793*2b54f0dbSXin Li 	#else
1794*2b54f0dbSXin Li 		return false;
1795*2b54f0dbSXin Li 	#endif
1796*2b54f0dbSXin Li }
1797*2b54f0dbSXin Li 
cpuinfo_has_arm_sha1(void)1798*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_sha1(void) {
1799*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1800*2b54f0dbSXin Li 		return cpuinfo_isa.sha1;
1801*2b54f0dbSXin Li 	#else
1802*2b54f0dbSXin Li 		return false;
1803*2b54f0dbSXin Li 	#endif
1804*2b54f0dbSXin Li }
1805*2b54f0dbSXin Li 
cpuinfo_has_arm_sha2(void)1806*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_sha2(void) {
1807*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1808*2b54f0dbSXin Li 		return cpuinfo_isa.sha2;
1809*2b54f0dbSXin Li 	#else
1810*2b54f0dbSXin Li 		return false;
1811*2b54f0dbSXin Li 	#endif
1812*2b54f0dbSXin Li }
1813*2b54f0dbSXin Li 
cpuinfo_has_arm_pmull(void)1814*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_pmull(void) {
1815*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1816*2b54f0dbSXin Li 		return cpuinfo_isa.pmull;
1817*2b54f0dbSXin Li 	#else
1818*2b54f0dbSXin Li 		return false;
1819*2b54f0dbSXin Li 	#endif
1820*2b54f0dbSXin Li }
1821*2b54f0dbSXin Li 
cpuinfo_has_arm_crc32(void)1822*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_crc32(void) {
1823*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
1824*2b54f0dbSXin Li 		return cpuinfo_isa.crc32;
1825*2b54f0dbSXin Li 	#else
1826*2b54f0dbSXin Li 		return false;
1827*2b54f0dbSXin Li 	#endif
1828*2b54f0dbSXin Li }
1829*2b54f0dbSXin Li 
cpuinfo_has_arm_sve(void)1830*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_sve(void) {
1831*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1832*2b54f0dbSXin Li 		return cpuinfo_isa.sve;
1833*2b54f0dbSXin Li 	#else
1834*2b54f0dbSXin Li 		return false;
1835*2b54f0dbSXin Li 	#endif
1836*2b54f0dbSXin Li }
1837*2b54f0dbSXin Li 
cpuinfo_has_arm_sve_bf16(void)1838*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_sve_bf16(void) {
1839*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1840*2b54f0dbSXin Li 		return cpuinfo_isa.sve && cpuinfo_isa.bf16;
1841*2b54f0dbSXin Li 	#else
1842*2b54f0dbSXin Li 		return false;
1843*2b54f0dbSXin Li 	#endif
1844*2b54f0dbSXin Li }
1845*2b54f0dbSXin Li 
cpuinfo_has_arm_sve2(void)1846*2b54f0dbSXin Li static inline bool cpuinfo_has_arm_sve2(void) {
1847*2b54f0dbSXin Li 	#if CPUINFO_ARCH_ARM64
1848*2b54f0dbSXin Li 		return cpuinfo_isa.sve2;
1849*2b54f0dbSXin Li 	#else
1850*2b54f0dbSXin Li 		return false;
1851*2b54f0dbSXin Li 	#endif
1852*2b54f0dbSXin Li }
1853*2b54f0dbSXin Li 
1854*2b54f0dbSXin Li const struct cpuinfo_processor* CPUINFO_ABI cpuinfo_get_processors(void);
1855*2b54f0dbSXin Li const struct cpuinfo_core* CPUINFO_ABI cpuinfo_get_cores(void);
1856*2b54f0dbSXin Li const struct cpuinfo_cluster* CPUINFO_ABI cpuinfo_get_clusters(void);
1857*2b54f0dbSXin Li const struct cpuinfo_package* CPUINFO_ABI cpuinfo_get_packages(void);
1858*2b54f0dbSXin Li const struct cpuinfo_uarch_info* CPUINFO_ABI cpuinfo_get_uarchs(void);
1859*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l1i_caches(void);
1860*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l1d_caches(void);
1861*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l2_caches(void);
1862*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l3_caches(void);
1863*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l4_caches(void);
1864*2b54f0dbSXin Li 
1865*2b54f0dbSXin Li const struct cpuinfo_processor* CPUINFO_ABI cpuinfo_get_processor(uint32_t index);
1866*2b54f0dbSXin Li const struct cpuinfo_core* CPUINFO_ABI cpuinfo_get_core(uint32_t index);
1867*2b54f0dbSXin Li const struct cpuinfo_cluster* CPUINFO_ABI cpuinfo_get_cluster(uint32_t index);
1868*2b54f0dbSXin Li const struct cpuinfo_package* CPUINFO_ABI cpuinfo_get_package(uint32_t index);
1869*2b54f0dbSXin Li const struct cpuinfo_uarch_info* CPUINFO_ABI cpuinfo_get_uarch(uint32_t index);
1870*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l1i_cache(uint32_t index);
1871*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l1d_cache(uint32_t index);
1872*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l2_cache(uint32_t index);
1873*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l3_cache(uint32_t index);
1874*2b54f0dbSXin Li const struct cpuinfo_cache* CPUINFO_ABI cpuinfo_get_l4_cache(uint32_t index);
1875*2b54f0dbSXin Li 
1876*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_processors_count(void);
1877*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_cores_count(void);
1878*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_clusters_count(void);
1879*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_packages_count(void);
1880*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_uarchs_count(void);
1881*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_l1i_caches_count(void);
1882*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_l1d_caches_count(void);
1883*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_l2_caches_count(void);
1884*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_l3_caches_count(void);
1885*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_l4_caches_count(void);
1886*2b54f0dbSXin Li 
1887*2b54f0dbSXin Li /**
1888*2b54f0dbSXin Li  * Returns upper bound on cache size.
1889*2b54f0dbSXin Li  */
1890*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_max_cache_size(void);
1891*2b54f0dbSXin Li 
1892*2b54f0dbSXin Li /**
1893*2b54f0dbSXin Li  * Identify the logical processor that executes the current thread.
1894*2b54f0dbSXin Li  *
1895*2b54f0dbSXin Li  * There is no guarantee that the thread will stay on the same logical processor for any time.
1896*2b54f0dbSXin Li  * Callers should treat the result as only a hint, and be prepared to handle NULL return value.
1897*2b54f0dbSXin Li  */
1898*2b54f0dbSXin Li const struct cpuinfo_processor* CPUINFO_ABI cpuinfo_get_current_processor(void);
1899*2b54f0dbSXin Li 
1900*2b54f0dbSXin Li /**
1901*2b54f0dbSXin Li  * Identify the core that executes the current thread.
1902*2b54f0dbSXin Li  *
1903*2b54f0dbSXin Li  * There is no guarantee that the thread will stay on the same core for any time.
1904*2b54f0dbSXin Li  * Callers should treat the result as only a hint, and be prepared to handle NULL return value.
1905*2b54f0dbSXin Li  */
1906*2b54f0dbSXin Li const struct cpuinfo_core* CPUINFO_ABI cpuinfo_get_current_core(void);
1907*2b54f0dbSXin Li 
1908*2b54f0dbSXin Li /**
1909*2b54f0dbSXin Li  * Identify the microarchitecture index of the core that executes the current thread.
1910*2b54f0dbSXin Li  * If the system does not support such identification, the function returns 0.
1911*2b54f0dbSXin Li  *
1912*2b54f0dbSXin Li  * There is no guarantee that the thread will stay on the same type of core for any time.
1913*2b54f0dbSXin Li  * Callers should treat the result as only a hint.
1914*2b54f0dbSXin Li  */
1915*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_current_uarch_index(void);
1916*2b54f0dbSXin Li 
1917*2b54f0dbSXin Li /**
1918*2b54f0dbSXin Li  * Identify the microarchitecture index of the core that executes the current thread.
1919*2b54f0dbSXin Li  * If the system does not support such identification, the function returns the user-specified default value.
1920*2b54f0dbSXin Li  *
1921*2b54f0dbSXin Li  * There is no guarantee that the thread will stay on the same type of core for any time.
1922*2b54f0dbSXin Li  * Callers should treat the result as only a hint.
1923*2b54f0dbSXin Li  */
1924*2b54f0dbSXin Li uint32_t CPUINFO_ABI cpuinfo_get_current_uarch_index_with_default(uint32_t default_uarch_index);
1925*2b54f0dbSXin Li 
1926*2b54f0dbSXin Li #ifdef __cplusplus
1927*2b54f0dbSXin Li } /* extern "C" */
1928*2b54f0dbSXin Li #endif
1929*2b54f0dbSXin Li 
1930*2b54f0dbSXin Li #endif /* CPUINFO_H */
1931