• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdint.h>
2 
3 #include <cpuinfo.h>
4 #include <x86/api.h>
5 
cpuinfo_x86_decode_uarch(enum cpuinfo_vendor vendor,const struct cpuinfo_x86_model_info * model_info)6 enum cpuinfo_uarch cpuinfo_x86_decode_uarch(
7 	enum cpuinfo_vendor vendor,
8 	const struct cpuinfo_x86_model_info* model_info) {
9 	switch (vendor) {
10 		case cpuinfo_vendor_intel:
11 			switch (model_info->family) {
12 #if CPUINFO_ARCH_X86
13 				case 0x05:
14 					switch (model_info->model) {
15 						case 0x01: // Pentium (60, 66)
16 						case 0x02: // Pentium (75, 90,
17 							   // 100, 120, 133,
18 							   // 150, 166, 200)
19 						case 0x03: // Pentium OverDrive
20 							   // for Intel486-based
21 							   // systems
22 						case 0x04: // Pentium MMX
23 							return cpuinfo_uarch_p5;
24 						case 0x09:
25 							return cpuinfo_uarch_quark;
26 					}
27 					break;
28 #endif /* CPUINFO_ARCH_X86 */
29 				case 0x06:
30 					switch (model_info->model) {
31 						/* Mainstream cores */
32 #if CPUINFO_ARCH_X86
33 						case 0x01: // Pentium Pro
34 						case 0x03: // Pentium II
35 							   // (Klamath) and
36 							   // Pentium II
37 							   // Overdrive
38 						case 0x05: // Pentium II
39 							   // (Deschutes,
40 							   // Tonga), Pentium II
41 							   // Celeron
42 							   // (Covington),
43 							   // Pentium II Xeon
44 							   // (Drake)
45 						case 0x06: // Pentium II
46 							   // (Dixon), Pentium
47 							   // II Celeron
48 							   // (Mendocino)
49 						case 0x07: // Pentium III
50 							   // (Katmai), Pentium
51 							   // III Xeon (Tanner)
52 						case 0x08: // Pentium III
53 							   // (Coppermine),
54 							   // Pentium II Celeron
55 							   // (Coppermine-128),
56 							   // Pentium III Xeon
57 							   // (Cascades)
58 						case 0x0A: // Pentium III Xeon
59 							   // (Cascades-2MB)
60 						case 0x0B: // Pentium III
61 							   // (Tualatin),
62 							   // Pentium III
63 							   // Celeron
64 							   // (Tualatin-256)
65 							return cpuinfo_uarch_p6;
66 						case 0x09: // Pentium M
67 							   // (Banias), Pentium
68 							   // M Celeron
69 							   // (Banias-0,
70 							   // Banias-512)
71 						case 0x0D: // Pentium M
72 							   // (Dothan), Pentium
73 							   // M Celeron
74 							   // (Dothan-512,
75 							   // Dothan-1024)
76 						case 0x15: // Intel 80579
77 							   // (Tolapai)
78 							return cpuinfo_uarch_dothan;
79 						case 0x0E: // Core Solo/Duo
80 							   // (Yonah), Pentium
81 							   // Dual-Core T2xxx
82 							   // (Yonah), Celeron M
83 							   // (Yonah-512,
84 							   // Yonah-1024),
85 							   // Dual-Core Xeon
86 							   // (Sossaman)
87 							return cpuinfo_uarch_yonah;
88 #endif /* CPUINFO_ARCH_X86 */
89 						case 0x0F: // Core 2 Duo
90 							   // (Conroe,
91 							   // Conroe-2M, Merom),
92 							   // Core 2 Quad
93 							   // (Tigerton), Xeon
94 							   // (Woodcrest,
95 							   // Clovertown,
96 							   // Kentsfield)
97 						case 0x16: // Celeron (Conroe-L,
98 							   // Merom-L), Core 2
99 							   // Duo (Merom)
100 							return cpuinfo_uarch_conroe;
101 						case 0x17: // Core 2 Duo
102 							   // (Penryn-3M), Core
103 							   // 2 Quad
104 							   // (Yorkfield), Core
105 							   // 2 Extreme
106 							   // (Yorkfield), Xeon
107 							   // (Harpertown),
108 							   // Pentium Dual-Core
109 							   // (Penryn)
110 						case 0x1D: // Xeon (Dunnington)
111 							return cpuinfo_uarch_penryn;
112 						case 0x1A: // Core iX
113 							   // (Bloomfield), Xeon
114 							   // (Gainestown)
115 						case 0x1E: // Core iX
116 							   // (Lynnfield,
117 							   // Clarksfield)
118 						case 0x1F: // Core iX
119 							   // (Havendale)
120 						case 0x2E: // Xeon (Beckton)
121 						case 0x25: // Core iX
122 							   // (Clarkdale)
123 						case 0x2C: // Core iX
124 							   // (Gulftown), Xeon
125 							   // (Gulftown)
126 						case 0x2F: // Xeon (Eagleton)
127 							return cpuinfo_uarch_nehalem;
128 						case 0x2A: // Core iX (Sandy
129 							   // Bridge)
130 						case 0x2D: // Core iX (Sandy
131 							   // Bridge-E), Xeon
132 							   // (Sandy Bridge
133 							   // EP/EX)
134 							return cpuinfo_uarch_sandy_bridge;
135 						case 0x3A: // Core iX (Ivy
136 							   // Bridge)
137 						case 0x3E: // Ivy Bridge-E
138 							return cpuinfo_uarch_ivy_bridge;
139 						case 0x3C:
140 						case 0x3F: // Haswell-E
141 						case 0x45: // Haswell ULT
142 						case 0x46: // Haswell with eDRAM
143 							return cpuinfo_uarch_haswell;
144 						case 0x3D: // Broadwell-U
145 						case 0x47: // Broadwell-H
146 						case 0x4F: // Broadwell-E
147 						case 0x56: // Broadwell-DE
148 							return cpuinfo_uarch_broadwell;
149 						case 0x4E: // Sky Lake Client
150 							   // Y/U
151 						case 0x55: // Sky/Cascade/Cooper
152 							   // Lake Server
153 						case 0x5E: // Sky Lake Client
154 							   // DT/H/S
155 						case 0x8E: // Kaby/Whiskey/Amber/Comet
156 							   // Lake Y/U
157 						case 0x9E: // Kaby/Coffee Lake
158 							   // DT/H/S
159 						case 0xA5: // Comet Lake H/S
160 						case 0xA6: // Comet Lake U/Y
161 							return cpuinfo_uarch_sky_lake;
162 						case 0x66: // Cannon Lake (Core
163 							   // i3-8121U)
164 							return cpuinfo_uarch_palm_cove;
165 						case 0x6A: // Ice Lake-DE
166 						case 0x6C: // Ice Lake-SP
167 						case 0x7D: // Ice Lake-Y
168 						case 0x7E: // Ice Lake-U
169 							return cpuinfo_uarch_sunny_cove;
170 
171 						/* Low-power cores */
172 						case 0x1C: // Diamondville,
173 							   // Silverthorne,
174 							   // Pineview
175 						case 0x26: // Tunnel Creek
176 							return cpuinfo_uarch_bonnell;
177 						case 0x27: // Medfield
178 						case 0x35: // Cloverview
179 						case 0x36: // Cedarview,
180 							   // Centerton
181 							return cpuinfo_uarch_saltwell;
182 						case 0x37: // Bay Trail
183 						case 0x4A: // Merrifield
184 						case 0x4D: // Avoton, Rangeley
185 						case 0x5A: // Moorefield
186 						case 0x5D: // SoFIA
187 							return cpuinfo_uarch_silvermont;
188 						case 0x4C: // Braswell, Cherry
189 							   // Trail
190 						case 0x75: // Spreadtrum
191 							   // SC9853I-IA
192 							return cpuinfo_uarch_airmont;
193 						case 0x5C: // Apollo Lake
194 						case 0x5F: // Denverton
195 							return cpuinfo_uarch_goldmont;
196 						case 0x7A: // Gemini Lake
197 							return cpuinfo_uarch_goldmont_plus;
198 
199 						/* Knights-series cores */
200 						case 0x57:
201 							return cpuinfo_uarch_knights_landing;
202 						case 0x85:
203 							return cpuinfo_uarch_knights_mill;
204 					}
205 					break;
206 				case 0x0F:
207 					switch (model_info->model) {
208 						case 0x00: // Pentium 4 Xeon
209 							   // (Foster)
210 						case 0x01: // Pentium 4 Celeron
211 							   // (Willamette-128),
212 							   // Pentium 4 Xeon
213 							   // (Foster, Foster
214 							   // MP)
215 						case 0x02: // Pentium 4
216 							   // (Northwood),
217 							   // Pentium 4 EE
218 							   // (Gallatin),
219 							   // Pentium 4 Celeron
220 							   // (Northwood-128,
221 							   // Northwood-256),
222 							   // Pentium 4 Xeon
223 							   // (Gallatin DP,
224 							   // Prestonia)
225 							return cpuinfo_uarch_willamette;
226 							break;
227 						case 0x03: // Pentium 4
228 							   // (Prescott),
229 							   // Pentium 4 Xeon
230 							   // (Nocona)
231 						case 0x04: // Pentium 4
232 							   // (Prescott-2M),
233 							   // Pentium 4 EE
234 							   // (Prescott-2M),
235 							   // Pentium D
236 							   // (Smithfield),
237 							   // Celeron D
238 							   // (Prescott-256),
239 							   // Pentium 4 Xeon
240 							   // (Cranford,
241 							   // Irwindale,
242 							   // Paxville)
243 						case 0x06: // Pentium 4 (Cedar
244 							   // Mill), Pentium D
245 							   // EE (Presler),
246 							   // Celeron D (Cedar
247 							   // Mill), Pentium 4
248 							   // Xeon (Dempsey,
249 							   // Tulsa)
250 							return cpuinfo_uarch_prescott;
251 					}
252 					break;
253 			}
254 			break;
255 		case cpuinfo_vendor_amd:
256 			switch (model_info->family) {
257 #if CPUINFO_ARCH_X86
258 				case 0x5:
259 					switch (model_info->model) {
260 						case 0x00:
261 						case 0x01:
262 						case 0x02:
263 							return cpuinfo_uarch_k5;
264 						case 0x06:
265 						case 0x07:
266 						case 0x08:
267 						case 0x0D:
268 							return cpuinfo_uarch_k6;
269 						case 0x0A:
270 							return cpuinfo_uarch_geode;
271 					}
272 					break;
273 				case 0x6:
274 					return cpuinfo_uarch_k7;
275 #endif /* CPUINFO_ARCH_X86 */
276 				case 0xF: // Opteron, Athlon 64, Sempron
277 				case 0x11: // Turion
278 					return cpuinfo_uarch_k8;
279 				case 0x10: // Opteron, Phenom, Athlon, Sempron
280 				case 0x12: // Llano APU
281 					return cpuinfo_uarch_k10;
282 				case 0x14:
283 					return cpuinfo_uarch_bobcat;
284 				case 0x15:
285 					switch (model_info->model) {
286 						case 0x00: // Engineering
287 							   // samples
288 						case 0x01: // Zambezi,
289 							   // Interlagos
290 							return cpuinfo_uarch_bulldozer;
291 						case 0x02: // Vishera
292 						case 0x10: // Trinity
293 						case 0x13: // Richland
294 							return cpuinfo_uarch_piledriver;
295 						case 0x38: // Godavari
296 						case 0x30: // Kaveri
297 							return cpuinfo_uarch_steamroller;
298 						case 0x60: // Carrizo
299 						case 0x65: // Bristol Ridge
300 						case 0x70: // Stoney Ridge
301 							return cpuinfo_uarch_excavator;
302 						default:
303 							switch (model_info->extended_model) {
304 								case 0x0:
305 									return cpuinfo_uarch_bulldozer;
306 								case 0x1: // No
307 									  // L3
308 									  // cache
309 								case 0x2: // With
310 									  // L3
311 									  // cache
312 									return cpuinfo_uarch_piledriver;
313 								case 0x3: // With
314 									  // L3
315 									  // cache
316 								case 0x4: // No
317 									  // L3
318 									  // cache
319 									return cpuinfo_uarch_steamroller;
320 							}
321 							break;
322 					}
323 					break;
324 				case 0x16:
325 					if (model_info->extended_model >= 0x03) {
326 						return cpuinfo_uarch_puma;
327 					} else {
328 						return cpuinfo_uarch_jaguar;
329 					}
330 				case 0x17:
331 					switch (model_info->extended_model) {
332 						case 0x0: // model 01h -> 14 nm
333 							  // Naples/Whitehaven/Summit
334 							  // Ridge/Snowy Owl,
335 							  // model 08h -> 12 nm
336 							  // Colfax/Pinnacle
337 							  // Ridge
338 						case 0x1: // model 11h -> 14 nm
339 							  // Raven Ridge/Great
340 							  // Horned Owl, model
341 							  // 18h -> 14 nm Banded
342 							  // Kestrel / 12 nm
343 							  // Picasso
344 							return cpuinfo_uarch_zen;
345 						case 0x3: // model 31h ->
346 							  // Rome/Castle Peak
347 						case 0x4: // model 47h -> Xbox
348 							  // Series X
349 						case 0x6: // model 60h ->
350 							  // Renoir/Grey Hawk,
351 							  // model 68h ->
352 							  // Lucienne
353 						case 0x7: // model 71h ->
354 							  // Matisse
355 						case 0x9: // model 90h -> Van
356 							  // Gogh, model 98h ->
357 							  // Mero
358 							return cpuinfo_uarch_zen2;
359 					}
360 					break;
361 				case 0x19:
362 					switch (model_info->extended_model) {
363 						case 0x0: // model 00h ->
364 							  // Genesis, model 01h
365 							  // -> Milan, model 08h
366 							  // -> Chagall
367 						case 0x2: // model 21h ->
368 							  // Vermeer
369 						case 0x3: // model 30h ->
370 							  // Badami, Trento
371 						case 0x4: // model 40h ->
372 							  // Rembrandt
373 						case 0x5: // model 50h ->
374 							  // Cezanne
375 							return cpuinfo_uarch_zen3;
376 						case 0x1: // model 10h..1Fh ->
377 							  // Stones
378 						case 0x6: // model 60h..6Fh ->
379 							  // Raphael
380 						case 0x7: // model 70h..77h ->
381 							  // Phoenix/Hawkpoint1,
382 							  // model 78h..7Fh ->
383 							  // Phoenix
384 							  // 2/Hawkpoint2
385 						case 0xA: // model A0h..AFh ->
386 							  // Stones-Dense
387 							return cpuinfo_uarch_zen4;
388 					}
389 					break;
390 				case 0x1a:
391 					return cpuinfo_uarch_zen5;
392 			}
393 			break;
394 		case cpuinfo_vendor_hygon:
395 			switch (model_info->family) {
396 				case 0x00:
397 					return cpuinfo_uarch_dhyana;
398 			}
399 			break;
400 		default:
401 			break;
402 	}
403 	return cpuinfo_uarch_unknown;
404 }
405