summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-05 19:48:17 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-05 19:48:17 -0800
commita7aef882a766e12847d021981b2f445c310aaf5e (patch)
treeadcfaf6f7d4eb3edf61e8838f6593ae23a31f6a9
parentd6837db077213c218599e33042f1006118d97be4 (diff)
downloadbinaryen-a7aef882a766e12847d021981b2f445c310aaf5e.tar.gz
binaryen-a7aef882a766e12847d021981b2f445c310aaf5e.tar.bz2
binaryen-a7aef882a766e12847d021981b2f445c310aaf5e.zip
shift corner cases
-rw-r--r--src/wasm-interpreter.h30
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) {