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); |
