aboutsummaryrefslogtreecommitdiff
path: root/src/lj_asm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_asm.c')
-rw-r--r--src/lj_asm.c31
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). */
707static void ra_destpair(ASMState *as, IRIns *ir) 707static 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: