summaryrefslogtreecommitdiff
path: root/src/lj_emit_arm.h
diff options
context:
space:
mode:
authorMike Pall <mike>2012-07-02 22:57:51 +0200
committerMike Pall <mike>2012-07-02 22:57:51 +0200
commit79e1eaa73b1bb8dd0e2ea7aeaba8504f89e5ff94 (patch)
tree6fae31ffc7e54f0f6baae8ec9d4032bb2de0acc3 /src/lj_emit_arm.h
parentafeb4e2c510ae70e0885d537cd4fb277a5d5de57 (diff)
downloadluajit-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.h23
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);