diff --git a/lib/std/target.zig b/lib/std/target.zig index 728d4c4c46..e7cb931c0c 100644 --- a/lib/std/target.zig +++ b/lib/std/target.zig @@ -637,9 +637,28 @@ pub const Target = struct { return x; } + /// Returns true if the specified feature is enabled. pub fn featureSetHas(set: Set, feature: F) bool { return set.isEnabled(@enumToInt(feature)); } + + /// Returns true if any specified feature is enabled. + pub fn featureSetHasAny(set: Set, features: anytype) bool { + comptime std.debug.assert(std.meta.trait.isIndexable(@TypeOf(features))); + inline for (features) |feature| { + if (set.isEnabled(@enumToInt(@as(F, feature)))) return true; + } + return false; + } + + /// Returns true if every specified feature is enabled. + pub fn featureSetHasAll(set: Set, features: anytype) bool { + comptime std.debug.assert(std.meta.trait.isIndexable(@TypeOf(features))); + inline for (features) |feature| { + if (!set.isEnabled(@enumToInt(@as(F, feature)))) return false; + } + return true; + } }; } }; diff --git a/lib/std/zig/cross_target.zig b/lib/std/zig/cross_target.zig index b8af5545dc..b26f416d26 100644 --- a/lib/std/zig/cross_target.zig +++ b/lib/std/zig/cross_target.zig @@ -827,6 +827,11 @@ test "CrossTarget.parse" { std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .cmov)); std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .fxsr)); + std.testing.expect(Target.x86.featureSetHasAny(target.cpu.features, .{ .sse, .avx, .cmov })); + std.testing.expect(!Target.x86.featureSetHasAny(target.cpu.features, .{ .sse, .avx })); + std.testing.expect(Target.x86.featureSetHasAll(target.cpu.features, .{ .mmx, .x87 })); + std.testing.expect(!Target.x86.featureSetHasAll(target.cpu.features, .{ .mmx, .x87, .sse })); + const text = try cross_target.zigTriple(std.testing.allocator); defer std.testing.allocator.free(text); std.testing.expectEqualSlices(u8, "x86_64-linux-gnu", text);