diff options
| author | kkHAIKE <kkhaike@gmail.com> | 2022-11-19 04:06:49 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-18 22:06:49 +0200 |
| commit | ea590ece4bcc26175d890dd82899ffc9ef64b6c3 (patch) | |
| tree | b5d77cc7bbe683e54c9bf2b7d29b4681dc057ba5 /src/value.zig | |
| parent | 04f3067a7921a51bd55870f3138220fd66426e33 (diff) | |
| download | zig-ea590ece4bcc26175d890dd82899ffc9ef64b6c3.tar.gz zig-ea590ece4bcc26175d890dd82899ffc9ef64b6c3.zip | |
Sema: optimize compare comptime float with int
Diffstat (limited to 'src/value.zig')
| -rw-r--r-- | src/value.zig | 30 |
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()); |
