From 167f638f91a4ff186ffa6ef8a8915422ea52f38b Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 24 Oct 2011 16:21:11 +0200 Subject: [PATCH] PPC: Generalize rematerialization handling. --- src/lj_asm.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/lj_asm.c b/src/lj_asm.c index 0c794ebb..7ee9fd2f 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -460,7 +460,20 @@ static void ra_evictset(ASMState *as, RegSet drop) /* Evict (rematerialize) all registers allocated to constants. */ static void ra_evictk(ASMState *as) { - RegSet work = ~as->freeset & RSET_ALL; + RegSet work; +#if !LJ_SOFTFP + work = ~as->freeset & RSET_FPR; + while (work) { + Reg r = rset_pickbot(work); + IRRef ref = regcost_ref(as->cost[r]); + if (emit_canremat(ref) && irref_isk(ref)) { + ra_rematk(as, ref); + checkmclim(as); + } + rset_clear(work, r); + } +#endif + work = ~as->freeset & RSET_GPR; while (work) { Reg r = rset_pickbot(work); IRRef ref = regcost_ref(as->cost[r]); @@ -483,7 +496,7 @@ static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) IRRef ref; r = rset_pickbot(work); ref = regcost_ref(as->cost[r]); - if (emit_canremat(ref) && + if (ref < ASMREF_L && k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i)) return r; rset_clear(work, r);