Fix narrowing of unary minus.

This commit is contained in:
Mike Pall 2020-05-22 02:45:03 +02:00
parent 0eddcbead2
commit 1e6e8aaa20

View File

@ -551,8 +551,13 @@ TRef lj_opt_narrow_unm(jit_State *J, TRef rc, TValue *vc)
{ {
rc = conv_str_tonum(J, rc, vc); rc = conv_str_tonum(J, rc, vc);
if (tref_isinteger(rc)) { if (tref_isinteger(rc)) {
if ((uint32_t)numberVint(vc) != 0x80000000u) uint32_t k = (uint32_t)numberVint(vc);
return emitir(IRTGI(IR_SUBOV), lj_ir_kint(J, 0), rc); if ((LJ_DUALNUM || k != 0) && k != 0x80000000u) {
TRef zero = lj_ir_kint(J, 0);
if (!LJ_DUALNUM)
emitir(IRTGI(IR_NE), rc, zero);
return emitir(IRTGI(IR_SUBOV), zero, rc);
}
rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT); rc = emitir(IRTN(IR_CONV), rc, IRCONV_NUM_INT);
} }
return emitir(IRTN(IR_NEG), rc, lj_ir_ksimd(J, LJ_KSIMD_NEG)); return emitir(IRTN(IR_NEG), rc, lj_ir_ksimd(J, LJ_KSIMD_NEG));