diff options
| author | Mike Pall <mike> | 2011-05-31 21:50:14 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-05-31 21:50:14 +0200 |
| commit | 2d0b32500ead55d9dc141e0328b9994db380fb18 (patch) | |
| tree | b981332700bf50763a8551359c4ec2a810c52a49 /src | |
| parent | 865ec114a7e9aedb5d728106883717167fd9d7c0 (diff) | |
| download | luajit-2d0b32500ead55d9dc141e0328b9994db380fb18.tar.gz luajit-2d0b32500ead55d9dc141e0328b9994db380fb18.tar.bz2 luajit-2d0b32500ead55d9dc141e0328b9994db380fb18.zip | |
ARM: Tune rematerialization scheduler.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_asm.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index f88b1a5b..0402bf7a 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
| @@ -121,6 +121,24 @@ static LJ_NORET LJ_NOINLINE void asm_mclimit(ASMState *as) | |||
| 121 | lj_mcode_limiterr(as->J, (size_t)(as->mctop - as->mcp + 4*MCLIM_REDZONE)); | 121 | lj_mcode_limiterr(as->J, (size_t)(as->mctop - as->mcp + 4*MCLIM_REDZONE)); |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | #ifdef RID_NUM_KREF | ||
| 125 | #define ra_iskref(ref) ((ref) < RID_NUM_KREF) | ||
| 126 | #define ra_krefreg(ref) ((Reg)(RID_MIN_KREF + (Reg)(ref))) | ||
| 127 | #define ra_krefk(as, ref) (as->krefk[(ref)]) | ||
| 128 | |||
| 129 | static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k) | ||
| 130 | { | ||
| 131 | IRRef ref = (IRRef)(r - RID_MIN_KREF); | ||
| 132 | as->krefk[ref] = k; | ||
| 133 | as->cost[r] = REGCOST(ref, ref); | ||
| 134 | } | ||
| 135 | |||
| 136 | #else | ||
| 137 | #define ra_iskref(ref) 0 | ||
| 138 | #define ra_krefreg(ref) RID_MIN_GPR | ||
| 139 | #define ra_krefk(as, ref) 0 | ||
| 140 | #endif | ||
| 141 | |||
| 124 | /* Arch-specific field offsets. */ | 142 | /* Arch-specific field offsets. */ |
| 125 | static const uint8_t field_ofs[IRFL__MAX+1] = { | 143 | static const uint8_t field_ofs[IRFL__MAX+1] = { |
| 126 | #define FLOFS(name, ofs) (uint8_t)(ofs), | 144 | #define FLOFS(name, ofs) (uint8_t)(ofs), |
| @@ -258,24 +276,6 @@ static void ra_dprintf(ASMState *as, const char *fmt, ...) | |||
| 258 | 276 | ||
| 259 | #define ra_used(ir) (ra_hasreg((ir)->r) || ra_hasspill((ir)->s)) | 277 | #define ra_used(ir) (ra_hasreg((ir)->r) || ra_hasspill((ir)->s)) |
| 260 | 278 | ||
| 261 | #ifdef RID_NUM_KREF | ||
| 262 | #define ra_iskref(ref) ((ref) < RID_NUM_KREF) | ||
| 263 | #define ra_krefreg(ref) ((Reg)(RID_MIN_KREF + (Reg)(ref))) | ||
| 264 | #define ra_krefk(as, ref) (as->krefk[(ref)]) | ||
| 265 | |||
| 266 | static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k) | ||
| 267 | { | ||
| 268 | IRRef ref = (IRRef)(r - RID_MIN_KREF); | ||
| 269 | as->krefk[ref] = k; | ||
| 270 | as->cost[r] = REGCOST(ref, ref); | ||
| 271 | } | ||
| 272 | |||
| 273 | #else | ||
| 274 | #define ra_iskref(ref) 0 | ||
| 275 | #define ra_krefreg(ref) RID_MIN_GPR | ||
| 276 | #define ra_krefk(as, ref) 0 | ||
| 277 | #endif | ||
| 278 | |||
| 279 | /* Setup register allocator. */ | 279 | /* Setup register allocator. */ |
| 280 | static void ra_setup(ASMState *as) | 280 | static void ra_setup(ASMState *as) |
| 281 | { | 281 | { |
| @@ -475,7 +475,7 @@ static void ra_evictk(ASMState *as) | |||
| 475 | static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) | 475 | static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) |
| 476 | { | 476 | { |
| 477 | /* First try to find a register which already holds the same constant. */ | 477 | /* First try to find a register which already holds the same constant. */ |
| 478 | RegSet work = ~as->freeset & RSET_GPR; | 478 | RegSet pick, work = ~as->freeset & RSET_GPR; |
| 479 | Reg r; | 479 | Reg r; |
| 480 | while (work) { | 480 | while (work) { |
| 481 | IRRef ref; | 481 | IRRef ref; |
| @@ -486,11 +486,15 @@ static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) | |||
| 486 | return r; | 486 | return r; |
| 487 | rset_clear(work, r); | 487 | rset_clear(work, r); |
| 488 | } | 488 | } |
| 489 | work = as->freeset & allow; | 489 | pick = as->freeset & allow; |
| 490 | if (work) | 490 | if (pick) { |
| 491 | r = rset_picktop(work); | 491 | /* Constants should preferably get unmodified registers. */ |
| 492 | else | 492 | if ((pick & ~as->modset)) |
| 493 | pick &= ~as->modset; | ||
| 494 | r = rset_pickbot(pick); /* Reduce conflicts with inverse allocation. */ | ||
| 495 | } else { | ||
| 493 | r = ra_evict(as, allow); | 496 | r = ra_evict(as, allow); |
| 497 | } | ||
| 494 | RA_DBGX((as, "allock $x $r", k, r)); | 498 | RA_DBGX((as, "allock $x $r", k, r)); |
| 495 | ra_setkref(as, r, k); | 499 | ra_setkref(as, r, k); |
| 496 | rset_clear(as->freeset, r); | 500 | rset_clear(as->freeset, r); |
