diff options
Diffstat (limited to 'src/lj_emit_mips.h')
-rw-r--r-- | src/lj_emit_mips.h | 22 |
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 |
7 | static intptr_t get_k64val(IRIns *ir) | 7 | static 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. */ |
85 | static int emit_kdelta1(ASMState *as, Reg t, intptr_t i) | 87 | static 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) | |||
299 | static void emit_addptr(ASMState *as, Reg r, int32_t ofs) | 301 | static 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 | } |