Skip to content

Commit 38895ee

Browse files
committed
implement local and function calls for v128 in the fast interpreter
1 parent dc06250 commit 38895ee

File tree

3 files changed

+49
-33
lines changed

3 files changed

+49
-33
lines changed

core/iwasm/interpreter/wasm_interp_fast.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3540,6 +3540,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
35403540
frame_ip += 2;
35413541
HANDLE_OP_END();
35423542
}
3543+
3544+
#if WASM_ENABLE_SIMDE != 0
35433545
HANDLE_OP(EXT_OP_SET_LOCAL_FAST_V128)
35443546
HANDLE_OP(EXT_OP_TEE_LOCAL_FAST_V128)
35453547
{
@@ -3556,7 +3558,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
35563558
frame_ip += 2;
35573559
HANDLE_OP_END();
35583560
}
3559-
3561+
#endif
35603562
HANDLE_OP(WASM_OP_GET_GLOBAL)
35613563
{
35623564
global_idx = read_uint32(frame_ip);
@@ -4905,7 +4907,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
49054907

49064908
HANDLE_OP_END();
49074909
}
4908-
4910+
#if WASM_ENABLE_SIMDE != 0
49094911
HANDLE_OP(EXT_OP_COPY_STACK_TOP_V128)
49104912
{
49114913
addr1 = GET_OFFSET();
@@ -4926,6 +4928,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
49264928

49274929
HANDLE_OP_END();
49284930
}
4931+
#endif
49294932

