diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 19:48:17 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-05 19:48:17 -0800 |
commit | a7aef882a766e12847d021981b2f445c310aaf5e (patch) | |
tree | adcfaf6f7d4eb3edf61e8838f6593ae23a31f6a9 | |
parent | d6837db077213c218599e33042f1006118d97be4 (diff) | |
download | binaryen-a7aef882a766e12847d021981b2f445c310aaf5e.tar.gz binaryen-a7aef882a766e12847d021981b2f445c310aaf5e.tar.bz2 binaryen-a7aef882a766e12847d021981b2f445c310aaf5e.zip |
shift corner cases
-rw-r--r-- | src/wasm-interpreter.h | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 5cb1105e8..9cf3adf24 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -390,9 +390,18 @@ public: case And: return Literal(l & r); case Or: return Literal(l | r); case Xor: return Literal(l ^ r); - case Shl: return Literal(l << r); - case ShrU: return Literal(int32_t(uint32_t(l) >> uint32_t(r))); - case ShrS: return Literal(l >> r); + case Shl: { + if (uint32_t(r) >= 32) return Literal(int32_t(0)); + return Literal(l << r); + } + case ShrU: { + if (uint32_t(r) >= 32) return Literal(int32_t(0)); + return Literal(int32_t(uint32_t(l) >> uint32_t(r))); + } + case ShrS: { + if (uint32_t(r) >= 32) return Literal(int32_t(l < 0 ? -1 : 0)); + return Literal(l >> r); + } default: abort(); } } else if (left.type == i64) { @@ -422,9 +431,18 @@ public: case And: return Literal(l & r); case Or: return Literal(l | r); case Xor: return Literal(l ^ r); - case Shl: return Literal(l << r); - case ShrU: return Literal(int64_t(uint64_t(l) >> uint64_t(r))); - case ShrS: return Literal(l >> r); + case Shl: { + if (uint64_t(r) >= 64) return Literal(int64_t(0)); + return Literal(l << r); + } + case ShrU: { + if (uint64_t(r) >= 64) return Literal(int64_t(0)); + return Literal(int64_t(uint64_t(l) >> uint64_t(r))); + } + case ShrS: { + if (uint64_t(r) >= 64) return Literal(int64_t(l < 0 ? -1 : 0)); + return Literal(l >> r); + } default: abort(); } } else if (left.type == f32) { |