authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-11-14 12:23:09+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-11-14 12:23:09+01:00
logb38fb4bff31b76cbaa27157784139a71e290f2e9
tree5f4d20b92a71e41ac71e8b44b3d4edc5e5359d7d
parent94538d8dd2fbfb8d23c43a813838f2ab5c4a8ad8
parent65b0a2342b4b08c61edaddc07ab01280c3d2b84a
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #25917 from alexrp/target-features

`std.Target`: add CPU features and models for alpha and hppa

5 files changed, 516 insertions(+), 9 deletions(-)

lib/std/Target.zig+7-2
......@@ -704,7 +704,7 @@ pub const Os = struct {
704704};
705705
706706pub const aarch64 = @import("Target/aarch64.zig");
707pub const alpha = @import("Target/generic.zig");
707pub const alpha = @import("Target/alpha.zig");
708708pub const amdgcn = @import("Target/amdgcn.zig");
709709pub const arc = @import("Target/arc.zig");
710710pub const arm = @import("Target/arm.zig");
......@@ -712,7 +712,7 @@ pub const avr = @import("Target/avr.zig");
712712pub const bpf = @import("Target/bpf.zig");
713713pub const csky = @import("Target/csky.zig");
714714pub const hexagon = @import("Target/hexagon.zig");
715pub const hppa = @import("Target/generic.zig");
715pub const hppa = @import("Target/hppa.zig");
716716pub const kalimba = @import("Target/generic.zig");
717717pub const kvx = @import("Target/kvx.zig");
718718pub const lanai = @import("Target/lanai.zig");
......@@ -1950,8 +1950,11 @@ pub const Cpu = struct {
19501950 /// Clang compatibility is important, consider using `baseline` instead.
19511951 pub fn generic(arch: Arch) *const Model {
19521952 return switch (arch) {
1953 .alpha => &alpha.cpu.ev4,
19531954 .amdgcn => &amdgcn.cpu.gfx600,
19541955 .avr => &avr.cpu.avr1,
1956 .hppa => &hppa.cpu.ts_1,
1957 .hppa64 => &hppa.cpu.pa_8000,
19551958 .kvx => &kvx.cpu.coolidge_v1,
19561959 .loongarch32 => &loongarch.cpu.generic_la32,
19571960 .loongarch64 => &loongarch.cpu.generic_la64,
......@@ -1982,6 +1985,7 @@ pub const Cpu = struct {
19821985 /// `Os.Tag.freestanding`.
19831986 pub fn baseline(arch: Arch, os: Os) *const Model {
19841987 return switch (arch) {
1988 .alpha => &alpha.cpu.ev6,
19851989 .amdgcn => &amdgcn.cpu.gfx906,
19861990 .arm => switch (os.tag) {
19871991 .@"3ds" => &arm.cpu.mpcore,
......@@ -2004,6 +2008,7 @@ pub const Cpu = struct {
20042008 .bpfel, .bpfeb => &bpf.cpu.v3,
20052009 .csky => &csky.cpu.ck810, // gcc/clang do not have a generic csky model.
20062010 .hexagon => &hexagon.cpu.hexagonv68, // gcc/clang do not have a generic hexagon model.
2011 .hppa => &hppa.cpu.pa_7300lc,
20072012 .kvx => &kvx.cpu.coolidge_v2,
20082013 .lanai => &lanai.cpu.v11, // clang does not have a generic lanai model.
20092014 .loongarch64 => &loongarch.cpu.la64v1_0,
lib/std/Target/alpha.zig created+101
......@@ -0,0 +1,101 @@
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 bwx,
9 cix,
10 fix,
11 max,
12};
13
14pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
15pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas;
16pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny;
17pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll;
18
19pub const all_features = blk: {
20 const len = @typeInfo(Feature).@"enum".fields.len;
21 std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
22 var result: [len]CpuFeature = undefined;
23 result[@intFromEnum(Feature.bwx)] = .{
24 .llvm_name = null,
25 .description = "Enable byte/word extensions",
26 .dependencies = featureSet(&[_]Feature{}),
27 };
28 result[@intFromEnum(Feature.cix)] = .{
29 .llvm_name = null,
30 .description = "Enable counting extensions",
31 .dependencies = featureSet(&[_]Feature{}),
32 };
33 result[@intFromEnum(Feature.fix)] = .{
34 .llvm_name = null,
35 .description = "Enable floating point move and square root extensions",
36 .dependencies = featureSet(&[_]Feature{}),
37 };
38 result[@intFromEnum(Feature.max)] = .{
39 .llvm_name = null,
40 .description = "Enable motion video extensions",
41 .dependencies = featureSet(&[_]Feature{}),
42 };
43 const ti = @typeInfo(Feature);
44 for (&result, 0..) |*elem, i| {
45 elem.index = i;
46 elem.name = ti.@"enum".fields[i].name;
47 }
48 break :blk result;
49};
50
51pub const cpu = struct {
52 pub const ev4: CpuModel = .{
53 .name = "ev4",
54 .llvm_name = null,
55 .features = featureSet(&[_]Feature{}),
56 };
57 pub const ev45: CpuModel = .{
58 .name = "ev45",
59 .llvm_name = null,
60 .features = featureSet(&[_]Feature{}),
61 };
62 pub const ev5: CpuModel = .{
63 .name = "ev5",
64 .llvm_name = null,
65 .features = featureSet(&[_]Feature{}),
66 };
67 pub const ev56: CpuModel = .{
68 .name = "ev56",
69 .llvm_name = null,
70 .features = featureSet(&[_]Feature{
71 .bwx,
72 }),
73 };
74 pub const ev6: CpuModel = .{
75 .name = "ev6",
76 .llvm_name = null,
77 .features = featureSet(&[_]Feature{
78 .bwx,
79 .fix,
80 .max,
81 }),
82 };
83 pub const ev67: CpuModel = .{
84 .name = "ev67",
85 .llvm_name = null,
86 .features = featureSet(&[_]Feature{
87 .bwx,
88 .cix,
89 .fix,
90 .max,
91 }),
92 };
93 pub const pca56: CpuModel = .{
94 .name = "pca56",
95 .llvm_name = null,
96 .features = featureSet(&[_]Feature{
97 .bwx,
98 .max,
99 }),
100 };
101};
lib/std/Target/hppa.zig created+178
......@@ -0,0 +1,178 @@
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 @"64bit",
9 max_1,
10 max_2,
11 v1_1,
12 v2_0,
13};
14
15pub const featureSet = CpuFeature.FeatureSetFns(Feature).featureSet;
16pub const featureSetHas = CpuFeature.FeatureSetFns(Feature).featureSetHas;
17pub const featureSetHasAny = CpuFeature.FeatureSetFns(Feature).featureSetHasAny;
18pub const featureSetHasAll = CpuFeature.FeatureSetFns(Feature).featureSetHasAll;
19
20pub const all_features = blk: {
21 const len = @typeInfo(Feature).@"enum".fields.len;
22 std.debug.assert(len <= CpuFeature.Set.needed_bit_count);
23 var result: [len]CpuFeature = undefined;
24 result[@intFromEnum(Feature.@"64bit")] = .{
25 .llvm_name = null,
26 .description = "Enable 64-bit PA-RISC 2.0",
27 .dependencies = featureSet(&[_]Feature{
28 .v2_0,
29 }),
30 };
31 result[@intFromEnum(Feature.max_1)] = .{
32 .llvm_name = null,
33 .description = "Enable MAX-1 multimedia acceleration extensions",
34 .dependencies = featureSet(&[_]Feature{}),
35 };
36 result[@intFromEnum(Feature.max_2)] = .{
37 .llvm_name = null,
38 .description = "Enable MAX-2 multimedia acceleration extensions",
39 .dependencies = featureSet(&[_]Feature{
40 .max_1,
41 }),
42 };
43 result[@intFromEnum(Feature.v1_1)] = .{
44 .llvm_name = null,
45 .description = "Enable ISA v1.1",
46 .dependencies = featureSet(&[_]Feature{}),
47 };
48 result[@intFromEnum(Feature.v2_0)] = .{
49 .llvm_name = null,
50 .description = "Enable ISA v2.0",
51 .dependencies = featureSet(&[_]Feature{
52 .max_2,
53 .v1_1,
54 }),
55 };
56 const ti = @typeInfo(Feature);
57 for (&result, 0..) |*elem, i| {
58 elem.index = i;
59 elem.name = ti.@"enum".fields[i].name;
60 }
61 break :blk result;
62};
63
64pub const cpu = struct {
65 pub const ns_1: CpuModel = .{
66 .name = "ns_1",
67 .llvm_name = null,
68 .features = featureSet(&[_]Feature{}),
69 };
70 pub const ns_2: CpuModel = .{
71 .name = "ns_2",
72 .llvm_name = null,
73 .features = featureSet(&[_]Feature{}),
74 };
75 pub const pa_7000: CpuModel = .{
76 .name = "pa_7000",
77 .llvm_name = null,
78 .features = featureSet(&[_]Feature{
79 .v1_1,
80 }),
81 };
82 pub const pa_7100: CpuModel = .{
83 .name = "pa_7100",
84 .llvm_name = null,
85 .features = featureSet(&[_]Feature{
86 .v1_1,
87 }),
88 };
89 pub const pa_7100lc: CpuModel = .{
90 .name = "pa_7100lc",
91 .llvm_name = null,
92 .features = featureSet(&[_]Feature{
93 .max_1,
94 .v1_1,
95 }),
96 };
97 pub const pa_7150: CpuModel = .{
98 .name = "pa_7150",
99 .llvm_name = null,
100 .features = featureSet(&[_]Feature{
101 .v1_1,
102 }),
103 };
104 pub const pa_7200: CpuModel = .{
105 .name = "pa_7200",
106 .llvm_name = null,
107 .features = featureSet(&[_]Feature{
108 .v1_1,
109 }),
110 };
111 pub const pa_7300lc: CpuModel = .{
112 .name = "pa_7300lc",
113 .llvm_name = null,
114 .features = featureSet(&[_]Feature{
115 .max_1,
116 .v1_1,
117 }),
118 };
119 pub const pa_8000: CpuModel = .{
120 .name = "pa_8000",
121 .llvm_name = null,
122 .features = featureSet(&[_]Feature{
123 .@"64bit",
124 }),
125 };
126 pub const pa_8200: CpuModel = .{
127 .name = "pa_8200",
128 .llvm_name = null,
129 .features = featureSet(&[_]Feature{
130 .@"64bit",
131 }),
132 };
133 pub const pa_8500: CpuModel = .{
134 .name = "pa_8500",
135 .llvm_name = null,
136 .features = featureSet(&[_]Feature{
137 .@"64bit",
138 }),
139 };
140 pub const pa_8600: CpuModel = .{
141 .name = "pa_8600",
142 .llvm_name = null,
143 .features = featureSet(&[_]Feature{
144 .@"64bit",
145 }),
146 };
147 pub const pa_8700: CpuModel = .{
148 .name = "pa_8700",
149 .llvm_name = null,
150 .features = featureSet(&[_]Feature{
151 .@"64bit",
152 }),
153 };
154 pub const pa_8800: CpuModel = .{
155 .name = "pa_8800",
156 .llvm_name = null,
157 .features = featureSet(&[_]Feature{
158 .@"64bit",
159 }),
160 };
161 pub const pa_8900: CpuModel = .{
162 .name = "pa_8900",
163 .llvm_name = null,
164 .features = featureSet(&[_]Feature{
165 .@"64bit",
166 }),
167 };
168 pub const pcx: CpuModel = .{
169 .name = "pcx",
170 .llvm_name = null,
171 .features = featureSet(&[_]Feature{}),
172 };
173 pub const ts_1: CpuModel = .{
174 .name = "ts_1",
175 .llvm_name = null,
176 .features = featureSet(&[_]Feature{}),
177 };
178};
lib/std/Target/x86.zig+7-7
......@@ -3081,13 +3081,6 @@ pub const cpu = struct {
30813081 .xsaveopt,
30823082 }),
30833083 };
3084 pub const @"i86": CpuModel = .{
3085 .name = "i86",
3086 .llvm_name = null,
3087 .features = featureSet(&[_]Feature{
3088 .@"16bit_mode",
3089 }),
3090 };
30913084 pub const @"i386": CpuModel = .{
30923085 .name = "i386",
30933086 .llvm_name = "i386",
......@@ -3129,6 +3122,13 @@ pub const cpu = struct {
31293122 .x87,
31303123 }),
31313124 };
3125 pub const @"i86": CpuModel = .{
3126 .name = "i86",
3127 .llvm_name = null,
3128 .features = featureSet(&[_]Feature{
3129 .@"16bit_mode",
3130 }),
3131 };
31323132 pub const icelake_client: CpuModel = .{
31333133 .name = "icelake_client",
31343134 .llvm_name = "icelake-client",
tools/update_cpu_features.zig+223
......@@ -393,6 +393,83 @@ const targets = [_]ArchTarget{
393393 "apple-latest",
394394 },
395395 },
396 .{
397 .zig_name = "alpha",
398 .llvm = null,
399 .extra_features = &.{
400 .{
401 .zig_name = "bwx",
402 .desc = "Enable byte/word extensions",
403 .deps = &.{},
404 },
405 .{
406 .zig_name = "cix",
407 .desc = "Enable counting extensions",
408 .deps = &.{},
409 },
410 .{
411 .zig_name = "fix",
412 .desc = "Enable floating point move and square root extensions",
413 .deps = &.{},
414 },
415 .{
416 .zig_name = "max",
417 .desc = "Enable motion video extensions",
418 .deps = &.{},
419 },
420 },
421 .extra_cpus = &.{
422 .{
423 .llvm_name = null,
424 .zig_name = "ev4",
425 .features = &.{},
426 },
427 .{
428 .llvm_name = null,
429 .zig_name = "ev45",
430 .features = &.{},
431 },
432 .{
433 .llvm_name = null,
434 .zig_name = "ev5",
435 .features = &.{},
436 },
437 .{
438 .llvm_name = null,
439 .zig_name = "ev56",
440 .features = &.{
441 "bwx",
442 },
443 },
444 .{
445 .llvm_name = null,
446 .zig_name = "pca56",
447 .features = &.{
448 "bwx",
449 "max",
450 },
451 },
452 .{
453 .llvm_name = null,
454 .zig_name = "ev6",
455 .features = &.{
456 "bwx",
457 "fix",
458 "max",
459 },
460 },
461 .{
462 .llvm_name = null,
463 .zig_name = "ev67",
464 .features = &.{
465 "bwx",
466 "cix",
467 "fix",
468 "max",
469 },
470 },
471 },
472 },
396473 .{
397474 .zig_name = "amdgcn",
398475 .llvm = .{
......@@ -973,6 +1050,152 @@ const targets = [_]ArchTarget{
9731050 .td_name = "Hexagon",
9741051 },
9751052 },
1053 .{
1054 .zig_name = "hppa",
1055 .llvm = null,
1056 .extra_features = &.{
1057 .{
1058 .zig_name = "64bit",
1059 .desc = "Enable 64-bit PA-RISC 2.0",
1060 .deps = &.{"v2_0"},
1061 },
1062 .{
1063 .zig_name = "max_1",
1064 .desc = "Enable MAX-1 multimedia acceleration extensions",
1065 .deps = &.{},
1066 },
1067 .{
1068 .zig_name = "max_2",
1069 .desc = "Enable MAX-2 multimedia acceleration extensions",
1070 .deps = &.{"max_1"},
1071 },
1072 .{
1073 .zig_name = "v1_1",
1074 .desc = "Enable ISA v1.1",
1075 .deps = &.{},
1076 },
1077 .{
1078 .zig_name = "v2_0",
1079 .desc = "Enable ISA v2.0",
1080 .deps = &.{ "max_2", "v1_1" },
1081 },
1082 },
1083 .extra_cpus = &.{
1084 .{
1085 .llvm_name = null,
1086 .zig_name = "ts_1",
1087 .features = &.{},
1088 },
1089 .{
1090 .llvm_name = null,
1091 .zig_name = "ns_1",
1092 .features = &.{},
1093 },
1094 .{
1095 .llvm_name = null,
1096 .zig_name = "ns_2",
1097 .features = &.{},
1098 },
1099 .{
1100 .llvm_name = null,
1101 .zig_name = "pcx",
1102 .features = &.{},
1103 },
1104 .{
1105 .llvm_name = null,
1106 .zig_name = "pa_7000",
1107 .features = &.{
1108 "v1_1",
1109 },
1110 },
1111 .{
1112 .llvm_name = null,
1113 .zig_name = "pa_7100",
1114 .features = &.{
1115 "v1_1",
1116 },
1117 },
1118 .{
1119 .llvm_name = null,
1120 .zig_name = "pa_7150",
1121 .features = &.{
1122 "v1_1",
1123 },
1124 },
1125 .{
1126 .llvm_name = null,
1127 .zig_name = "pa_7100lc",
1128 .features = &.{
1129 "max_1",
1130 "v1_1",
1131 },
1132 },
1133 .{
1134 .llvm_name = null,
1135 .zig_name = "pa_7200",
1136 .features = &.{
1137 "v1_1",
1138 },
1139 },
1140 .{
1141 .llvm_name = null,
1142 .zig_name = "pa_7300lc",
1143 .features = &.{
1144 "max_1",
1145 "v1_1",
1146 },
1147 },
1148 .{
1149 .llvm_name = null,
1150 .zig_name = "pa_8000",
1151 .features = &.{
1152 "64bit",
1153 },
1154 },
1155 .{
1156 .llvm_name = null,
1157 .zig_name = "pa_8200",
1158 .features = &.{
1159 "64bit",
1160 },
1161 },
1162 .{
1163 .llvm_name = null,
1164 .zig_name = "pa_8500",
1165 .features = &.{
1166 "64bit",
1167 },
1168 },
1169 .{
1170 .llvm_name = null,
1171 .zig_name = "pa_8600",
1172 .features = &.{
1173 "64bit",
1174 },
1175 },
1176 .{
1177 .llvm_name = null,
1178 .zig_name = "pa_8700",
1179 .features = &.{
1180 "64bit",
1181 },
1182 },
1183 .{
1184 .llvm_name = null,
1185 .zig_name = "pa_8800",
1186 .features = &.{
1187 "64bit",
1188 },
1189 },
1190 .{
1191 .llvm_name = null,
1192 .zig_name = "pa_8900",
1193 .features = &.{
1194 "64bit",
1195 },
1196 },
1197 },
1198 },
9761199 .{
9771200 .zig_name = "kvx",
9781201 .llvm = null,