diff options
author | Mike Pall <mike> | 2022-01-24 14:37:50 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2022-01-24 14:37:50 +0100 |
commit | 9512d5c1aced61e13e7be2d3208ec7ae3516b458 (patch) | |
tree | c31882578a670847adb37475362b7d21ae9bc099 /src/lj_opt_narrow.c | |
parent | c18acfe7565b9b20be0a73563f535766233ad78a (diff) | |
download | luajit-9512d5c1aced61e13e7be2d3208ec7ae3516b458.tar.gz luajit-9512d5c1aced61e13e7be2d3208ec7ae3516b458.tar.bz2 luajit-9512d5c1aced61e13e7be2d3208ec7ae3516b458.zip |
Fix pow() optimization inconsistencies.
Diffstat (limited to 'src/lj_opt_narrow.c')
-rw-r--r-- | src/lj_opt_narrow.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c index 57b19613..fe92468e 100644 --- a/src/lj_opt_narrow.c +++ b/src/lj_opt_narrow.c | |||
@@ -590,20 +590,14 @@ TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc) | |||
590 | rb = conv_str_tonum(J, rb, vb); | 590 | rb = conv_str_tonum(J, rb, vb); |
591 | rb = lj_ir_tonum(J, rb); /* Left arg is always treated as an FP number. */ | 591 | rb = lj_ir_tonum(J, rb); /* Left arg is always treated as an FP number. */ |
592 | rc = conv_str_tonum(J, rc, vc); | 592 | rc = conv_str_tonum(J, rc, vc); |
593 | /* Narrowing must be unconditional to preserve (-x)^i semantics. */ | ||
594 | if (tvisint(vc) || numisint(numV(vc))) { | 593 | if (tvisint(vc) || numisint(numV(vc))) { |
595 | int checkrange = 0; | 594 | int32_t k = numberVint(vc); |
596 | /* pow() is faster for bigger exponents. But do this only for (+k)^i. */ | 595 | if (!(k >= -65536 && k <= 65536)) goto force_pow_num; |
597 | if (tref_isk(rb) && (int32_t)ir_knum(IR(tref_ref(rb)))->u32.hi >= 0) { | ||
598 | int32_t k = numberVint(vc); | ||
599 | if (!(k >= -65536 && k <= 65536)) goto force_pow_num; | ||
600 | checkrange = 1; | ||
601 | } | ||
602 | if (!tref_isinteger(rc)) { | 596 | if (!tref_isinteger(rc)) { |
603 | /* Guarded conversion to integer! */ | 597 | /* Guarded conversion to integer! */ |
604 | rc = emitir(IRTGI(IR_CONV), rc, IRCONV_INT_NUM|IRCONV_CHECK); | 598 | rc = emitir(IRTGI(IR_CONV), rc, IRCONV_INT_NUM|IRCONV_CHECK); |
605 | } | 599 | } |
606 | if (checkrange && !tref_isk(rc)) { /* Range guard: -65536 <= i <= 65536 */ | 600 | if (!tref_isk(rc)) { /* Range guard: -65536 <= i <= 65536 */ |
607 | TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536)); | 601 | TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536)); |
608 | emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536)); | 602 | emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536)); |
609 | } | 603 | } |