summaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 0fc73683..2ecac2d9 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -231,6 +231,7 @@ static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op)
231 case IR_ADD: k1 += k2; break; 231 case IR_ADD: k1 += k2; break;
232 case IR_SUB: k1 -= k2; break; 232 case IR_SUB: k1 -= k2; break;
233 case IR_MUL: k1 *= k2; break; 233 case IR_MUL: k1 *= k2; break;
234 case IR_MOD: k1 = lj_vm_modi(k1, k2); break;
234 case IR_BAND: k1 &= k2; break; 235 case IR_BAND: k1 &= k2; break;
235 case IR_BOR: k1 |= k2; break; 236 case IR_BOR: k1 |= k2; break;
236 case IR_BXOR: k1 ^= k2; break; 237 case IR_BXOR: k1 ^= k2; break;
@@ -249,6 +250,7 @@ static int32_t kfold_intop(int32_t k1, int32_t k2, IROp op)
249LJFOLD(ADD KINT KINT) 250LJFOLD(ADD KINT KINT)
250LJFOLD(SUB KINT KINT) 251LJFOLD(SUB KINT KINT)
251LJFOLD(MUL KINT KINT) 252LJFOLD(MUL KINT KINT)
253LJFOLD(MOD KINT KINT)
252LJFOLD(BAND KINT KINT) 254LJFOLD(BAND KINT KINT)
253LJFOLD(BOR KINT KINT) 255LJFOLD(BOR KINT KINT)
254LJFOLD(BXOR KINT KINT) 256LJFOLD(BXOR KINT KINT)
@@ -1148,7 +1150,6 @@ LJFOLDF(simplify_intmul_k32)
1148 1150
1149LJFOLD(MUL any KINT64) 1151LJFOLD(MUL any KINT64)
1150LJFOLDF(simplify_intmul_k64) 1152LJFOLDF(simplify_intmul_k64)
1151
1152{ 1153{
1153 if (ir_kint64(fright)->u64 == 0) /* i * 0 ==> 0 */ 1154 if (ir_kint64(fright)->u64 == 0) /* i * 0 ==> 0 */
1154 return INT64FOLD(0); 1155 return INT64FOLD(0);
@@ -1160,6 +1161,27 @@ LJFOLDF(simplify_intmul_k64)
1160 return NEXTFOLD; 1161 return NEXTFOLD;
1161} 1162}
1162 1163
1164LJFOLD(MOD any KINT)
1165LJFOLDF(simplify_intmod_k)
1166{
1167 int32_t k = fright->i;
1168 lua_assert(k != 0);
1169 if (k > 0 && (k & (k-1)) == 0) { /* i % (2^k) ==> i & (2^k-1) */
1170 fins->o = IR_BAND;
1171 fins->op2 = lj_ir_kint(J, k-1);
1172 return RETRYFOLD;
1173 }
1174 return NEXTFOLD;
1175}
1176
1177LJFOLD(MOD KINT any)
1178LJFOLDF(simplify_intmod_kleft)
1179{
1180 if (fleft->i == 0)
1181 return INTFOLD(0);
1182 return NEXTFOLD;
1183}
1184
1163LJFOLD(SUB any any) 1185LJFOLD(SUB any any)
1164LJFOLD(SUBOV any any) 1186LJFOLD(SUBOV any any)
1165LJFOLDF(simplify_intsub) 1187LJFOLDF(simplify_intsub)