summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2017-12-06 09:25:23 -0800
committerGitHub <noreply@github.com>2017-12-06 09:25:23 -0800
commitb7f0a896efc12bb72b40bdaf19986736ccb9315a (patch)
treee53bf953f00367db4541d1bad5f45dab9a51ea1d /src
parent82d8dc7a9f5ca1c7989ab227bf32edfcd7e4a3c1 (diff)
downloadbinaryen-b7f0a896efc12bb72b40bdaf19986736ccb9315a.tar.gz
binaryen-b7f0a896efc12bb72b40bdaf19986736ccb9315a.tar.bz2
binaryen-b7f0a896efc12bb72b40bdaf19986736ccb9315a.zip
support i*.extend* instructions in interpreter (#1322)
* also fixes optimizing them in Precompute
Diffstat (limited to 'src')
-rw-r--r--src/tools/fuzzing.h4
-rw-r--r--src/wasm-interpreter.h31
2 files changed, 20 insertions, 15 deletions
diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h
index 982a94114..be12b561a 100644
--- a/src/tools/fuzzing.h
+++ b/src/tools/fuzzing.h
@@ -1070,7 +1070,7 @@ private:
switch (type) {
case i32: {
switch (upTo(4)) {
- case 0: return makeUnary({ pick(EqZInt32, ClzInt32, CtzInt32, PopcntInt32), make(i32) });
+ case 0: return makeUnary({ pick(EqZInt32, ClzInt32, CtzInt32, PopcntInt32, ExtendS8Int32, ExtendS16Int32), make(i32) });
case 1: return makeUnary({ pick(EqZInt64, WrapInt64), make(i64) });
case 2: return makeUnary({ pick(TruncSFloat32ToInt32, TruncUFloat32ToInt32, ReinterpretFloat32), make(f32) });
case 3: return makeUnary({ pick(TruncSFloat64ToInt32, TruncUFloat64ToInt32), make(f64) });
@@ -1079,7 +1079,7 @@ private:
}
case i64: {
switch (upTo(4)) {
- case 0: return makeUnary({ pick(ClzInt64, CtzInt64, PopcntInt64), make(i64) });
+ case 0: return makeUnary({ pick(ClzInt64, CtzInt64, PopcntInt64, ExtendS8Int64, ExtendS16Int64, ExtendS32Int64), make(i64) });
case 1: return makeUnary({ pick(ExtendSInt32, ExtendUInt32), make(i32) });
case 2: return makeUnary({ pick(TruncSFloat32ToInt64, TruncUFloat32ToInt64), make(f32) });
case 3: return makeUnary({ pick(TruncSFloat64ToInt64, TruncUFloat64ToInt64, ReinterpretFloat64), make(f64) });
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index b3fa3f265..c8b48e477 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -239,32 +239,37 @@ public:
NOTE_EVAL1(value);
if (value.type == i32) {
switch (curr->op) {
- case ClzInt32: return value.countLeadingZeroes();
- case CtzInt32: return value.countTrailingZeroes();
- case PopcntInt32: return value.popCount();
- case EqZInt32: return Literal(int32_t(value == Literal(int32_t(0))));
- case ReinterpretInt32: return value.castToF32();
- case ExtendSInt32: return value.extendToSI64();
- case ExtendUInt32: return value.extendToUI64();
+ case ClzInt32: return value.countLeadingZeroes();
+ case CtzInt32: return value.countTrailingZeroes();
+ case PopcntInt32: return value.popCount();
+ case EqZInt32: return Literal(int32_t(value == Literal(int32_t(0))));
+ case ReinterpretInt32: return value.castToF32();
+ case ExtendSInt32: return value.extendToSI64();
+ case ExtendUInt32: return value.extendToUI64();
case ConvertUInt32ToFloat32: return value.convertUToF32();
case ConvertUInt32ToFloat64: return value.convertUToF64();
case ConvertSInt32ToFloat32: return value.convertSToF32();
case ConvertSInt32ToFloat64: return value.convertSToF64();
+ case ExtendS8Int32: return Literal(int32_t(int8_t(value.geti32() & 0xFF)));
+ case ExtendS16Int32: return Literal(int32_t(int16_t(value.geti32() & 0xFFFF)));
default: WASM_UNREACHABLE();
}
}
if (value.type == i64) {
switch (curr->op) {
- case ClzInt64: return value.countLeadingZeroes();
- case CtzInt64: return value.countTrailingZeroes();
- case PopcntInt64: return value.popCount();
- case EqZInt64: return Literal(int32_t(value == Literal(int64_t(0))));
- case WrapInt64: return value.truncateToI32();
- case ReinterpretInt64: return value.castToF64();
+ case ClzInt64: return value.countLeadingZeroes();
+ case CtzInt64: return value.countTrailingZeroes();
+ case PopcntInt64: return value.popCount();
+ case EqZInt64: return Literal(int32_t(value == Literal(int64_t(0))));
+ case WrapInt64: return value.truncateToI32();
+ case ReinterpretInt64: return value.castToF64();
case ConvertUInt64ToFloat32: return value.convertUToF32();
case ConvertUInt64ToFloat64: return value.convertUToF64();
case ConvertSInt64ToFloat32: return value.convertSToF32();
case ConvertSInt64ToFloat64: return value.convertSToF64();
+ case ExtendS8Int64: return Literal(int64_t(int8_t(value.geti64() & 0xFF)));
+ case ExtendS16Int64: return Literal(int64_t(int16_t(value.geti64() & 0xFFFF)));
+ case ExtendS32Int64: return Literal(int64_t(int32_t(value.geti64() & 0xFFFFFFFF)));
default: WASM_UNREACHABLE();
}
}