diff options
| author | Mike Pall <mike> | 2012-08-19 18:42:08 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2012-08-19 18:42:08 +0200 |
| commit | 1481263aaa5630e6557f094e7d875fe28874870d (patch) | |
| tree | b7a88009592eaafb2c807359e0fc14123b21495c | |
| parent | 2ac083cb5a0ce5f24fb1182eacf14438bb45e7ba (diff) | |
| download | luajit-1481263aaa5630e6557f094e7d875fe28874870d.tar.gz luajit-1481263aaa5630e6557f094e7d875fe28874870d.tar.bz2 luajit-1481263aaa5630e6557f094e7d875fe28874870d.zip | |
ARM, MIPS, PPC: Rematerialize FPR invariants first.
| -rw-r--r-- | src/lj_asm.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index 8d2cafb3..426730be 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -451,7 +451,7 @@ static void ra_evictset(ASMState *as, RegSet drop) | |||
| 451 | checkmclim(as); | 451 | checkmclim(as); |
| 452 | } | 452 | } |
| 453 | #endif | 453 | #endif |
| 454 | work = (drop & ~as->freeset) & RSET_GPR; | 454 | work = (drop & ~as->freeset); |
| 455 | while (work) { | 455 | while (work) { |
| 456 | Reg r = rset_pickbot(work); | 456 | Reg r = rset_pickbot(work); |
| 457 | ra_restore(as, regcost_ref(as->cost[r])); | 457 | ra_restore(as, regcost_ref(as->cost[r])); |
| @@ -644,7 +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 | ra_scratch(as, RID2RSET(r)); | 647 | ra_modified(as, r); |
| 648 | emit_movrr(as, ir, dest, r); | 648 | emit_movrr(as, ir, dest, r); |
| 649 | } | 649 | } |
| 650 | } | 650 | } |
| @@ -1110,6 +1110,15 @@ static void asm_phi_shuffle(ASMState *as) | |||
| 1110 | } | 1110 | } |
| 1111 | 1111 | ||
| 1112 | /* Restore/remat invariants whose registers are modified inside the loop. */ | 1112 | /* Restore/remat invariants whose registers are modified inside the loop. */ |
| 1113 | #if !LJ_SOFTFP | ||
| 1114 | work = as->modset & ~(as->freeset | as->phiset) & RSET_FPR; | ||
| 1115 | while (work) { | ||
| 1116 | Reg r = rset_pickbot(work); | ||
| 1117 | ra_restore(as, regcost_ref(as->cost[r])); | ||
| 1118 | rset_clear(work, r); | ||
| 1119 | checkmclim(as); | ||
| 1120 | } | ||
| 1121 | #endif | ||
| 1113 | work = as->modset & ~(as->freeset | as->phiset); | 1122 | work = as->modset & ~(as->freeset | as->phiset); |
| 1114 | while (work) { | 1123 | while (work) { |
| 1115 | Reg r = rset_pickbot(work); | 1124 | Reg r = rset_pickbot(work); |
