diff options
author | Mike Pall <mike> | 2020-05-22 02:45:03 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2020-05-22 02:45:03 +0200 |
commit | 1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5 (patch) | |
tree | b0b4bb0b78cf96c49a82cc6c6898a7cfc513bcbb | |
parent | 0eddcbead2d67c16dcd4039a6765b9d2fc8ea631 (diff) | |
download | luajit-1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5.tar.gz luajit-1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5.tar.bz2 luajit-1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5.zip |
Fix narrowing of unary minus.
-rw-r--r-- | src/lj_opt_narrow.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c index ef0599c9..ba425334 100644 --- a/src/lj_opt_narrow.c +++ b/src/lj_opt_narrow.c | |||
@@ -551,8 +551,13 @@ TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc) | |||
551 | { | 551 | { |
552 | rc = conv_str_tonum(J, rc, vc); | 552 | rc = conv_str_tonum(J, rc, vc); |
553 | if (tref_isinteger(rc)) { | 553 | if (tref_isinteger(rc)) { |
554 | if ((uint32_t)numberVint(vc) != 0x80000000u) | 554 | uint32_t k = (uint32_t)numberVint(vc); |
555 | return emitir(IRTGI(IR_SUBOV), lj_ir_kint(J, 0), rc); | 555 | if ((LJ_DUALNUM || k != 0) && k != 0x80000000u) { |
556 | TRef zero = lj_ir_kint(J, 0); | ||
557 | if (!LJ_DUALNUM) | ||
558 | emitir(IRTGI(IR_NE), rc, zero); | ||
559 | return emitir(IRTGI(IR_SUBOV), zero, rc); | ||
560 | } | ||
556 | rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT); | 561 | rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT); |
557 | } | 562 | } |
558 | return emitir(IRTN(IR_NEG), rc, lj_ir_ksimd(J, LJ_KSIMD_NEG)); | 563 | return emitir(IRTN(IR_NEG), rc, lj_ir_ksimd(J, LJ_KSIMD_NEG)); |