mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-16 22:51:27 +00:00
Emit JIT IRs for get/set wasm globals (#1085)
WASM_OP_SET_GLOBAL_AUX_STACK is unsupported currently
This commit is contained in:
parent
8ef253a19c
commit
f1f674bc8d
|
@ -161,9 +161,82 @@ fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8
|
||||||
|
get_global_type(const WASMModule *module, uint32 global_idx)
|
||||||
|
{
|
||||||
|
return module->globals[global_idx].type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32
|
||||||
|
get_global_data_offset(const WASMModule *module, uint32 global_idx)
|
||||||
|
{
|
||||||
|
if (global_idx < module->import_global_count) {
|
||||||
|
const WASMGlobalImport *import_global =
|
||||||
|
&((module->import_globals + global_idx)->u.global);
|
||||||
|
return import_global->data_offset;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const WASMGlobal *global = module->globals + global_idx;
|
||||||
|
return global->data_offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
jit_compile_op_get_global(JitCompContext *cc, uint32 global_idx)
|
jit_compile_op_get_global(JitCompContext *cc, uint32 global_idx)
|
||||||
{
|
{
|
||||||
|
uint32 data_offset;
|
||||||
|
uint8 global_type = 0;
|
||||||
|
JitReg value = 0;
|
||||||
|
|
||||||
|
bh_assert(global_idx < cc->cur_wasm_module->import_global_count
|
||||||
|
+ cc->cur_wasm_module->global_count);
|
||||||
|
|
||||||
|
data_offset = get_global_data_offset(cc->cur_wasm_module, global_idx);
|
||||||
|
global_type = get_global_type(cc->cur_wasm_module, global_idx);
|
||||||
|
switch (global_type) {
|
||||||
|
case VALUE_TYPE_I32:
|
||||||
|
#if WASM_ENABLE_REF_TYPES != 0
|
||||||
|
case VALUE_TYPE_EXTERNREF:
|
||||||
|
case VALUE_TYPE_FUNCREF:
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
value = jit_cc_new_reg_I32(cc);
|
||||||
|
GEN_INSN(LDI32, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VALUE_TYPE_I64:
|
||||||
|
{
|
||||||
|
value = jit_cc_new_reg_I64(cc);
|
||||||
|
GEN_INSN(LDI64, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VALUE_TYPE_F32:
|
||||||
|
{
|
||||||
|
value = jit_cc_new_reg_F32(cc);
|
||||||
|
GEN_INSN(LDF32, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VALUE_TYPE_F64:
|
||||||
|
{
|
||||||
|
value = jit_cc_new_reg_F64(cc);
|
||||||
|
GEN_INSN(LDF64, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
jit_set_last_error(cc, "unexpected global type");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PUSH(value, global_type);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,5 +244,61 @@ bool
|
||||||
jit_compile_op_set_global(JitCompContext *cc, uint32 global_idx,
|
jit_compile_op_set_global(JitCompContext *cc, uint32 global_idx,
|
||||||
bool is_aux_stack)
|
bool is_aux_stack)
|
||||||
{
|
{
|
||||||
|
uint32 data_offset;
|
||||||
|
uint8 global_type = 0;
|
||||||
|
JitReg value = 0;
|
||||||
|
|
||||||
|
if (is_aux_stack) {
|
||||||
|
jit_set_last_error(cc, "doesn't support set global_aux_stack");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
bh_assert(global_idx < cc->cur_wasm_module->import_global_count
|
||||||
|
+ cc->cur_wasm_module->global_count);
|
||||||
|
|
||||||
|
data_offset = get_global_data_offset(cc->cur_wasm_module, global_idx);
|
||||||
|
global_type = get_global_type(cc->cur_wasm_module, global_idx);
|
||||||
|
switch (global_type) {
|
||||||
|
case VALUE_TYPE_I32:
|
||||||
|
#if WASM_ENABLE_REF_TYPES != 0
|
||||||
|
case VALUE_TYPE_EXTERNREF:
|
||||||
|
case VALUE_TYPE_FUNCREF:
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
POP_I32(value);
|
||||||
|
GEN_INSN(STI32, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VALUE_TYPE_I64:
|
||||||
|
{
|
||||||
|
POP_I64(value);
|
||||||
|
GEN_INSN(STI64, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VALUE_TYPE_F32:
|
||||||
|
{
|
||||||
|
POP_F32(value);
|
||||||
|
GEN_INSN(STF32, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case VALUE_TYPE_F64:
|
||||||
|
{
|
||||||
|
POP_F64(value);
|
||||||
|
GEN_INSN(STF64, value, get_global_data_reg(cc->jit_frame),
|
||||||
|
NEW_CONST(I32, data_offset));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
jit_set_last_error(cc, "unexpected global type");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,6 +204,10 @@ typedef struct WASMGlobalImport {
|
||||||
WASMModule *import_module;
|
WASMModule *import_module;
|
||||||
WASMGlobal *import_global_linked;
|
WASMGlobal *import_global_linked;
|
||||||
#endif
|
#endif
|
||||||
|
#if WASM_ENABLE_FAST_JIT != 0
|
||||||
|
/* The data offset of current global in global data */
|
||||||
|
uint32 data_offset;
|
||||||
|
#endif
|
||||||
} WASMGlobalImport;
|
} WASMGlobalImport;
|
||||||
|
|
||||||
typedef struct WASMImport {
|
typedef struct WASMImport {
|
||||||
|
@ -263,6 +267,10 @@ struct WASMGlobal {
|
||||||
uint8 type;
|
uint8 type;
|
||||||
bool is_mutable;
|
bool is_mutable;
|
||||||
InitializerExpression init_expr;
|
InitializerExpression init_expr;
|
||||||
|
#if WASM_ENABLE_FAST_JIT != 0
|
||||||
|
/* The data offset of current global in global data */
|
||||||
|
uint32 data_offset;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct WASMExport {
|
typedef struct WASMExport {
|
||||||
|
|
|
@ -2851,6 +2851,28 @@ fail:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WASM_ENABLE_FAST_JIT != 0
|
||||||
|
static void
|
||||||
|
calculate_global_data_offset(WASMModule *module)
|
||||||
|
{
|
||||||
|
uint32 i, data_offset;
|
||||||
|
|
||||||
|
data_offset = 0;
|
||||||
|
for (i = 0; i < module->import_global_count; i++) {
|
||||||
|
WASMGlobalImport *import_global =
|
||||||
|
&((module->import_globals + i)->u.global);
|
||||||
|
import_global->data_offset = data_offset;
|
||||||
|
data_offset += wasm_value_type_size(import_global->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < module->global_count; i++) {
|
||||||
|
WASMGlobal *global = module->globals + i;
|
||||||
|
global->data_offset = data_offset;
|
||||||
|
data_offset += wasm_value_type_size(global->type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
|
wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
|
||||||
uint32 cur_func_idx, char *error_buf,
|
uint32 cur_func_idx, char *error_buf,
|
||||||
|
@ -3239,6 +3261,8 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
||||||
}
|
}
|
||||||
|
|
||||||
#if WASM_ENABLE_FAST_JIT != 0
|
#if WASM_ENABLE_FAST_JIT != 0
|
||||||
|
calculate_global_data_offset(module);
|
||||||
|
|
||||||
if (!(module->fast_jit_func_ptrs =
|
if (!(module->fast_jit_func_ptrs =
|
||||||
loader_malloc(sizeof(void *) * module->function_count, error_buf,
|
loader_malloc(sizeof(void *) * module->function_count, error_buf,
|
||||||
error_buf_size))) {
|
error_buf_size))) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user