diff options
author | Mike Pall <mike> | 2022-03-08 19:44:10 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2022-03-08 19:44:10 +0100 |
commit | 96d6d5032098ea9f0002165394a8774dcaa0c0ce (patch) | |
tree | 84712e02c1452d8f0c48a6f506a9aa1ebe0f4a32 /src/lj_opt_narrow.c | |
parent | aa0550e3f0999cc6ef62f7ef80493ebef8c9a2f7 (diff) | |
download | luajit-96d6d5032098ea9f0002165394a8774dcaa0c0ce.tar.gz luajit-96d6d5032098ea9f0002165394a8774dcaa0c0ce.tar.bz2 luajit-96d6d5032098ea9f0002165394a8774dcaa0c0ce.zip |
Revert to trival pow() optimizations to prevent inaccuracies.
Diffstat (limited to 'src/lj_opt_narrow.c')
-rw-r--r-- | src/lj_opt_narrow.c | 24 |
1 files changed, 0 insertions, 24 deletions
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c index fe92468e..586f1bc7 100644 --- a/src/lj_opt_narrow.c +++ b/src/lj_opt_narrow.c | |||
@@ -584,30 +584,6 @@ TRef lj_opt_narrow_mod(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc) | |||
584 | return emitir(IRTN(IR_SUB), rb, tmp); | 584 | return emitir(IRTN(IR_SUB), rb, tmp); |
585 | } | 585 | } |
586 | 586 | ||
587 | /* Narrowing of power operator or math.pow. */ | ||
588 | TRef lj_opt_narrow_pow(jit_State *J, TRef rb, TRef rc, TValue *vb, TValue *vc) | ||
589 | { | ||
590 | rb = conv_str_tonum(J, rb, vb); | ||
591 | rb = lj_ir_tonum(J, rb); /* Left arg is always treated as an FP number. */ | ||
592 | rc = conv_str_tonum(J, rc, vc); | ||
593 | if (tvisint(vc) || numisint(numV(vc))) { | ||
594 | int32_t k = numberVint(vc); | ||
595 | if (!(k >= -65536 && k <= 65536)) goto force_pow_num; | ||
596 | if (!tref_isinteger(rc)) { | ||
597 | /* Guarded conversion to integer! */ | ||
598 | rc = emitir(IRTGI(IR_CONV), rc, IRCONV_INT_NUM|IRCONV_CHECK); | ||
599 | } | ||
600 | if (!tref_isk(rc)) { /* Range guard: -65536 <= i <= 65536 */ | ||
601 | TRef tmp = emitir(IRTI(IR_ADD), rc, lj_ir_kint(J, 65536)); | ||
602 | emitir(IRTGI(IR_ULE), tmp, lj_ir_kint(J, 2*65536)); | ||
603 | } | ||
604 | } else { | ||
605 | force_pow_num: | ||
606 | rc = lj_ir_tonum(J, rc); /* Want POW(num, num), not POW(num, int). */ | ||
607 | } | ||
608 | return emitir(IRTN(IR_POW), rb, rc); | ||
609 | } | ||
610 | |||
611 | /* -- Predictive narrowing of induction variables ------------------------- */ | 587 | /* -- Predictive narrowing of induction variables ------------------------- */ |
612 | 588 | ||
613 | /* Narrow a single runtime value. */ | 589 | /* Narrow a single runtime value. */ |