authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-08-04 21:46:49-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-08-04 21:46:49-07:00
log316b4bde6a118c0742eee0d45137268a1dc99a26
tree84e9fb5c41e5785d7efd58ab788b95bbd323e6df
parente2b9e2137ee21acaaaee0e58600216ef3c06c86f

update target CPU features from llvm 10 to 11rc1


13 files changed, 991 insertions(+), 67 deletions(-)

lib/std/target.zig+1-1
......@@ -485,7 +485,7 @@ pub const Target = struct {
485485 pub const Set = struct {
486486 ints: [usize_count]usize,
487487
488 pub const needed_bit_count = 155;
488 pub const needed_bit_count = 168;
489489 pub const byte_count = (needed_bit_count + 7) / 8;
490490 pub const usize_count = (byte_count + (@sizeOf(usize) - 1)) / @sizeOf(usize);
491491 pub const Index = std.math.Log2Int(std.meta.Int(false, usize_count * @bitSizeOf(usize)));
lib/std/target/aarch64.zig+201-7
......@@ -3,6 +3,7 @@ const CpuFeature = std.Target.Cpu.Feature;
33const CpuModel = std.Target.Cpu.Model;
44
55pub const Feature = enum {
6 a34,
67 a65,
78 a76,
89 aes,
......@@ -10,6 +11,7 @@ pub const Feature = enum {
1011 alternate_sextload_cvt_f32_pattern,
1112 altnzcv,
1213 am,
14 amvs,
1315 apple_a10,
1416 apple_a11,
1517 apple_a12,
......@@ -18,6 +20,7 @@ pub const Feature = enum {
1820 arith_bcc_fusion,
1921 arith_cbz_fusion,
2022 balance_fp_ops,
23 bf16,
2124 bti,
2225 call_saved_x10,
2326 call_saved_x11,
......@@ -38,9 +41,13 @@ pub const Feature = enum {
3841 disable_latency_sched_heuristic,
3942 dit,
4043 dotprod,
44 ecv,
4145 ete,
4246 exynos_cheap_as_move,
4347 exynosm4,
48 f32mm,
49 f64mm,
50 fgt,
4451 fmi,
4552 force_32bit_jump_tables,
4653 fp_armv8,
......@@ -53,6 +60,9 @@ pub const Feature = enum {
5360 fuse_crypto_eor,
5461 fuse_csel,
5562 fuse_literals,
63 harden_sls_blr,
64 harden_sls_retbr,
65 i8mm,
5666 jsconv,
5767 lor,
5868 lse,
......@@ -96,6 +106,7 @@ pub const Feature = enum {
96106 reserve_x27,
97107 reserve_x28,
98108 reserve_x3,
109 reserve_x30,
99110 reserve_x4,
100111 reserve_x5,
101112 reserve_x6,
......@@ -129,6 +140,7 @@ pub const Feature = enum {
129140 trbe,
130141 uaops,
131142 use_aa,
143 use_experimental_zeroing_pseudos,
132144 use_postra_scheduler,
133145 use_reciprocal_square_root,
134146 v8a,
......@@ -137,6 +149,7 @@ pub const Feature = enum {
137149 v8_3a,
138150 v8_4a,
139151 v8_5a,
152 v8_6a,
140153 vh,
141154 zcm,
142155 zcz,
......@@ -152,6 +165,16 @@ pub const all_features = blk: {
152165 const len = @typeInfo(Feature).Enum.fields.len;
153166 std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
154167 var result: [len]CpuFeature = undefined;
168 result[@enumToInt(Feature.a34)] = .{
169 .llvm_name = "a35",
170 .description = "Cortex-A34 ARM processors",
171 .dependencies = featureSet(&[_]Feature{
172 .crc,
173 .crypto,
174 .perfmon,
175 .v8a,
176 }),
177 };
155178 result[@enumToInt(Feature.a65)] = .{
156179 .llvm_name = "a65",
157180 .description = "Cortex-A65 ARM processors",
......@@ -206,6 +229,13 @@ pub const all_features = blk: {
206229 .description = "Enable v8.4-A Activity Monitors extension",
207230 .dependencies = featureSet(&[_]Feature{}),
208231 };
232 result[@enumToInt(Feature.amvs)] = .{
233 .llvm_name = "amvs",
234 .description = "Enable v8.6-A Activity Monitors Virtualization support",
235 .dependencies = featureSet(&[_]Feature{
236 .am,
237 }),
238 };
209239 result[@enumToInt(Feature.apple_a10)] = .{
210240 .llvm_name = "apple-a10",
211241 .description = "Apple A10",
......@@ -325,6 +355,11 @@ pub const all_features = blk: {
325355 .description = "balance mix of odd and even D-registers for fp multiply(-accumulate) ops",
326356 .dependencies = featureSet(&[_]Feature{}),
327357 };
358 result[@enumToInt(Feature.bf16)] = .{
359 .llvm_name = "bf16",
360 .description = "Enable BFloat16 Extension",
361 .dependencies = featureSet(&[_]Feature{}),
362 };
328363 result[@enumToInt(Feature.bti)] = .{
329364 .llvm_name = "bti",
330365 .description = "Enable Branch Target Identification",
......@@ -431,6 +466,11 @@ pub const all_features = blk: {
431466 .description = "Enable dot product support",
432467 .dependencies = featureSet(&[_]Feature{}),
433468 };
469 result[@enumToInt(Feature.ecv)] = .{
470 .llvm_name = "ecv",
471 .description = "Enable enhanced counter virtualization extension",
472 .dependencies = featureSet(&[_]Feature{}),
473 };
434474 result[@enumToInt(Feature.ete)] = .{
435475 .llvm_name = "ete",
436476 .description = "Enable Embedded Trace Extension",
......@@ -468,6 +508,25 @@ pub const all_features = blk: {
468508 .zcz,
469509 }),
470510 };
511 result[@enumToInt(Feature.f32mm)] = .{
512 .llvm_name = "f32mm",
513 .description = "Enable Matrix Multiply FP32 Extension",
514 .dependencies = featureSet(&[_]Feature{
515 .sve,
516 }),
517 };
518 result[@enumToInt(Feature.f64mm)] = .{
519 .llvm_name = "f64mm",
520 .description = "Enable Matrix Multiply FP64 Extension",
521 .dependencies = featureSet(&[_]Feature{
522 .sve,
523 }),
524 };
525 result[@enumToInt(Feature.fgt)] = .{
526 .llvm_name = "fgt",
527 .description = "Enable fine grained virtualization traps extension",
528 .dependencies = featureSet(&[_]Feature{}),
529 };
471530 result[@enumToInt(Feature.fmi)] = .{
472531 .llvm_name = "fmi",
473532 .description = "Enable v8.4-A Flag Manipulation Instructions",
......@@ -532,9 +591,24 @@ pub const all_features = blk: {
532591 .description = "CPU fuses literal generation operations",
533592 .dependencies = featureSet(&[_]Feature{}),
534593 };
594 result[@enumToInt(Feature.harden_sls_blr)] = .{
595 .llvm_name = "harden-sls-blr",
596 .description = "Harden against straight line speculation across BLR instructions",
597 .dependencies = featureSet(&[_]Feature{}),
598 };
599 result[@enumToInt(Feature.harden_sls_retbr)] = .{
600 .llvm_name = "harden-sls-retbr",
601 .description = "Harden against straight line speculation across RET and BR instructions",
602 .dependencies = featureSet(&[_]Feature{}),
603 };
604 result[@enumToInt(Feature.i8mm)] = .{
605 .llvm_name = "i8mm",
606 .description = "Enable Matrix Multiply Int8 Extension",
607 .dependencies = featureSet(&[_]Feature{}),
608 };
535609 result[@enumToInt(Feature.jsconv)] = .{
536610 .llvm_name = "jsconv",
537 .description = "Enable v8.3-A JavaScript FP conversion enchancement",
611 .description = "Enable v8.3-A JavaScript FP conversion instructions",
538612 .dependencies = featureSet(&[_]Feature{
539613 .fp_armv8,
540614 }),
......@@ -607,12 +681,12 @@ pub const all_features = blk: {
607681 };
608682 result[@enumToInt(Feature.nv)] = .{
609683 .llvm_name = "nv",
610 .description = "Enable v8.4-A Nested Virtualization Enchancement",
684 .description = "Enable v8.4-A Nested Virtualization extension",
611685 .dependencies = featureSet(&[_]Feature{}),
612686 };
613687 result[@enumToInt(Feature.pa)] = .{
614688 .llvm_name = "pa",
615 .description = "Enable v8.3-A Pointer Authentication enchancement",
689 .description = "Enable v8.3-A Pointer Authentication extension",
616690 .dependencies = featureSet(&[_]Feature{}),
617691 };
618692 result[@enumToInt(Feature.pan)] = .{
......@@ -776,6 +850,11 @@ pub const all_features = blk: {
776850 .description = "Reserve X3, making it unavailable as a GPR",
777851 .dependencies = featureSet(&[_]Feature{}),
778852 };
853 result[@enumToInt(Feature.reserve_x30)] = .{
854 .llvm_name = "reserve-x30",
855 .description = "Reserve X30, making it unavailable as a GPR",
856 .dependencies = featureSet(&[_]Feature{}),
857 };
779858 result[@enumToInt(Feature.reserve_x4)] = .{
780859 .llvm_name = "reserve-x4",
781860 .description = "Reserve X4, making it unavailable as a GPR",
......@@ -961,6 +1040,11 @@ pub const all_features = blk: {
9611040 .description = "Use alias analysis during codegen",
9621041 .dependencies = featureSet(&[_]Feature{}),
9631042 };
1043 result[@enumToInt(Feature.use_experimental_zeroing_pseudos)] = .{
1044 .llvm_name = "use-experimental-zeroing-pseudos",
1045 .description = "Hint to the compiler that the MOVPRFX instruction is merged with destructive operations",
1046 .dependencies = featureSet(&[_]Feature{}),
1047 };
9641048 result[@enumToInt(Feature.use_postra_scheduler)] = .{
9651049 .llvm_name = "use-postra-scheduler",
9661050 .description = "Schedule again after register allocation",
......@@ -1049,6 +1133,18 @@ pub const all_features = blk: {
10491133 .v8_4a,
10501134 }),
10511135 };
1136 result[@enumToInt(Feature.v8_6a)] = .{
1137 .llvm_name = "v8.6a",
1138 .description = "Support ARM v8.6a instructions",
1139 .dependencies = featureSet(&[_]Feature{
1140 .amvs,
1141 .bf16,
1142 .ecv,
1143 .fgt,
1144 .i8mm,
1145 .v8_5a,
1146 }),
1147 };
10521148 result[@enumToInt(Feature.vh)] = .{
10531149 .llvm_name = "vh",
10541150 .description = "Enables ARM v8.1 Virtual Host extension",
......@@ -1091,6 +1187,21 @@ pub const all_features = blk: {
10911187};
10921188
10931189pub const cpu = struct {
1190 pub const a64fx = CpuModel{
1191 .name = "a64fx",
1192 .llvm_name = "a64fx",
1193 .features = featureSet(&[_]Feature{
1194 .complxnum,
1195 .fp_armv8,
1196 .fullfp16,
1197 .neon,
1198 .perfmon,
1199 .sha2,
1200 .sve,
1201 .use_postra_scheduler,
1202 .v8_2a,
1203 }),
1204 };
10941205 pub const apple_a10 = CpuModel{
10951206 .name = "apple_a10",
10961207 .llvm_name = "apple-a10",
......@@ -1161,14 +1272,28 @@ pub const cpu = struct {
11611272 .apple_a12,
11621273 }),
11631274 };
1275 pub const carmel = CpuModel{
1276 .name = "carmel",
1277 .llvm_name = "carmel",
1278 .features = featureSet(&[_]Feature{
1279 .crypto,
1280 .fullfp16,
1281 .neon,
1282 .v8_2a,
1283 }),
1284 };
1285 pub const cortex_a34 = CpuModel{
1286 .name = "cortex_a34",
1287 .llvm_name = "cortex-a34",
1288 .features = featureSet(&[_]Feature{
1289 .a34,
1290 }),
1291 };
11641292 pub const cortex_a35 = CpuModel{
11651293 .name = "cortex_a35",
11661294 .llvm_name = "cortex-a35",
11671295 .features = featureSet(&[_]Feature{
1168 .crc,
1169 .crypto,
1170 .perfmon,
1171 .v8a,
1296 .a34,
11721297 }),
11731298 };
11741299 pub const cortex_a53 = CpuModel{
......@@ -1278,6 +1403,54 @@ pub const cpu = struct {
12781403 .a76,
12791404 }),
12801405 };
1406 pub const cortex_a77 = CpuModel{
1407 .name = "cortex_a77",
1408 .llvm_name = "cortex-a77",
1409 .features = featureSet(&[_]Feature{
1410 .crypto,
1411 .dotprod,
1412 .fp_armv8,
1413 .fullfp16,
1414 .neon,
1415 .rcpc,
1416 .v8_2a,
1417 }),
1418 };
1419 pub const cortex_a78 = CpuModel{
1420 .name = "cortex_a78",
1421 .llvm_name = "cortex-a78",
1422 .features = featureSet(&[_]Feature{
1423 .crypto,
1424 .dotprod,
1425 .fp_armv8,
1426 .fullfp16,
1427 .fuse_aes,
1428 .neon,
1429 .perfmon,
1430 .rcpc,
1431 .spe,
1432 .ssbs,
1433 .use_postra_scheduler,
1434 .v8_2a,
1435 }),
1436 };
1437 pub const cortex_x1 = CpuModel{
1438 .name = "cortex_x1",
1439 .llvm_name = "cortex-x1",
1440 .features = featureSet(&[_]Feature{
1441 .crypto,
1442 .dotprod,
1443 .fp_armv8,
1444 .fullfp16,
1445 .fuse_aes,
1446 .neon,
1447 .perfmon,
1448 .rcpc,
1449 .spe,
1450 .use_postra_scheduler,
1451 .v8_2a,
1452 }),
1453 };
12811454 pub const cyclone = CpuModel{
12821455 .name = "cyclone",
12831456 .llvm_name = "cyclone",
......@@ -1452,6 +1625,27 @@ pub const cpu = struct {
14521625 .v8_1a,
14531626 }),
14541627 };
1628 pub const thunderx3t110 = CpuModel{
1629 .name = "thunderx3t110",
1630 .llvm_name = "thunderx3t110",
1631 .features = featureSet(&[_]Feature{
1632 .aggressive_fma,
1633 .arith_bcc_fusion,
1634 .balance_fp_ops,
1635 .crc,
1636 .crypto,
1637 .fp_armv8,
1638 .lse,
1639 .neon,
1640 .pa,
1641 .perfmon,
1642 .predictable_select_expensive,
1643 .strict_align,
1644 .use_aa,
1645 .use_postra_scheduler,
1646 .v8_3a,
1647 }),
1648 };
14551649 pub const thunderxt81 = CpuModel{
14561650 .name = "thunderxt81",
14571651 .llvm_name = "thunderxt81",
lib/std/target/amdgpu.zig+105-38
......@@ -5,6 +5,7 @@ const CpuModel = std.Target.Cpu.Model;
55pub const Feature = enum {
66 @"16_bit_insts",
77 DumpCode,
8 a16,
89 add_no_carry_insts,
910 aperture_regs,
1011 atomic_fadd_insts,
......@@ -21,9 +22,11 @@ pub const Feature = enum {
2122 dot6_insts,
2223 dpp,
2324 dpp8,
25 ds_src2_insts,
2426 dumpcode,
2527 enable_ds128,
2628 enable_prt_strict_null,
29 fast_denormal_f32,
2730 fast_fmaf,
2831 flat_address_space,
2932 flat_for_global,
......@@ -33,15 +36,14 @@ pub const Feature = enum {
3336 flat_segment_offset_bug,
3437 fma_mix_insts,
3538 fmaf,
36 fp_exceptions,
37 fp16_denormals,
38 fp32_denormals,
3939 fp64,
40 fp64_denormals,
41 fp64_fp16_denormals,
40 g16,
4241 gcn3_encoding,
42 get_wave_id_inst,
4343 gfx10,
44 gfx10_3_insts,
4445 gfx10_insts,
46 gfx10_b_encoding,
4547 gfx7_gfx8_gfx9_insts,
4648 gfx8_insts,
4749 gfx9,
......@@ -58,6 +60,7 @@ pub const Feature = enum {
5860 localmemorysize0,
5961 localmemorysize32768,
6062 localmemorysize65536,
63 mad_mac_f32_insts,
6164 mad_mix_insts,
6265 mai_insts,
6366 max_private_element_size_16,
......@@ -78,6 +81,7 @@ pub const Feature = enum {
7881 r128_a16,
7982 register_banking,
8083 s_memrealtime,
84 s_memtime_inst,
8185 scalar_atomics,
8286 scalar_flat_scratch_insts,
8387 scalar_stores,
......@@ -129,6 +133,11 @@ pub const all_features = blk: {
129133 .description = "Dump MachineInstrs in the CodeEmitter",
130134 .dependencies = featureSet(&[_]Feature{}),
131135 };
136 result[@enumToInt(Feature.a16)] = .{
137 .llvm_name = "a16",
138 .description = "Support gfx10-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands",
139 .dependencies = featureSet(&[_]Feature{}),
140 };
132141 result[@enumToInt(Feature.add_no_carry_insts)] = .{
133142 .llvm_name = "add-no-carry-insts",
134143 .description = "Have VALU add/sub instructions without carry out",
......@@ -142,7 +151,9 @@ pub const all_features = blk: {
142151 result[@enumToInt(Feature.atomic_fadd_insts)] = .{
143152 .llvm_name = "atomic-fadd-insts",
144153 .description = "Has buffer_atomic_add_f32, buffer_atomic_pk_add_f16, global_atomic_add_f32, global_atomic_pk_add_f16 instructions",
145 .dependencies = featureSet(&[_]Feature{}),
154 .dependencies = featureSet(&[_]Feature{
155 .flat_global_insts,
156 }),
146157 };
147158 result[@enumToInt(Feature.auto_waitcnt_before_barrier)] = .{
148159 .llvm_name = "auto-waitcnt-before-barrier",
......@@ -209,6 +220,11 @@ pub const all_features = blk: {
209220 .description = "Support DPP8 (Data Parallel Primitives) extension",
210221 .dependencies = featureSet(&[_]Feature{}),
211222 };
223 result[@enumToInt(Feature.ds_src2_insts)] = .{
224 .llvm_name = "ds-src2-insts",
225 .description = "Has ds_*_src2 instructions",
226 .dependencies = featureSet(&[_]Feature{}),
227 };
212228 result[@enumToInt(Feature.dumpcode)] = .{
213229 .llvm_name = "dumpcode",
214230 .description = "Dump MachineInstrs in the CodeEmitter",
......@@ -224,6 +240,11 @@ pub const all_features = blk: {
224240 .description = "Enable zeroing of result registers for sparse texture fetches",
225241 .dependencies = featureSet(&[_]Feature{}),
226242 };
243 result[@enumToInt(Feature.fast_denormal_f32)] = .{
244 .llvm_name = "fast-denormal-f32",
245 .description = "Enabling denormals does not cause f32 instructions to run at f64 rates",
246 .dependencies = featureSet(&[_]Feature{}),
247 };
227248 result[@enumToInt(Feature.fast_fmaf)] = .{
228249 .llvm_name = "fast-fmaf",
229250 .description = "Assuming f32 fma is at least as fast as mul + add",
......@@ -269,58 +290,38 @@ pub const all_features = blk: {
269290 .description = "Enable single precision FMA (not as fast as mul+add, but fused)",
270291 .dependencies = featureSet(&[_]Feature{}),
271292 };
272 result[@enumToInt(Feature.fp_exceptions)] = .{
273 .llvm_name = "fp-exceptions",
274 .description = "Enable floating point exceptions",
275 .dependencies = featureSet(&[_]Feature{}),
276 };
277 result[@enumToInt(Feature.fp16_denormals)] = .{
278 .llvm_name = "fp16-denormals",
279 .description = "Enable half precision denormal handling",
280 .dependencies = featureSet(&[_]Feature{
281 .fp64_fp16_denormals,
282 }),
283 };
284 result[@enumToInt(Feature.fp32_denormals)] = .{
285 .llvm_name = "fp32-denormals",
286 .description = "Enable single precision denormal handling",
287 .dependencies = featureSet(&[_]Feature{}),
288 };
289293 result[@enumToInt(Feature.fp64)] = .{
290294 .llvm_name = "fp64",
291295 .description = "Enable double precision operations",
292296 .dependencies = featureSet(&[_]Feature{}),
293297 };
294 result[@enumToInt(Feature.fp64_denormals)] = .{
295 .llvm_name = "fp64-denormals",
296 .description = "Enable double and half precision denormal handling",
297 .dependencies = featureSet(&[_]Feature{
298 .fp64,
299 .fp64_fp16_denormals,
300 }),
301 };
302 result[@enumToInt(Feature.fp64_fp16_denormals)] = .{
303 .llvm_name = "fp64-fp16-denormals",
304 .description = "Enable double and half precision denormal handling",
305 .dependencies = featureSet(&[_]Feature{
306 .fp64,
307 }),
298 result[@enumToInt(Feature.g16)] = .{
299 .llvm_name = "g16",
300 .description = "Support G16 for 16-bit gradient image operands",
301 .dependencies = featureSet(&[_]Feature{}),
308302 };
309303 result[@enumToInt(Feature.gcn3_encoding)] = .{
310304 .llvm_name = "gcn3-encoding",
311305 .description = "Encoding format for VI",
312306 .dependencies = featureSet(&[_]Feature{}),
313307 };
308 result[@enumToInt(Feature.get_wave_id_inst)] = .{
309 .llvm_name = "get-wave-id-inst",
310 .description = "Has s_get_waveid_in_workgroup instruction",
311 .dependencies = featureSet(&[_]Feature{}),
312 };
314313 result[@enumToInt(Feature.gfx10)] = .{
315314 .llvm_name = "gfx10",
316315 .description = "GFX10 GPU generation",
317316 .dependencies = featureSet(&[_]Feature{
318317 .@"16_bit_insts",
318 .a16,
319319 .add_no_carry_insts,
320320 .aperture_regs,
321321 .ci_insts,
322322 .dpp,
323323 .dpp8,
324 .fast_denormal_f32,
324325 .fast_fmaf,
325326 .flat_address_space,
326327 .flat_global_insts,
......@@ -328,6 +329,7 @@ pub const all_features = blk: {
328329 .flat_scratch_insts,
329330 .fma_mix_insts,
330331 .fp64,
332 .g16,
331333 .gfx10_insts,
332334 .gfx8_insts,
333335 .gfx9_insts,
......@@ -351,11 +353,21 @@ pub const all_features = blk: {
351353 .vscnt,
352354 }),
353355 };
356 result[@enumToInt(Feature.gfx10_3_insts)] = .{
357 .llvm_name = "gfx10-3-insts",
358 .description = "Additional instructions for GFX10.3",
359 .dependencies = featureSet(&[_]Feature{}),
360 };
354361 result[@enumToInt(Feature.gfx10_insts)] = .{
355362 .llvm_name = "gfx10-insts",
356363 .description = "Additional instructions for GFX10+",
357364 .dependencies = featureSet(&[_]Feature{}),
358365 };
366 result[@enumToInt(Feature.gfx10_b_encoding)] = .{
367 .llvm_name = "gfx10_b-encoding",
368 .description = "Encoding format GFX10_B",
369 .dependencies = featureSet(&[_]Feature{}),
370 };
359371 result[@enumToInt(Feature.gfx7_gfx8_gfx9_insts)] = .{
360372 .llvm_name = "gfx7-gfx8-gfx9-insts",
361373 .description = "Instructions shared in GFX7, GFX8, GFX9",
......@@ -375,6 +387,8 @@ pub const all_features = blk: {
375387 .aperture_regs,
376388 .ci_insts,
377389 .dpp,
390 .ds_src2_insts,
391 .fast_denormal_f32,
378392 .fast_fmaf,
379393 .flat_address_space,
380394 .flat_global_insts,
......@@ -388,8 +402,10 @@ pub const all_features = blk: {
388402 .int_clamp_insts,
389403 .inv_2pi_inline_imm,
390404 .localmemorysize65536,
405 .mad_mac_f32_insts,
391406 .r128_a16,
392407 .s_memrealtime,
408 .s_memtime_inst,
393409 .scalar_atomics,
394410 .scalar_flat_scratch_insts,
395411 .scalar_stores,
......@@ -467,6 +483,11 @@ pub const all_features = blk: {
467483 .description = "The size of local memory in bytes",
468484 .dependencies = featureSet(&[_]Feature{}),
469485 };
486 result[@enumToInt(Feature.mad_mac_f32_insts)] = .{
487 .llvm_name = "mad-mac-f32-insts",
488 .description = "Has v_mad_f32/v_mac_f32/v_madak_f32/v_madmk_f32 instructions",
489 .dependencies = featureSet(&[_]Feature{}),
490 };
470491 result[@enumToInt(Feature.mad_mix_insts)] = .{
471492 .llvm_name = "mad-mix-insts",
472493 .description = "Has v_mad_mix_f32, v_mad_mixlo_f16, v_mad_mixhi_f16 instructions",
......@@ -554,7 +575,7 @@ pub const all_features = blk: {
554575 };
555576 result[@enumToInt(Feature.r128_a16)] = .{
556577 .llvm_name = "r128-a16",
557 .description = "Support 16 bit coordindates/gradients/lod/clamp/mip types on gfx9",
578 .description = "Support gfx9-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands, where a16 is aliased with r128",
558579 .dependencies = featureSet(&[_]Feature{}),
559580 };
560581 result[@enumToInt(Feature.register_banking)] = .{
......@@ -567,6 +588,11 @@ pub const all_features = blk: {
567588 .description = "Has s_memrealtime instruction",
568589 .dependencies = featureSet(&[_]Feature{}),
569590 };
591 result[@enumToInt(Feature.s_memtime_inst)] = .{
592 .llvm_name = "s-memtime-inst",
593 .description = "Has s_memtime instruction",
594 .dependencies = featureSet(&[_]Feature{}),
595 };
570596 result[@enumToInt(Feature.scalar_atomics)] = .{
571597 .llvm_name = "scalar-atomics",
572598 .description = "Has atomic scalar memory instructions",
......@@ -617,13 +643,16 @@ pub const all_features = blk: {
617643 .description = "SEA_ISLANDS GPU generation",
618644 .dependencies = featureSet(&[_]Feature{
619645 .ci_insts,
646 .ds_src2_insts,
620647 .flat_address_space,
621648 .fp64,
622649 .gfx7_gfx8_gfx9_insts,
623650 .localmemorysize65536,
651 .mad_mac_f32_insts,
624652 .mimg_r128,
625653 .movrel,
626654 .no_sram_ecc_support,
655 .s_memtime_inst,
627656 .trig_reduced_range,
628657 .wavefrontsize64,
629658 }),
......@@ -647,13 +676,16 @@ pub const all_features = blk: {
647676 .llvm_name = "southern-islands",
648677 .description = "SOUTHERN_ISLANDS GPU generation",
649678 .dependencies = featureSet(&[_]Feature{
679 .ds_src2_insts,
650680 .fp64,
651681 .ldsbankcount32,
652682 .localmemorysize32768,
683 .mad_mac_f32_insts,
653684 .mimg_r128,
654685 .movrel,
655686 .no_sram_ecc_support,
656687 .no_xnack_support,
688 .s_memtime_inst,
657689 .trig_reduced_range,
658690 .wavefrontsize64,
659691 }),
......@@ -720,6 +752,8 @@ pub const all_features = blk: {
720752 .@"16_bit_insts",
721753 .ci_insts,
722754 .dpp,
755 .ds_src2_insts,
756 .fast_denormal_f32,
723757 .flat_address_space,
724758 .fp64,
725759 .gcn3_encoding,
......@@ -728,10 +762,12 @@ pub const all_features = blk: {
728762 .int_clamp_insts,
729763 .inv_2pi_inline_imm,
730764 .localmemorysize65536,
765 .mad_mac_f32_insts,
731766 .mimg_r128,
732767 .movrel,
733768 .no_sram_ecc_support,
734769 .s_memrealtime,
770 .s_memtime_inst,
735771 .scalar_stores,
736772 .sdwa,
737773 .sdwa_mav,
......@@ -840,16 +876,20 @@ pub const cpu = struct {
840876 .features = featureSet(&[_]Feature{
841877 .code_object_v3,
842878 .dl_insts,
879 .ds_src2_insts,
843880 .flat_segment_offset_bug,
881 .get_wave_id_inst,
844882 .gfx10,
845883 .inst_fwd_prefetch_bug,
846884 .lds_branch_vmem_war_hazard,
847885 .lds_misaligned_bug,
848886 .ldsbankcount32,
887 .mad_mac_f32_insts,
849888 .no_xnack_support,
850889 .nsa_encoding,
851890 .nsa_to_vmem_bug,
852891 .offset_3f_bug,
892 .s_memtime_inst,
853893 .scalar_atomics,
854894 .scalar_flat_scratch_insts,
855895 .scalar_stores,
......@@ -870,15 +910,19 @@ pub const cpu = struct {
870910 .dot2_insts,
871911 .dot5_insts,
872912 .dot6_insts,
913 .ds_src2_insts,
873914 .flat_segment_offset_bug,
915 .get_wave_id_inst,
874916 .gfx10,
875917 .inst_fwd_prefetch_bug,
876918 .lds_branch_vmem_war_hazard,
877919 .ldsbankcount32,
920 .mad_mac_f32_insts,
878921 .no_xnack_support,
879922 .nsa_encoding,
880923 .nsa_to_vmem_bug,
881924 .offset_3f_bug,
925 .s_memtime_inst,
882926 .scalar_atomics,
883927 .scalar_flat_scratch_insts,
884928 .scalar_stores,
......@@ -899,16 +943,20 @@ pub const cpu = struct {
899943 .dot2_insts,
900944 .dot5_insts,
901945 .dot6_insts,
946 .ds_src2_insts,
902947 .flat_segment_offset_bug,
948 .get_wave_id_inst,
903949 .gfx10,
904950 .inst_fwd_prefetch_bug,
905951 .lds_branch_vmem_war_hazard,
906952 .lds_misaligned_bug,
907953 .ldsbankcount32,
954 .mad_mac_f32_insts,
908955 .no_xnack_support,
909956 .nsa_encoding,
910957 .nsa_to_vmem_bug,
911958 .offset_3f_bug,
959 .s_memtime_inst,
912960 .scalar_atomics,
913961 .scalar_flat_scratch_insts,
914962 .scalar_stores,
......@@ -919,6 +967,25 @@ pub const cpu = struct {
919967 .wavefrontsize32,
920968 }),
921969 };
970 pub const gfx1030 = CpuModel{
971 .name = "gfx1030",
972 .llvm_name = "gfx1030",
973 .features = featureSet(&[_]Feature{
974 .code_object_v3,
975 .dl_insts,
976 .dot1_insts,
977 .dot2_insts,
978 .dot5_insts,
979 .dot6_insts,
980 .gfx10,
981 .gfx10_3_insts,
982 .gfx10_b_encoding,
983 .ldsbankcount32,
984 .no_xnack_support,
985 .nsa_encoding,
986 .wavefrontsize32,
987 }),
988 };
922989 pub const gfx600 = CpuModel{
923990 .name = "gfx600",
924991 .llvm_name = "gfx600",
lib/std/target/arm.zig+171
......@@ -11,6 +11,16 @@ pub const Feature = enum {
1111 aes,
1212 avoid_movs_shop,
1313 avoid_partial_cpsr,
14 bf16,
15 cde,
16 cdecp0,
17 cdecp1,
18 cdecp2,
19 cdecp3,
20 cdecp4,
21 cdecp5,
22 cdecp6,
23 cdecp7,
1424 cheap_predicable_cpsr,
1525 crc,
1626 crypto,
......@@ -53,11 +63,13 @@ pub const Feature = enum {
5363 has_v8_3a,
5464 has_v8_4a,
5565 has_v8_5a,
66 has_v8_6a,
5667 has_v8,
5768 has_v8m,
5869 has_v8m_main,
5970 hwdiv,
6071 hwdiv_arm,
72 i8mm,
6173 iwmmxt,
6274 iwmmxt2,
6375 lob,
......@@ -141,6 +153,7 @@ pub const Feature = enum {
141153 v8_3a,
142154 v8_4a,
143155 v8_5a,
156 v8_6a,
144157 vfp2,
145158 vfp2sp,
146159 vfp3,
......@@ -209,6 +222,76 @@ pub const all_features = blk: {
209222 .description = "Avoid CPSR partial update for OOO execution",
210223 .dependencies = featureSet(&[_]Feature{}),
211224 };
225 result[@enumToInt(Feature.bf16)] = .{
226 .llvm_name = "bf16",
227 .description = "Enable support for BFloat16 instructions",
228 .dependencies = featureSet(&[_]Feature{
229 .neon,
230 }),
231 };
232 result[@enumToInt(Feature.cde)] = .{
233 .llvm_name = "cde",
234 .description = "Support CDE instructions",
235 .dependencies = featureSet(&[_]Feature{
236 .v8m_main,
237 }),
238 };
239 result[@enumToInt(Feature.cdecp0)] = .{
240 .llvm_name = "cdecp0",
241 .description = "Coprocessor 0 ISA is CDEv1",
242 .dependencies = featureSet(&[_]Feature{
243 .cde,
244 }),
245 };
246 result[@enumToInt(Feature.cdecp1)] = .{
247 .llvm_name = "cdecp1",
248 .description = "Coprocessor 1 ISA is CDEv1",
249 .dependencies = featureSet(&[_]Feature{
250 .cde,
251 }),
252 };
253 result[@enumToInt(Feature.cdecp2)] = .{
254 .llvm_name = "cdecp2",
255 .description = "Coprocessor 2 ISA is CDEv1",
256 .dependencies = featureSet(&[_]Feature{
257 .cde,
258 }),
259 };
260 result[@enumToInt(Feature.cdecp3)] = .{
261 .llvm_name = "cdecp3",
262 .description = "Coprocessor 3 ISA is CDEv1",
263 .dependencies = featureSet(&[_]Feature{
264 .cde,
265 }),
266 };
267 result[@enumToInt(Feature.cdecp4)] = .{
268 .llvm_name = "cdecp4",
269 .description = "Coprocessor 4 ISA is CDEv1",
270 .dependencies = featureSet(&[_]Feature{
271 .cde,
272 }),
273 };
274 result[@enumToInt(Feature.cdecp5)] = .{
275 .llvm_name = "cdecp5",
276 .description = "Coprocessor 5 ISA is CDEv1",
277 .dependencies = featureSet(&[_]Feature{
278 .cde,
279 }),
280 };
281 result[@enumToInt(Feature.cdecp6)] = .{
282 .llvm_name = "cdecp6",
283 .description = "Coprocessor 6 ISA is CDEv1",
284 .dependencies = featureSet(&[_]Feature{
285 .cde,
286 }),
287 };
288 result[@enumToInt(Feature.cdecp7)] = .{
289 .llvm_name = "cdecp7",
290 .description = "Coprocessor 7 ISA is CDEv1",
291 .dependencies = featureSet(&[_]Feature{
292 .cde,
293 }),
294 };
212295 result[@enumToInt(Feature.cheap_predicable_cpsr)] = .{
213296 .llvm_name = "cheap-predicable-cpsr",
214297 .description = "Disable +1 predication cost for instructions updating CPSR",
......@@ -508,6 +591,15 @@ pub const all_features = blk: {
508591 .has_v8_4a,
509592 }),
510593 };
594 result[@enumToInt(Feature.has_v8_6a)] = .{
595 .llvm_name = "v8.6a",
596 .description = "Support ARM v8.6a instructions",
597 .dependencies = featureSet(&[_]Feature{
598 .bf16,
599 .i8mm,
600 .has_v8_5a,
601 }),
602 };
511603 result[@enumToInt(Feature.has_v8m)] = .{
512604 .llvm_name = "v8m",
513605 .description = "Support ARM v8M Baseline instructions",
......@@ -532,6 +624,13 @@ pub const all_features = blk: {
532624 .description = "Enable divide instructions in ARM mode",
533625 .dependencies = featureSet(&[_]Feature{}),
534626 };
627 result[@enumToInt(Feature.i8mm)] = .{
628 .llvm_name = "i8mm",
629 .description = "Enable Matrix Multiply Int8 Extension",
630 .dependencies = featureSet(&[_]Feature{
631 .neon,
632 }),
633 };
535634 result[@enumToInt(Feature.iwmmxt)] = .{
536635 .llvm_name = "iwmmxt",
537636 .description = "ARMv5te architecture",
......@@ -1177,6 +1276,25 @@ pub const all_features = blk: {
11771276 .virtualization,
11781277 }),
11791278 };
1279 result[@enumToInt(Feature.v8_6a)] = .{
1280 .llvm_name = "armv8.6-a",
1281 .description = "ARMv86a architecture",
1282 .dependencies = featureSet(&[_]Feature{
1283 .aclass,
1284 .crc,
1285 .crypto,
1286 .db,
1287 .dotprod,
1288 .dsp,
1289 .fp_armv8,
1290 .mp,
1291 .neon,
1292 .ras,
1293 .trustzone,
1294 .has_v8_6a,
1295 .virtualization,
1296 }),
1297 };
11801298 result[@enumToInt(Feature.vfp2)] = .{
11811299 .llvm_name = "vfp2",
11821300 .description = "Enable VFP2 instructions",
......@@ -1722,6 +1840,32 @@ pub const cpu = struct {
17221840 .hwdiv_arm,
17231841 }),
17241842 };
1843 pub const cortex_a77 = CpuModel{
1844 .name = "cortex_a77",
1845 .llvm_name = "cortex-a77",
1846 .features = featureSet(&[_]Feature{
1847 .v8_2a,
1848 .crc,
1849 .crypto,
1850 .dotprod,
1851 .fullfp16,
1852 .hwdiv,
1853 .hwdiv_arm,
1854 }),
1855 };
1856 pub const cortex_a78 = CpuModel{
1857 .name = "cortex_a78",
1858 .llvm_name = "cortex-a78",
1859 .features = featureSet(&[_]Feature{
1860 .v8_2a,
1861 .crc,
1862 .crypto,
1863 .dotprod,
1864 .fullfp16,
1865 .hwdiv,
1866 .hwdiv_arm,
1867 }),
1868 };
17251869 pub const cortex_a8 = CpuModel{
17261870 .name = "cortex_a8",
17271871 .llvm_name = "cortex-a8",
......@@ -1837,6 +1981,20 @@ pub const cpu = struct {
18371981 .vfp4d16sp,
18381982 }),
18391983 };
1984 pub const cortex_m55 = CpuModel{
1985 .name = "cortex_m55",
1986 .llvm_name = "cortex-m55",
1987 .features = featureSet(&[_]Feature{
1988 .v8_1m_main,
1989 .dsp,
1990 .fp_armv8d16,
1991 .loop_align,
1992 .mve_fp,
1993 .no_branch_predictor,
1994 .slowfpvmlx,
1995 .use_misched,
1996 }),
1997 };
18401998 pub const cortex_m7 = CpuModel{
18411999 .name = "cortex_m7",
18422000 .llvm_name = "cortex-m7",
......@@ -1924,6 +2082,19 @@ pub const cpu = struct {
19242082 .vfp3d16,
19252083 }),
19262084 };
2085 pub const cortex_x1 = CpuModel{
2086 .name = "cortex_x1",
2087 .llvm_name = "cortex-x1",
2088 .features = featureSet(&[_]Feature{
2089 .v8_2a,
2090 .crc,
2091 .crypto,
2092 .dotprod,
2093 .fullfp16,
2094 .hwdiv,
2095 .hwdiv_arm,
2096 }),
2097 };
19272098 pub const cyclone = CpuModel{
19282099 .name = "cyclone",
19292100 .llvm_name = "cyclone",
lib/std/target/avr.zig+22-1
......@@ -25,6 +25,7 @@ pub const Feature = enum {
2525 jmpcall,
2626 lpm,
2727 lpmx,
28 memmappedregs,
2829 movw,
2930 mul,
3031 rmw,
......@@ -60,6 +61,7 @@ pub const all_features = blk: {
6061 .dependencies = featureSet(&[_]Feature{
6162 .avr0,
6263 .lpm,
64 .memmappedregs,
6365 }),
6466 };
6567 result[@enumToInt(Feature.avr2)] = .{
......@@ -156,6 +158,7 @@ pub const all_features = blk: {
156158 .dependencies = featureSet(&[_]Feature{
157159 .avr0,
158160 .@"break",
161 .memmappedregs,
159162 .sram,
160163 .tinyencoding,
161164 }),
......@@ -205,6 +208,11 @@ pub const all_features = blk: {
205208 .description = "The device supports the `LPM Rd, Z[+]` instruction",
206209 .dependencies = featureSet(&[_]Feature{}),
207210 };
211 result[@enumToInt(Feature.memmappedregs)] = .{
212 .llvm_name = "memmappedregs",
213 .description = "The device has CPU registers mapped in data address space",
214 .dependencies = featureSet(&[_]Feature{}),
215 };
208216 result[@enumToInt(Feature.movw)] = .{
209217 .llvm_name = "movw",
210218 .description = "The device supports the 16-bit MOVW instruction",
......@@ -239,6 +247,7 @@ pub const all_features = blk: {
239247 .jmpcall,
240248 .lpm,
241249 .lpmx,
250 .memmappedregs,
242251 .movw,
243252 .mul,
244253 .rmw,
......@@ -271,10 +280,22 @@ pub const all_features = blk: {
271280 .llvm_name = "xmega",
272281 .description = "The device is a part of the xmega family",
273282 .dependencies = featureSet(&[_]Feature{
274 .avr51,
283 .addsubiw,
284 .avr0,
285 .@"break",
275286 .des,
276287 .eijmpcall,
288 .elpm,
289 .elpmx,
290 .ijmpcall,
291 .jmpcall,
292 .lpm,
293 .lpmx,
294 .movw,
295 .mul,
296 .spm,
277297 .spmx,
298 .sram,
278299 }),
279300 };
280301 result[@enumToInt(Feature.xmegau)] = .{
lib/std/target/hexagon.zig+101
......@@ -3,6 +3,8 @@ const CpuFeature = std.Target.Cpu.Feature;
33const CpuModel = std.Target.Cpu.Model;
44
55pub const Feature = enum {
6 audio,
7 compound,
68 duplex,
79 hvx,
810 hvx_length128b,
......@@ -11,6 +13,7 @@ pub const Feature = enum {
1113 hvxv62,
1214 hvxv65,
1315 hvxv66,
16 hvxv67,
1417 long_calls,
1518 mem_noshuf,
1619 memops,
......@@ -18,14 +21,18 @@ pub const Feature = enum {
1821 nvj,
1922 nvs,
2023 packets,
24 prev65,
2125 reserved_r19,
2226 small_data,
27 tinycore,
28 unsafe_fp,
2329 v5,
2430 v55,
2531 v60,
2632 v62,
2733 v65,
2834 v66,
35 v67,
2936 zreg,
3037};
3138
......@@ -35,6 +42,16 @@ pub const all_features = blk: {
3542 const len = @typeInfo(Feature).Enum.fields.len;
3643 std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
3744 var result: [len]CpuFeature = undefined;
45 result[@enumToInt(Feature.audio)] = .{
46 .llvm_name = "audio",
47 .description = "Hexagon Audio extension instructions",
48 .dependencies = featureSet(&[_]Feature{}),
49 };
50 result[@enumToInt(Feature.compound)] = .{
51 .llvm_name = "compound",
52 .description = "Use compound instructions",
53 .dependencies = featureSet(&[_]Feature{}),
54 };
3855 result[@enumToInt(Feature.duplex)] = .{
3956 .llvm_name = "duplex",
4057 .description = "Enable generation of duplex instruction",
......@@ -94,6 +111,16 @@ pub const all_features = blk: {
94111 .zreg,
95112 }),
96113 };
114 result[@enumToInt(Feature.hvxv67)] = .{
115 .llvm_name = "hvxv67",
116 .description = "Hexagon HVX instructions",
117 .dependencies = featureSet(&[_]Feature{
118 .hvxv60,
119 .hvxv62,
120 .hvxv65,
121 .hvxv66,
122 }),
123 };
97124 result[@enumToInt(Feature.long_calls)] = .{
98125 .llvm_name = "long-calls",
99126 .description = "Use constant-extended calls",
......@@ -133,6 +160,11 @@ pub const all_features = blk: {
133160 .description = "Support for instruction packets",
134161 .dependencies = featureSet(&[_]Feature{}),
135162 };
163 result[@enumToInt(Feature.prev65)] = .{
164 .llvm_name = "prev65",
165 .description = "Support features deprecated in v65",
166 .dependencies = featureSet(&[_]Feature{}),
167 };
136168 result[@enumToInt(Feature.reserved_r19)] = .{
137169 .llvm_name = "reserved-r19",
138170 .description = "Reserve register R19",
......@@ -143,6 +175,16 @@ pub const all_features = blk: {
143175 .description = "Allow GP-relative addressing of global variables",
144176 .dependencies = featureSet(&[_]Feature{}),
145177 };
178 result[@enumToInt(Feature.tinycore)] = .{
179 .llvm_name = "tinycore",
180 .description = "Hexagon Tiny Core",
181 .dependencies = featureSet(&[_]Feature{}),
182 };
183 result[@enumToInt(Feature.unsafe_fp)] = .{
184 .llvm_name = "unsafe-fp",
185 .description = "Use unsafe FP math",
186 .dependencies = featureSet(&[_]Feature{}),
187 };
146188 result[@enumToInt(Feature.v5)] = .{
147189 .llvm_name = "v5",
148190 .description = "Enable Hexagon V5 architecture",
......@@ -173,6 +215,11 @@ pub const all_features = blk: {
173215 .description = "Enable Hexagon V66 architecture",
174216 .dependencies = featureSet(&[_]Feature{}),
175217 };
218 result[@enumToInt(Feature.v67)] = .{
219 .llvm_name = "v67",
220 .description = "Enable Hexagon V67 architecture",
221 .dependencies = featureSet(&[_]Feature{}),
222 };
176223 result[@enumToInt(Feature.zreg)] = .{
177224 .llvm_name = "zreg",
178225 .description = "Hexagon ZReg extension instructions",
......@@ -191,11 +238,13 @@ pub const cpu = struct {
191238 .name = "generic",
192239 .llvm_name = "generic",
193240 .features = featureSet(&[_]Feature{
241 .compound,
194242 .duplex,
195243 .memops,
196244 .nvj,
197245 .nvs,
198246 .packets,
247 .prev65,
199248 .small_data,
200249 .v5,
201250 .v55,
......@@ -206,11 +255,13 @@ pub const cpu = struct {
206255 .name = "hexagonv5",
207256 .llvm_name = "hexagonv5",
208257 .features = featureSet(&[_]Feature{
258 .compound,
209259 .duplex,
210260 .memops,
211261 .nvj,
212262 .nvs,
213263 .packets,
264 .prev65,
214265 .small_data,
215266 .v5,
216267 }),
......@@ -219,11 +270,13 @@ pub const cpu = struct {
219270 .name = "hexagonv55",
220271 .llvm_name = "hexagonv55",
221272 .features = featureSet(&[_]Feature{
273 .compound,
222274 .duplex,
223275 .memops,
224276 .nvj,
225277 .nvs,
226278 .packets,
279 .prev65,
227280 .small_data,
228281 .v5,
229282 .v55,
......@@ -233,11 +286,13 @@ pub const cpu = struct {
233286 .name = "hexagonv60",
234287 .llvm_name = "hexagonv60",
235288 .features = featureSet(&[_]Feature{
289 .compound,
236290 .duplex,
237291 .memops,
238292 .nvj,
239293 .nvs,
240294 .packets,
295 .prev65,
241296 .small_data,
242297 .v5,
243298 .v55,
......@@ -248,11 +303,13 @@ pub const cpu = struct {
248303 .name = "hexagonv62",
249304 .llvm_name = "hexagonv62",
250305 .features = featureSet(&[_]Feature{
306 .compound,
251307 .duplex,
252308 .memops,
253309 .nvj,
254310 .nvs,
255311 .packets,
312 .prev65,
256313 .small_data,
257314 .v5,
258315 .v55,
......@@ -264,6 +321,7 @@ pub const cpu = struct {
264321 .name = "hexagonv65",
265322 .llvm_name = "hexagonv65",
266323 .features = featureSet(&[_]Feature{
324 .compound,
267325 .duplex,
268326 .mem_noshuf,
269327 .memops,
......@@ -282,6 +340,7 @@ pub const cpu = struct {
282340 .name = "hexagonv66",
283341 .llvm_name = "hexagonv66",
284342 .features = featureSet(&[_]Feature{
343 .compound,
285344 .duplex,
286345 .mem_noshuf,
287346 .memops,
......@@ -297,4 +356,46 @@ pub const cpu = struct {
297356 .v66,
298357 }),
299358 };
359 pub const hexagonv67 = CpuModel{
360 .name = "hexagonv67",
361 .llvm_name = "hexagonv67",
362 .features = featureSet(&[_]Feature{
363 .compound,
364 .duplex,
365 .mem_noshuf,
366 .memops,
367 .nvj,
368 .nvs,
369 .packets,
370 .small_data,
371 .v5,
372 .v55,
373 .v60,
374 .v62,
375 .v65,
376 .v66,
377 .v67,
378 }),
379 };
380 pub const hexagonv67t = CpuModel{
381 .name = "hexagonv67t",
382 .llvm_name = "hexagonv67t",
383 .features = featureSet(&[_]Feature{
384 .audio,
385 .compound,
386 .mem_noshuf,
387 .memops,
388 .nvs,
389 .packets,
390 .small_data,
391 .tinycore,
392 .v5,
393 .v55,
394 .v60,
395 .v62,
396 .v65,
397 .v66,
398 .v67,
399 }),
400 };
300401};
lib/std/target/mips.zig+6
......@@ -28,6 +28,7 @@ pub const Feature = enum {
2828 mips32r6,
2929 mips3_32,
3030 mips3_32r2,
31 mips3d,
3132 mips4,
3233 mips4_32,
3334 mips4_32r2,
......@@ -222,6 +223,11 @@ pub const all_features = blk: {
222223 .description = "Subset of MIPS-III that is also in MIPS32r2 [highly experimental]",
223224 .dependencies = featureSet(&[_]Feature{}),
224225 };
226 result[@enumToInt(Feature.mips3d)] = .{
227 .llvm_name = "mips3d",
228 .description = "Mips 3D ASE",
229 .dependencies = featureSet(&[_]Feature{}),
230 };
225231 result[@enumToInt(Feature.mips4)] = .{
226232 .llvm_name = "mips4",
227233 .description = "MIPS IV ISA Support",
lib/std/target/nvptx.zig+26
......@@ -13,6 +13,8 @@ pub const Feature = enum {
1313 ptx61,
1414 ptx63,
1515 ptx64,
16 ptx65,
17 ptx70,
1618 sm_20,
1719 sm_21,
1820 sm_30,
......@@ -28,6 +30,7 @@ pub const Feature = enum {
2830 sm_70,
2931 sm_72,
3032 sm_75,
33 sm_80,
3134};
3235
3336pub usingnamespace CpuFeature.feature_set_fns(Feature);
......@@ -86,6 +89,16 @@ pub const all_features = blk: {
8689 .description = "Use PTX version 6.4",
8790 .dependencies = featureSet(&[_]Feature{}),
8891 };
92 result[@enumToInt(Feature.ptx65)] = .{
93 .llvm_name = "ptx65",
94 .description = "Use PTX version 6.5",
95 .dependencies = featureSet(&[_]Feature{}),
96 };
97 result[@enumToInt(Feature.ptx70)] = .{
98 .llvm_name = "ptx70",
99 .description = "Use PTX version 7.0",
100 .dependencies = featureSet(&[_]Feature{}),
101 };
89102 result[@enumToInt(Feature.sm_20)] = .{
90103 .llvm_name = "sm_20",
91104 .description = "Target SM 2.0",
......@@ -161,6 +174,11 @@ pub const all_features = blk: {
161174 .description = "Target SM 7.5",
162175 .dependencies = featureSet(&[_]Feature{}),
163176 };
177 result[@enumToInt(Feature.sm_80)] = .{
178 .llvm_name = "sm_80",
179 .description = "Target SM 8.0",
180 .dependencies = featureSet(&[_]Feature{}),
181 };
164182 const ti = @typeInfo(Feature);
165183 for (result) |*elem, i| {
166184 elem.index = i;
......@@ -286,4 +304,12 @@ pub const cpu = struct {
286304 .sm_75,
287305 }),
288306 };
307 pub const sm_80 = CpuModel{
308 .name = "sm_80",
309 .llvm_name = "sm_80",
310 .features = featureSet(&[_]Feature{
311 .ptx70,
312 .sm_80,
313 }),
314 };
289315};
lib/std/target/powerpc.zig+121-1
......@@ -25,11 +25,15 @@ pub const Feature = enum {
2525 frsqrte,
2626 frsqrtes,
2727 fsqrt,
28 fuse_addi_load,
29 fuse_addis_load,
30 fusion,
2831 hard_float,
2932 htm,
3033 icbt,
3134 invariant_function_descriptors,
3235 isa_v30_instructions,
36 isa_v31_instructions,
3337 isel,
3438 ldbrx,
3539 lfiwax,
......@@ -37,7 +41,9 @@ pub const Feature = enum {
3741 mfocrf,
3842 msync,
3943 partword_atomics,
44 pcrelative_memops,
4045 popcntd,
46 power10_vector,
4147 power8_altivec,
4248 power8_vector,
4349 power9_altivec,
......@@ -46,6 +52,8 @@ pub const Feature = enum {
4652 ppc_prera_sched,
4753 ppc4xx,
4854 ppc6xx,
55 predictable_select_expensive,
56 prefix_instrs,
4957 qpx,
5058 recipprec,
5159 secure_plt,
......@@ -201,6 +209,25 @@ pub const all_features = blk: {
201209 .fpu,
202210 }),
203211 };
212 result[@enumToInt(Feature.fuse_addi_load)] = .{
213 .llvm_name = "fuse-addi-load",
214 .description = "Power8 Addi-Load fusion",
215 .dependencies = featureSet(&[_]Feature{
216 .fusion,
217 }),
218 };
219 result[@enumToInt(Feature.fuse_addis_load)] = .{
220 .llvm_name = "fuse-addis-load",
221 .description = "Power8 Addis-Load fusion",
222 .dependencies = featureSet(&[_]Feature{
223 .fusion,
224 }),
225 };
226 result[@enumToInt(Feature.fusion)] = .{
227 .llvm_name = "fusion",
228 .description = "Target supports instruction fusion",
229 .dependencies = featureSet(&[_]Feature{}),
230 };
204231 result[@enumToInt(Feature.hard_float)] = .{
205232 .llvm_name = "hard-float",
206233 .description = "Enable floating-point instructions",
......@@ -223,9 +250,16 @@ pub const all_features = blk: {
223250 };
224251 result[@enumToInt(Feature.isa_v30_instructions)] = .{
225252 .llvm_name = "isa-v30-instructions",
226 .description = "Enable instructions added in ISA 3.0.",
253 .description = "Enable instructions in ISA 3.0.",
227254 .dependencies = featureSet(&[_]Feature{}),
228255 };
256 result[@enumToInt(Feature.isa_v31_instructions)] = .{
257 .llvm_name = "isa-v31-instructions",
258 .description = "Enable instructions in ISA 3.1.",
259 .dependencies = featureSet(&[_]Feature{
260 .isa_v30_instructions,
261 }),
262 };
229263 result[@enumToInt(Feature.isel)] = .{
230264 .llvm_name = "isel",
231265 .description = "Enable the isel instruction",
......@@ -265,11 +299,26 @@ pub const all_features = blk: {
265299 .description = "Enable l[bh]arx and st[bh]cx.",
266300 .dependencies = featureSet(&[_]Feature{}),
267301 };
302 result[@enumToInt(Feature.pcrelative_memops)] = .{
303 .llvm_name = "pcrelative-memops",
304 .description = "Enable PC relative Memory Ops",
305 .dependencies = featureSet(&[_]Feature{
306 .isa_v30_instructions,
307 }),
308 };
268309 result[@enumToInt(Feature.popcntd)] = .{
269310 .llvm_name = "popcntd",
270311 .description = "Enable the popcnt[dw] instructions",
271312 .dependencies = featureSet(&[_]Feature{}),
272313 };
314 result[@enumToInt(Feature.power10_vector)] = .{
315 .llvm_name = "power10-vector",
316 .description = "Enable POWER10 vector instructions",
317 .dependencies = featureSet(&[_]Feature{
318 .isa_v31_instructions,
319 .power9_vector,
320 }),
321 };
273322 result[@enumToInt(Feature.power8_altivec)] = .{
274323 .llvm_name = "power8-altivec",
275324 .description = "Enable POWER8 Altivec instructions",
......@@ -322,6 +371,20 @@ pub const all_features = blk: {
322371 .description = "Enable PPC 6xx instructions",
323372 .dependencies = featureSet(&[_]Feature{}),
324373 };
374 result[@enumToInt(Feature.predictable_select_expensive)] = .{
375 .llvm_name = "predictable-select-expensive",
376 .description = "Prefer likely predicted branches over selects",
377 .dependencies = featureSet(&[_]Feature{}),
378 };
379 result[@enumToInt(Feature.prefix_instrs)] = .{
380 .llvm_name = "prefix-instrs",
381 .description = "Enable prefixed instructions",
382 .dependencies = featureSet(&[_]Feature{
383 .isa_v30_instructions,
384 .power8_vector,
385 .power9_altivec,
386 }),
387 };
325388 result[@enumToInt(Feature.qpx)] = .{
326389 .llvm_name = "qpx",
327390 .description = "Enable QPX instructions",
......@@ -567,6 +630,7 @@ pub const cpu = struct {
567630 .booke,
568631 .icbt,
569632 .isel,
633 .msync,
570634 .spe,
571635 }),
572636 };
......@@ -615,16 +679,21 @@ pub const cpu = struct {
615679 .htm,
616680 .icbt,
617681 .isa_v30_instructions,
682 .isa_v31_instructions,
618683 .isel,
619684 .ldbrx,
620685 .lfiwax,
621686 .mfocrf,
622687 .partword_atomics,
688 .pcrelative_memops,
623689 .popcntd,
690 .power10_vector,
624691 .power8_altivec,
625692 .power8_vector,
626693 .power9_altivec,
627694 .power9_vector,
695 .predictable_select_expensive,
696 .prefix_instrs,
628697 .recipprec,
629698 .stfiwx,
630699 .two_const_nr,
......@@ -724,6 +793,8 @@ pub const cpu = struct {
724793 .frsqrte,
725794 .frsqrtes,
726795 .fsqrt,
796 .fuse_addi_load,
797 .fuse_addis_load,
727798 .htm,
728799 .icbt,
729800 .isel,
......@@ -734,6 +805,51 @@ pub const cpu = struct {
734805 .popcntd,
735806 .power8_altivec,
736807 .power8_vector,
808 .predictable_select_expensive,
809 .recipprec,
810 .stfiwx,
811 .two_const_nr,
812 .vsx,
813 }),
814 };
815 pub const pwr10 = CpuModel{
816 .name = "pwr10",
817 .llvm_name = "pwr10",
818 .features = featureSet(&[_]Feature{
819 .@"64bit",
820 .allow_unaligned_fp_access,
821 .altivec,
822 .bpermd,
823 .cmpb,
824 .crypto,
825 .direct_move,
826 .extdiv,
827 .fcpsgn,
828 .fpcvt,
829 .fprnd,
830 .fre,
831 .fres,
832 .frsqrte,
833 .frsqrtes,
834 .fsqrt,
835 .htm,
836 .icbt,
837 .isa_v30_instructions,
838 .isa_v31_instructions,
839 .isel,
840 .ldbrx,
841 .lfiwax,
842 .mfocrf,
843 .partword_atomics,
844 .pcrelative_memops,
845 .popcntd,
846 .power10_vector,
847 .power8_altivec,
848 .power8_vector,
849 .power9_altivec,
850 .power9_vector,
851 .predictable_select_expensive,
852 .prefix_instrs,
737853 .recipprec,
738854 .stfiwx,
739855 .two_const_nr,
......@@ -885,6 +1001,8 @@ pub const cpu = struct {
8851001 .frsqrte,
8861002 .frsqrtes,
8871003 .fsqrt,
1004 .fuse_addi_load,
1005 .fuse_addis_load,
8881006 .htm,
8891007 .icbt,
8901008 .isel,
......@@ -895,6 +1013,7 @@ pub const cpu = struct {
8951013 .popcntd,
8961014 .power8_altivec,
8971015 .power8_vector,
1016 .predictable_select_expensive,
8981017 .recipprec,
8991018 .stfiwx,
9001019 .two_const_nr,
......@@ -936,6 +1055,7 @@ pub const cpu = struct {
9361055 .power9_vector,
9371056 .ppc_postra_sched,
9381057 .ppc_prera_sched,
1058 .predictable_select_expensive,
9391059 .recipprec,
9401060 .stfiwx,
9411061 .two_const_nr,
lib/std/target/riscv.zig+130-12
......@@ -8,8 +8,21 @@ pub const Feature = enum {
88 c,
99 d,
1010 e,
11 experimental_b,
12 experimental_v,
13 experimental_zbb,
14 experimental_zbc,
15 experimental_zbe,
16 experimental_zbf,
17 experimental_zbm,
18 experimental_zbp,
19 experimental_zbproposedc,
20 experimental_zbr,
21 experimental_zbs,
22 experimental_zbt,
1123 f,
1224 m,
25 no_rvc_hints,
1326 relax,
1427 reserve_x1,
1528 reserve_x10,
......@@ -42,7 +55,7 @@ pub const Feature = enum {
4255 reserve_x7,
4356 reserve_x8,
4457 reserve_x9,
45 rvc_hints,
58 save_restore,
4659};
4760
4861pub usingnamespace CpuFeature.feature_set_fns(Feature);
......@@ -78,6 +91,78 @@ pub const all_features = blk: {
7891 .description = "Implements RV32E (provides 16 rather than 32 GPRs)",
7992 .dependencies = featureSet(&[_]Feature{}),
8093 };
94 result[@enumToInt(Feature.experimental_b)] = .{
95 .llvm_name = "experimental-b",
96 .description = "'B' (Bit Manipulation Instructions)",
97 .dependencies = featureSet(&[_]Feature{
98 .experimental_zbb,
99 .experimental_zbc,
100 .experimental_zbe,
101 .experimental_zbf,
102 .experimental_zbm,
103 .experimental_zbp,
104 .experimental_zbr,
105 .experimental_zbs,
106 .experimental_zbt,
107 }),
108 };
109 result[@enumToInt(Feature.experimental_v)] = .{
110 .llvm_name = "experimental-v",
111 .description = "'V' (Vector Instructions)",
112 .dependencies = featureSet(&[_]Feature{
113 .f,
114 }),
115 };
116 result[@enumToInt(Feature.experimental_zbb)] = .{
117 .llvm_name = "experimental-zbb",
118 .description = "'Zbb' (Base 'B' Instructions)",
119 .dependencies = featureSet(&[_]Feature{}),
120 };
121 result[@enumToInt(Feature.experimental_zbc)] = .{
122 .llvm_name = "experimental-zbc",
123 .description = "'Zbc' (Carry-Less 'B' Instructions)",
124 .dependencies = featureSet(&[_]Feature{}),
125 };
126 result[@enumToInt(Feature.experimental_zbe)] = .{
127 .llvm_name = "experimental-zbe",
128 .description = "'Zbe' (Extract-Deposit 'B' Instructions)",
129 .dependencies = featureSet(&[_]Feature{}),
130 };
131 result[@enumToInt(Feature.experimental_zbf)] = .{
132 .llvm_name = "experimental-zbf",
133 .description = "'Zbf' (Bit-Field 'B' Instructions)",
134 .dependencies = featureSet(&[_]Feature{}),
135 };
136 result[@enumToInt(Feature.experimental_zbm)] = .{
137 .llvm_name = "experimental-zbm",
138 .description = "'Zbm' (Matrix 'B' Instructions)",
139 .dependencies = featureSet(&[_]Feature{}),
140 };
141 result[@enumToInt(Feature.experimental_zbp)] = .{
142 .llvm_name = "experimental-zbp",
143 .description = "'Zbp' (Permutation 'B' Instructions)",
144 .dependencies = featureSet(&[_]Feature{}),
145 };
146 result[@enumToInt(Feature.experimental_zbproposedc)] = .{
147 .llvm_name = "experimental-zbproposedc",
148 .description = "'Zbproposedc' (Proposed Compressed 'B' Instructions)",
149 .dependencies = featureSet(&[_]Feature{}),
150 };
151 result[@enumToInt(Feature.experimental_zbr)] = .{
152 .llvm_name = "experimental-zbr",
153 .description = "'Zbr' (Polynomial Reduction 'B' Instructions)",
154 .dependencies = featureSet(&[_]Feature{}),
155 };
156 result[@enumToInt(Feature.experimental_zbs)] = .{
157 .llvm_name = "experimental-zbs",
158 .description = "'Zbs' (Single-Bit 'B' Instructions)",
159 .dependencies = featureSet(&[_]Feature{}),
160 };
161 result[@enumToInt(Feature.experimental_zbt)] = .{
162 .llvm_name = "experimental-zbt",
163 .description = "'Zbt' (Ternary 'B' Instructions)",
164 .dependencies = featureSet(&[_]Feature{}),
165 };
81166 result[@enumToInt(Feature.f)] = .{
82167 .llvm_name = "f",
83168 .description = "'F' (Single-Precision Floating-Point)",
......@@ -88,6 +173,11 @@ pub const all_features = blk: {
88173 .description = "'M' (Integer Multiplication and Division)",
89174 .dependencies = featureSet(&[_]Feature{}),
90175 };
176 result[@enumToInt(Feature.no_rvc_hints)] = .{
177 .llvm_name = "no-rvc-hints",
178 .description = "Disable RVC Hint Instructions.",
179 .dependencies = featureSet(&[_]Feature{}),
180 };
91181 result[@enumToInt(Feature.relax)] = .{
92182 .llvm_name = "relax",
93183 .description = "Enable Linker relaxation.",
......@@ -248,9 +338,9 @@ pub const all_features = blk: {
248338 .description = "Reserve X9",
249339 .dependencies = featureSet(&[_]Feature{}),
250340 };
251 result[@enumToInt(Feature.rvc_hints)] = .{
252 .llvm_name = "rvc-hints",
253 .description = "Enable RVC Hint Instructions.",
341 result[@enumToInt(Feature.save_restore)] = .{
342 .llvm_name = "save-restore",
343 .description = "Enable save/restore.",
254344 .dependencies = featureSet(&[_]Feature{}),
255345 };
256346 const ti = @typeInfo(Feature);
......@@ -273,7 +363,6 @@ pub const cpu = struct {
273363 .m,
274364 }),
275365 };
276
277366 pub const baseline_rv64 = CpuModel{
278367 .name = "baseline_rv64",
279368 .llvm_name = null,
......@@ -286,20 +375,49 @@ pub const cpu = struct {
286375 .m,
287376 }),
288377 };
289
290378 pub const generic_rv32 = CpuModel{
291379 .name = "generic_rv32",
292 .llvm_name = null,
293 .features = featureSet(&[_]Feature{
294 .rvc_hints,
295 }),
380 .llvm_name = "generic-rv32",
381 .features = featureSet(&[_]Feature{}),
296382 };
297383 pub const generic_rv64 = CpuModel{
298384 .name = "generic_rv64",
299 .llvm_name = null,
385 .llvm_name = "generic-rv64",
300386 .features = featureSet(&[_]Feature{
301387 .@"64bit",
302 .rvc_hints,
388 }),
389 };
390 pub const rocket_rv32 = CpuModel{
391 .name = "rocket_rv32",
392 .llvm_name = "rocket-rv32",
393 .features = featureSet(&[_]Feature{}),
394 };
395 pub const rocket_rv64 = CpuModel{
396 .name = "rocket_rv64",
397 .llvm_name = "rocket-rv64",
398 .features = featureSet(&[_]Feature{
399 .@"64bit",
400 }),
401 };
402 pub const sifive_e31 = CpuModel{
403 .name = "sifive_e31",
404 .llvm_name = "sifive-e31",
405 .features = featureSet(&[_]Feature{
406 .a,
407 .c,
408 .m,
409 }),
410 };
411 pub const sifive_u54 = CpuModel{
412 .name = "sifive_u54",
413 .llvm_name = "sifive-u54",
414 .features = featureSet(&[_]Feature{
415 .@"64bit",
416 .a,
417 .c,
418 .d,
419 .f,
420 .m,
303421 }),
304422 };
305423};
lib/std/target/systemz.zig+6
......@@ -32,6 +32,7 @@ pub const Feature = enum {
3232 population_count,
3333 processor_assist,
3434 reset_reference_bits_multiple,
35 soft_float,
3536 transactional_execution,
3637 vector,
3738 vector_enhancements_1,
......@@ -191,6 +192,11 @@ pub const all_features = blk: {
191192 .description = "Assume that the reset-reference-bits-multiple facility is installed",
192193 .dependencies = featureSet(&[_]Feature{}),
193194 };
195 result[@enumToInt(Feature.soft_float)] = .{
196 .llvm_name = "soft-float",
197 .description = "Use software emulation for floating point",
198 .dependencies = featureSet(&[_]Feature{}),
199 };
194200 result[@enumToInt(Feature.transactional_execution)] = .{
195201 .llvm_name = "transactional-execution",
196202 .description = "Assume that the transactional-execution facility is installed",
lib/std/target/wasm.zig+8
......@@ -9,6 +9,7 @@ pub const Feature = enum {
99 multivalue,
1010 mutable_globals,
1111 nontrapping_fptoint,
12 reference_types,
1213 sign_ext,
1314 simd128,
1415 tail_call,
......@@ -51,6 +52,11 @@ pub const all_features = blk: {
5152 .description = "Enable non-trapping float-to-int conversion operators",
5253 .dependencies = featureSet(&[_]Feature{}),
5354 };
55 result[@enumToInt(Feature.reference_types)] = .{
56 .llvm_name = "reference-types",
57 .description = "Enable reference types",
58 .dependencies = featureSet(&[_]Feature{}),
59 };
5460 result[@enumToInt(Feature.sign_ext)] = .{
5561 .llvm_name = "sign-ext",
5662 .description = "Enable sign extension operators",
......@@ -87,10 +93,12 @@ pub const cpu = struct {
8793 .llvm_name = "bleeding-edge",
8894 .features = featureSet(&[_]Feature{
8995 .atomics,
96 .bulk_memory,
9097 .mutable_globals,
9198 .nontrapping_fptoint,
9299 .sign_ext,
93100 .simd128,
101 .tail_call,
94102 }),
95103 };
96104 pub const generic = CpuModel{
lib/std/target/x86.zig+93-7
......@@ -8,6 +8,9 @@ pub const Feature = enum {
88 @"64bit",
99 adx,
1010 aes,
11 amx_bf16,
12 amx_int8,
13 amx_tile,
1114 avx,
1215 avx2,
1316 avx512bf16,
......@@ -42,6 +45,7 @@ pub const Feature = enum {
4245 false_deps_popcnt,
4346 fast_11bytenop,
4447 fast_15bytenop,
48 fast_7bytenop,
4549 fast_bextr,
4650 fast_gather,
4751 fast_hops,
......@@ -62,6 +66,8 @@ pub const Feature = enum {
6266 invpcid,
6367 lea_sp,
6468 lea_uses_ag,
69 lvi_cfi,
70 lvi_load_hardening,
6571 lwp,
6672 lzcnt,
6773 macrofusion,
......@@ -93,6 +99,8 @@ pub const Feature = enum {
9399 retpoline_indirect_calls,
94100 rtm,
95101 sahf,
102 serialize,
103 seses,
96104 sgx,
97105 sha,
98106 shstk,
......@@ -115,6 +123,7 @@ pub const Feature = enum {
115123 sse4a,
116124 ssse3,
117125 tbm,
126 tsxldtrk,
118127 use_aa,
119128 use_glm_div_sqrt_costs,
120129 vaes,
......@@ -167,6 +176,25 @@ pub const all_features = blk: {
167176 .sse2,
168177 }),
169178 };
179 result[@enumToInt(Feature.amx_bf16)] = .{
180 .llvm_name = "amx-bf16",
181 .description = "Support AMX-BF16 instructions",
182 .dependencies = featureSet(&[_]Feature{
183 .amx_tile,
184 }),
185 };
186 result[@enumToInt(Feature.amx_int8)] = .{
187 .llvm_name = "amx-int8",
188 .description = "Support AMX-INT8 instructions",
189 .dependencies = featureSet(&[_]Feature{
190 .amx_tile,
191 }),
192 };
193 result[@enumToInt(Feature.amx_tile)] = .{
194 .llvm_name = "amx-tile",
195 .description = "Support AMX-TILE instructions",
196 .dependencies = featureSet(&[_]Feature{}),
197 };
170198 result[@enumToInt(Feature.avx)] = .{
171199 .llvm_name = "avx",
172200 .description = "Enable AVX instructions",
......@@ -377,6 +405,11 @@ pub const all_features = blk: {
377405 .description = "Target can quickly decode up to 15 byte NOPs",
378406 .dependencies = featureSet(&[_]Feature{}),
379407 };
408 result[@enumToInt(Feature.fast_7bytenop)] = .{
409 .llvm_name = "fast-7bytenop",
410 .description = "Target can quickly decode up to 7 byte NOPs",
411 .dependencies = featureSet(&[_]Feature{}),
412 };
380413 result[@enumToInt(Feature.fast_bextr)] = .{
381414 .llvm_name = "fast-bextr",
382415 .description = "Indicates that the BEXTR instruction is implemented as a single uop with good throughput",
......@@ -484,6 +517,16 @@ pub const all_features = blk: {
484517 .description = "LEA instruction needs inputs at AG stage",
485518 .dependencies = featureSet(&[_]Feature{}),
486519 };
520 result[@enumToInt(Feature.lvi_cfi)] = .{
521 .llvm_name = "lvi-cfi",
522 .description = "Prevent indirect calls/branches from using a memory operand, and precede all indirect calls/branches from a register with an LFENCE instruction to serialize control flow. Also decompose RET instructions into a POP+LFENCE+JMP sequence.",
523 .dependencies = featureSet(&[_]Feature{}),
524 };
525 result[@enumToInt(Feature.lvi_load_hardening)] = .{
526 .llvm_name = "lvi-load-hardening",
527 .description = "Insert LFENCE instructions to prevent data speculatively injected into loads from being used maliciously.",
528 .dependencies = featureSet(&[_]Feature{}),
529 };
487530 result[@enumToInt(Feature.lwp)] = .{
488531 .llvm_name = "lwp",
489532 .description = "Enable LWP instructions",
......@@ -646,6 +689,18 @@ pub const all_features = blk: {
646689 .description = "Support LAHF and SAHF instructions",
647690 .dependencies = featureSet(&[_]Feature{}),
648691 };
692 result[@enumToInt(Feature.serialize)] = .{
693 .llvm_name = "serialize",
694 .description = "Has serialize instruction",
695 .dependencies = featureSet(&[_]Feature{}),
696 };
697 result[@enumToInt(Feature.seses)] = .{
698 .llvm_name = "seses",
699 .description = "Prevent speculative execution side channel timing attacks by inserting a speculation barrier before memory reads, memory writes, and conditional branches. Implies LVI Control Flow integrity.",
700 .dependencies = featureSet(&[_]Feature{
701 .lvi_cfi,
702 }),
703 };
649704 result[@enumToInt(Feature.sgx)] = .{
650705 .llvm_name = "sgx",
651706 .description = "Enable Software Guard Extensions",
......@@ -770,6 +825,11 @@ pub const all_features = blk: {
770825 .description = "Enable TBM instructions",
771826 .dependencies = featureSet(&[_]Feature{}),
772827 };
828 result[@enumToInt(Feature.tsxldtrk)] = .{
829 .llvm_name = "tsxldtrk",
830 .description = "Support TSXLDTRK instructions",
831 .dependencies = featureSet(&[_]Feature{}),
832 };
773833 result[@enumToInt(Feature.use_aa)] = .{
774834 .llvm_name = "use-aa",
775835 .description = "Use alias analysis during codegen",
......@@ -831,17 +891,23 @@ pub const all_features = blk: {
831891 result[@enumToInt(Feature.xsavec)] = .{
832892 .llvm_name = "xsavec",
833893 .description = "Support xsavec instructions",
834 .dependencies = featureSet(&[_]Feature{}),
894 .dependencies = featureSet(&[_]Feature{
895 .xsave,
896 }),
835897 };
836898 result[@enumToInt(Feature.xsaveopt)] = .{
837899 .llvm_name = "xsaveopt",
838900 .description = "Support xsaveopt instructions",
839 .dependencies = featureSet(&[_]Feature{}),
901 .dependencies = featureSet(&[_]Feature{
902 .xsave,
903 }),
840904 };
841905 result[@enumToInt(Feature.xsaves)] = .{
842906 .llvm_name = "xsaves",
843907 .description = "Support xsaves instructions",
844 .dependencies = featureSet(&[_]Feature{}),
908 .dependencies = featureSet(&[_]Feature{
909 .xsave,
910 }),
845911 };
846912 const ti = @typeInfo(Feature);
847913 for (result) |*elem, i| {
......@@ -866,6 +932,7 @@ pub const cpu = struct {
866932 .lzcnt,
867933 .nopl,
868934 .popcnt,
935 .prfchw,
869936 .sahf,
870937 .slow_shld,
871938 .sse4a,
......@@ -1043,6 +1110,7 @@ pub const cpu = struct {
10431110 .lzcnt,
10441111 .nopl,
10451112 .popcnt,
1113 .prfchw,
10461114 .sahf,
10471115 .slow_shld,
10481116 .sse4a,
......@@ -1169,11 +1237,13 @@ pub const cpu = struct {
11691237 .lwp,
11701238 .lzcnt,
11711239 .mmx,
1240 .movbe,
11721241 .mwaitx,
11731242 .nopl,
11741243 .pclmul,
11751244 .popcnt,
11761245 .prfchw,
1246 .rdrnd,
11771247 .sahf,
11781248 .slow_shld,
11791249 .tbm,
......@@ -1226,6 +1296,7 @@ pub const cpu = struct {
12261296 .f16c,
12271297 .false_deps_lzcnt_tzcnt,
12281298 .false_deps_popcnt,
1299 .fast_15bytenop,
12291300 .fast_scalar_fsqrt,
12301301 .fast_shld_rotate,
12311302 .fast_variable_shuffle,
......@@ -1362,6 +1433,7 @@ pub const cpu = struct {
13621433 .cx8,
13631434 .ermsb,
13641435 .f16c,
1436 .fast_15bytenop,
13651437 .fast_gather,
13661438 .fast_scalar_fsqrt,
13671439 .fast_shld_rotate,
......@@ -1423,6 +1495,7 @@ pub const cpu = struct {
14231495 .ermsb,
14241496 .f16c,
14251497 .false_deps_popcnt,
1498 .fast_15bytenop,
14261499 .fast_gather,
14271500 .fast_scalar_fsqrt,
14281501 .fast_shld_rotate,
......@@ -1483,6 +1556,7 @@ pub const cpu = struct {
14831556 .ermsb,
14841557 .f16c,
14851558 .false_deps_popcnt,
1559 .fast_15bytenop,
14861560 .fast_gather,
14871561 .fast_scalar_fsqrt,
14881562 .fast_shld_rotate,
......@@ -1528,6 +1602,7 @@ pub const cpu = struct {
15281602 .cx8,
15291603 .f16c,
15301604 .false_deps_popcnt,
1605 .fast_15bytenop,
15311606 .fast_scalar_fsqrt,
15321607 .fast_shld_rotate,
15331608 .fsgsbase,
......@@ -1566,6 +1641,7 @@ pub const cpu = struct {
15661641 .f16c,
15671642 .false_deps_lzcnt_tzcnt,
15681643 .false_deps_popcnt,
1644 .fast_15bytenop,
15691645 .fast_scalar_fsqrt,
15701646 .fast_shld_rotate,
15711647 .fast_variable_shuffle,
......@@ -1640,6 +1716,7 @@ pub const cpu = struct {
16401716 .cx16,
16411717 .cx8,
16421718 .false_deps_popcnt,
1719 .fast_15bytenop,
16431720 .fast_scalar_fsqrt,
16441721 .fast_shld_rotate,
16451722 .fxsr,
......@@ -1773,6 +1850,7 @@ pub const cpu = struct {
17731850 .f16c,
17741851 .false_deps_lzcnt_tzcnt,
17751852 .false_deps_popcnt,
1853 .fast_15bytenop,
17761854 .fast_scalar_fsqrt,
17771855 .fast_shld_rotate,
17781856 .fast_variable_shuffle,
......@@ -1867,6 +1945,7 @@ pub const cpu = struct {
18671945 .cx8,
18681946 .ermsb,
18691947 .f16c,
1948 .fast_15bytenop,
18701949 .fast_gather,
18711950 .fast_scalar_fsqrt,
18721951 .fast_shld_rotate,
......@@ -1936,6 +2015,7 @@ pub const cpu = struct {
19362015 .cx8,
19372016 .ermsb,
19382017 .f16c,
2018 .fast_15bytenop,
19392019 .fast_gather,
19402020 .fast_scalar_fsqrt,
19412021 .fast_shld_rotate,
......@@ -1989,6 +2069,7 @@ pub const cpu = struct {
19892069 .cx8,
19902070 .f16c,
19912071 .false_deps_popcnt,
2072 .fast_15bytenop,
19922073 .fast_scalar_fsqrt,
19932074 .fast_shld_rotate,
19942075 .fsgsbase,
......@@ -2414,6 +2495,7 @@ pub const cpu = struct {
24142495 .cx16,
24152496 .cx8,
24162497 .false_deps_popcnt,
2498 .fast_15bytenop,
24172499 .fast_scalar_fsqrt,
24182500 .fast_shld_rotate,
24192501 .fxsr,
......@@ -2443,6 +2525,7 @@ pub const cpu = struct {
24432525 .cx16,
24442526 .cx8,
24452527 .false_deps_popcnt,
2528 .fast_7bytenop,
24462529 .fxsr,
24472530 .idivq_to_divl,
24482531 .mmx,
......@@ -2487,6 +2570,7 @@ pub const cpu = struct {
24872570 .ermsb,
24882571 .f16c,
24892572 .false_deps_popcnt,
2573 .fast_15bytenop,
24902574 .fast_gather,
24912575 .fast_scalar_fsqrt,
24922576 .fast_shld_rotate,
......@@ -2539,6 +2623,7 @@ pub const cpu = struct {
25392623 .ermsb,
25402624 .f16c,
25412625 .false_deps_popcnt,
2626 .fast_15bytenop,
25422627 .fast_gather,
25432628 .fast_scalar_fsqrt,
25442629 .fast_shld_rotate,
......@@ -2596,6 +2681,7 @@ pub const cpu = struct {
25962681 .ermsb,
25972682 .f16c,
25982683 .false_deps_popcnt,
2684 .fast_15bytenop,
25992685 .fast_gather,
26002686 .fast_scalar_fsqrt,
26012687 .fast_shld_rotate,
......@@ -2639,6 +2725,7 @@ pub const cpu = struct {
26392725 .cx16,
26402726 .cx8,
26412727 .false_deps_popcnt,
2728 .fast_7bytenop,
26422729 .fxsr,
26432730 .idivq_to_divl,
26442731 .mmx,
......@@ -2689,6 +2776,7 @@ pub const cpu = struct {
26892776 .cx8,
26902777 .ermsb,
26912778 .f16c,
2779 .fast_15bytenop,
26922780 .fast_gather,
26932781 .fast_scalar_fsqrt,
26942782 .fast_shld_rotate,
......@@ -2738,8 +2826,8 @@ pub const cpu = struct {
27382826 .features = featureSet(&[_]Feature{
27392827 .@"64bit",
27402828 .aes,
2741 .cldemote,
27422829 .clflushopt,
2830 .clwb,
27432831 .cmov,
27442832 .cx16,
27452833 .cx8,
......@@ -2748,8 +2836,6 @@ pub const cpu = struct {
27482836 .gfni,
27492837 .mmx,
27502838 .movbe,
2751 .movdir64b,
2752 .movdiri,
27532839 .nopl,
27542840 .pclmul,
27552841 .popcnt,
......@@ -2768,7 +2854,6 @@ pub const cpu = struct {
27682854 .ssse3,
27692855 .use_glm_div_sqrt_costs,
27702856 .vzeroupper,
2771 .waitpkg,
27722857 .x87,
27732858 .xsave,
27742859 .xsavec,
......@@ -2824,6 +2909,7 @@ pub const cpu = struct {
28242909 .cmov,
28252910 .cx8,
28262911 .fxsr,
2912 .idivq_to_divl,
28272913 .macrofusion,
28282914 .mmx,
28292915 .nopl,