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 /src | |
parent | 2ac083cb5a0ce5f24fb1182eacf14438bb45e7ba (diff) | |
download | luajit-1481263aaa5630e6557f094e7d875fe28874870d.tar.gz luajit-1481263aaa5630e6557f094e7d875fe28874870d.tar.bz2 luajit-1481263aaa5630e6557f094e7d875fe28874870d.zip |
ARM, MIPS, PPC: Rematerialize FPR invariants first.
Diffstat (limited to 'src')
-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); |