diff options
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r-- | src/lj_asm.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index b12b7466..4187a1d9 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -703,14 +703,14 @@ static void ra_leftov(ASMState *as, Reg dest, IRRef lref) | |||
703 | #endif | 703 | #endif |
704 | 704 | ||
705 | #if !LJ_TARGET_X86ORX64 | 705 | #if !LJ_TARGET_X86ORX64 |
706 | /* Force a RID_RET/RID_RETHI destination register pair (marked as free). */ | 706 | /* Force a RID_RETLO/RID_RETHI destination register pair (marked as free). */ |
707 | static void ra_destpair(ASMState *as, IRIns *ir) | 707 | static void ra_destpair(ASMState *as, IRIns *ir) |
708 | { | 708 | { |
709 | Reg destlo = ir->r, desthi = (ir+1)->r; | 709 | Reg destlo = ir->r, desthi = (ir+1)->r; |
710 | /* First spill unrelated refs blocking the destination registers. */ | 710 | /* First spill unrelated refs blocking the destination registers. */ |
711 | if (!rset_test(as->freeset, RID_RET) && | 711 | if (!rset_test(as->freeset, RID_RETLO) && |
712 | destlo != RID_RET && desthi != RID_RET) | 712 | destlo != RID_RETLO && desthi != RID_RETLO) |
713 | ra_restore(as, regcost_ref(as->cost[RID_RET])); | 713 | ra_restore(as, regcost_ref(as->cost[RID_RETLO])); |
714 | if (!rset_test(as->freeset, RID_RETHI) && | 714 | if (!rset_test(as->freeset, RID_RETHI) && |
715 | destlo != RID_RETHI && desthi != RID_RETHI) | 715 | destlo != RID_RETHI && desthi != RID_RETHI) |
716 | ra_restore(as, regcost_ref(as->cost[RID_RETHI])); | 716 | ra_restore(as, regcost_ref(as->cost[RID_RETHI])); |
@@ -719,7 +719,7 @@ static void ra_destpair(ASMState *as, IRIns *ir) | |||
719 | ra_free(as, destlo); | 719 | ra_free(as, destlo); |
720 | ra_modified(as, destlo); | 720 | ra_modified(as, destlo); |
721 | } else { | 721 | } else { |
722 | destlo = RID_RET; | 722 | destlo = RID_RETLO; |
723 | } | 723 | } |
724 | if (ra_hasreg(desthi)) { | 724 | if (ra_hasreg(desthi)) { |
725 | ra_free(as, desthi); | 725 | ra_free(as, desthi); |
@@ -729,24 +729,24 @@ static void ra_destpair(ASMState *as, IRIns *ir) | |||
729 | } | 729 | } |
730 | /* Check for conflicts and shuffle the registers as needed. */ | 730 | /* Check for conflicts and shuffle the registers as needed. */ |
731 | if (destlo == RID_RETHI) { | 731 | if (destlo == RID_RETHI) { |
732 | if (desthi == RID_RET) { | 732 | if (desthi == RID_RETLO) { |
733 | emit_movrr(as, ir, RID_RETHI, RID_TMP); | 733 | emit_movrr(as, ir, RID_RETHI, RID_TMP); |
734 | emit_movrr(as, ir, RID_RET, RID_RETHI); | 734 | emit_movrr(as, ir, RID_RETLO, RID_RETHI); |
735 | emit_movrr(as, ir, RID_TMP, RID_RET); | 735 | emit_movrr(as, ir, RID_TMP, RID_RETLO); |
736 | } else { | 736 | } else { |
737 | emit_movrr(as, ir, RID_RETHI, RID_RET); | 737 | emit_movrr(as, ir, RID_RETHI, RID_RETLO); |
738 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); | 738 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); |
739 | } | 739 | } |
740 | } else if (desthi == RID_RET) { | 740 | } else if (desthi == RID_RETLO) { |
741 | emit_movrr(as, ir, RID_RET, RID_RETHI); | 741 | emit_movrr(as, ir, RID_RETLO, RID_RETHI); |
742 | if (destlo != RID_RET) emit_movrr(as, ir, destlo, RID_RET); | 742 | if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO); |
743 | } else { | 743 | } else { |
744 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); | 744 | if (desthi != RID_RETHI) emit_movrr(as, ir, desthi, RID_RETHI); |
745 | if (destlo != RID_RET) emit_movrr(as, ir, destlo, RID_RET); | 745 | if (destlo != RID_RETLO) emit_movrr(as, ir, destlo, RID_RETLO); |
746 | } | 746 | } |
747 | /* Restore spill slots (if any). */ | 747 | /* Restore spill slots (if any). */ |
748 | if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI); | 748 | if (ra_hasspill((ir+1)->s)) ra_save(as, ir+1, RID_RETHI); |
749 | if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RET); | 749 | if (ra_hasspill(ir->s)) ra_save(as, ir, RID_RETLO); |
750 | } | 750 | } |
751 | #endif | 751 | #endif |
752 | 752 | ||
@@ -1520,6 +1520,9 @@ static void asm_setup_regsp(ASMState *as) | |||
1520 | #if LJ_SOFTFP | 1520 | #if LJ_SOFTFP |
1521 | case IR_MIN: case IR_MAX: | 1521 | case IR_MIN: case IR_MAX: |
1522 | #endif | 1522 | #endif |
1523 | #if LJ_BE | ||
1524 | (ir-1)->prev = REGSP_HINT(RID_RETLO); | ||
1525 | #endif | ||
1523 | ir->prev = REGSP_HINT(RID_RETHI); | 1526 | ir->prev = REGSP_HINT(RID_RETHI); |
1524 | continue; | 1527 | continue; |
1525 | default: | 1528 | default: |