aboutsummaryrefslogtreecommitdiff
path: root/src/lj_opt_narrow.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lj_opt_narrow.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c
index ba425334..94cce582 100644
--- a/src/lj_opt_narrow.c
+++ b/src/lj_opt_narrow.c
@@ -593,10 +593,10 @@ TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)
593 /* Narrowing must be unconditional to preserve (-x)^i semantics. */ 593 /* Narrowing must be unconditional to preserve (-x)^i semantics. */
594 if (tvisint(vc) || numisint(numV(vc))) { 594 if (tvisint(vc) || numisint(numV(vc))) {
595 int checkrange = 0; 595 int checkrange = 0;
596 /* Split pow is faster for bigger exponents. But do this only for (+k)^i. */ 596 /* pow() is faster for bigger exponents. But do this only for (+k)^i. */
597 if (tref_isk(rb) && (int32_t)ir_knum(IR(tref_ref(rb)))->u32.hi >= 0) { 597 if (tref_isk(rb) && (int32_t)ir_knum(IR(tref_ref(rb)))->u32.hi >= 0) {
598 int32_t k = numberVint(vc); 598 int32_t k = numberVint(vc);
599 if (!(k >= -65536 && k <= 65536)) goto split_pow; 599 if (!(k >= -65536 && k <= 65536)) goto force_pow_num;
600 checkrange = 1; 600 checkrange = 1;
601 } 601 }
602 if (!tref_isinteger(rc)) { 602 if (!tref_isinteger(rc)) {
@@ -607,19 +607,11 @@ TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc)
607 TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536)); 607 TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536));
608 emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536)); 608 emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536));
609 } 609 }
610 return emitir(IRTN(IR_POW), rb, rc); 610 } else {
611force_pow_num:
612 rc = lj_ir_tonum(J, rc); /* Want POW(num, num), not POW(num, int). */
611 } 613 }
612split_pow: 614 return emitir(IRTN(IR_POW), rb, rc);
613 /* FOLD covers most cases, but some are easier to do here. */
614 if (tref_isk(rb) && tvispone(ir_knum(IR(tref_ref(rb)))))
615 return rb; /* 1 ^ x ==> 1 */
616 rc = lj_ir_tonum(J, rc);
617 if (tref_isk(rc) && ir_knum(IR(tref_ref(rc)))->n == 0.5)
618 return emitir(IRTN(IR_FPMATH), rb, IRFPM_SQRT); /* x ^ 0.5 ==> sqrt(x) */
619 /* Split up b^c into exp2(c*log2(b)). Assembler may rejoin later. */
620 rb = emitir(IRTN(IR_FPMATH), rb, IRFPM_LOG2);
621 rc = emitir(IRTN(IR_MUL), rb, rc);
622 return emitir(IRTN(IR_FPMATH), rc, IRFPM_EXP2);
623} 615}
624 616
625/* -- Predictive narrowing of induction variables ------------------------- */ 617/* -- Predictive narrowing of induction variables ------------------------- */