diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index eb500db9..325b0372 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -226,6 +226,8 @@ static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op) | |||
226 | case IR_BSAR: k1 >>= (k2 & 31); break; | 226 | case IR_BSAR: k1 >>= (k2 & 31); break; |
227 | case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break; | 227 | case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 31)); break; |
228 | case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break; | 228 | case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 31)); break; |
229 | case IR_MIN: k1 = k1 < k2 ? k1 : k2; break; | ||
230 | case IR_MAX: k1 = k1 > k2 ? k1 : k2; break; | ||
229 | default: lua_assert(0); break; | 231 | default: lua_assert(0); break; |
230 | } | 232 | } |
231 | return k1; | 233 | return k1; |
@@ -242,6 +244,8 @@ LJFOLD(BSHR KINT KINT) | |||
242 | LJFOLD(BSAR KINT KINT) | 244 | LJFOLD(BSAR KINT KINT) |
243 | LJFOLD(BROL KINT KINT) | 245 | LJFOLD(BROL KINT KINT) |
244 | LJFOLD(BROR KINT KINT) | 246 | LJFOLD(BROR KINT KINT) |
247 | LJFOLD(MIN KINT KINT) | ||
248 | LJFOLD(MAX KINT KINT) | ||
245 | LJFOLDF(kfold_intarith) | 249 | LJFOLDF(kfold_intarith) |
246 | { | 250 | { |
247 | return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); | 251 | return INTFOLD(kfold_intop(fleft->i, fright->i, (IROp)fins->o)); |
@@ -1434,19 +1438,29 @@ LJFOLDF(reassoc_shift) | |||
1434 | 1438 | ||
1435 | LJFOLD(MIN MIN KNUM) | 1439 | LJFOLD(MIN MIN KNUM) |
1436 | LJFOLD(MAX MAX KNUM) | 1440 | LJFOLD(MAX MAX KNUM) |
1441 | LJFOLD(MIN MIN KINT) | ||
1442 | LJFOLD(MAX MAX KINT) | ||
1437 | LJFOLDF(reassoc_minmax_k) | 1443 | LJFOLDF(reassoc_minmax_k) |
1438 | { | 1444 | { |
1439 | IRIns *irk = IR(fleft->op2); | 1445 | IRIns *irk = IR(fleft->op2); |
1440 | if (irk->o == IR_KNUM) { | 1446 | if (irk->o == IR_KNUM) { |
1441 | lua_Number a = ir_knum(irk)->n; | 1447 | lua_Number a = ir_knum(irk)->n; |
1442 | lua_Number b = knumright; | 1448 | lua_Number y = lj_vm_foldarith(a, knumright, fins->o - IR_ADD); |
1443 | lua_Number y = lj_vm_foldarith(a, b, fins->o - IR_ADD); | ||
1444 | if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */ | 1449 | if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */ |
1445 | return LEFTFOLD; | 1450 | return LEFTFOLD; |
1446 | PHIBARRIER(fleft); | 1451 | PHIBARRIER(fleft); |
1447 | fins->op1 = fleft->op1; | 1452 | fins->op1 = fleft->op1; |
1448 | fins->op2 = (IRRef1)lj_ir_knum(J, y); | 1453 | fins->op2 = (IRRef1)lj_ir_knum(J, y); |
1449 | return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */ | 1454 | return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */ |
1455 | } else if (irk->o == IR_KINT) { | ||
1456 | int32_t a = irk->i; | ||
1457 | int32_t y = kfold_intop(a, fright->i, fins->o); | ||
1458 | if (a == y) /* (x o k1) o k2 ==> x o k1, if (k1 o k2) == k1. */ | ||
1459 | return LEFTFOLD; | ||
1460 | PHIBARRIER(fleft); | ||
1461 | fins->op1 = fleft->op1; | ||
1462 | fins->op2 = (IRRef1)lj_ir_kint(J, y); | ||
1463 | return RETRYFOLD; /* (x o k1) o k2 ==> x o (k1 o k2) */ | ||
1450 | } | 1464 | } |
1451 | return NEXTFOLD; | 1465 | return NEXTFOLD; |
1452 | } | 1466 | } |