diff options
Diffstat (limited to 'src')
| -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 | } |
