Refine get/set global opcodes for interpreter (#294)

This commit is contained in:
wenyongh
2020-06-29 14:17:27 +08:00
committed by GitHub
parent ee315e4049
commit 847dccaa34
5 changed files with 252 additions and 152 deletions

View File

@ -782,10 +782,9 @@ load_import_section(const uint8 *buf, const uint8 *buf_end, WASMModule *module,
case IMPORT_KIND_GLOBAL: /* import global */
bh_assert(import_globals);
import = import_globals++;
if (!load_global_import(module,
sub_module,
sub_module_name, field_name, &p,
p_end, &import->u.global,
if (!load_global_import(module, sub_module,
sub_module_name, field_name,
&p, p_end, &import->u.global,
error_buf, error_buf_size)) {
return false;
}
@ -2087,6 +2086,9 @@ wasm_loader_find_block_addr(BlockAddr *block_addr_cache,
case WASM_OP_TEE_LOCAL:
case WASM_OP_GET_GLOBAL:
case WASM_OP_SET_GLOBAL:
case WASM_OP_GET_GLOBAL_64:
case WASM_OP_SET_GLOBAL_64:
case WASM_OP_SET_GLOBAL_AUX_STACK:
skip_leb_uint32(p, p_end); /* localidx */
break;
@ -4371,24 +4373,42 @@ re_scan:
case WASM_OP_GET_GLOBAL:
{
p_org = p - 1;
read_leb_uint32(p, p_end, global_idx);
bh_assert(global_idx < global_count);
global_type = global_idx < module->import_global_count
? module->import_globals[global_idx].u.global.type
:module->globals[global_idx - module->import_global_count].type;
global_type =
global_idx < module->import_global_count
? module->import_globals[global_idx].u.global.type
: module->globals[global_idx - module->import_global_count]
.type;
PUSH_TYPE(global_type);
#if WASM_ENABLE_FAST_INTERP != 0
#if WASM_ENABLE_FAST_INTERP == 0
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0)
if (global_type == VALUE_TYPE_I64
|| global_type == VALUE_TYPE_F64) {
*p_org = WASM_OP_GET_GLOBAL_64;
}
#endif
#else /* else of WASM_ENABLE_FAST_INTERP */
if (global_type == VALUE_TYPE_I64
|| global_type == VALUE_TYPE_F64) {
skip_label();
emit_label(WASM_OP_GET_GLOBAL_64);
}
emit_uint32(loader_ctx, global_idx);
PUSH_OFFSET_TYPE(global_type);
#endif
#endif /* end of WASM_ENABLE_FAST_INTERP */
break;
}
case WASM_OP_SET_GLOBAL:
{
bool is_mutable = false;
p_org = p - 1;
read_leb_uint32(p, p_end, global_idx);
bh_assert(global_idx < global_count);
@ -4406,10 +4426,33 @@ re_scan:
.type;
POP_TYPE(global_type);
#if WASM_ENABLE_FAST_INTERP != 0
#if WASM_ENABLE_FAST_INTERP == 0
#if (WASM_ENABLE_WAMR_COMPILER == 0) && (WASM_ENABLE_JIT == 0)
if (global_type == VALUE_TYPE_I64
|| global_type == VALUE_TYPE_F64) {
*p_org = WASM_OP_SET_GLOBAL_64;
}
else if (module->llvm_aux_stack_size > 0
&& global_idx == module->llvm_aux_stack_global_index) {
*p_org = WASM_OP_SET_GLOBAL_AUX_STACK;
}
#endif
#else /* else of WASM_ENABLE_FAST_INTERP */
if (global_type == VALUE_TYPE_I64
|| global_type == VALUE_TYPE_F64) {
skip_label();
emit_label(WASM_OP_SET_GLOBAL_64);
}
else if (module->llvm_aux_stack_size > 0
&& global_idx == module->llvm_aux_stack_global_index) {
skip_label();
emit_label(WASM_OP_SET_GLOBAL_AUX_STACK);
}
emit_uint32(loader_ctx, global_idx);
POP_OFFSET_TYPE(global_type);
#endif
#endif /* end of WASM_ENABLE_FAST_INTERP */
(void)is_mutable;
break;
}