implement globals

This commit is contained in:
Maks Litskevich 2025-01-21 19:16:13 +00:00 committed by Marcin Kolny
parent b2804c004f
commit 28d74d2e6c
3 changed files with 51 additions and 3 deletions

View File

@ -3595,7 +3595,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
GET_I64_FROM_ADDR((uint32 *)global_addr)); GET_I64_FROM_ADDR((uint32 *)global_addr));
HANDLE_OP_END(); HANDLE_OP_END();
} }
#if WASM_ENABLE_SIMDE != 0
HANDLE_OP(WASM_OP_GET_GLOBAL_128)
{
global_idx = read_uint32(frame_ip);
bh_assert(global_idx < module->e->global_count);
global = globals + global_idx;
global_addr = get_global_addr(global_data, global);
addr_ret = GET_OFFSET();
PUT_V128_TO_ADDR(frame_lp + addr_ret,
GET_V128_FROM_ADDR((uint32 *)global_addr));
HANDLE_OP_END();
}
#endif
HANDLE_OP(WASM_OP_SET_GLOBAL) HANDLE_OP(WASM_OP_SET_GLOBAL)
{ {
global_idx = read_uint32(frame_ip); global_idx = read_uint32(frame_ip);
@ -3662,6 +3674,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
GET_I64_FROM_ADDR(frame_lp + addr1)); GET_I64_FROM_ADDR(frame_lp + addr1));
HANDLE_OP_END(); HANDLE_OP_END();
} }
#if WASM_ENABLE_SIMDE != 0
HANDLE_OP(WASM_OP_SET_GLOBAL_128)
{
global_idx = read_uint32(frame_ip);
bh_assert(global_idx < module->e->global_count);
global = globals + global_idx;
global_addr = get_global_addr(global_data, global);
addr1 = GET_OFFSET();
PUT_V128_TO_ADDR((uint32 *)global_addr,
GET_V128_FROM_ADDR(frame_lp + addr1));
HANDLE_OP_END();
}
#endif
/* memory load instructions */ /* memory load instructions */
HANDLE_OP(WASM_OP_I32_LOAD) HANDLE_OP(WASM_OP_I32_LOAD)

View File

@ -7300,6 +7300,8 @@ wasm_loader_find_block_addr(WASMExecEnv *exec_env, BlockAddr *block_addr_cache,
case WASM_OP_SET_GLOBAL: case WASM_OP_SET_GLOBAL:
case WASM_OP_GET_GLOBAL_64: case WASM_OP_GET_GLOBAL_64:
case WASM_OP_SET_GLOBAL_64: case WASM_OP_SET_GLOBAL_64:
case WASM_OP_GET_GLOBAL_128:
case WASM_OP_SET_GLOBAL_128:
case WASM_OP_SET_GLOBAL_AUX_STACK: case WASM_OP_SET_GLOBAL_AUX_STACK:
skip_leb_uint32(p, p_end); /* local index */ skip_leb_uint32(p, p_end); /* local index */
break; break;
@ -9111,6 +9113,11 @@ preserve_referenced_local(WASMLoaderContext *loader_ctx, uint8 opcode,
loader_ctx->preserved_local_offset++; loader_ctx->preserved_local_offset++;
emit_label(EXT_OP_COPY_STACK_TOP); emit_label(EXT_OP_COPY_STACK_TOP);
} }
else if (local_type == VALUE_TYPE_V128) {
if (loader_ctx->p_code_compiled)
loader_ctx->preserved_local_offset += 4;
emit_label(EXT_OP_COPY_STACK_TOP_V128);
}
else { else {
if (loader_ctx->p_code_compiled) if (loader_ctx->p_code_compiled)
loader_ctx->preserved_local_offset += 2; loader_ctx->preserved_local_offset += 2;
@ -13206,9 +13213,14 @@ re_scan:
skip_label(); skip_label();
emit_label(WASM_OP_GET_GLOBAL_64); emit_label(WASM_OP_GET_GLOBAL_64);
} }
if (global_type == VALUE_TYPE_V128) {
skip_label();
emit_label(WASM_OP_GET_GLOBAL_128);
}
#endif /* end of WASM_ENABLE_SIMDE */
emit_uint32(loader_ctx, global_idx); emit_uint32(loader_ctx, global_idx);
PUSH_OFFSET_TYPE(global_type); PUSH_OFFSET_TYPE(global_type);
#endif /* end of WASM_ENABLE_FAST_INTERP */
break; break;
} }
@ -13300,6 +13312,12 @@ re_scan:
skip_label(); skip_label();
emit_label(WASM_OP_SET_GLOBAL_AUX_STACK); emit_label(WASM_OP_SET_GLOBAL_AUX_STACK);
} }
#if WASM_ENABLE_SIMDE != 0
else if (global_type == VALUE_TYPE_V128) {
skip_label();
emit_label(WASM_OP_SET_GLOBAL_128);
}
#endif /* end of WASM_ENABLE_SIMDE */
emit_uint32(loader_ctx, global_idx); emit_uint32(loader_ctx, global_idx);
POP_OFFSET_TYPE(global_type); POP_OFFSET_TYPE(global_type);
#endif /* end of WASM_ENABLE_FAST_INTERP */ #endif /* end of WASM_ENABLE_FAST_INTERP */

View File

@ -284,6 +284,8 @@ typedef enum WASMOpcode {
EXT_OP_SET_LOCAL_FAST_V128 = 0xdd, EXT_OP_SET_LOCAL_FAST_V128 = 0xdd,
EXT_OP_TEE_LOCAL_FAST_V128 = 0xde, EXT_OP_TEE_LOCAL_FAST_V128 = 0xde,
EXT_OP_COPY_STACK_TOP_V128 = 0xdf, EXT_OP_COPY_STACK_TOP_V128 = 0xdf,
WASM_OP_GET_GLOBAL_128 = 0xe0,
WASM_OP_SET_GLOBAL_128 = 0xe1,
#endif #endif
/* Post-MVP extend op prefix */ /* Post-MVP extend op prefix */
@ -803,7 +805,10 @@ typedef enum WASMAtomicEXTOpcode {
#define DEF_EXT_V128_HANDLE() \ #define DEF_EXT_V128_HANDLE() \
SET_GOTO_TABLE_ELEM(EXT_OP_SET_LOCAL_FAST_V128), \ SET_GOTO_TABLE_ELEM(EXT_OP_SET_LOCAL_FAST_V128), \
SET_GOTO_TABLE_ELEM(EXT_OP_TEE_LOCAL_FAST_V128), \ SET_GOTO_TABLE_ELEM(EXT_OP_TEE_LOCAL_FAST_V128), \
SET_GOTO_TABLE_ELEM(EXT_OP_COPY_STACK_TOP_V128), SET_GOTO_TABLE_ELEM(EXT_OP_COPY_STACK_TOP_V128), \
SET_GOTO_TABLE_ELEM(WASM_OP_GET_GLOBAL_128), \
SET_GOTO_TABLE_ELEM(WASM_OP_SET_GLOBAL_128), \
#else #else
#define DEF_EXT_V128_HANDLE() #define DEF_EXT_V128_HANDLE()
#endif #endif