diff options
Diffstat (limited to '')
-rw-r--r-- | src/lj_opt_narrow.c | 20 |
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 { |
611 | force_pow_num: | ||
612 | rc = lj_ir_tonum(J, rc); /* Want POW(num, num), not POW(num, int). */ | ||
611 | } | 613 | } |
612 | split_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 ------------------------- */ |