diff options
-rw-r--r-- | src/lj_opt_fold.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index 5f4b8810..a72aa440 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -347,6 +347,11 @@ static uint64_t kfold_int64arith(uint64_t k1, uint64_t k2, IROp op) | |||
347 | case IR_BAND: k1 &= k2; break; | 347 | case IR_BAND: k1 &= k2; break; |
348 | case IR_BOR: k1 |= k2; break; | 348 | case IR_BOR: k1 |= k2; break; |
349 | case IR_BXOR: k1 ^= k2; break; | 349 | case IR_BXOR: k1 ^= k2; break; |
350 | case IR_BSHL: k1 <<= (k2 & 63); break; | ||
351 | case IR_BSHR: k1 = (int32_t)((uint32_t)k1 >> (k2 & 63)); break; | ||
352 | case IR_BSAR: k1 >>= (k2 & 63); break; | ||
353 | case IR_BROL: k1 = (int32_t)lj_rol((uint32_t)k1, (k2 & 63)); break; | ||
354 | case IR_BROR: k1 = (int32_t)lj_ror((uint32_t)k1, (k2 & 63)); break; | ||
350 | #endif | 355 | #endif |
351 | default: UNUSED(k2); lua_assert(0); break; | 356 | default: UNUSED(k2); lua_assert(0); break; |
352 | } | 357 | } |
@@ -1653,6 +1658,14 @@ LJFOLDF(simplify_shiftk_andk) | |||
1653 | fins->op2 = (IRRef1)lj_ir_kint(J, k); | 1658 | fins->op2 = (IRRef1)lj_ir_kint(J, k); |
1654 | fins->ot = IRTI(IR_BAND); | 1659 | fins->ot = IRTI(IR_BAND); |
1655 | return RETRYFOLD; | 1660 | return RETRYFOLD; |
1661 | } else if (irk->o == IR_KINT64) { | ||
1662 | uint64_t k = kfold_int64arith(ir_k64(irk)->u64, fright->i, (IROp)fins->o); | ||
1663 | IROpT ot = fleft->ot; | ||
1664 | fins->op1 = fleft->op1; | ||
1665 | fins->op1 = (IRRef1)lj_opt_fold(J); | ||
1666 | fins->op2 = (IRRef1)lj_ir_kint64(J, k); | ||
1667 | fins->ot = ot; | ||
1668 | return RETRYFOLD; | ||
1656 | } | 1669 | } |
1657 | return NEXTFOLD; | 1670 | return NEXTFOLD; |
1658 | } | 1671 | } |