aboutsummaryrefslogtreecommitdiff
path: root/src/lj_emit_mips.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_emit_mips.h')
-rw-r--r--src/lj_emit_mips.h22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/lj_emit_mips.h b/src/lj_emit_mips.h
index bdabcf16..3de5ff18 100644
--- a/src/lj_emit_mips.h
+++ b/src/lj_emit_mips.h
@@ -4,8 +4,9 @@
4*/ 4*/
5 5
6#if LJ_64 6#if LJ_64
7static intptr_t get_k64val(IRIns *ir) 7static intptr_t get_k64val(ASMState *as, IRRef ref)
8{ 8{
9 IRIns *ir = IR(ref);
9 if (ir->o == IR_KINT64) { 10 if (ir->o == IR_KINT64) {
10 return (intptr_t)ir_kint64(ir)->u64; 11 return (intptr_t)ir_kint64(ir)->u64;
11 } else if (ir->o == IR_KGC) { 12 } else if (ir->o == IR_KGC) {
@@ -15,16 +16,17 @@ static intptr_t get_k64val(IRIns *ir)
15 } else if (LJ_SOFTFP && ir->o == IR_KNUM) { 16 } else if (LJ_SOFTFP && ir->o == IR_KNUM) {
16 return (intptr_t)ir_knum(ir)->u64; 17 return (intptr_t)ir_knum(ir)->u64;
17 } else { 18 } else {
18 lua_assert(ir->o == IR_KINT || ir->o == IR_KNULL); 19 lj_assertA(ir->o == IR_KINT || ir->o == IR_KNULL,
20 "bad 64 bit const IR op %d", ir->o);
19 return ir->i; /* Sign-extended. */ 21 return ir->i; /* Sign-extended. */
20 } 22 }
21} 23}
22#endif 24#endif
23 25
24#if LJ_64 26#if LJ_64
25#define get_kval(ir) get_k64val(ir) 27#define get_kval(as, ref) get_k64val(as, ref)
26#else 28#else
27#define get_kval(ir) ((ir)->i) 29#define get_kval(as, ref) (IR((ref))->i)
28#endif 30#endif
29 31
30/* -- Emit basic instructions --------------------------------------------- */ 32/* -- Emit basic instructions --------------------------------------------- */
@@ -82,18 +84,18 @@ static void emit_tsml(ASMState *as, MIPSIns mi, Reg rt, Reg rs, uint32_t msb,
82#define emit_canremat(ref) ((ref) <= REF_BASE) 84#define emit_canremat(ref) ((ref) <= REF_BASE)
83 85
84/* Try to find a one step delta relative to another constant. */ 86/* Try to find a one step delta relative to another constant. */
85static int emit_kdelta1(ASMState *as, Reg t, intptr_t i) 87static int emit_kdelta1(ASMState *as, Reg rd, intptr_t i)
86{ 88{
87 RegSet work = ~as->freeset & RSET_GPR; 89 RegSet work = ~as->freeset & RSET_GPR;
88 while (work) { 90 while (work) {
89 Reg r = rset_picktop(work); 91 Reg r = rset_picktop(work);
90 IRRef ref = regcost_ref(as->cost[r]); 92 IRRef ref = regcost_ref(as->cost[r]);
91 lua_assert(r != t); 93 lj_assertA(r != rd, "dest reg %d not free", rd);
92 if (ref < ASMREF_L) { 94 if (ref < ASMREF_L) {
93 intptr_t delta = (intptr_t)((uintptr_t)i - 95 intptr_t delta = (intptr_t)((uintptr_t)i -
94 (uintptr_t)(ra_iskref(ref) ? ra_krefk(as, ref) : get_kval(IR(ref)))); 96 (uintptr_t)(ra_iskref(ref) ? ra_krefk(as, ref) : get_kval(as, ref)));
95 if (checki16(delta)) { 97 if (checki16(delta)) {
96 emit_tsi(as, MIPSI_AADDIU, t, r, delta); 98 emit_tsi(as, MIPSI_AADDIU, rd, r, delta);
97 return 1; 99 return 1;
98 } 100 }
99 } 101 }
@@ -223,7 +225,7 @@ static void emit_branch(ASMState *as, MIPSIns mi, Reg rs, Reg rt, MCode *target)
223{ 225{
224 MCode *p = as->mcp; 226 MCode *p = as->mcp;
225 ptrdiff_t delta = target - p; 227 ptrdiff_t delta = target - p;
226 lua_assert(((delta + 0x8000) >> 16) == 0); 228 lj_assertA(((delta + 0x8000) >> 16) == 0, "branch target out of range");
227 *--p = mi | MIPSF_S(rs) | MIPSF_T(rt) | ((uint32_t)delta & 0xffffu); 229 *--p = mi | MIPSF_S(rs) | MIPSF_T(rt) | ((uint32_t)delta & 0xffffu);
228 as->mcp = p; 230 as->mcp = p;
229} 231}
@@ -299,7 +301,7 @@ static void emit_storeofs(ASMState *as, IRIns *ir, Reg r, Reg base, int32_t ofs)
299static void emit_addptr(ASMState *as, Reg r, int32_t ofs) 301static void emit_addptr(ASMState *as, Reg r, int32_t ofs)
300{ 302{
301 if (ofs) { 303 if (ofs) {
302 lua_assert(checki16(ofs)); 304 lj_assertA(checki16(ofs), "offset %d out of range", ofs);
303 emit_tsi(as, MIPSI_AADDIU, r, r, ofs); 305 emit_tsi(as, MIPSI_AADDIU, r, r, ofs);
304 } 306 }
305} 307}