diff options
author | Mike Pall <mike> | 2016-11-21 15:43:17 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2016-11-21 15:43:17 +0100 |
commit | a56654460d9ca636536c8204a358207a698e625b (patch) | |
tree | ec3d63c61cfcc4f6054f0abf87dd706a3c95e110 /src | |
parent | 2b77da35bc77e2d34062d9168884095d9145a993 (diff) | |
download | luajit-a56654460d9ca636536c8204a358207a698e625b.tar.gz luajit-a56654460d9ca636536c8204a358207a698e625b.tar.bz2 luajit-a56654460d9ca636536c8204a358207a698e625b.zip |
Generalize deferred constant handling in backend to 64 bit.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_asm.c | 34 | ||||
-rw-r--r-- | src/lj_emit_arm.h | 2 | ||||
-rw-r--r-- | src/lj_emit_mips.h | 4 | ||||
-rw-r--r-- | src/lj_emit_ppc.h | 2 |
4 files changed, 34 insertions, 8 deletions
diff --git a/src/lj_asm.c b/src/lj_asm.c index 2cb5abea..f0a11ca8 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c | |||
@@ -91,7 +91,7 @@ typedef struct ASMState { | |||
91 | MCode *realign; /* Realign loop if not NULL. */ | 91 | MCode *realign; /* Realign loop if not NULL. */ |
92 | 92 | ||
93 | #ifdef RID_NUM_KREF | 93 | #ifdef RID_NUM_KREF |
94 | int32_t krefk[RID_NUM_KREF]; | 94 | intptr_t krefk[RID_NUM_KREF]; |
95 | #endif | 95 | #endif |
96 | IRRef1 phireg[RID_MAX]; /* PHI register references. */ | 96 | IRRef1 phireg[RID_MAX]; /* PHI register references. */ |
97 | uint16_t parentmap[LJ_MAX_JSLOTS]; /* Parent instruction to RegSP map. */ | 97 | uint16_t parentmap[LJ_MAX_JSLOTS]; /* Parent instruction to RegSP map. */ |
@@ -144,7 +144,7 @@ static LJ_AINLINE void checkmclim(ASMState *as) | |||
144 | #define ra_krefreg(ref) ((Reg)(RID_MIN_KREF + (Reg)(ref))) | 144 | #define ra_krefreg(ref) ((Reg)(RID_MIN_KREF + (Reg)(ref))) |
145 | #define ra_krefk(as, ref) (as->krefk[(ref)]) | 145 | #define ra_krefk(as, ref) (as->krefk[(ref)]) |
146 | 146 | ||
147 | static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, int32_t k) | 147 | static LJ_AINLINE void ra_setkref(ASMState *as, Reg r, intptr_t k) |
148 | { | 148 | { |
149 | IRRef ref = (IRRef)(r - RID_MIN_KREF); | 149 | IRRef ref = (IRRef)(r - RID_MIN_KREF); |
150 | as->krefk[ref] = k; | 150 | as->krefk[ref] = k; |
@@ -324,7 +324,11 @@ static Reg ra_rematk(ASMState *as, IRRef ref) | |||
324 | lua_assert(!rset_test(as->freeset, r)); | 324 | lua_assert(!rset_test(as->freeset, r)); |
325 | ra_free(as, r); | 325 | ra_free(as, r); |
326 | ra_modified(as, r); | 326 | ra_modified(as, r); |
327 | #if LJ_64 | ||
328 | emit_loadu64(as, r, ra_krefk(as, ref)); | ||
329 | #else | ||
327 | emit_loadi(as, r, ra_krefk(as, ref)); | 330 | emit_loadi(as, r, ra_krefk(as, ref)); |
331 | #endif | ||
328 | return r; | 332 | return r; |
329 | } | 333 | } |
330 | ir = IR(ref); | 334 | ir = IR(ref); |
@@ -526,7 +530,7 @@ static void ra_evictk(ASMState *as) | |||
526 | 530 | ||
527 | #ifdef RID_NUM_KREF | 531 | #ifdef RID_NUM_KREF |
528 | /* Allocate a register for a constant. */ | 532 | /* Allocate a register for a constant. */ |
529 | static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) | 533 | static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow) |
530 | { | 534 | { |
531 | /* First try to find a register which already holds the same constant. */ | 535 | /* First try to find a register which already holds the same constant. */ |
532 | RegSet pick, work = ~as->freeset & RSET_GPR; | 536 | RegSet pick, work = ~as->freeset & RSET_GPR; |
@@ -535,9 +539,31 @@ static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) | |||
535 | IRRef ref; | 539 | IRRef ref; |
536 | r = rset_pickbot(work); | 540 | r = rset_pickbot(work); |
537 | ref = regcost_ref(as->cost[r]); | 541 | ref = regcost_ref(as->cost[r]); |
542 | #if LJ_64 | ||
543 | if (ref < ASMREF_L) { | ||
544 | if (ra_iskref(ref)) { | ||
545 | if (k == ra_krefk(as, ref)) | ||
546 | return r; | ||
547 | } else { | ||
548 | IRIns *ir = IR(ref); | ||
549 | if ((ir->o == IR_KINT64 && k == (int64_t)ir_kint64(ir)->u64) || | ||
550 | #if LJ_GC64 | ||
551 | (ir->o == IR_KINT && k == ir->i) || | ||
552 | (ir->o == IR_KGC && k == (intptr_t)ir_kgc(ir)) || | ||
553 | ((ir->o == IR_KPTR || ir->o == IR_KKPTR) && | ||
554 | k == (intptr_t)ir_kptr(ir)) | ||
555 | #else | ||
556 | (ir->o != IR_KINT64 && k == ir->i) | ||
557 | #endif | ||
558 | ) | ||
559 | return r; | ||
560 | } | ||
561 | } | ||
562 | #else | ||
538 | if (ref < ASMREF_L && | 563 | if (ref < ASMREF_L && |
539 | k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i)) | 564 | k == (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i)) |
540 | return r; | 565 | return r; |
566 | #endif | ||
541 | rset_clear(work, r); | 567 | rset_clear(work, r); |
542 | } | 568 | } |
543 | pick = as->freeset & allow; | 569 | pick = as->freeset & allow; |
@@ -557,7 +583,7 @@ static Reg ra_allock(ASMState *as, int32_t k, RegSet allow) | |||
557 | } | 583 | } |
558 | 584 | ||
559 | /* Allocate a specific register for a constant. */ | 585 | /* Allocate a specific register for a constant. */ |
560 | static void ra_allockreg(ASMState *as, int32_t k, Reg r) | 586 | static void ra_allockreg(ASMState *as, intptr_t k, Reg r) |
561 | { | 587 | { |
562 | Reg kr = ra_allock(as, k, RID2RSET(r)); | 588 | Reg kr = ra_allock(as, k, RID2RSET(r)); |
563 | if (kr != r) { | 589 | if (kr != r) { |
diff --git a/src/lj_emit_arm.h b/src/lj_emit_arm.h index 496b37a3..f7c93d84 100644 --- a/src/lj_emit_arm.h +++ b/src/lj_emit_arm.h | |||
@@ -207,7 +207,7 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i) | |||
207 | 207 | ||
208 | #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) | 208 | #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) |
209 | 209 | ||
210 | static Reg ra_allock(ASMState *as, int32_t k, RegSet allow); | 210 | static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow); |
211 | 211 | ||
212 | /* Get/set from constant pointer. */ | 212 | /* Get/set from constant pointer. */ |
213 | static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p) | 213 | static void emit_lsptr(ASMState *as, ARMIns ai, Reg r, void *p) |
diff --git a/src/lj_emit_mips.h b/src/lj_emit_mips.h index d35f830b..93c35ea4 100644 --- a/src/lj_emit_mips.h +++ b/src/lj_emit_mips.h | |||
@@ -94,8 +94,8 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i) | |||
94 | 94 | ||
95 | #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) | 95 | #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) |
96 | 96 | ||
97 | static Reg ra_allock(ASMState *as, int32_t k, RegSet allow); | 97 | static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow); |
98 | static void ra_allockreg(ASMState *as, int32_t k, Reg r); | 98 | static void ra_allockreg(ASMState *as, intptr_t k, Reg r); |
99 | 99 | ||
100 | /* Get/set from constant pointer. */ | 100 | /* Get/set from constant pointer. */ |
101 | static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow) | 101 | static void emit_lsptr(ASMState *as, MIPSIns mi, Reg r, void *p, RegSet allow) |
diff --git a/src/lj_emit_ppc.h b/src/lj_emit_ppc.h index 5163012a..34a6efb7 100644 --- a/src/lj_emit_ppc.h +++ b/src/lj_emit_ppc.h | |||
@@ -98,7 +98,7 @@ static void emit_loadi(ASMState *as, Reg r, int32_t i) | |||
98 | 98 | ||
99 | #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) | 99 | #define emit_loada(as, r, addr) emit_loadi(as, (r), i32ptr((addr))) |
100 | 100 | ||
101 | static Reg ra_allock(ASMState *as, int32_t k, RegSet allow); | 101 | static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow); |
102 | 102 | ||
103 | /* Get/set from constant pointer. */ | 103 | /* Get/set from constant pointer. */ |
104 | static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow) | 104 | static void emit_lsptr(ASMState *as, PPCIns pi, Reg r, void *p, RegSet allow) |