]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
ARM: Simplify two-step constant rematerialization.
authorMike Pall <mike>
Mon, 2 Jul 2012 20:57:51 +0000 (22:57 +0200)
committerMike Pall <mike>
Mon, 2 Jul 2012 20:57:51 +0000 (22:57 +0200)
src/lj_emit_arm.h

index 21ece88e7586614b711ef66649f8e0e9d620cd73..27de68527a795320fbd26bcf7d3574007e10175c 100644 (file)
@@ -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);