diff options
-rw-r--r-- | src/lj_emit_arm.h | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/lj_emit_arm.h b/src/lj_emit_arm.h index 21ece88e..27de6852 100644 --- a/src/lj_emit_arm.h +++ b/src/lj_emit_arm.h | |||
@@ -141,16 +141,19 @@ static int emit_kdelta2(ASMState *as, Reg d, int32_t i) | |||
141 | IRRef ref = regcost_ref(as->cost[r]); | 141 | IRRef ref = regcost_ref(as->cost[r]); |
142 | lua_assert(r != d); | 142 | lua_assert(r != d); |
143 | if (emit_canremat(ref)) { | 143 | if (emit_canremat(ref)) { |
144 | int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i); | 144 | int32_t other = ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i; |
145 | uint32_t sh, inv = 0, k2, k; | 145 | if (other) { |
146 | if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; } | 146 | int32_t delta = i - other; |
147 | sh = lj_ffs(delta) & ~1; | 147 | uint32_t sh, inv = 0, k2, k; |
148 | k2 = emit_isk12(0, delta & (255 << sh)); | 148 | if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; } |
149 | k = emit_isk12(0, delta & ~(255 << sh)); | 149 | sh = lj_ffs(delta) & ~1; |
150 | if (k) { | 150 | k2 = emit_isk12(0, delta & (255 << sh)); |
151 | emit_dn(as, ARMI_ADD^k2^inv, d, d); | 151 | k = emit_isk12(0, delta & ~(255 << sh)); |
152 | emit_dn(as, ARMI_ADD^k^inv, d, r); | 152 | if (k) { |
153 | return 1; | 153 | emit_dn(as, ARMI_ADD^k2^inv, d, d); |
154 | emit_dn(as, ARMI_ADD^k^inv, d, r); | ||
155 | return 1; | ||
156 | } | ||
154 | } | 157 | } |
155 | } | 158 | } |
156 | rset_clear(work, r); | 159 | rset_clear(work, r); |