aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-10-25 21:16:27 +0200
committerMike Pall <mike>2011-10-25 21:16:27 +0200
commit455917fa0a0b9db21936a4f68994ea6b1134d027 (patch)
tree1238c88ac42409d1a577a1932b46af05fa4c69de /src
parent17cb366fc9e1cd07bfd091a6bfa8dd370aa573a4 (diff)
downloadluajit-455917fa0a0b9db21936a4f68994ea6b1134d027.tar.gz
luajit-455917fa0a0b9db21936a4f68994ea6b1134d027.tar.bz2
luajit-455917fa0a0b9db21936a4f68994ea6b1134d027.zip
Add more FOLD rules for shift + BAND simplifications.
Diffstat (limited to 'src')
-rw-r--r--src/lj_opt_fold.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 2a388278..e7d4f9cd 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -1402,6 +1402,36 @@ LJFOLDF(simplify_shift2_ki)
1402 return NEXTFOLD; 1402 return NEXTFOLD;
1403} 1403}
1404 1404
1405LJFOLD(BSHL BAND KINT)
1406LJFOLD(BSHR BAND KINT)
1407LJFOLD(BROL BAND KINT)
1408LJFOLD(BROR BAND KINT)
1409LJFOLDF(simplify_shiftk_andk)
1410{
1411 IRIns *irk = IR(fleft->op2);
1412 PHIBARRIER(fleft);
1413 if (irk->o == IR_KINT) { /* (i & k1) o k2 ==> (i o k2) & (k1 o k2) */
1414 int32_t k = kfold_intop(irk->i, fright->i, (IROp)fins->o);
1415 fins->op1 = fleft->op1;
1416 fins->op1 = (IRRef1)lj_opt_fold(J);
1417 fins->op2 = (IRRef1)lj_ir_kint(J, k);
1418 fins->ot = IRTI(IR_BAND);
1419 return RETRYFOLD;
1420 }
1421 return NEXTFOLD;
1422}
1423
1424LJFOLD(BAND BSHL KINT)
1425LJFOLD(BAND BSHR KINT)
1426LJFOLDF(simplify_andk_shiftk)
1427{
1428 IRIns *irk = IR(fleft->op2);
1429 if (irk->o == IR_KINT &&
1430 kfold_intop(-1, irk->i, (IROp)fleft->o) == fright->i)
1431 return LEFTFOLD; /* (i o k1) & k2 ==> i, if (-1 o k1) == k2 */
1432 return NEXTFOLD;
1433}
1434
1405/* -- Reassociation ------------------------------------------------------- */ 1435/* -- Reassociation ------------------------------------------------------- */
1406 1436
1407LJFOLD(ADD ADD KINT) 1437LJFOLD(ADD ADD KINT)