diff options
-rw-r--r-- | src/lj_opt_fold.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 461fa621..ab8085d7 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -818,9 +818,9 @@ LJFOLDF(simplify_nummuldiv_k) | |||
818 | return RETRYFOLD; | 818 | return RETRYFOLD; |
819 | } else if (fins->o == IR_DIV) { /* x / 2^k ==> x * 2^-k */ | 819 | } else if (fins->o == IR_DIV) { /* x / 2^k ==> x * 2^-k */ |
820 | uint64_t u = ir_knum(fright)->u64; | 820 | uint64_t u = ir_knum(fright)->u64; |
821 | if ((u & U64x(000fffff,ffffffff)) == 0 && | 821 | uint32_t ex = ((uint32_t)(u >> 52) & 0x7ff); |
822 | (uint32_t)(u = ((u >> 52) & 0x7ff)) - 1 < 0x7fd) { | 822 | if ((u & U64x(000fffff,ffffffff)) == 0 && ex - 1 < 0x7fd) { |
823 | u = (u & (uint64_t)1 << 63) | ((uint64_t)(0x7fe - (uint32_t)u) << 52); | 823 | u = (u & ((uint64_t)1 << 63)) | ((uint64_t)(0x7fe - ex) << 52); |
824 | fins->o = IR_MUL; /* Multiply by exact reciprocal. */ | 824 | fins->o = IR_MUL; /* Multiply by exact reciprocal. */ |
825 | fins->op2 = lj_ir_knum_u64(J, u); | 825 | fins->op2 = lj_ir_knum_u64(J, u); |
826 | return RETRYFOLD; | 826 | return RETRYFOLD; |