aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2020-05-22 02:45:03 +0200
committerMike Pall <mike>2020-05-22 02:45:03 +0200
commit1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5 (patch)
treeb0b4bb0b78cf96c49a82cc6c6898a7cfc513bcbb
parent0eddcbead2d67c16dcd4039a6765b9d2fc8ea631 (diff)
downloadluajit-1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5.tar.gz
luajit-1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5.tar.bz2
luajit-1e6e8aaa20626ac94cf907c69b0452f76e9f5fa5.zip
Fix narrowing of unary minus.
-rw-r--r--src/lj_opt_narrow.c9
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));