summaryrefslogtreecommitdiff
path: root/src/lj_opt_narrow.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_narrow.c')
-rw-r--r--src/lj_opt_narrow.c16
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. */
554TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc) 554TRef 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);