diff options
author | Mike Pall <mike> | 2011-06-03 18:48:02 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2011-06-03 18:48:02 +0200 |
commit | 8c5935000d2b9bccd6c563b45c6a893f28986ca5 (patch) | |
tree | 2f530cf0b703350e355f1931679a7ed68503867e /src/lj_opt_narrow.c | |
parent | eec28aa9fdf5f733a4f7d2628fc060eac66ab713 (diff) | |
download | luajit2-8c5935000d2b9bccd6c563b45c6a893f28986ca5.tar.gz |
Add narrowing of modulo operator.
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) } /* Narrowing of modulo operator. */ -TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc) +TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vc) { TRef tmp; - if ((J->flags & JIT_F_OPT_NARROW) && - tref_isk(rc) && tref_isint(rc)) { /* Optimize x % k. */ - int32_t k = IR(tref_ref(rc))->i; - if (k > 0 && (k & (k-1)) == 0) { /* i % 2^k ==> band(i, 2^k-1) */ - if (tref_isinteger(rb)) - return emitir(IRTI(IR_BAND), rb, lj_ir_kint(J, k-1)); - } + if (tvisstr(vc) && !lj_str_tonum(strV(vc), vc)) + lj_trace_err(J, LJ_TRERR_BADTYPE); + if ((LJ_DUALNUM || (J->flags & JIT_F_OPT_NARROW)) && + tref_isinteger(rb) && tref_isinteger(rc) && + (tvisint(vc) ? intV(vc) != 0 : !tviszero(vc))) { + emitir(IRTGI(IR_NE), rc, lj_ir_kint(J, 0)); + return emitir(IRTI(IR_MOD), rb, rc); } /* b % c ==> b - floor(b/c)*c */ rb = lj_ir_tonum(J, rb); |