Skip to content

Commit b7f0a89

Browse files
authored
support i*.extend* instructions in interpreter (#1322)
* also fixes optimizing them in Precompute
1 parent 82d8dc7 commit b7f0a89

File tree

5 files changed

+294
-361
lines changed

5 files changed

+294
-361
lines changed

src/tools/fuzzing.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ class TranslateToFuzzReader {
10701070
switch (type) {
10711071
case i32: {
10721072
switch (upTo(4)) {
1073-
case 0: return makeUnary({ pick(EqZInt32, ClzInt32, CtzInt32, PopcntInt32), make(i32) });
1073+
case 0: return makeUnary({ pick(EqZInt32, ClzInt32, CtzInt32, PopcntInt32, ExtendS8Int32, ExtendS16Int32), make(i32) });
10741074
case 1: return makeUnary({ pick(EqZInt64, WrapInt64), make(i64) });
10751075
case 2: return makeUnary({ pick(TruncSFloat32ToInt32, TruncUFloat32ToInt32, ReinterpretFloat32), make(f32) });
10761076
case 3: return makeUnary({ pick(TruncSFloat64ToInt32, TruncUFloat64ToInt32), make(f64) });
@@ -1079,7 +1079,7 @@ class TranslateToFuzzReader {
10791079
}
10801080
case i64: {
10811081
switch (upTo(4)) {
1082-
case 0: return makeUnary({ pick(ClzInt64, CtzInt64, PopcntInt64), make(i64) });
1082+
case 0: return makeUnary({ pick(ClzInt64, CtzInt64, PopcntInt64, ExtendS8Int64, ExtendS16Int64, ExtendS32Int64), make(i64) });
10831083
case 1: return makeUnary({ pick(ExtendSInt32, ExtendUInt32), make(i32) });
10841084
case 2: return makeUnary({ pick(TruncSFloat32ToInt64, TruncUFloat32ToInt64), make(f32) });
10851085
case 3: return makeUnary({ pick(TruncSFloat64ToInt64, TruncUFloat64ToInt64, ReinterpretFloat64), make(f64) });

src/wasm-interpreter.h

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -239,32 +239,37 @@ class ExpressionRunner : public Visitor<SubType, Flow> {
239239
NOTE_EVAL1(value);
240240
if (value.type == i32) {
241241
switch (curr->op) {
242-
case ClzInt32: return value.countLeadingZeroes();
243-
case CtzInt32: return value.countTrailingZeroes();
244-
case PopcntInt32: return value.popCount();
245-
case EqZInt32: return Literal(int32_t(value == Literal(int32_t(0))));
246-
case ReinterpretInt32: return value.castToF32();
247-
case ExtendSInt32: return value.extendToSI64();
248-
case ExtendUInt32: return value.extendToUI64();
242+
case ClzInt32: return value.countLeadingZeroes();
243+
case CtzInt32: return value.countTrailingZeroes();
244+
case PopcntInt32: return value.popCount();
245+
case EqZInt32: return Literal(int32_t(value == Literal(int32_t(0))));
246+
case ReinterpretInt32: return value.castToF32();
247+
case ExtendSInt32: return value.extendToSI64();
248+
case ExtendUInt32: return value.extendToUI64();
249249
case ConvertUInt32ToFloat32: return value.convertUToF32();
250250
case ConvertUInt32ToFloat64: return value.convertUToF64();
251251
case ConvertSInt32ToFloat32: return value.convertSToF32();
252252
case ConvertSInt32ToFloat64: return value.convertSToF64();
253+
case ExtendS8Int32: return Literal(int32_t(int8_t(value.geti32() & 0xFF)));
254+
case ExtendS16Int32: return Literal(int32_t(int16_t(value.geti32() & 0xFFFF)));
253255
default: WASM_UNREACHABLE();
254256
}
255257
}
256258
if (value.type == i64) {
257259
switch (curr->op) {
258-
case ClzInt64: return value.countLeadingZeroes();
259-
case CtzInt64: return value.countTrailingZeroes();
260-
case PopcntInt64: return value.popCount();
261-
case EqZInt64: return Literal(int32_t(value == Literal(int64_t(0))));
262-
case WrapInt64: return value.truncateToI32();
263-
case ReinterpretInt64: return value.castToF64();
260+
case ClzInt64: return value.countLeadingZeroes();
261+
case CtzInt64: return value.countTrailingZeroes();
262+
case PopcntInt64: return value.popCount();
263+
case EqZInt64: return Literal(int32_t(value == Literal(int64_t(0))));
264+
case WrapInt64: return value.truncateToI32();
265+
case ReinterpretInt64: return value.castToF64();
264266
case ConvertUInt64ToFloat32: return value.convertUToF32();
265267
case ConvertUInt64ToFloat64: return value.convertUToF64();
266268
case ConvertSInt64ToFloat32: return value.convertSToF32();
267269
case ConvertSInt64ToFloat64: return value.convertSToF64();
270+
case ExtendS8Int64: return Literal(int64_t(int8_t(value.geti64() & 0xFF)));
271+
case ExtendS16Int64: return Literal(int64_t(int16_t(value.geti64() & 0xFFFF)));
272+
case ExtendS32Int64: return Literal(int64_t(int32_t(value.geti64() & 0xFFFFFFFF)));
268273
default: WASM_UNREACHABLE();
269274
}
270275
}

test/passes/fuzz-exec.txt

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
[fuzz-exec] note result: $a => (i32.const -69)
2+
[fuzz-exec] note result: $b => (i32.const -31768)
3+
[fuzz-exec] note result: $c => (i64.const -69)
4+
[fuzz-exec] note result: $d => (i64.const -31768)
5+
[fuzz-exec] note result: $e => (i64.const -2146649112)
6+
[fuzz-exec] 5 results noted
7+
(module
8+
(type $0 (func (result i32)))
9+
(type $1 (func (result i64)))
10+
(memory $0 0)
11+
(export "a" (func $a))
12+
(export "b" (func $b))
13+
(export "c" (func $c))
14+
(export "d" (func $d))
15+
(export "e" (func $e))
16+
(func $a (; 0 ;) (type $0) (result i32)
17+
(i32.extend8_s
18+
(i32.const 187)
19+
)
20+
)
21+
(func $b (; 1 ;) (type $0) (result i32)
22+
(i32.extend16_s
23+
(i32.const 33768)
24+
)
25+
)
26+
(func $c (; 2 ;) (type $1) (result i64)
27+
(i64.extend8_s
28+
(i64.const 187)
29+
)
30+
)
31+
(func $d (; 3 ;) (type $1) (result i64)
32+
(i64.extend16_s
33+
(i64.const 33768)
34+
)
35+
)
36+
(func $e (; 4 ;) (type $1) (result i64)
37+
(i64.extend32_s
38+
(i64.const 2148318184)
39+
)
40+
)
41+
)
42+
[fuzz-exec] note result: $a => (i32.const -69)
43+
[fuzz-exec] note result: $b => (i32.const -31768)
44+
[fuzz-exec] note result: $c => (i64.const -69)
45+
[fuzz-exec] note result: $d => (i64.const -31768)
46+
[fuzz-exec] note result: $e => (i64.const -2146649112)
47+
[fuzz-exec] 5 results noted
48+
[fuzz-exec] comparing $a
49+
[fuzz-exec] comparing $b
50+
[fuzz-exec] comparing $c
51+
[fuzz-exec] comparing $d
52+
[fuzz-exec] comparing $e
53+
[fuzz-exec] 5 results match

test/passes/fuzz-exec.wast

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
(module
2+
(export "a" (func $a))
3+
(export "b" (func $b))
4+
(export "c" (func $c))
5+
(export "d" (func $d))
6+
(export "e" (func $e))
7+
(func $a (result i32)
8+
(i32.extend8_s
9+
(i32.const 187)
10+
)
11+
)
12+
(func $b (result i32)
13+
(i32.extend16_s
14+
(i32.const 33768)
15+
)
16+
)
17+
(func $c (result i64)
18+
(i64.extend8_s
19+
(i64.const 187)
20+
)
21+
)
22+
(func $d (result i64)
23+
(i64.extend16_s
24+
(i64.const 33768)
25+
)
26+
)
27+
(func $e (result i64)
28+
(i64.extend32_s
29+
(i64.const 2148318184)
30+
)
31+
)
32+
)
33+

0 commit comments

Comments
 (0)