diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index e7a1ca54..495b784d 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -247,6 +247,19 @@ LJFOLDF(kfold_intarith) | |||
247 | return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); | 247 | return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); |
248 | } | 248 | } |
249 | 249 | ||
250 | LJFOLD(ADDOV KINT KINT) | ||
251 | LJFOLD(SUBOV KINT KINT) | ||
252 | LJFOLD(MULOV KINT KINT) | ||
253 | LJFOLDF(kfold_intovarith) | ||
254 | { | ||
255 | lua_Number n = lj_vm_foldarith((lua_Number)fleft->i, (lua_Number)fright->i, | ||
256 | fins->o - IR_ADDOV); | ||
257 | int32_t k = lj_num2int(n); | ||
258 | if (n != (lua_Number)k) | ||
259 | return FAILFOLD; | ||
260 | return INTFOLD(k); | ||
261 | } | ||
262 | |||
250 | LJFOLD(BNOT KINT) | 263 | LJFOLD(BNOT KINT) |
251 | LJFOLDF(kfold_bnot) | 264 | LJFOLDF(kfold_bnot) |
252 | { | 265 | { |
@@ -992,6 +1005,21 @@ LJFOLDF(simplify_intadd_k) | |||
992 | return NEXTFOLD; | 1005 | return NEXTFOLD; |
993 | } | 1006 | } |
994 | 1007 | ||
1008 | LJFOLD(MULOV any KINT) | ||
1009 | LJFOLDF(simplify_intmul_k) | ||
1010 | { | ||
1011 | if (fright->i == 0) /* i * 0 ==> 0 */ | ||
1012 | return RIGHTFOLD; | ||
1013 | if (fright->i == 1) /* i * 1 ==> i */ | ||
1014 | return LEFTFOLD; | ||
1015 | if (fright->i == 2) { /* i * 2 ==> i + i */ | ||
1016 | fins->o = IR_ADDOV; | ||
1017 | fins->op2 = fins->op1; | ||
1018 | return RETRYFOLD; | ||
1019 | } | ||
1020 | return NEXTFOLD; | ||
1021 | } | ||
1022 | |||
995 | LJFOLD(SUB any KINT) | 1023 | LJFOLD(SUB any KINT) |
996 | LJFOLDF(simplify_intsub_k) | 1024 | LJFOLDF(simplify_intsub_k) |
997 | { | 1025 | { |
@@ -1484,6 +1512,7 @@ LJFOLDF(abc_invar) | |||
1484 | LJFOLD(ADD any any) | 1512 | LJFOLD(ADD any any) |
1485 | LJFOLD(MUL any any) | 1513 | LJFOLD(MUL any any) |
1486 | LJFOLD(ADDOV any any) | 1514 | LJFOLD(ADDOV any any) |
1515 | LJFOLD(MULOV any any) | ||
1487 | LJFOLDF(comm_swap) | 1516 | LJFOLDF(comm_swap) |
1488 | { | 1517 | { |
1489 | if (fins->op1 < fins->op2) { /* Move lower ref to the right. */ | 1518 | if (fins->op1 < fins->op2) { /* Move lower ref to the right. */ |