diff options
-rw-r--r-- | src/lj_asm.c | 1 | ||||
-rw-r--r-- | src/lj_asm_arm.h | 9 |
2 files changed, 7 insertions, 3 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index 426730be..8deddd65 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -644,6 +644,7 @@ static void ra_destreg(ASMState *as, IRIns *ir, Reg r) | |||
644 | { | 644 | { |
645 | Reg dest = ra_dest(as, ir, RID2RSET(r)); | 645 | Reg dest = ra_dest(as, ir, RID2RSET(r)); |
646 | if (dest != r) { | 646 | if (dest != r) { |
647 | lua_assert(rset_test(as->freeset, r)); | ||
647 | ra_modified(as, r); | 648 | ra_modified(as, r); |
648 | emit_movrr(as, ir, dest, r); | 649 | emit_movrr(as, ir, dest, r); |
649 | } | 650 | } |
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index e865850d..f307d6b8 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h | |||
@@ -2102,9 +2102,12 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
2102 | if (ra_hasspill(irp->s)) { | 2102 | if (ra_hasspill(irp->s)) { |
2103 | rset_clear(allow, ra_dest(as, ir, allow)); | 2103 | rset_clear(allow, ra_dest(as, ir, allow)); |
2104 | } else { | 2104 | } else { |
2105 | lua_assert(ra_hasreg(irp->r)); | 2105 | Reg r = irp->r; |
2106 | rset_clear(allow, irp->r); | 2106 | lua_assert(ra_hasreg(r)); |
2107 | ra_destreg(as, ir, irp->r); | 2107 | rset_clear(allow, r); |
2108 | if (r != ir->r && !rset_test(as->freeset, r)) | ||
2109 | ra_restore(as, regcost_ref(as->cost[r])); | ||
2110 | ra_destreg(as, ir, r); | ||
2108 | } | 2111 | } |
2109 | return allow; | 2112 | return allow; |
2110 | } | 2113 | } |