diff options
author | Mike Pall <mike> | 2012-08-15 16:17:34 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2012-08-15 16:17:34 +0200 |
commit | ff0a1f3f4eedf8e43eeb5cc3d2f8d051b648e0c0 (patch) | |
tree | 344b8050d1cb8f112a8699c4d1a3a2200a196ca9 /src | |
parent | 5e18c91b899f718dd371f24d5486ade1f9a9ab6d (diff) | |
download | luajit-ff0a1f3f4eedf8e43eeb5cc3d2f8d051b648e0c0.tar.gz luajit-ff0a1f3f4eedf8e43eeb5cc3d2f8d051b648e0c0.tar.bz2 luajit-ff0a1f3f4eedf8e43eeb5cc3d2f8d051b648e0c0.zip |
FOLD x / 2^k ==> x * 2^-k.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_opt_fold.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 74cea785..461fa621 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -816,6 +816,15 @@ LJFOLDF(simplify_nummuldiv_k) | |||
816 | fins->o = IR_ADD; | 816 | fins->o = IR_ADD; |
817 | fins->op2 = fins->op1; | 817 | fins->op2 = fins->op1; |
818 | return RETRYFOLD; | 818 | return RETRYFOLD; |
819 | } else if (fins->o == IR_DIV) { /* x / 2^k ==> x * 2^-k */ | ||
820 | uint64_t u = ir_knum(fright)->u64; | ||
821 | if ((u & U64x(000fffff,ffffffff)) == 0 && | ||
822 | (uint32_t)(u = ((u >> 52) & 0x7ff)) - 1 < 0x7fd) { | ||
823 | u = (u & (uint64_t)1 << 63) | ((uint64_t)(0x7fe - (uint32_t)u) << 52); | ||
824 | fins->o = IR_MUL; /* Multiply by exact reciprocal. */ | ||
825 | fins->op2 = lj_ir_knum_u64(J, u); | ||
826 | return RETRYFOLD; | ||
827 | } | ||
819 | } | 828 | } |
820 | return NEXTFOLD; | 829 | return NEXTFOLD; |
821 | } | 830 | } |