diff options
Diffstat (limited to 'src/lj_opt_narrow.c')
-rw-r--r-- | src/lj_opt_narrow.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c index e7f280ec..40696c02 100644 --- a/src/lj_opt_narrow.c +++ b/src/lj_opt_narrow.c | |||
@@ -551,16 +551,16 @@ TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc) | |||
551 | } | 551 | } |
552 | 552 | ||
553 | /* Narrowing of modulo operator. */ | 553 | /* Narrowing of modulo operator. */ |
554 | TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc) | 554 | TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vc) |
555 | { | 555 | { |
556 | TRef tmp; | 556 | TRef tmp; |
557 | if ((J->flags & JIT_F_OPT_NARROW) && | 557 | if (tvisstr(vc) && !lj_str_tonum(strV(vc), vc)) |
558 | tref_isk(rc) && tref_isint(rc)) { /* Optimize x % k. */ | 558 | lj_trace_err(J, LJ_TRERR_BADTYPE); |
559 | int32_t k = IR(tref_ref(rc))->i; | 559 | if ((LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) && |
560 | if (k > 0 && (k & (k-1)) == 0) { /* i % 2^k ==> band(i, 2^k-1) */ | 560 | tref_isinteger(rb) && tref_isinteger(rc) && |
561 | if (tref_isinteger(rb)) | 561 | (tvisint(vc) ? intV(vc) != 0 : !tviszero(vc))) { |
562 | return emitir(IRTI(IR_BAND), rb, lj_ir_kint(J, k-1)); | 562 | emitir(IRTGI(IR_NE), rc, lj_ir_kint(J, 0)); |
563 | } | 563 | return emitir(IRTI(IR_MOD), rb, rc); |
564 | } | 564 | } |
565 | /* b % c ==> b - floor(b/c)*c */ | 565 | /* b % c ==> b - floor(b/c)*c */ |
566 | rb = lj_ir_tonum(J, rb); | 566 | rb = lj_ir_tonum(J, rb); |