aboutsummaryrefslogtreecommitdiff
path: root/src/parseTools.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-03-28 17:18:36 -0700
committerAlon Zakai <alonzakai@gmail.com>2012-03-28 17:18:36 -0700
commitc4ed137c4537cc0103f8def5ea25f03cbd3b42d6 (patch)
treeb440279f9703e5df2f0c6f13cd319b148c27dc6d /src/parseTools.js
parent054b2403e959ef760f48a8a501477b675bd90221 (diff)
do not js-optimize away rounding corrections
Diffstat (limited to 'src/parseTools.js')
-rw-r--r--src/parseTools.js3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/parseTools.js b/src/parseTools.js
index 520d278e..0e6ddee8 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -1537,7 +1537,8 @@ function makeRounding(value, bits, signed, floatConversion) {
// TODO: handle roundings of i64s
assert(bits);
// C rounds to 0 (-5.5 to -5, +5.5 to 5), while JS has no direct way to do that.
- if (bits <= 32 && signed) return '((' + value + ')|0)'; // This is fast and even correct, for all cases
+ if (bits <= 32 && signed) return '((' + value + ')&-1)'; // This is fast and even correct, for all cases. Note that it is the same
+ // as |0, but &-1 hints to the js optimizer that this is a rounding correction
// Do Math.floor, which is reasonably fast, if we either don't care, or if we can be sure
// the value is non-negative
if (!correctRoundings() || (!signed && !floatConversion)) return 'Math.floor(' + value + ')';