From 0341c0f9dd3c03cc4cde1f070f739173f80f852d Mon Sep 17 00:00:00 2001 From: Richard Feldman Date: Sat, 15 May 2021 14:59:16 -0400 Subject: [PATCH] Beginnings of RocDec in Zig --- compiler/builtins/bitcode/src/dec.zig | 58 +++++++++++++++++++++++++++ compiler/builtins/bitcode/src/num.zig | 1 + 2 files changed, 59 insertions(+) create mode 100644 compiler/builtins/bitcode/src/dec.zig diff --git a/compiler/builtins/bitcode/src/dec.zig b/compiler/builtins/bitcode/src/dec.zig new file mode 100644 index 0000000000..99522031d5 --- /dev/null +++ b/compiler/builtins/bitcode/src/dec.zig @@ -0,0 +1,58 @@ +const std = @import("std"); + +pub const RocDec = struct { + num: i128, + + pub fn add(self: RocDec, other: RocDec) RocDec { + var answer: i128 = undefined; + const overflowed = @addWithOverflow(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_i256 = @intCast(i256, self.num); + const other_i256 = @intCast(i256, other.num); + const answer = 0; //self_i256 * other_i256; + + if ((answer >> 192) < 0) { + return RocDec{ .num = 0 }; + // return RocDec{ .num = @intCast(i128, @divTrunc(answer, one_e20)) }; + } else { + return RocDec{ .num = 0 }; + // std.debug.panic("TODO runtime exception for overflow!", .{}); + } + } +}; + +const one_e20: i256 = 100000000000000000000; + +const expectEqual = std.testing.expectEqual; + +test "add" { + expectEqual( + RocDec { .num = 0 }, + (RocDec{ .num = 0 }).add(RocDec{ .num = 0 }) + ); +} + +test "mul" { + expectEqual( + RocDec { .num = 0 }, + (RocDec{ .num = 0 }).mul(RocDec{ .num = 0 }) + ); + + expectEqual( + RocDec { .num = 100000000000000000000 }, + (RocDec{ .num = 100000000000000000000 }).mul(RocDec{ .num = 100000000000000000000 }) + ); + + // expectEqual( + // (RocDec{ .num = 1 }).add(RocDec{ .num = 1 }), + // RocDec { .num = 0 } + // ); +} diff --git a/compiler/builtins/bitcode/src/num.zig b/compiler/builtins/bitcode/src/num.zig index b42aee20ca..4051ae4de4 100644 --- a/compiler/builtins/bitcode/src/num.zig +++ b/compiler/builtins/bitcode/src/num.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const dec = @import("dec"); const always_inline = std.builtin.CallOptions.Modifier.always_inline; const math = std.math;