49304933
HANDLE_OP(EXT_OP_COPY_STACK_VALUES)
49314934
{

core/iwasm/interpreter/wasm_loader.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12948,10 +12948,12 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
1294812948
emit_label(EXT_OP_SET_LOCAL_FAST_I64);
1294912949
emit_byte(loader_ctx, (uint8)local_offset);
1295012950
}
12951+
#if WASM_ENABLE_SIMDE != 0
1295112952
else if (local_type == VALUE_TYPE_V128) {
1295212953
emit_label(EXT_OP_SET_LOCAL_FAST_V128);
1295312954
emit_byte(loader_ctx, (uint8)local_offset);
1295412955
}
12956+
#endif
1295512957
else {
1295612958
set_error_buf(error_buf, error_buf_size,
1295712959
"unknown local type");

core/iwasm/interpreter/wasm_opcode.h

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -250,35 +250,40 @@ typedef enum WASMOpcode {
250250
/* extend op code */
251251
EXT_OP_GET_LOCAL_FAST = 0xc7,
252252
EXT_OP_SET_LOCAL_FAST_I64 = 0xc8,
253-
EXT_OP_SET_LOCAL_FAST_V128 = 0xc9,
254-
EXT_OP_SET_LOCAL_FAST = 0xca,
255-
EXT_OP_TEE_LOCAL_FAST = 0xcb,
256-
EXT_OP_TEE_LOCAL_FAST_I64 = 0xcc,
257-
EXT_OP_TEE_LOCAL_FAST_V128 = 0xcd,
258-
EXT_OP_COPY_STACK_TOP = 0xce,
259-
EXT_OP_COPY_STACK_TOP_I64 = 0xcf,
260-
EXT_OP_COPY_STACK_TOP_V128 = 0xd0,
261-
EXT_OP_COPY_STACK_VALUES = 0xd1,
262-
263-
WASM_OP_IMPDEP = 0xd2,
264-
265-
WASM_OP_REF_NULL = 0xd3, /* ref.null */
266-
WASM_OP_REF_IS_NULL = 0xd4, /* ref.is_null */
267-
WASM_OP_REF_FUNC = 0xd5, /* ref.func */
268-
WASM_OP_REF_EQ = 0xd6, /* ref.eq */
269-
WASM_OP_REF_AS_NON_NULL = 0xd7, /* ref.as_non_null */
270-
WASM_OP_BR_ON_NULL = 0xd8, /* br_on_null */
271-
WASM_OP_BR_ON_NON_NULL = 0xd9, /* br_on_non_null */
272-
273-
EXT_OP_BLOCK = 0xda, /* block with blocktype */
274-
EXT_OP_LOOP = 0xdb, /* loop with blocktype */
275-
EXT_OP_IF = 0xdc, /* if with blocktype */
276-
EXT_OP_BR_TABLE_CACHE = 0xdd, /* br_table from cache */
277-
278-
EXT_OP_TRY = 0xde, /* try block with blocktype */
253+
EXT_OP_SET_LOCAL_FAST = 0xc9,
254+
EXT_OP_TEE_LOCAL_FAST = 0xca,
255+
EXT_OP_TEE_LOCAL_FAST_I64 = 0xcb,
256+
EXT_OP_COPY_STACK_TOP = 0xcc,
257+
EXT_OP_COPY_STACK_TOP_I64 = 0xcd,
258+
EXT_OP_COPY_STACK_VALUES = 0xce,
259+
260+
WASM_OP_IMPDEP = 0xcf,
261+
262+
WASM_OP_REF_NULL = 0xd0, /* ref.null */
263+
WASM_OP_REF_IS_NULL = 0xd1, /* ref.is_null */
264+
WASM_OP_REF_FUNC = 0xd2, /* ref.func */
265+
WASM_OP_REF_EQ = 0xd3, /* ref.eq */
266+
WASM_OP_REF_AS_NON_NULL = 0xd4, /* ref.as_non_null */
267+
WASM_OP_BR_ON_NULL = 0xd5, /* br_on_null */
268+
WASM_OP_BR_ON_NON_NULL = 0xd6, /* br_on_non_null */
269+
270+
EXT_OP_BLOCK = 0xd7, /* block with blocktype */
271+
EXT_OP_LOOP = 0xd8, /* loop with blocktype */
272+
EXT_OP_IF = 0xd9, /* if with blocktype */
273+
EXT_OP_BR_TABLE_CACHE = 0xda, /* br_table from cache */
274+
275+
EXT_OP_TRY = 0xdb, /* try block with blocktype */
279276

280277
#if WASM_ENABLE_DEBUG_INTERP != 0
281-
DEBUG_OP_BREAK = 0xdf, /* debug break point */
278+
DEBUG_OP_BREAK = 0xdc, /* debug break point */
279+
#endif
280+
281+
#if (WASM_ENABLE_JIT != 0 \
282+
|| (WASM_ENABLE_FAST_INTERP != 0 && WASM_ENABLE_SIMDE != 0)) \
283+
&& WASM_ENABLE_SIMD != 0
284+
EXT_OP_SET_LOCAL_FAST_V128 = 0xdd,
285+
EXT_OP_TEE_LOCAL_FAST_V128 = 0xde,
286+
EXT_OP_COPY_STACK_TOP_V128 = 0xdf,
282287
#endif
283288

284289
/* Post-MVP extend op prefix */
@@ -793,6 +798,15 @@ typedef enum WASMAtomicEXTOpcode {
793798
#define SET_GOTO_TABLE_SIMD_PREFIX_ELEM()
794799
#endif
795800

801+
#if (WASM_ENABLE_FAST_INTERP != 0 && WASM_ENABLE_SIMDE != 0) \
802+
&& WASM_ENABLE_SIMD != 0
803+
#define DEF_EXT_V128_HANDLE() \
804+
SET_GOTO_TABLE_ELEM(EXT_OP_SET_LOCAL_FAST_V128), \
805+
SET_GOTO_TABLE_ELEM(EXT_OP_TEE_LOCAL_FAST_V128), \
806+
SET_GOTO_TABLE_ELEM(EXT_OP_COPY_STACK_TOP_V128),
807+
#else
808+
#define DEF_EXT_V128_HANDLE()
809+
#endif
796810
/*
797811
* Macro used to generate computed goto tables for the C interpreter.
798812
*/
@@ -1001,14 +1015,11 @@ typedef enum WASMAtomicEXTOpcode {
10011015
HANDLE_OPCODE(WASM_OP_SELECT_64), /* 0xc6 */ \
10021016
HANDLE_OPCODE(EXT_OP_GET_LOCAL_FAST), /* 0xc7 */ \
10031017
HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST_I64), /* 0xc8 */ \
1004-
HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST_V128), /* 0xc9 */ \
10051018
HANDLE_OPCODE(EXT_OP_SET_LOCAL_FAST), /* 0xca */ \
10061019
HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST), /* 0xcb */ \
10071020
HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST_I64), /* 0xcc */ \
1008-
HANDLE_OPCODE(EXT_OP_TEE_LOCAL_FAST_V128), /* 0xcd */ \
10091021
HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP), /* 0xce */ \
10101022
HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP_I64), /* 0xcf */ \
1011-
HANDLE_OPCODE(EXT_OP_COPY_STACK_TOP_V128), /* 0xd0 */ \
10121023
HANDLE_OPCODE(EXT_OP_COPY_STACK_VALUES), /* 0xd1 */ \
10131024
HANDLE_OPCODE(WASM_OP_IMPDEP), /* 0xd2 */ \
10141025
HANDLE_OPCODE(WASM_OP_REF_NULL), /* 0xd3 */ \
@@ -1027,7 +1038,7 @@ typedef enum WASMAtomicEXTOpcode {
10271038
SET_GOTO_TABLE_ELEM(WASM_OP_MISC_PREFIX), /* 0xfc */ \
10281039
SET_GOTO_TABLE_SIMD_PREFIX_ELEM() /* 0xfd */ \
10291040
SET_GOTO_TABLE_ELEM(WASM_OP_ATOMIC_PREFIX), /* 0xfe */ \
1030-
DEF_DEBUG_BREAK_HANDLE() \
1041+
DEF_DEBUG_BREAK_HANDLE() DEF_EXT_V128_HANDLE() \
10311042
};
10321043

10331044
#ifdef __cplusplus

0 commit comments

Comments
 (0)