mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-07-15 08:48:33 +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:
|
||||
{
|
||||
a.ror(regs_i64[reg_no_dst], imm);
|
||||
a.rol(regs_i64[reg_no_dst], imm);
|
||||
break;
|
||||
}
|
||||
case ROTR:
|
||||
|
|
|
@ -167,6 +167,8 @@ jit_compile_op_call(JitCompContext *cc, uint32 func_idx, bool tail_call)
|
|||
3)) {
|
||||
return false;
|
||||
}
|
||||
/* Convert bool to uint32 */
|
||||
GEN_INSN(AND, native_ret, native_ret, NEW_CONST(I32, 0xFF));
|
||||
|
||||
/* Check whether there is exception thrown */
|
||||
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)) {
|
||||
return false;
|
||||
}
|
||||
/* Convert bool to uint32 */
|
||||
GEN_INSN(AND, native_ret, native_ret, NEW_CONST(I32, 0xFF));
|
||||
|
||||
/* Check whether there is exception thrown */
|
||||
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)) {
|
||||
goto fail;
|
||||
}
|
||||
/* Convert bool to uint32 */
|
||||
GEN_INSN(AND, grow_res, grow_res, NEW_CONST(I32, 0xFF));
|
||||
|
||||
/* Check if enlarge memory success */
|
||||
res = jit_cc_new_reg_I32(cc);
|
||||
|
|
|
@ -1050,10 +1050,14 @@ do_i64_const_shru(int64 lhs, int64 rhs)
|
|||
return (uint64)lhs >> rhs;
|
||||
}
|
||||
|
||||
typedef enum { SHL, SHRS, SHRU, ROTL, ROTR } SHIFT_OP;
|
||||
|
||||
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;
|
||||
|
||||
if (jit_reg_is_const(rhs)) {
|
||||
if (is_i32) {
|
||||
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 {
|
||||
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);
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -1101,7 +1111,7 @@ compile_int_shl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
|||
JitInsn *insn = NULL;
|
||||
#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);
|
||||
if (res)
|
||||
|
@ -1132,7 +1142,7 @@ compile_int_shrs(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
|||
JitInsn *insn = NULL;
|
||||
#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);
|
||||
if (res)
|
||||
|
@ -1163,7 +1173,7 @@ compile_int_shru(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
|||
JitInsn *insn = NULL;
|
||||
#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);
|
||||
if (res)
|
||||
|
@ -1225,7 +1235,7 @@ compile_int_rotl(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
|||
JitInsn *insn = NULL;
|
||||
#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);
|
||||
if (res)
|
||||
|
@ -1287,7 +1297,7 @@ compile_int_rotr(JitCompContext *cc, JitReg left, JitReg right, bool is_i32)
|
|||
JitInsn *insn = NULL;
|
||||
#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);
|
||||
if (res)
|
||||
|
|
|
@ -3261,9 +3261,10 @@ load_from_sections(WASMModule *module, WASMSection *sections,
|
|||
#if WASM_ENABLE_FAST_JIT != 0
|
||||
calculate_global_data_offset(module);
|
||||
|
||||
if (!(module->fast_jit_func_ptrs =
|
||||
loader_malloc(sizeof(void *) * module->function_count, error_buf,
|
||||
error_buf_size))) {
|
||||
if (module->function_count
|
||||
&& !(module->fast_jit_func_ptrs =
|
||||
loader_malloc(sizeof(void *) * module->function_count,
|
||||
error_buf, error_buf_size))) {
|
||||
return false;
|
||||
}
|
||||
if (!jit_compiler_compile_all(module)) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user