aboutsummaryrefslogtreecommitdiff
path: root/src/value.zig
diff options
context:
space:
mode:
authorkkHAIKE <kkhaike@gmail.com>2022-11-19 04:06:49 +0800
committerGitHub <noreply@github.com>2022-11-18 22:06:49 +0200
commitea590ece4bcc26175d890dd82899ffc9ef64b6c3 (patch)
treeb5d77cc7bbe683e54c9bf2b7d29b4681dc057ba5 /src/value.zig
parent04f3067a7921a51bd55870f3138220fd66426e33 (diff)
downloadzig-ea590ece4bcc26175d890dd82899ffc9ef64b6c3.tar.gz
zig-ea590ece4bcc26175d890dd82899ffc9ef64b6c3.zip
Sema: optimize compare comptime float with int
Diffstat (limited to 'src/value.zig')
-rw-r--r--src/value.zig30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/value.zig b/src/value.zig
index 61d7840e04..042a960b25 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -2081,6 +2081,15 @@ pub const Value = extern union {
op: std.math.CompareOperator,
opt_sema: ?*Sema,
) Module.CompileError!bool {
+ if (lhs.isInf()) {
+ switch (op) {
+ .neq => return true,
+ .eq => return false,
+ .gt, .gte => return !lhs.isNegativeInf(),
+ .lt, .lte => return lhs.isNegativeInf(),
+ }
+ }
+
switch (lhs.tag()) {
.repeated => return lhs.castTag(.repeated).?.data.compareAllWithZeroAdvanced(op, opt_sema),
.aggregate => {
@@ -2089,11 +2098,11 @@ pub const Value = extern union {
}
return true;
},
- .float_16 => if (std.math.isNan(lhs.castTag(.float_16).?.data)) return op != .neq,
- .float_32 => if (std.math.isNan(lhs.castTag(.float_32).?.data)) return op != .neq,
- .float_64 => if (std.math.isNan(lhs.castTag(.float_64).?.data)) return op != .neq,
- .float_80 => if (std.math.isNan(lhs.castTag(.float_80).?.data)) return op != .neq,
- .float_128 => if (std.math.isNan(lhs.castTag(.float_128).?.data)) return op != .neq,
+ .float_16 => if (std.math.isNan(lhs.castTag(.float_16).?.data)) return op == .neq,
+ .float_32 => if (std.math.isNan(lhs.castTag(.float_32).?.data)) return op == .neq,
+ .float_64 => if (std.math.isNan(lhs.castTag(.float_64).?.data)) return op == .neq,
+ .float_80 => if (std.math.isNan(lhs.castTag(.float_80).?.data)) return op == .neq,
+ .float_128 => if (std.math.isNan(lhs.castTag(.float_128).?.data)) return op == .neq,
else => {},
}
return (try orderAgainstZeroAdvanced(lhs, opt_sema)).compare(op);
@@ -3817,6 +3826,17 @@ pub const Value = extern union {
};
}
+ pub fn isNegativeInf(val: Value) bool {
+ return switch (val.tag()) {
+ .float_16 => std.math.isNegativeInf(val.castTag(.float_16).?.data),
+ .float_32 => std.math.isNegativeInf(val.castTag(.float_32).?.data),
+ .float_64 => std.math.isNegativeInf(val.castTag(.float_64).?.data),
+ .float_80 => std.math.isNegativeInf(val.castTag(.float_80).?.data),
+ .float_128 => std.math.isNegativeInf(val.castTag(.float_128).?.data),
+ else => false,
+ };
+ }
+
pub fn floatRem(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, target: Target) !Value {
if (float_type.zigTypeTag() == .Vector) {
const result_data = try arena.alloc(Value, float_type.vectorLen());