diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 24 |
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) | |||
249 | LJFOLD(ADD KINT KINT) | 250 | LJFOLD(ADD KINT KINT) |
250 | LJFOLD(SUB KINT KINT) | 251 | LJFOLD(SUB KINT KINT) |
251 | LJFOLD(MUL KINT KINT) | 252 | LJFOLD(MUL KINT KINT) |
253 | LJFOLD(MOD KINT KINT) | ||
252 | LJFOLD(BAND KINT KINT) | 254 | LJFOLD(BAND KINT KINT) |
253 | LJFOLD(BOR KINT KINT) | 255 | LJFOLD(BOR KINT KINT) |
254 | LJFOLD(BXOR KINT KINT) | 256 | LJFOLD(BXOR KINT KINT) |
@@ -1148,7 +1150,6 @@ LJFOLDF(simplify_intmul_k32) | |||
1148 | 1150 | ||
1149 | LJFOLD(MUL any KINT64) | 1151 | LJFOLD(MUL any KINT64) |
1150 | LJFOLDF(simplify_intmul_k64) | 1152 | LJFOLDF(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 | ||
1164 | LJFOLD(MOD any KINT) | ||
1165 | LJFOLDF(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 | |||
1177 | LJFOLD(MOD KINT any) | ||
1178 | LJFOLDF(simplify_intmod_kleft) | ||
1179 | { | ||
1180 | if (fleft->i == 0) | ||
1181 | return INTFOLD(0); | ||
1182 | return NEXTFOLD; | ||
1183 | } | ||
1184 | |||
1163 | LJFOLD(SUB any any) | 1185 | LJFOLD(SUB any any) |
1164 | LJFOLD(SUBOV any any) | 1186 | LJFOLD(SUBOV any any) |
1165 | LJFOLDF(simplify_intsub) | 1187 | LJFOLDF(simplify_intsub) |