Skip to content

Commit 4cb9b1b

Browse files
committed
Add zero load opcodes
1 parent 138faba commit 4cb9b1b

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

core/iwasm/interpreter/wasm_interp_fast.c

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6391,14 +6391,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
63916391
break;
63926392
}
63936393

6394-
#define SIMD_LOAD_LANE_OP(register, width) \
6394+
#define SIMD_LOAD_LANE_COMMON(vec, register, lane, width) \
63956395
do { \
6396-
uint32 offset, addr; \
6397-
offset = read_uint32(frame_ip); \
6398-
V128 vec = POP_V128(); \
6399-
int32 base = POP_I32(); \
6400-
offset += base; \
6401-
int lane = *frame_ip++; \
64026396
addr = GET_OPERAND(uint32, I32, 0); \
64036397
addr_ret = GET_OFFSET(); \
64046398
CHECK_MEMORY_OVERFLOW(width / 8); \
@@ -6411,6 +6405,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
64116405
PUT_V128_TO_ADDR(frame_lp + addr_ret, vec); \
64126406
} while (0)
64136407

6408+
#define SIMD_LOAD_LANE_OP(register, width) \
6409+
do { \
6410+
uint32 offset, addr; \
6411+
offset = read_uint32(frame_ip); \
6412+
V128 vec = POP_V128(); \
6413+
int32 base = POP_I32(); \
6414+
offset += base; \
6415+
int lane = *frame_ip++; \
6416+
SIMD_LOAD_LANE_COMMON(vec, register, lane, width); \
6417+
} while (0)
6418+
64146419
case SIMD_v128_load8_lane:
64156420
{
64166421
SIMD_LOAD_LANE_OP(i8x16, 8);
@@ -6435,10 +6440,29 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
64356440
case SIMD_v128_store16_lane:
64366441
case SIMD_v128_store32_lane:
64376442
case SIMD_v128_store64_lane:
6443+
{
6444+
wasm_set_exception(module, "unsupported SIMD opcode");
6445+
break;
6446+
}
6447+
#define SIMD_LOAD_ZERO_OP(register, width) \
6448+
do { \
6449+
uint32 offset, addr; \
6450+
offset = read_uint32(frame_ip); \
6451+
int32 base = POP_I32(); \
6452+
offset += base; \
6453+
int32 lane = 0; \
6454+
V128 vec = { 0 }; \
6455+
SIMD_LOAD_LANE_COMMON(vec, register, lane, width); \
6456+
} while (0)
6457+
64386458
case SIMD_v128_load32_zero:
6459+
{
6460+
SIMD_LOAD_ZERO_OP(i32x4, 32);
6461+
break;
6462+
}
64396463
case SIMD_v128_load64_zero:
64406464
{
6441-
wasm_set_exception(module, "unsupported SIMD opcode");
6465+
SIMD_LOAD_ZERO_OP(i64x2, 64);
64426466
break;
64436467
}
64446468

core/iwasm/interpreter/wasm_loader.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15397,7 +15397,9 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
1539715397
}
1539815398

1539915399
read_leb_mem_offset(p, p_end, mem_offset); /* offset */
15400-
15400+
#if WASM_ENABLE_FAST_INTERP != 0
15401+
emit_uint32(loader_ctx, mem_offset);
15402+
#endif
1540115403
POP_AND_PUSH(mem_offset_type, VALUE_TYPE_V128);
1540215404
#if WASM_ENABLE_JIT != 0 || WASM_ENABLE_WAMR_COMPILER != 0
1540315405
func->has_memory_operations = true;

0 commit comments

Comments
 (0)