mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-07-15 16:58:34 +00:00
Fix fast jit issues
This commit is contained in:
parent
71c4465283
commit
001571a370
|
@ -3958,7 +3958,7 @@ shift_r_imm_to_r_i64(x86::Assembler &a, SHIFT_OP op, int32 reg_no_dst,
|
||||||
}
|
}
|
||||||
case ROTL:
|
case ROTL:
|
||||||
{
|
{
|
||||||
a.ror(regs_i64[reg_no_dst], imm);
|
a.rol(regs_i64[reg_no_dst], imm);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ROTR:
|
case ROTR:
|
||||||
|
|
|
@ -167,6 +167,8 @@ jit_compile_op_call(JitCompContext *cc, uint32 func_idx, bool tail_call)
|
||||||
3)) {
|
3)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/* Convert bool to uint32 */
|
||||||
|
GEN_INSN(AND, native_ret, native_ret, NEW_CONST(I32, 0xFF));
|
||||||
|
|
||||||
/* Check whether there is exception thrown */
|
/* Check whether there is exception thrown */
|
||||||
GEN_INSN(CMP, cc->cmp_reg, native_ret, NEW_CONST(I32, 0));
|
GEN_INSN(CMP, cc->cmp_reg, native_ret, NEW_CONST(I32, 0));
|
||||||
|
@ -339,6 +341,8 @@ jit_compile_op_call_indirect(JitCompContext *cc, uint32 type_idx,
|
||||||
if (!jit_emit_callnative(cc, jit_call_indirect, native_ret, arg_regs, 6)) {
|
if (!jit_emit_callnative(cc, jit_call_indirect, native_ret, arg_regs, 6)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
/* Convert bool to uint32 */
|
||||||
|
GEN_INSN(AND, native_ret, native_ret, NEW_CONST(I32, 0xFF));
|
||||||
|
|
||||||
/* Check whether there is exception thrown */
|
/* Check whether there is exception thrown */
|
||||||
GEN_INSN(CMP, cc->cmp_reg, native_ret, NEW_CONST(I32, 0));
|
GEN_INSN(CMP, cc->cmp_reg, native_ret, NEW_CONST(I32, 0));
|
||||||
|
|
|
@ -507,6 +507,8 @@ jit_compile_op_memory_grow(JitCompContext *cc, uint32 mem_idx)
|
||||||
if (!jit_emit_callnative(cc, wasm_enlarge_memory, grow_res, args, 2)) {
|
if (!jit_emit_callnative(cc, wasm_enlarge_memory, grow_res, args, 2)) {
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
/* Convert bool to uint32 */
|
||||||
|
GEN_INSN(AND, grow_res, grow_res, NEW_CONST(I32, 0xFF));
|
||||||
|
|
||||||
/* Check if enlarge memory success */
|
/* Check if enlarge memory success */
|
||||||
res = jit_cc_new_reg_I32(cc);
|
res = jit_cc_new_reg_I32(cc);
|
||||||
|
|
|
@ -1050,10 +1050,14 @@ do_i64_const_shru(int64 lhs, int64 rhs)
|
||||||
return (uint64)lhs >> rhs;
|
return (uint64)lhs >> rhs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef enum { SHL, SHRS, SHRU, ROTL, ROTR } SHIFT_OP;
|
||||||
|
|
||||||
static JitReg
|
static JitReg
|
||||||
compile_int_shift_modulo(JitCompContext *cc, JitReg rhs, bool is_i32)
|
compile_int_shift_modulo(JitCompContext *cc, JitReg rhs, bool is_i32,
|
||||||
|
SHIFT_OP op)
|
||||||
{
|
{
|
||||||
JitReg res;
|
JitReg res;
|
||||||
|
|
||||||
if (jit_reg_is_const(rhs)) {
|
if (jit_reg_is_const(rhs)) {
|
||||||
if (is_i32) {
|
if (is_i32) {
|
||||||
int32 val = jit_cc_get_const_I32(cc, rhs);
|
int32 val = jit_cc_get_const_I32(cc, rhs);
|
||||||
|
@ -1067,7 +1071,12 @@ compile_int_shift_modulo(JitCompContext *cc, JitReg rhs, bool is_i32)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (is_i32) {
|
if (op == ROTL || op == ROTR) {
|
||||||
|
/* No need to generate AND insn as the result
|
||||||
|
is same for rotate shift */
|
||||||
|
res = rhs;
|
||||||
|
}
|
||||||
|
else if (is_i32) {
|
||||||
res = jit_cc_new_reg_I32(cc);
|
res = jit_cc_new_reg_I32(cc);
|
||||||
GEN_INSN(AND, res, rhs, NEW_CONST(I32, 0x1f));
|
GEN_INSN(AND, res, rhs, NEW_CONST(I32, 0x1f));
|
||||||
}
|
}
|
||||||
|
@ -1076,6 +1085,7 @@ compile_int_shift_modulo(JitCompContext *cc, JitReg rhs, bool is_i32)
|
||||||
GEN_INSN(AND, res, rhs, NEW_CONST(I64, 0x3f));
|
GEN_INSN(AND, res, rhs, NEW_CONST(I64, 0x3f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1101,7 +1111,7 @@ compile_int_shl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
||||||
JitInsn *insn = NULL;
|
JitInsn *insn = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
right = compile_int_shift_modulo(cc, right, is_i32);
|
right = compile_int_shift_modulo(cc, right, is_i32, SHL);
|
||||||
|
|
||||||
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, shl);
|
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, shl);
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -1132,7 +1142,7 @@ compile_int_shrs(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
||||||
JitInsn *insn = NULL;
|
JitInsn *insn = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
right = compile_int_shift_modulo(cc, right, is_i32);
|
right = compile_int_shift_modulo(cc, right, is_i32, SHRS);
|
||||||
|
|
||||||
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, shrs);
|
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, shrs);
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -1163,7 +1173,7 @@ compile_int_shru(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
||||||
JitInsn *insn = NULL;
|
JitInsn *insn = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
right = compile_int_shift_modulo(cc, right, is_i32);
|
right = compile_int_shift_modulo(cc, right, is_i32, SHRU);
|
||||||
|
|
||||||
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, shru);
|
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, shru);
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -1225,7 +1235,7 @@ compile_int_rotl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
||||||
JitInsn *insn = NULL;
|
JitInsn *insn = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
right = compile_int_shift_modulo(cc, right, is_i32);
|
right = compile_int_shift_modulo(cc, right, is_i32, ROTL);
|
||||||
|
|
||||||
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, rotl);
|
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, rotl);
|
||||||
if (res)
|
if (res)
|
||||||
|
@ -1287,7 +1297,7 @@ compile_int_rotr(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
||||||
JitInsn *insn = NULL;
|
JitInsn *insn = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
right = compile_int_shift_modulo(cc, right, is_i32);
|
right = compile_int_shift_modulo(cc, right, is_i32, ROTR);
|
||||||
|
|
||||||
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, rotr);
|
res = CHECK_AND_PROCESS_INT_CONSTS(cc, left, right, is_i32, rotr);
|
||||||
if (res)
|
if (res)
|
||||||
|
|
|
@ -3261,9 +3261,10 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
||||||
#if WASM_ENABLE_FAST_JIT != 0
|
#if WASM_ENABLE_FAST_JIT != 0
|
||||||
calculate_global_data_offset(module);
|
calculate_global_data_offset(module);
|
||||||
|
|
||||||
if (!(module->fast_jit_func_ptrs =
|
if (module->function_count
|
||||||
loader_malloc(sizeof(void *) * module->function_count, error_buf,
|
&& !(module->fast_jit_func_ptrs =
|
||||||
error_buf_size))) {
|
loader_malloc(sizeof(void *) * module->function_count,
|
||||||
|
error_buf, error_buf_size))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!jit_compiler_compile_all(module)) {
|
if (!jit_compiler_compile_all(module)) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user