authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-20 05:16:33+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-10-20 05:37:12+02:00
logb0ce4f0996e24ad62501be325da7e402bcb3498e
tree60b4e81ece5025e3a3c959ceee5cdcd3b1f181fb
parent4df60441652914d3228bbd1dc3c05f64b8c16191
signature Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

update_cpu_features: omit more optional arm features

Both on models and architecture levels this time. As part of this, I removed neon from the baseline model because that isn't actually part of the ARMv7 baseline on any platform I'm aware of, and it made our baseline binaries not work on some real boards, e.g. Tegra 2. We keep vfp3d16 since virtually every ARMv7 board has VFP. To not regress PlayStation Vita performance, I also added a kermit model with neon enabled. This was necessary since vortex_a9 lost all NEON/VFP features by default.

3 files changed, 171 insertions(+), 25 deletions(-)

lib/std/Target.zig+2-2
......@@ -2090,12 +2090,12 @@ pub const Cpu = struct {
20902090 .amdgcn => &amdgcn.cpu.gfx906,
20912091 .arm => switch (os.tag) {
20922092 .@"3ds" => &arm.cpu.mpcore,
2093 .vita => &arm.cpu.cortex_a9,
2093 .vita => &arm.cpu.kermit,
20942094 .gba => &arm.cpu.arm7tdmi,
20952095 else => &arm.cpu.baseline,
20962096 },
20972097 .thumb => switch (os.tag) {
2098 .vita => &arm.cpu.cortex_a9,
2098 .vita => &arm.cpu.kermit,
20992099 .gba => &arm.cpu.arm7tdmi,
21002100 else => &arm.cpu.baseline,
21012101 },
lib/std/Target/arm.zig+35-22
......@@ -1200,7 +1200,6 @@ pub const all_features = blk: {
12001200 .db,
12011201 .dsp,
12021202 .has_v7,
1203 .neon,
12041203 .perfmon,
12051204 }),
12061205 };
......@@ -1250,7 +1249,6 @@ pub const all_features = blk: {
12501249 .dsp,
12511250 .has_v7,
12521251 .mp,
1253 .neon,
12541252 .perfmon,
12551253 .trustzone,
12561254 .virtualization,
......@@ -1262,12 +1260,12 @@ pub const all_features = blk: {
12621260 .dependencies = featureSet(&[_]Feature{
12631261 .aclass,
12641262 .crc,
1265 .crypto,
12661263 .db,
12671264 .dsp,
12681265 .fp_armv8,
12691266 .has_v8_1a,
12701267 .mp,
1268 .neon,
12711269 .trustzone,
12721270 .virtualization,
12731271 }),
......@@ -1276,7 +1274,6 @@ pub const all_features = blk: {
12761274 .llvm_name = "armv8.1-m.main",
12771275 .description = "ARMv81mMainline architecture",
12781276 .dependencies = featureSet(&[_]Feature{
1279 .@"8msecext",
12801277 .acquire_release,
12811278 .db,
12821279 .has_v8_1m_main,
......@@ -1294,12 +1291,12 @@ pub const all_features = blk: {
12941291 .dependencies = featureSet(&[_]Feature{
12951292 .aclass,
12961293 .crc,
1297 .crypto,
12981294 .db,
12991295 .dsp,
13001296 .fp_armv8,
13011297 .has_v8_2a,
13021298 .mp,
1299 .neon,
13031300 .ras,
13041301 .trustzone,
13051302 .virtualization,
......@@ -1311,12 +1308,12 @@ pub const all_features = blk: {
13111308 .dependencies = featureSet(&[_]Feature{
13121309 .aclass,
13131310 .crc,
1314 .crypto,
13151311 .db,
13161312 .dsp,
13171313 .fp_armv8,
13181314 .has_v8_3a,
13191315 .mp,
1316 .neon,
13201317 .ras,
13211318 .trustzone,
13221319 .virtualization,
......@@ -1328,7 +1325,6 @@ pub const all_features = blk: {
13281325 .dependencies = featureSet(&[_]Feature{
13291326 .aclass,
13301327 .crc,
1331 .crypto,
13321328 .db,
13331329 .dsp,
13341330 .fp_armv8,
......@@ -1345,7 +1341,6 @@ pub const all_features = blk: {
13451341 .dependencies = featureSet(&[_]Feature{
13461342 .aclass,
13471343 .crc,
1348 .crypto,
13491344 .db,
13501345 .dsp,
13511346 .fp_armv8,
......@@ -1362,7 +1357,6 @@ pub const all_features = blk: {
13621357 .dependencies = featureSet(&[_]Feature{
13631358 .aclass,
13641359 .crc,
1365 .crypto,
13661360 .db,
13671361 .dsp,
13681362 .fp_armv8,
......@@ -1379,7 +1373,6 @@ pub const all_features = blk: {
13791373 .dependencies = featureSet(&[_]Feature{
13801374 .aclass,
13811375 .crc,
1382 .crypto,
13831376 .db,
13841377 .dsp,
13851378 .fp_armv8,
......@@ -1396,7 +1389,6 @@ pub const all_features = blk: {
13961389 .dependencies = featureSet(&[_]Feature{
13971390 .aclass,
13981391 .crc,
1399 .crypto,
14001392 .db,
14011393 .dsp,
14021394 .fp_armv8,
......@@ -1413,7 +1405,6 @@ pub const all_features = blk: {
14131405 .dependencies = featureSet(&[_]Feature{
14141406 .aclass,
14151407 .crc,
1416 .crypto,
14171408 .db,
14181409 .dsp,
14191410 .fp_armv8,
......@@ -1430,12 +1421,12 @@ pub const all_features = blk: {
14301421 .dependencies = featureSet(&[_]Feature{
14311422 .aclass,
14321423 .crc,
1433 .crypto,
14341424 .db,
14351425 .dsp,
14361426 .fp_armv8,
14371427 .has_v8,
14381428 .mp,
1429 .neon,
14391430 .trustzone,
14401431 .virtualization,
14411432 }),
......@@ -1444,7 +1435,6 @@ pub const all_features = blk: {
14441435 .llvm_name = "armv8-m.base",
14451436 .description = "ARMv8mBaseline architecture",
14461437 .dependencies = featureSet(&[_]Feature{
1447 .@"8msecext",
14481438 .acquire_release,
14491439 .db,
14501440 .has_v7clrex,
......@@ -1460,7 +1450,6 @@ pub const all_features = blk: {
14601450 .llvm_name = "armv8-m.main",
14611451 .description = "ARMv8mMainline architecture",
14621452 .dependencies = featureSet(&[_]Feature{
1463 .@"8msecext",
14641453 .acquire_release,
14651454 .db,
14661455 .has_v8m_main,
......@@ -1523,7 +1512,6 @@ pub const all_features = blk: {
15231512 .dependencies = featureSet(&[_]Feature{
15241513 .aclass,
15251514 .crc,
1526 .crypto,
15271515 .db,
15281516 .dsp,
15291517 .fp_armv8,
......@@ -1949,6 +1937,7 @@ pub const cpu = struct {
19491937 .llvm_name = "generic",
19501938 .features = featureSet(&[_]Feature{
19511939 .v7a,
1940 .vfp3d16,
19521941 }),
19531942 };
19541943 pub const cortex_a12: CpuModel = .{
......@@ -1960,7 +1949,6 @@ pub const cpu = struct {
19601949 .ret_addr_stack,
19611950 .trustzone,
19621951 .v7a,
1963 .vfp4,
19641952 .virtualization,
19651953 .vmlx_forwarding,
19661954 }),
......@@ -1976,7 +1964,6 @@ pub const cpu = struct {
19761964 .splat_vfp_neon,
19771965 .trustzone,
19781966 .v7a,
1979 .vfp4,
19801967 .virtualization,
19811968 .vldn_align,
19821969 }),
......@@ -1990,7 +1977,6 @@ pub const cpu = struct {
19901977 .ret_addr_stack,
19911978 .trustzone,
19921979 .v7a,
1993 .vfp4,
19941980 .virtualization,
19951981 .vmlx_forwarding,
19961982 }),
......@@ -2020,7 +2006,6 @@ pub const cpu = struct {
20202006 .slowfpvmlx,
20212007 .trustzone,
20222008 .v7a,
2023 .vfp4,
20242009 .vmlx_forwarding,
20252010 }),
20262011 };
......@@ -2072,7 +2057,6 @@ pub const cpu = struct {
20722057 .slowfpvmlx,
20732058 .trustzone,
20742059 .v7a,
2075 .vfp4,
20762060 .virtualization,
20772061 .vmlx_forwarding,
20782062 .vmlx_hazards,
......@@ -2186,7 +2170,6 @@ pub const cpu = struct {
21862170 .features = featureSet(&[_]Feature{
21872171 .avoid_partial_cpsr,
21882172 .expand_fp_mlx,
2189 .fp16,
21902173 .mp,
21912174 .muxed_units,
21922175 .neon_fpmovs,
......@@ -2322,6 +2305,7 @@ pub const cpu = struct {
23222305 .name = "cortex_m85",
23232306 .llvm_name = "cortex-m85",
23242307 .features = featureSet(&[_]Feature{
2308 .@"8msecext",
23252309 .branch_align_64,
23262310 .dsp,
23272311 .m85,
......@@ -2434,6 +2418,7 @@ pub const cpu = struct {
24342418 .features = featureSet(&[_]Feature{
24352419 .avoid_movs_shop,
24362420 .avoid_partial_cpsr,
2421 .crypto,
24372422 .disable_postra_scheduler,
24382423 .neonfp,
24392424 .ret_addr_stack,
......@@ -2455,6 +2440,7 @@ pub const cpu = struct {
24552440 .name = "exynos_m1",
24562441 .llvm_name = null,
24572442 .features = featureSet(&[_]Feature{
2443 .crypto,
24582444 .expand_fp_mlx,
24592445 .fuse_aes,
24602446 .fuse_literals,
......@@ -2475,6 +2461,7 @@ pub const cpu = struct {
24752461 .name = "exynos_m2",
24762462 .llvm_name = null,
24772463 .features = featureSet(&[_]Feature{
2464 .crypto,
24782465 .expand_fp_mlx,
24792466 .fuse_aes,
24802467 .fuse_literals,
......@@ -2495,6 +2482,7 @@ pub const cpu = struct {
24952482 .name = "exynos_m3",
24962483 .llvm_name = "exynos-m3",
24972484 .features = featureSet(&[_]Feature{
2485 .crypto,
24982486 .expand_fp_mlx,
24992487 .fuse_aes,
25002488 .fuse_literals,
......@@ -2515,6 +2503,7 @@ pub const cpu = struct {
25152503 .name = "exynos_m4",
25162504 .llvm_name = "exynos-m4",
25172505 .features = featureSet(&[_]Feature{
2506 .crypto,
25182507 .dotprod,
25192508 .expand_fp_mlx,
25202509 .fullfp16,
......@@ -2537,6 +2526,7 @@ pub const cpu = struct {
25372526 .name = "exynos_m5",
25382527 .llvm_name = "exynos-m5",
25392528 .features = featureSet(&[_]Feature{
2529 .crypto,
25402530 .dotprod,
25412531 .expand_fp_mlx,
25422532 .fullfp16,
......@@ -2567,6 +2557,26 @@ pub const cpu = struct {
25672557 .v5te,
25682558 }),
25692559 };
2560 pub const kermit: CpuModel = .{
2561 .name = "kermit",
2562 .llvm_name = "cortex-a9",
2563 .features = featureSet(&[_]Feature{
2564 .avoid_partial_cpsr,
2565 .expand_fp_mlx,
2566 .fp16,
2567 .mp,
2568 .muxed_units,
2569 .neon,
2570 .neon_fpmovs,
2571 .prefer_vmovsr,
2572 .ret_addr_stack,
2573 .trustzone,
2574 .v7a,
2575 .vldn_align,
2576 .vmlx_forwarding,
2577 .vmlx_hazards,
2578 }),
2579 };
25702580 pub const krait: CpuModel = .{
25712581 .name = "krait",
25722582 .llvm_name = "krait",
......@@ -2575,6 +2585,7 @@ pub const cpu = struct {
25752585 .hwdiv,
25762586 .hwdiv_arm,
25772587 .muxed_units,
2588 .neon,
25782589 .ret_addr_stack,
25792590 .v7a,
25802591 .vfp4,
......@@ -2586,6 +2597,7 @@ pub const cpu = struct {
25862597 .name = "kryo",
25872598 .llvm_name = "kryo",
25882599 .features = featureSet(&[_]Feature{
2600 .crypto,
25892601 .v8a,
25902602 }),
25912603 };
......@@ -2715,6 +2727,7 @@ pub const cpu = struct {
27152727 .hwdiv,
27162728 .hwdiv_arm,
27172729 .mp,
2730 .neon,
27182731 .neonfp,
27192732 .prefer_ishst,
27202733 .prof_unpr,
tools/update_cpu_features.zig+134-1
......@@ -843,6 +843,7 @@ const targets = [_]ArchTarget{
843843 .{
844844 .llvm_name = "armv7-a",
845845 .zig_name = "v7a",
846 .omit_deps = &.{"neon"},
846847 },
847848 .{
848849 .llvm_name = "armv7-m",
......@@ -867,58 +868,72 @@ const targets = [_]ArchTarget{
867868 .{
868869 .llvm_name = "armv7ve",
869870 .zig_name = "v7ve",
871 .omit_deps = &.{"neon"},
870872 },
871873 .{
872874 .llvm_name = "armv8.1-a",
873875 .zig_name = "v8_1a",
876 .omit_deps = &.{"crypto"},
874877 },
875878 .{
876879 .llvm_name = "armv8.1-m.main",
877880 .zig_name = "v8_1m_main",
881 .omit_deps = &.{"8msecext"},
878882 },
879883 .{
880884 .llvm_name = "armv8.2-a",
881885 .zig_name = "v8_2a",
886 .omit_deps = &.{"crypto"},
882887 },
883888 .{
884889 .llvm_name = "armv8.3-a",
885890 .zig_name = "v8_3a",
891 .omit_deps = &.{"crypto"},
886892 },
887893 .{
888894 .llvm_name = "armv8.4-a",
889895 .zig_name = "v8_4a",
896 .omit_deps = &.{"crypto"},
890897 },
891898 .{
892899 .llvm_name = "armv8.5-a",
893900 .zig_name = "v8_5a",
901 .omit_deps = &.{"crypto"},
894902 },
895903 .{
896904 .llvm_name = "armv8.6-a",
897905 .zig_name = "v8_6a",
906 .omit_deps = &.{"crypto"},
898907 },
899908 .{
900909 .llvm_name = "armv8.7-a",
901910 .zig_name = "v8_7a",
911 .omit_deps = &.{"crypto"},
902912 },
903913 .{
904914 .llvm_name = "armv8.8-a",
905915 .zig_name = "v8_8a",
916 .omit_deps = &.{"crypto"},
906917 },
907918 .{
908919 .llvm_name = "armv8.9-a",
909920 .zig_name = "v8_9a",
921 .omit_deps = &.{"crypto"},
910922 },
911923 .{
912924 .llvm_name = "armv8-a",
913925 .zig_name = "v8a",
926 .omit_deps = &.{"crypto"},
914927 },
915928 .{
916929 .llvm_name = "armv8-m.base",
917930 .zig_name = "v8m",
931 .omit_deps = &.{"8msecext"},
918932 },
919933 .{
920934 .llvm_name = "armv8-m.main",
921935 .zig_name = "v8m_main",
936 .omit_deps = &.{"8msecext"},
922937 },
923938 .{
924939 .llvm_name = "armv8-r",
......@@ -935,6 +950,7 @@ const targets = [_]ArchTarget{
935950 .{
936951 .llvm_name = "armv9.3-a",
937952 .zig_name = "v9_3a",
953 .omit_deps = &.{"crypto"},
938954 },
939955 .{
940956 .llvm_name = "armv9.4-a",
......@@ -1101,6 +1117,78 @@ const targets = [_]ArchTarget{
11011117 },
11021118 },
11031119 .model_overrides = &.{
1120 .{
1121 .llvm_name = "cortex-a5",
1122 .omit_deps = &.{"vfp4"},
1123 },
1124 .{
1125 .llvm_name = "cortex-a7",
1126 .omit_deps = &.{"vfp4"},
1127 },
1128 .{
1129 .llvm_name = "cortex-a9",
1130 .omit_deps = &.{"fp16"},
1131 },
1132 .{
1133 .llvm_name = "cortex-a12",
1134 .omit_deps = &.{"vfp4"},
1135 },
1136 .{
1137 .llvm_name = "cortex-a15",
1138 .omit_deps = &.{"vfp4"},
1139 },
1140 .{
1141 .llvm_name = "cortex-a17",
1142 .omit_deps = &.{"vfp4"},
1143 },
1144 .{
1145 .llvm_name = "cortex-a32",
1146 .omit_deps = &.{"crypto"},
1147 },
1148 .{
1149 .llvm_name = "cortex-a35",
1150 .omit_deps = &.{"crypto"},
1151 },
1152 .{
1153 .llvm_name = "cortex-a53",
1154 .omit_deps = &.{"crypto"},
1155 },
1156 .{
1157 .llvm_name = "cortex-a57",
1158 .omit_deps = &.{"crypto"},
1159 },
1160 .{
1161 .llvm_name = "cortex-a72",
1162 .omit_deps = &.{"crypto"},
1163 },
1164 .{
1165 .llvm_name = "cortex-a73",
1166 .omit_deps = &.{"crypto"},
1167 },
1168 .{
1169 .llvm_name = "cortex-a76",
1170 .omit_deps = &.{"crypto"},
1171 },
1172 .{
1173 .llvm_name = "cortex-a76ae",
1174 .omit_deps = &.{"crypto"},
1175 },
1176 .{
1177 .llvm_name = "cortex-a77",
1178 .omit_deps = &.{"crypto"},
1179 },
1180 .{
1181 .llvm_name = "cortex-a78",
1182 .omit_deps = &.{"crypto"},
1183 },
1184 .{
1185 .llvm_name = "cortex-a78ae",
1186 .omit_deps = &.{"crypto"},
1187 },
1188 .{
1189 .llvm_name = "cortex-a78c",
1190 .omit_deps = &.{"crypto"},
1191 },
11041192 .{
11051193 .llvm_name = "cortex-m4",
11061194 .omit_deps = &.{"vfp4d16sp"},
......@@ -1127,6 +1215,7 @@ const targets = [_]ArchTarget{
11271215 },
11281216 .{
11291217 .llvm_name = "cortex-m85",
1218 .extra_deps = &.{"8msecext"},
11301219 .omit_deps = &.{ "fp_armv8d16", "mve_fp", "pacbti" },
11311220 },
11321221 .{
......@@ -1149,6 +1238,26 @@ const targets = [_]ArchTarget{
11491238 .llvm_name = "cortex-r52plus",
11501239 .omit_deps = &.{ "fp_armv8", "neon" },
11511240 },
1241 .{
1242 .llvm_name = "cortex-x1",
1243 .omit_deps = &.{"crypto"},
1244 },
1245 .{
1246 .llvm_name = "cortex-x1c",
1247 .omit_deps = &.{"crypto"},
1248 },
1249 .{
1250 .llvm_name = "krait",
1251 .extra_deps = &.{"neon"},
1252 },
1253 .{
1254 .llvm_name = "neoverse-n1",
1255 .omit_deps = &.{"crypto"},
1256 },
1257 .{
1258 .llvm_name = "neoverse-v1",
1259 .omit_deps = &.{"crypto"},
1260 },
11521261 .{
11531262 .llvm_name = "star-mc1",
11541263 .omit_deps = &.{ "dsp", "fp_armv8d16sp" },
......@@ -1157,12 +1266,16 @@ const targets = [_]ArchTarget{
11571266 .llvm_name = "star-mc3",
11581267 .omit_deps = &.{ "fp_armv8d16", "mve_fp", "pacbti" },
11591268 },
1269 .{
1270 .llvm_name = "swift",
1271 .extra_deps = &.{"neon"},
1272 },
11601273 },
11611274 .extra_models = &.{
11621275 .{
11631276 .llvm_name = "generic",
11641277 .zig_name = "baseline",
1165 .features = &.{"v7a"},
1278 .features = &.{ "v7a", "vfp3d16" },
11661279 },
11671280 .{
11681281 .llvm_name = null,
......@@ -1174,6 +1287,26 @@ const targets = [_]ArchTarget{
11741287 .zig_name = "exynos_m2",
11751288 .features = &.{ "v8a", "exynos" },
11761289 },
1290 .{
1291 .llvm_name = "cortex-a9",
1292 .zig_name = "kermit",
1293 .features = &.{
1294 "avoid_partial_cpsr",
1295 "expand_fp_mlx",
1296 "fp16",
1297 "mp",
1298 "muxed_units",
1299 "neon",
1300 "neon_fpmovs",
1301 "prefer_vmovsr",
1302 "ret_addr_stack",
1303 "trustzone",
1304 "v7a",
1305 "vldn_align",
1306 "vmlx_forwarding",
1307 "vmlx_hazards",
1308 },
1309 },
11771310 },
11781311 },
11791312 .{