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