]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
FOLD x / 2^k ==> x * 2^-k.
authorMike Pall <mike>
Wed, 15 Aug 2012 14:17:34 +0000 (16:17 +0200)
committerMike Pall <mike>
Wed, 15 Aug 2012 14:17:34 +0000 (16:17 +0200)
src/lj_opt_fold.c

index 74cea7858e0b73f001902b340837cc0d18501194..461fa621172c74a045942529b7ed0b6ed0ce98b0 100644 (file)
@@ -816,6 +816,15 @@ LJFOLDF(simplify_nummuldiv_k)
     fins->o = IR_ADD;
     fins->op2 = fins->op1;
     return RETRYFOLD;
+  } else if (fins->o == IR_DIV) {  /* x / 2^k ==> x * 2^-k */
+    uint64_t u = ir_knum(fright)->u64;
+    if ((u & U64x(000fffff,ffffffff)) == 0 &&
+       (uint32_t)(u = ((u >> 52) & 0x7ff)) - 1 < 0x7fd) {
+      u = (u & (uint64_t)1 << 63) | ((uint64_t)(0x7fe - (uint32_t)u) << 52);
+      fins->o = IR_MUL;  /* Multiply by exact reciprocal. */
+      fins->op2 = lj_ir_knum_u64(J, u);
+      return RETRYFOLD;
+    }
   }
   return NEXTFOLD;
 }