Skip to content

Commit 28d74d2

Browse files
Zzzabiyakaloganek
authored andcommitted
implement globals
1 parent b2804c0 commit 28d74d2

File tree

3 files changed

+51
-3
lines changed

3 files changed

+51
-3
lines changed

core/iwasm/interpreter/wasm_interp_fast.c

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3595,7 +3595,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
35953595
GET_I64_FROM_ADDR((uint32 *)global_addr));
35963596
HANDLE_OP_END();
35973597
}
3598-
3598+
#if WASM_ENABLE_SIMDE != 0
3599+
HANDLE_OP(WASM_OP_GET_GLOBAL_128)
3600+
{
3601+
global_idx = read_uint32(frame_ip);
3602+
bh_assert(global_idx < module->e->global_count);
3603+
global = globals + global_idx;
3604+
global_addr = get_global_addr(global_data, global);
3605+
addr_ret = GET_OFFSET();
3606+
PUT_V128_TO_ADDR(frame_lp + addr_ret,
3607+
GET_V128_FROM_ADDR((uint32 *)global_addr));
3608+
HANDLE_OP_END();
3609+
}
3610+
#endif
35993611
HANDLE_OP(WASM_OP_SET_GLOBAL)
36003612
{
36013613
global_idx = read_uint32(frame_ip);
@@ -3662,6 +3674,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
36623674
GET_I64_FROM_ADDR(frame_lp + addr1));
36633675
HANDLE_OP_END();
36643676
}
3677+
#if WASM_ENABLE_SIMDE != 0
3678+
HANDLE_OP(WASM_OP_SET_GLOBAL_128)
3679+
{
3680+
global_idx = read_uint32(frame_ip);
3681+
bh_assert(global_idx < module->e->global_count);
3682+
global = globals + global_idx;
3683+
global_addr = get_global_addr(global_data, global);
3684+
addr1 = GET_OFFSET();
3685+
PUT_V128_TO_ADDR((uint32 *)global_addr,
3686+
GET_V128_FROM_ADDR(frame_lp + addr1));
3687+
HANDLE_OP_END();
3688+
}
3689+
#endif
36653690

36663691
/* memory load instructions */
36673692
HANDLE_OP(WASM_OP_I32_LOAD)

core/iwasm/interpreter/wasm_loader.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7300,6 +7300,8 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
73007300
case WASM_OP_SET_GLOBAL:
73017301
case WASM_OP_GET_GLOBAL_64:
73027302
case WASM_OP_SET_GLOBAL_64:
7303+
case WASM_OP_GET_GLOBAL_128:
7304+
case WASM_OP_SET_GLOBAL_128:
73037305
case WASM_OP_SET_GLOBAL_AUX_STACK:
73047306
skip_leb_uint32(p, p_end); /* local index */
73057307
break;
@@ -9111,6 +9113,11 @@ preserve_referenced_local(WASMLoaderContext *loader_ctx, uint8 opcode,
91119113
loader_ctx->preserved_local_offset++;
91129114
emit_label(EXT_OP_COPY_STACK_TOP);
91139115
}
9116+
else if (local_type == VALUE_TYPE_V128) {
9117+
if (loader_ctx->p_code_compiled)
9118+
loader_ctx->preserved_local_offset += 4;
9119+
emit_label(EXT_OP_COPY_STACK_TOP_V128);
9120+
}
91149121
else {
91159122
if (loader_ctx->p_code_compiled)
91169123
loader_ctx->preserved_local_offset += 2;
@@ -13206,9 +13213,14 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
1320613213
skip_label();
1320713214
emit_label(WASM_OP_GET_GLOBAL_64);
1320813215
}
13216+
13217+
if (global_type == VALUE_TYPE_V128) {
13218+
skip_label();
13219+
emit_label(WASM_OP_GET_GLOBAL_128);
13220+
}
13221+
#endif /* end of WASM_ENABLE_SIMDE */
1320913222
emit_uint32(loader_ctx, global_idx);
1321013223
PUSH_OFFSET_TYPE(global_type);
13211-
#endif /* end of WASM_ENABLE_FAST_INTERP */
1321213224
break;
1321313225
}
1321413226

@@ -13300,6 +13312,12 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
1330013312
skip_label();
1330113313
emit_label(WASM_OP_SET_GLOBAL_AUX_STACK);
1330213314
}
13315+
#if WASM_ENABLE_SIMDE != 0
13316+
else if (global_type == VALUE_TYPE_V128) {
13317+
skip_label();
13318+
emit_label(WASM_OP_SET_GLOBAL_128);
13319+
}
13320+
#endif /* end of WASM_ENABLE_SIMDE */
1330313321
emit_uint32(loader_ctx, global_idx);
1330413322
POP_OFFSET_TYPE(global_type);
1330513323
#endif /* end of WASM_ENABLE_FAST_INTERP */

core/iwasm/interpreter/wasm_opcode.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ typedef enum WASMOpcode {
284284
EXT_OP_SET_LOCAL_FAST_V128 = 0xdd,
285285
EXT_OP_TEE_LOCAL_FAST_V128 = 0xde,
286286
EXT_OP_COPY_STACK_TOP_V128 = 0xdf,
287+
WASM_OP_GET_GLOBAL_128 = 0xe0,
288+
WASM_OP_SET_GLOBAL_128 = 0xe1,
287289
#endif
288290

289291
/* Post-MVP extend op prefix */
@@ -803,7 +805,10 @@ typedef enum WASMAtomicEXTOpcode {
803805
#define DEF_EXT_V128_HANDLE() \
804806
SET_GOTO_TABLE_ELEM(EXT_OP_SET_LOCAL_FAST_V128), \
805807
SET_GOTO_TABLE_ELEM(EXT_OP_TEE_LOCAL_FAST_V128), \
806-
SET_GOTO_TABLE_ELEM(EXT_OP_COPY_STACK_TOP_V128),
808+
SET_GOTO_TABLE_ELEM(EXT_OP_COPY_STACK_TOP_V128), \
809+
SET_GOTO_TABLE_ELEM(WASM_OP_GET_GLOBAL_128), \
810+
SET_GOTO_TABLE_ELEM(WASM_OP_SET_GLOBAL_128), \
811+
807812
#else
808813
#define DEF_EXT_V128_HANDLE()
809814
#endif

0 commit comments

Comments
 (0)