master
1//! This file is auto-generated by tools/update_cpu_features.zig.
2
3const std = @import("../std.zig");
4const CpuFeature = std.Target.Cpu.Feature;
5const CpuModel = std.Target.Cpu.Model;
6
7pub const Feature = enum {
8 abs2008,
9 cnmips,
10 cnmipsp,
11 crc,
12 dsp,
13 dspr2,
14 dspr3,
15 eva,
16 fp64,
17 fpxx,
18 ginv,
19 gp64,
20 i6400,
21 i6500,
22 long_calls,
23 micromips,
24 mips1,
25 mips16,
26 mips2,
27 mips3,
28 mips32,
29 mips32r2,
30 mips32r3,
31 mips32r5,
32 mips32r6,
33 mips3_32,
34 mips3_32r2,
35 mips3d,
36 mips4,
37 mips4_32,
38 mips4_32r2,
39 mips5,
40 mips5_32r2,
41 mips64,
42 mips64r2,
43 mips64r3,
44 mips64r5,
45 mips64r6,
46 msa,
47 mt,
48 nan2008,
49 noabicalls,
50 nomadd4,
51 nooddspreg,
52 p5600,
53 ptr64,
54 single_float,
55 soft_float,
56 strict_align,
57 sym32,
58 use_indirect_jump_hazard,
59 use_tcc_in_div,
60 vfpu,
61 virt,
62 xgot,
63};
64
65pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
66pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas;
67pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny;
68pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll;
69
70pub const all_features = blk: {
71 const len = @typeInfo(Feature).@"enum".fields.len;
72 std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
73 var result: [len]CpuFeature = undefined;
74 result[@intFromEnum(Feature.abs2008)] = .{
75 .llvm_name = "abs2008",
76 .description = "Disable IEEE 754-2008 abs.fmt mode",
77 .dependencies = featureSet(&[_]Feature{}),
78 };
79 result[@intFromEnum(Feature.cnmips)] = .{
80 .llvm_name = "cnmips",
81 .description = "Octeon cnMIPS Support",
82 .dependencies = featureSet(&[_]Feature{
83 .mips64r2,
84 }),
85 };
86 result[@intFromEnum(Feature.cnmipsp)] = .{
87 .llvm_name = "cnmipsp",
88 .description = "Octeon+ cnMIPS Support",
89 .dependencies = featureSet(&[_]Feature{
90 .cnmips,
91 }),
92 };
93 result[@intFromEnum(Feature.crc)] = .{
94 .llvm_name = "crc",
95 .description = "Mips R6 CRC ASE",
96 .dependencies = featureSet(&[_]Feature{}),
97 };
98 result[@intFromEnum(Feature.dsp)] = .{
99 .llvm_name = "dsp",
100 .description = "Mips DSP ASE",
101 .dependencies = featureSet(&[_]Feature{}),
102 };
103 result[@intFromEnum(Feature.dspr2)] = .{
104 .llvm_name = "dspr2",
105 .description = "Mips DSP-R2 ASE",
106 .dependencies = featureSet(&[_]Feature{
107 .dsp,
108 }),
109 };
110 result[@intFromEnum(Feature.dspr3)] = .{
111 .llvm_name = "dspr3",
112 .description = "Mips DSP-R3 ASE",
113 .dependencies = featureSet(&[_]Feature{
114 .dspr2,
115 }),
116 };
117 result[@intFromEnum(Feature.eva)] = .{
118 .llvm_name = "eva",
119 .description = "Mips EVA ASE",
120 .dependencies = featureSet(&[_]Feature{}),
121 };
122 result[@intFromEnum(Feature.fp64)] = .{
123 .llvm_name = "fp64",
124 .description = "Support 64-bit FP registers",
125 .dependencies = featureSet(&[_]Feature{}),
126 };
127 result[@intFromEnum(Feature.fpxx)] = .{
128 .llvm_name = "fpxx",
129 .description = "Support for FPXX",
130 .dependencies = featureSet(&[_]Feature{}),
131 };
132 result[@intFromEnum(Feature.ginv)] = .{
133 .llvm_name = "ginv",
134 .description = "Mips Global Invalidate ASE",
135 .dependencies = featureSet(&[_]Feature{}),
136 };
137 result[@intFromEnum(Feature.gp64)] = .{
138 .llvm_name = "gp64",
139 .description = "General Purpose Registers are 64-bit wide",
140 .dependencies = featureSet(&[_]Feature{}),
141 };
142 result[@intFromEnum(Feature.i6400)] = .{
143 .llvm_name = "i6400",
144 .description = "MIPS I6400 Processor",
145 .dependencies = featureSet(&[_]Feature{
146 .mips64r6,
147 .msa,
148 }),
149 };
150 result[@intFromEnum(Feature.i6500)] = .{
151 .llvm_name = "i6500",
152 .description = "MIPS I6500 Processor",
153 .dependencies = featureSet(&[_]Feature{
154 .mips64r6,
155 .msa,
156 }),
157 };
158 result[@intFromEnum(Feature.long_calls)] = .{
159 .llvm_name = "long-calls",
160 .description = "Disable use of the jal instruction",
161 .dependencies = featureSet(&[_]Feature{}),
162 };
163 result[@intFromEnum(Feature.micromips)] = .{
164 .llvm_name = "micromips",
165 .description = "microMips mode",
166 .dependencies = featureSet(&[_]Feature{}),
167 };
168 result[@intFromEnum(Feature.mips1)] = .{
169 .llvm_name = "mips1",
170 .description = "Mips I ISA Support [highly experimental]",
171 .dependencies = featureSet(&[_]Feature{}),
172 };
173 result[@intFromEnum(Feature.mips16)] = .{
174 .llvm_name = "mips16",
175 .description = "Mips16 mode",
176 .dependencies = featureSet(&[_]Feature{}),
177 };
178 result[@intFromEnum(Feature.mips2)] = .{
179 .llvm_name = "mips2",
180 .description = "Mips II ISA Support [highly experimental]",
181 .dependencies = featureSet(&[_]Feature{
182 .mips1,
183 }),
184 };
185 result[@intFromEnum(Feature.mips3)] = .{
186 .llvm_name = "mips3",
187 .description = "MIPS III ISA Support [highly experimental]",
188 .dependencies = featureSet(&[_]Feature{
189 .fp64,
190 .gp64,
191 .mips2,
192 .mips3_32,
193 .mips3_32r2,
194 }),
195 };
196 result[@intFromEnum(Feature.mips32)] = .{
197 .llvm_name = "mips32",
198 .description = "Mips32 ISA Support",
199 .dependencies = featureSet(&[_]Feature{
200 .mips2,
201 .mips3_32,
202 .mips4_32,
203 }),
204 };
205 result[@intFromEnum(Feature.mips32r2)] = .{
206 .llvm_name = "mips32r2",
207 .description = "Mips32r2 ISA Support",
208 .dependencies = featureSet(&[_]Feature{
209 .mips32,
210 .mips3_32r2,
211 .mips4_32r2,
212 .mips5_32r2,
213 }),
214 };
215 result[@intFromEnum(Feature.mips32r3)] = .{
216 .llvm_name = "mips32r3",
217 .description = "Mips32r3 ISA Support",
218 .dependencies = featureSet(&[_]Feature{
219 .mips32r2,
220 }),
221 };
222 result[@intFromEnum(Feature.mips32r5)] = .{
223 .llvm_name = "mips32r5",
224 .description = "Mips32r5 ISA Support",
225 .dependencies = featureSet(&[_]Feature{
226 .mips32r3,
227 }),
228 };
229 result[@intFromEnum(Feature.mips32r6)] = .{
230 .llvm_name = "mips32r6",
231 .description = "Mips32r6 ISA Support [experimental]",
232 .dependencies = featureSet(&[_]Feature{
233 .abs2008,
234 .fp64,
235 .mips32r5,
236 .nan2008,
237 }),
238 };
239 result[@intFromEnum(Feature.mips3_32)] = .{
240 .llvm_name = "mips3_32",
241 .description = "Subset of MIPS-III that is also in MIPS32 [highly experimental]",
242 .dependencies = featureSet(&[_]Feature{}),
243 };
244 result[@intFromEnum(Feature.mips3_32r2)] = .{
245 .llvm_name = "mips3_32r2",
246 .description = "Subset of MIPS-III that is also in MIPS32r2 [highly experimental]",
247 .dependencies = featureSet(&[_]Feature{}),
248 };
249 result[@intFromEnum(Feature.mips3d)] = .{
250 .llvm_name = "mips3d",
251 .description = "Mips 3D ASE",
252 .dependencies = featureSet(&[_]Feature{}),
253 };
254 result[@intFromEnum(Feature.mips4)] = .{
255 .llvm_name = "mips4",
256 .description = "MIPS IV ISA Support",
257 .dependencies = featureSet(&[_]Feature{
258 .mips3,
259 .mips4_32,
260 .mips4_32r2,
261 }),
262 };
263 result[@intFromEnum(Feature.mips4_32)] = .{
264 .llvm_name = "mips4_32",
265 .description = "Subset of MIPS-IV that is also in MIPS32 [highly experimental]",
266 .dependencies = featureSet(&[_]Feature{}),
267 };
268 result[@intFromEnum(Feature.mips4_32r2)] = .{
269 .llvm_name = "mips4_32r2",
270 .description = "Subset of MIPS-IV that is also in MIPS32r2 [highly experimental]",
271 .dependencies = featureSet(&[_]Feature{}),
272 };
273 result[@intFromEnum(Feature.mips5)] = .{
274 .llvm_name = "mips5",
275 .description = "MIPS V ISA Support [highly experimental]",
276 .dependencies = featureSet(&[_]Feature{
277 .mips4,
278 .mips5_32r2,
279 }),
280 };
281 result[@intFromEnum(Feature.mips5_32r2)] = .{
282 .llvm_name = "mips5_32r2",
283 .description = "Subset of MIPS-V that is also in MIPS32r2 [highly experimental]",
284 .dependencies = featureSet(&[_]Feature{}),
285 };
286 result[@intFromEnum(Feature.mips64)] = .{
287 .llvm_name = "mips64",
288 .description = "Mips64 ISA Support",
289 .dependencies = featureSet(&[_]Feature{
290 .mips32,
291 .mips5,
292 }),
293 };
294 result[@intFromEnum(Feature.mips64r2)] = .{
295 .llvm_name = "mips64r2",
296 .description = "Mips64r2 ISA Support",
297 .dependencies = featureSet(&[_]Feature{
298 .mips32r2,
299 .mips64,
300 }),
301 };
302 result[@intFromEnum(Feature.mips64r3)] = .{
303 .llvm_name = "mips64r3",
304 .description = "Mips64r3 ISA Support",
305 .dependencies = featureSet(&[_]Feature{
306 .mips32r3,
307 .mips64r2,
308 }),
309 };
310 result[@intFromEnum(Feature.mips64r5)] = .{
311 .llvm_name = "mips64r5",
312 .description = "Mips64r5 ISA Support",
313 .dependencies = featureSet(&[_]Feature{
314 .mips32r5,
315 .mips64r3,
316 }),
317 };
318 result[@intFromEnum(Feature.mips64r6)] = .{
319 .llvm_name = "mips64r6",
320 .description = "Mips64r6 ISA Support [experimental]",
321 .dependencies = featureSet(&[_]Feature{
322 .mips32r6,
323 .mips64r5,
324 }),
325 };
326 result[@intFromEnum(Feature.msa)] = .{
327 .llvm_name = "msa",
328 .description = "Mips MSA ASE",
329 .dependencies = featureSet(&[_]Feature{}),
330 };
331 result[@intFromEnum(Feature.mt)] = .{
332 .llvm_name = "mt",
333 .description = "Mips MT ASE",
334 .dependencies = featureSet(&[_]Feature{}),
335 };
336 result[@intFromEnum(Feature.nan2008)] = .{
337 .llvm_name = "nan2008",
338 .description = "IEEE 754-2008 NaN encoding",
339 .dependencies = featureSet(&[_]Feature{}),
340 };
341 result[@intFromEnum(Feature.noabicalls)] = .{
342 .llvm_name = "noabicalls",
343 .description = "Disable SVR4-style position-independent code",
344 .dependencies = featureSet(&[_]Feature{}),
345 };
346 result[@intFromEnum(Feature.nomadd4)] = .{
347 .llvm_name = "nomadd4",
348 .description = "Disable 4-operand madd.fmt and related instructions",
349 .dependencies = featureSet(&[_]Feature{}),
350 };
351 result[@intFromEnum(Feature.nooddspreg)] = .{
352 .llvm_name = "nooddspreg",
353 .description = "Disable odd numbered single-precision registers",
354 .dependencies = featureSet(&[_]Feature{}),
355 };
356 result[@intFromEnum(Feature.p5600)] = .{
357 .llvm_name = "p5600",
358 .description = "The P5600 Processor",
359 .dependencies = featureSet(&[_]Feature{
360 .mips32r5,
361 }),
362 };
363 result[@intFromEnum(Feature.ptr64)] = .{
364 .llvm_name = "ptr64",
365 .description = "Pointers are 64-bit wide",
366 .dependencies = featureSet(&[_]Feature{}),
367 };
368 result[@intFromEnum(Feature.single_float)] = .{
369 .llvm_name = "single-float",
370 .description = "Only supports single precision float",
371 .dependencies = featureSet(&[_]Feature{}),
372 };
373 result[@intFromEnum(Feature.soft_float)] = .{
374 .llvm_name = "soft-float",
375 .description = "Does not support floating point instructions",
376 .dependencies = featureSet(&[_]Feature{}),
377 };
378 result[@intFromEnum(Feature.strict_align)] = .{
379 .llvm_name = "strict-align",
380 .description = "Disable unaligned load store for r6",
381 .dependencies = featureSet(&[_]Feature{}),
382 };
383 result[@intFromEnum(Feature.sym32)] = .{
384 .llvm_name = "sym32",
385 .description = "Symbols are 32 bit on Mips64",
386 .dependencies = featureSet(&[_]Feature{}),
387 };
388 result[@intFromEnum(Feature.use_indirect_jump_hazard)] = .{
389 .llvm_name = "use-indirect-jump-hazard",
390 .description = "Use indirect jump guards to prevent certain speculation based attacks",
391 .dependencies = featureSet(&[_]Feature{}),
392 };
393 result[@intFromEnum(Feature.use_tcc_in_div)] = .{
394 .llvm_name = "use-tcc-in-div",
395 .description = "Force the assembler to use trapping",
396 .dependencies = featureSet(&[_]Feature{}),
397 };
398 result[@intFromEnum(Feature.vfpu)] = .{
399 .llvm_name = "vfpu",
400 .description = "Enable vector FPU instructions",
401 .dependencies = featureSet(&[_]Feature{}),
402 };
403 result[@intFromEnum(Feature.virt)] = .{
404 .llvm_name = "virt",
405 .description = "Mips Virtualization ASE",
406 .dependencies = featureSet(&[_]Feature{}),
407 };
408 result[@intFromEnum(Feature.xgot)] = .{
409 .llvm_name = "xgot",
410 .description = "Assume 32-bit GOT",
411 .dependencies = featureSet(&[_]Feature{}),
412 };
413 const ti = @typeInfo(Feature);
414 for (&result, 0..) |*elem, i| {
415 elem.index = i;
416 elem.name = ti.@"enum".fields[i].name;
417 }
418 break :blk result;
419};
420
421pub const cpu = struct {
422 pub const generic: CpuModel = .{
423 .name = "generic",
424 .llvm_name = "generic",
425 .features = featureSet(&[_]Feature{
426 .mips32,
427 }),
428 };
429 pub const @"i6400": CpuModel = .{
430 .name = "i6400",
431 .llvm_name = "i6400",
432 .features = featureSet(&[_]Feature{
433 .i6400,
434 }),
435 };
436 pub const @"i6500": CpuModel = .{
437 .name = "i6500",
438 .llvm_name = "i6500",
439 .features = featureSet(&[_]Feature{
440 .i6500,
441 }),
442 };
443 pub const mips1: CpuModel = .{
444 .name = "mips1",
445 .llvm_name = "mips1",
446 .features = featureSet(&[_]Feature{
447 .mips1,
448 }),
449 };
450 pub const mips2: CpuModel = .{
451 .name = "mips2",
452 .llvm_name = "mips2",
453 .features = featureSet(&[_]Feature{
454 .mips2,
455 }),
456 };
457 pub const mips3: CpuModel = .{
458 .name = "mips3",
459 .llvm_name = "mips3",
460 .features = featureSet(&[_]Feature{
461 .mips3,
462 }),
463 };
464 pub const mips32: CpuModel = .{
465 .name = "mips32",
466 .llvm_name = "mips32",
467 .features = featureSet(&[_]Feature{
468 .mips32,
469 }),
470 };
471 pub const mips32r2: CpuModel = .{
472 .name = "mips32r2",
473 .llvm_name = "mips32r2",
474 .features = featureSet(&[_]Feature{
475 .mips32r2,
476 }),
477 };
478 pub const mips32r3: CpuModel = .{
479 .name = "mips32r3",
480 .llvm_name = "mips32r3",
481 .features = featureSet(&[_]Feature{
482 .mips32r3,
483 }),
484 };
485 pub const mips32r5: CpuModel = .{
486 .name = "mips32r5",
487 .llvm_name = "mips32r5",
488 .features = featureSet(&[_]Feature{
489 .mips32r5,
490 }),
491 };
492 pub const mips32r6: CpuModel = .{
493 .name = "mips32r6",
494 .llvm_name = "mips32r6",
495 .features = featureSet(&[_]Feature{
496 .mips32r6,
497 }),
498 };
499 pub const mips4: CpuModel = .{
500 .name = "mips4",
501 .llvm_name = "mips4",
502 .features = featureSet(&[_]Feature{
503 .mips4,
504 }),
505 };
506 pub const mips5: CpuModel = .{
507 .name = "mips5",
508 .llvm_name = "mips5",
509 .features = featureSet(&[_]Feature{
510 .mips5,
511 }),
512 };
513 pub const mips64: CpuModel = .{
514 .name = "mips64",
515 .llvm_name = "mips64",
516 .features = featureSet(&[_]Feature{
517 .mips64,
518 }),
519 };
520 pub const mips64r2: CpuModel = .{
521 .name = "mips64r2",
522 .llvm_name = "mips64r2",
523 .features = featureSet(&[_]Feature{
524 .mips64r2,
525 }),
526 };
527 pub const mips64r3: CpuModel = .{
528 .name = "mips64r3",
529 .llvm_name = "mips64r3",
530 .features = featureSet(&[_]Feature{
531 .mips64r3,
532 }),
533 };
534 pub const mips64r5: CpuModel = .{
535 .name = "mips64r5",
536 .llvm_name = "mips64r5",
537 .features = featureSet(&[_]Feature{
538 .mips64r5,
539 }),
540 };
541 pub const mips64r6: CpuModel = .{
542 .name = "mips64r6",
543 .llvm_name = "mips64r6",
544 .features = featureSet(&[_]Feature{
545 .mips64r6,
546 }),
547 };
548 pub const octeon: CpuModel = .{
549 .name = "octeon",
550 .llvm_name = "octeon",
551 .features = featureSet(&[_]Feature{
552 .cnmips,
553 }),
554 };
555 pub const @"octeon+": CpuModel = .{
556 .name = "octeon+",
557 .llvm_name = "octeon+",
558 .features = featureSet(&[_]Feature{
559 .cnmipsp,
560 }),
561 };
562 pub const p5600: CpuModel = .{
563 .name = "p5600",
564 .llvm_name = "p5600",
565 .features = featureSet(&[_]Feature{
566 .p5600,
567 }),
568 };
569};