summaryrefslogtreecommitdiff
path: root/src/lj_opt_narrow.c
diff options
context:
space:
mode:
authorMike Pall <mike>2022-01-24 14:37:50 +0100
committerMike Pall <mike>2022-01-24 14:37:50 +0100
commit9512d5c1aced61e13e7be2d3208ec7ae3516b458 (patch)
treec31882578a670847adb37475362b7d21ae9bc099 /src/lj_opt_narrow.c
parentc18acfe7565b9b20be0a73563f535766233ad78a (diff)
downloadluajit-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.c12
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 }