Skip to content

Commit 0ab070a

Browse files
authored
Fix fast jit issues (#1223)
Fix br if not clear_value issue Fix i64.DIV/REM issue: i64 result rax/rdx may be overwritten by following i32 load eax/edx
1 parent b84f117 commit 0ab070a

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

core/iwasm/fast-jit/fe/jit_emit_control.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,7 @@ jit_compile_op_br_if(JitCompContext *cc, uint32 br_depth, uint8 **p_frame_ip)
899899
SET_BUILDER_POS(if_basic_block);
900900
SET_BB_BEGIN_BCIP(if_basic_block, *p_frame_ip - 1);
901901

902+
clear_values(cc->jit_frame);
902903
if (!handle_op_br(cc, br_depth, p_frame_ip))
903904
goto fail;
904905

core/iwasm/fast-jit/fe/jit_emit_numberic.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -512,57 +512,75 @@ compile_int_div_no_check(JitCompContext *cc, IntArithmetic arith_op,
512512
case INT_DIV_S:
513513
case INT_DIV_U:
514514
{
515-
JitInsn *insn = NULL;
515+
JitInsn *insn = NULL, *insn1 = NULL;
516516

517517
if (is_i32) {
518518
GEN_INSN(MOV, eax_hreg, left);
519519
if (arith_op == INT_DIV_S)
520520
insn = GEN_INSN(DIV_S, eax_hreg, eax_hreg, right);
521521
else
522522
insn = GEN_INSN(DIV_U, eax_hreg, eax_hreg, right);
523-
524-
res = eax_hreg;
525523
}
526524
else {
527525
GEN_INSN(MOV, rax_hreg, left);
528526
if (arith_op == INT_DIV_S)
529527
insn = GEN_INSN(DIV_S, rax_hreg, rax_hreg, right);
530528
else
531529
insn = GEN_INSN(DIV_U, rax_hreg, rax_hreg, right);
532-
533-
res = rax_hreg;
534530
}
535531

536532
jit_lock_reg_in_insn(cc, insn, eax_hreg);
537533
jit_lock_reg_in_insn(cc, insn, edx_hreg);
534+
535+
if (is_i32) {
536+
res = jit_cc_new_reg_I32(cc);
537+
insn1 = jit_insn_new_MOV(res, eax_hreg);
538+
}
539+
else {
540+
res = jit_cc_new_reg_I64(cc);
541+
insn1 = jit_insn_new_MOV(res, rax_hreg);
542+
}
543+
544+
if (insn && insn1) {
545+
jit_insn_insert_after(insn, insn1);
546+
}
538547
break;
539548
}
540549
case INT_REM_S:
541550
case INT_REM_U:
542551
{
543-
JitInsn *insn = NULL;
552+
JitInsn *insn = NULL, *insn1 = NULL;
544553

545554
if (is_i32) {
546555
GEN_INSN(MOV, eax_hreg, left);
547556
if (arith_op == INT_REM_S)
548557
insn = GEN_INSN(REM_S, edx_hreg, eax_hreg, right);
549558
else
550559
insn = GEN_INSN(REM_U, edx_hreg, eax_hreg, right);
551-
552-
res = edx_hreg;
553560
}
554561
else {
555562
GEN_INSN(MOV, rax_hreg, left);
556563
if (arith_op == INT_REM_S)
557564
insn = GEN_INSN(REM_S, rdx_hreg, rax_hreg, right);
558565
else
559566
insn = GEN_INSN(REM_U, rdx_hreg, rax_hreg, right);
560-
561-
res = rdx_hreg;
562567
}
563568

564569
jit_lock_reg_in_insn(cc, insn, eax_hreg);
565570
jit_lock_reg_in_insn(cc, insn, edx_hreg);
571+
572+
if (is_i32) {
573+
res = jit_cc_new_reg_I32(cc);
574+
insn1 = jit_insn_new_MOV(res, edx_hreg);
575+
}
576+
else {
577+
res = jit_cc_new_reg_I64(cc);
578+
insn1 = jit_insn_new_MOV(res, rdx_hreg);
579+
}
580+
581+
if (insn && insn1) {
582+
jit_insn_insert_after(insn, insn1);
583+
}
566584
break;
567585
}
568586
#else

0 commit comments

Comments
 (0)