diff options
author | Mike Pall <mike> | 2012-07-02 22:57:51 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-07-02 22:57:51 +0200 |
commit | 79e1eaa73b1bb8dd0e2ea7aeaba8504f89e5ff94 (patch) | |
tree | 6fae31ffc7e54f0f6baae8ec9d4032bb2de0acc3 /src/lj_emit_arm.h | |
parent | afeb4e2c510ae70e0885d537cd4fb277a5d5de57 (diff) | |
download | luajit-79e1eaa73b1bb8dd0e2ea7aeaba8504f89e5ff94.tar.gz luajit-79e1eaa73b1bb8dd0e2ea7aeaba8504f89e5ff94.tar.bz2 luajit-79e1eaa73b1bb8dd0e2ea7aeaba8504f89e5ff94.zip |
ARM: Simplify two-step constant rematerialization.
Diffstat (limited to '')
-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); |