From dd2ac10ab9ed9548acb8ffc879e522ea1f47fbbb Mon Sep 17 00:00:00 2001 From: Jared Ramirez Date: Tue, 15 Jun 2021 19:19:03 -0700 Subject: [PATCH] Add RocDec.sub --- .gitignore | 1 + compiler/builtins/bitcode/src/dec.zig | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/.gitignore b/.gitignore index 242dbec6f8..d0ccfa7943 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ vgcore.* #editors .idea/ .vscode/ +.ignore #files too big to track in git editor/benches/resources/100000_lines.roc diff --git a/compiler/builtins/bitcode/src/dec.zig b/compiler/builtins/bitcode/src/dec.zig index 1fdf363910..d194e3e333 100644 --- a/compiler/builtins/bitcode/src/dec.zig +++ b/compiler/builtins/bitcode/src/dec.zig @@ -213,6 +213,17 @@ pub const RocDec = struct { } } + pub fn sub(self: RocDec, other: RocDec) RocDec { + var answer: i128 = undefined; + const overflowed = @subWithOverflow(i128, self.num, other.num, &answer); + + if (!overflowed) { + return RocDec{ .num = answer }; + } else { + std.debug.panic("TODO runtime exception for overflow!", .{}); + } + } + pub fn mul(self: RocDec, other: RocDec) RocDec { const self_i128 = self.num; const other_i128 = other.num; @@ -652,6 +663,18 @@ test "add: 1" { try expectEqual(RocDec{ .num = 1 }, dec.add(.{ .num = 1 })); } +test "sub: 0" { + var dec: RocDec = .{ .num = 1 }; + + try expectEqual(RocDec{ .num = 1 }, dec.sub(.{ .num = 0 })); +} + +test "sub: 1" { + var dec: RocDec = .{ .num = 1 }; + + try expectEqual(RocDec{ .num = 0 }, dec.sub(.{ .num = 1 })); +} + test "mul: by 0" { var dec: RocDec = .{ .num = 0 };