summaryrefslogtreecommitdiff
path: root/src/support/safe_integer.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-03-28 13:42:53 -0700
committerAlon Zakai <alonzakai@gmail.com>2016-03-28 13:42:53 -0700
commit68e15c423d92dd69138702cc572e503a33b31782 (patch)
tree2fa2e2d23ebc062d7d848e877316ddeb8583a61f /src/support/safe_integer.cpp
parentb8d01b47e5f53a92cd5db528d1939462f919d5f6 (diff)
parente34634c2448d0de88284ec01356e8cb98af54ada (diff)
downloadbinaryen-68e15c423d92dd69138702cc572e503a33b31782.tar.gz
binaryen-68e15c423d92dd69138702cc572e503a33b31782.tar.bz2
binaryen-68e15c423d92dd69138702cc572e503a33b31782.zip
Merge pull request #284 from WebAssembly/tighten-safe-int
Tighten safe integer
Diffstat (limited to 'src/support/safe_integer.cpp')
-rw-r--r--src/support/safe_integer.cpp34
1 files changed, 18 insertions, 16 deletions
diff --git a/src/support/safe_integer.cpp b/src/support/safe_integer.cpp
index 191296e1e..bce2cbc39 100644
--- a/src/support/safe_integer.cpp
+++ b/src/support/safe_integer.cpp
@@ -25,7 +25,8 @@ using namespace wasm;
bool wasm::isInteger(double x) { return fmod(x, 1) == 0; }
bool wasm::isUInteger32(double x) {
- return isInteger(x) && x >= 0 && x <= std::numeric_limits<uint32_t>::max();
+ return !std::signbit(x) && isInteger(x) &&
+ x <= std::numeric_limits<uint32_t>::max();
}
bool wasm::isSInteger32(double x) {
@@ -34,21 +35,22 @@ bool wasm::isSInteger32(double x) {
}
uint32_t wasm::toUInteger32(double x) {
- return x < std::numeric_limits<uint32_t>::max()
- ? x
- : std::numeric_limits<uint32_t>::max();
+ return std::signbit(x) ? 0 : (x < std::numeric_limits<uint32_t>::max()
+ ? x
+ : std::numeric_limits<uint32_t>::max());
}
int32_t wasm::toSInteger32(double x) {
- return x > std::numeric_limits<int32_t>::min() &&
- x < std::numeric_limits<int32_t>::max()
+ return (x > std::numeric_limits<int32_t>::min() &&
+ x < std::numeric_limits<int32_t>::max())
? x
- : (x < 0 ? std::numeric_limits<int32_t>::min()
- : std::numeric_limits<int32_t>::max());
+ : (std::signbit(x) ? std::numeric_limits<int32_t>::min()
+ : std::numeric_limits<int32_t>::max());
}
bool wasm::isUInteger64(double x) {
- return isInteger(x) && x >= 0 && x <= std::numeric_limits<uint64_t>::max();
+ return !std::signbit(x) && isInteger(x) &&
+ x <= std::numeric_limits<uint64_t>::max();
}
bool wasm::isSInteger64(double x) {
@@ -57,15 +59,15 @@ bool wasm::isSInteger64(double x) {
}
uint64_t wasm::toUInteger64(double x) {
- return x < (double)std::numeric_limits<uint64_t>::max()
- ? (uint64_t)x
- : std::numeric_limits<uint64_t>::max();
+ return std::signbit(x) ? 0 : (x < (double)std::numeric_limits<uint64_t>::max()
+ ? (uint64_t)x
+ : std::numeric_limits<uint64_t>::max());
}
int64_t wasm::toSInteger64(double x) {
- return x > (double)std::numeric_limits<int64_t>::min() &&
- x < (double)std::numeric_limits<int64_t>::max()
+ return (x > (double)std::numeric_limits<int64_t>::min() &&
+ x < (double)std::numeric_limits<int64_t>::max())
? (int64_t)x
- : (x < 0 ? std::numeric_limits<int64_t>::min()
- : std::numeric_limits<int64_t>::max());
+ : (std::signbit(x) ? std::numeric_limits<int64_t>::min()
+ : std::numeric_limits<int64_t>::max());
}