Skip to content

Commit 6f1390f

Browse files
authored
Add sign extension instructions support (#333)
* Add support for extension instructions * Add sign extension tests
1 parent 24bc0cc commit 6f1390f

File tree

5 files changed

+40
-0
lines changed

5 files changed

+40
-0
lines changed

src/Interpreter/instructions.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,6 +1268,31 @@ bool i_instr_conversion(Module *m, uint8_t opcode) {
12681268
return true;
12691269
}
12701270

1271+
bool i_instr_extension(Module *m, uint8_t opcode) {
1272+
auto &v = m->stack[m->sp].value;
1273+
1274+
switch (opcode) {
1275+
case 0xc0: // i32.extend8_s
1276+
v.int32 = static_cast<int8_t>(v.int32);
1277+
break;
1278+
case 0xc1: // i32.extend16_s
1279+
v.int32 = static_cast<int16_t>(v.int32);
1280+
break;
1281+
case 0xc2: // i64.extend8_s
1282+
v.int64 = static_cast<int8_t>(v.int64);
1283+
break;
1284+
case 0xc3: // i64.extend16_s
1285+
v.int64 = static_cast<int16_t>(v.int64);
1286+
break;
1287+
case 0xc4: // i64.extend32_s
1288+
v.int64 = static_cast<int32_t>(v.int64);
1289+
break;
1290+
default:
1291+
return false;
1292+
}
1293+
return true;
1294+
}
1295+
12711296
/**
12721297
* 0xe0 ... 0xe3 callback operations
12731298
*/

src/Interpreter/instructions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,6 @@ bool i_instr_binary_f64(Module *m, uint8_t opcode);
7272

7373
bool i_instr_conversion(Module *m, uint8_t opcode);
7474

75+
bool i_instr_extension(Module *m, uint8_t opcode);
76+
7577
bool i_instr_callback(Module *m, uint8_t opcode);

src/Interpreter/interpreter.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,11 @@ bool Interpreter::interpret(Module *m, bool waiting) {
436436
success &= i_instr_conversion(m, opcode);
437437
continue;
438438

439+
// extension operations
440+
case 0xc0 ... 0xc4:
441+
success &= i_instr_extension(m, opcode);
442+
continue;
443+
439444
// callback operations
440445
case 0xe0 ... 0xe3:
441446
success &= i_instr_callback(m, opcode);

tests/latch/core/i32_0.asserts.wast

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,13 @@
198198
(assert_return (invoke "popcnt" (i32.const 0xDEADBEEF)) (i32.const 24))
199199
(assert_return (invoke "extend8_s" (i32.const 0)) (i32.const 0))
200200
(assert_return (invoke "extend8_s" (i32.const 0x7f)) (i32.const 127))
201+
(assert_return (invoke "extend8_s" (i32.const 0x80)) (i32.const -128))
202+
(assert_return (invoke "extend8_s" (i32.const 0xff)) (i32.const -1))
201203
(assert_return (invoke "extend8_s" (i32.const -1)) (i32.const -1))
202204
(assert_return (invoke "extend16_s" (i32.const 0)) (i32.const 0))
203205
(assert_return (invoke "extend16_s" (i32.const 0x7fff)) (i32.const 32767))
206+
(assert_return (invoke "extend16_s" (i32.const 0x8000)) (i32.const -32768))
207+
(assert_return (invoke "extend16_s" (i32.const 0xffff)) (i32.const -1))
204208
(assert_return (invoke "extend16_s" (i32.const -1)) (i32.const -1))
205209
(assert_return (invoke "eqz" (i32.const 0)) (i32.const 1))
206210
(assert_return (invoke "eqz" (i32.const 1)) (i32.const 0))

tests/latch/core/i64_0.asserts.wast

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,13 @@
131131
(assert_return (invoke "popcnt" (i64.const 0x00008000)) (i64.const 1))
132132
(assert_return (invoke "extend8_s" (i64.const 0)) (i64.const 0))
133133
(assert_return (invoke "extend8_s" (i64.const 0x7f)) (i64.const 127))
134+
(assert_return (invoke "extend8_s" (i64.const 0x80)) (i64.const -128))
135+
(assert_return (invoke "extend8_s" (i64.const 0xff)) (i64.const -1))
134136
(assert_return (invoke "extend8_s" (i64.const -1)) (i64.const -1))
135137
(assert_return (invoke "extend16_s" (i64.const 0)) (i64.const 0))
136138
(assert_return (invoke "extend16_s" (i64.const 0x7fff)) (i64.const 32767))
139+
(assert_return (invoke "extend16_s" (i64.const 0x8000)) (i64.const -32768))
140+
(assert_return (invoke "extend16_s" (i64.const 0xffff)) (i64.const -1))
137141
(assert_return (invoke "extend16_s" (i64.const -1)) (i64.const -1))
138142
(assert_return (invoke "extend32_s" (i64.const 0)) (i64.const 0))
139143
(assert_return (invoke "extend32_s" (i64.const 0x7fff)) (i64.const 32767))

0 commit comments

Comments
 (0)