From e597a8d72eba1241b944fee48c0be4d6203acc4c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 13 May 2018 17:38:35 +0100 Subject: Fix issues with exact integer bounds and remove dead code --- src/exact_value.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'src/exact_value.cpp') diff --git a/src/exact_value.cpp b/src/exact_value.cpp index 49ba5c353..b0513c6eb 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -413,9 +413,10 @@ ExactValue exact_unary_operator_value(TokenKind op, ExactValue v, i32 precision) // NOTE(bill): unsigned integers will be negative and will need to be // limited to the types precision // IMPORTANT NOTE(bill): Max precision is 64 bits as that's how integers are stored - if (0 < precision && precision < 64) { - i = i & ~(-1ll << precision); - } + i = i & unsigned_integer_maxs[precision/8]; + // if (0 < precision && precision < 64) { + // i = i & ~(-1ll << precision); + // } return exact_value_i64(i); } @@ -438,7 +439,7 @@ failure: } // NOTE(bill): Make sure things are evaluated in correct order -i32 exact_value_order(ExactValue v) { +i32 exact_value_order(ExactValue const &v) { switch (v.kind) { case ExactValue_Invalid: return 0; @@ -612,11 +613,21 @@ error:; // NOTE(bill): MSVC accepts this??? apparently you cannot declare variab return empty_exact_value; } -gb_inline ExactValue exact_value_add(ExactValue x, ExactValue y) { return exact_binary_operator_value(Token_Add, x, y); } -gb_inline ExactValue exact_value_sub(ExactValue x, ExactValue y) { return exact_binary_operator_value(Token_Sub, x, y); } -gb_inline ExactValue exact_value_mul(ExactValue x, ExactValue y) { return exact_binary_operator_value(Token_Mul, x, y); } -gb_inline ExactValue exact_value_quo(ExactValue x, ExactValue y) { return exact_binary_operator_value(Token_Quo, x, y); } -gb_inline ExactValue exact_value_shift(TokenKind op, ExactValue x, ExactValue y) { return exact_binary_operator_value(op, x, y); } +gb_inline ExactValue exact_value_add(ExactValue const &x, ExactValue const &y) { + return exact_binary_operator_value(Token_Add, x, y); +} +gb_inline ExactValue exact_value_sub(ExactValue const &x, ExactValue const &y) { + return exact_binary_operator_value(Token_Sub, x, y); +} +gb_inline ExactValue exact_value_mul(ExactValue const &x, ExactValue const &y) { + return exact_binary_operator_value(Token_Mul, x, y); +} +gb_inline ExactValue exact_value_quo(ExactValue const &x, ExactValue const &y) { + return exact_binary_operator_value(Token_Quo, x, y); +} +gb_inline ExactValue exact_value_shift(TokenKind op, ExactValue const &x, ExactValue const &y) { + return exact_binary_operator_value(op, x, y); +} i32 cmp_f64(f64 a, f64 b) { -- cgit v1.2.3