aboutsummaryrefslogtreecommitdiff
path: root/src/exact_value.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-05-13 17:38:35 +0100
committergingerBill <bill@gingerbill.org>2018-05-13 17:38:35 +0100
commite597a8d72eba1241b944fee48c0be4d6203acc4c (patch)
tree0e473696a04bed8cb7cde5a184016d13afbcae65 /src/exact_value.cpp
parentde9a4b516465201c8803ae2a2181c9532be65339 (diff)
Fix issues with exact integer bounds and remove dead code
Diffstat (limited to 'src/exact_value.cpp')
-rw-r--r--src/exact_value.cpp29
1 files changed, 20 insertions, 9 deletions
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) {