From 79e1eaa73b1bb8dd0e2ea7aeaba8504f89e5ff94 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 2 Jul 2012 22:57:51 +0200 Subject: [PATCH] ARM: Simplify two-step constant rematerialization. --- src/lj_emit_arm.h | 23 +++++++++++++---------- 1 file 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) IRRef ref = regcost_ref(as->cost[r]); lua_assert(r != d); if (emit_canremat(ref)) { - int32_t delta = i - (ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i); - uint32_t sh, inv = 0, k2, k; - if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; } - sh = lj_ffs(delta) & ~1; - k2 = emit_isk12(0, delta & (255 << sh)); - k = emit_isk12(0, delta & ~(255 << sh)); - if (k) { - emit_dn(as, ARMI_ADD^k2^inv, d, d); - emit_dn(as, ARMI_ADD^k^inv, d, r); - return 1; + int32_t other = ra_iskref(ref) ? ra_krefk(as, ref) : IR(ref)->i; + if (other) { + int32_t delta = i - other; + uint32_t sh, inv = 0, k2, k; + if (delta < 0) { delta = -delta; inv = ARMI_ADD^ARMI_SUB; } + sh = lj_ffs(delta) & ~1; + k2 = emit_isk12(0, delta & (255 << sh)); + k = emit_isk12(0, delta & ~(255 << sh)); + if (k) { + emit_dn(as, ARMI_ADD^k2^inv, d, d); + emit_dn(as, ARMI_ADD^k^inv, d, r); + return 1; + } } } rset_clear(work, r); -- 2.11.4.GIT