Commit 7f22c41e09

Jacob Young <jacobly0@users.noreply.github.com>
2025-01-03 04:01:13
x86_64: add some ReleaseSmall support
1 parent df7661b
Changed files (1)
src
arch
src/arch/x86_64/CodeGen.zig
@@ -27209,14 +27209,57 @@ fn regExtraBits(self: *CodeGen, ty: Type) u64 {
     return self.regBitSize(ty) - ty.bitSize(self.pt.zcu);
 }
 
-fn hasFeature(self: *CodeGen, feature: std.Target.x86.Feature) bool {
-    return std.Target.x86.featureSetHas(self.target.cpu.features, feature);
-}
-fn hasAnyFeatures(self: *CodeGen, features: anytype) bool {
-    return std.Target.x86.featureSetHasAny(self.target.cpu.features, features);
-}
-fn hasAllFeatures(self: *CodeGen, features: anytype) bool {
-    return std.Target.x86.featureSetHasAll(self.target.cpu.features, features);
+fn hasFeature(cg: *CodeGen, feature: std.Target.x86.Feature) bool {
+    return switch (feature) {
+        .@"64bit" => switch (cg.target.cpu.arch) {
+            else => unreachable,
+            .x86 => false,
+            .x86_64 => true,
+        },
+        .false_deps_getmant,
+        .false_deps_lzcnt_tzcnt,
+        .false_deps_mulc,
+        .false_deps_mullq,
+        .false_deps_perm,
+        .false_deps_popcnt,
+        .false_deps_range,
+        .slow_3ops_lea,
+        .slow_incdec,
+        .slow_lea,
+        .slow_pmaddwd,
+        .slow_pmulld,
+        .slow_shld,
+        .slow_two_mem_ops,
+        .slow_unaligned_mem_16,
+        .slow_unaligned_mem_32,
+        => switch (cg.mod.optimize_mode) {
+            .Debug, .ReleaseSafe, .ReleaseFast => null,
+            .ReleaseSmall => false,
+        },
+        .fast_11bytenop,
+        .fast_15bytenop,
+        .fast_7bytenop,
+        .fast_bextr,
+        .fast_dpwssd,
+        .fast_gather,
+        .fast_hops,
+        .fast_imm16,
+        .fast_lzcnt,
+        .fast_movbe,
+        .fast_scalar_fsqrt,
+        .fast_scalar_shift_masks,
+        .fast_shld_rotate,
+        .fast_variable_crosslane_shuffle,
+        .fast_variable_perlane_shuffle,
+        .fast_vector_fsqrt,
+        .fast_vector_shift_masks,
+        => switch (cg.mod.optimize_mode) {
+            .Debug, .ReleaseSafe, .ReleaseFast => null,
+            .ReleaseSmall => true,
+        },
+        .mmx => false,
+        else => null,
+    } orelse std.Target.x86.featureSetHas(cg.target.cpu.features, feature);
 }
 
 fn typeOf(self: *CodeGen, inst: Air.Inst.Ref) Type {
@@ -29090,15 +29133,7 @@ fn select(
     cases: []const Select.Case,
 ) !void {
     cases: for (cases) |case| {
-        for (case.required_features) |required_feature| if (required_feature) |feature| if (!switch (feature) {
-            .@"64bit" => switch (cg.target.cpu.arch) {
-                else => unreachable,
-                .x86 => false,
-                .x86_64 => true,
-            },
-            .mmx => false,
-            else => cg.hasFeature(feature),
-        }) continue :cases;
+        for (case.required_features) |required_feature| if (required_feature) |feature| if (!cg.hasFeature(feature)) continue :cases;
         for (case.dst_constraints[0..dst_temps.len], dst_tys) |dst_constraint, dst_ty| if (!dst_constraint.accepts(dst_ty, cg)) continue :cases;
         for (case.src_constraints[0..src_temps.len], src_temps) |src_constraint, src_temp| if (!src_constraint.accepts(src_temp.typeOf(cg), cg)) continue :cases;
         if (std.debug.runtime_safety) {