diff options
-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)); |