FOLD x / 2^k ==> x * 2^-k.

This commit is contained in:
Mike Pall 2012-08-15 16:17:34 +02:00
parent 5e18c91b89
commit ff0a1f3f4e

View 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;
}