aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2011-03-19 17:46:10 +0100
committerMike Pall <mike>2011-03-19 17:46:10 +0100
commit7088abce8f811f68d3375771ba04f24b82e4a72a (patch)
treebcf50c67465c02112f5f24ab25e172fb2f24dd2d
parenta1c887e3b960f99e293817ac0cbfda57a4ae42c5 (diff)
downloadluajit-7088abce8f811f68d3375771ba04f24b82e4a72a.tar.gz
luajit-7088abce8f811f68d3375771ba04f24b82e4a72a.tar.bz2
luajit-7088abce8f811f68d3375771ba04f24b82e4a72a.zip
DUALNUM: Fix narrowing of unary minus.
-rw-r--r--src/lj_record.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/lj_record.c b/src/lj_record.c
index ea23c758..15152b96 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -1655,7 +1655,7 @@ void lj_record_ins(jit_State *J)
1655 rc = lj_ir_call(J, IRCALL_lj_tab_len, rc); 1655 rc = lj_ir_call(J, IRCALL_lj_tab_len, rc);
1656 } else { 1656 } else {
1657 ix.tab = rc; 1657 ix.tab = rc;
1658 copyTV(J->L, &ix.tabv, &ix.keyv); 1658 copyTV(J->L, &ix.tabv, rcv);
1659 ix.key = TREF_NIL; 1659 ix.key = TREF_NIL;
1660 setnilV(&ix.keyv); 1660 setnilV(&ix.keyv);
1661 rc = rec_mm_arith(J, &ix, MM_len); 1661 rc = rec_mm_arith(J, &ix, MM_len);
@@ -1666,19 +1666,20 @@ void lj_record_ins(jit_State *J)
1666 1666
1667 case BC_UNM: 1667 case BC_UNM:
1668 if (tref_isnumber_str(rc)) { 1668 if (tref_isnumber_str(rc)) {
1669 rc = lj_opt_narrow_unm(J, rc, &ix.tabv); 1669 rc = lj_opt_narrow_unm(J, rc, rcv);
1670 } else { 1670 } else {
1671 ix.tab = rc; 1671 ix.tab = rc;
1672 copyTV(J->L, &ix.tabv, &ix.keyv); 1672 copyTV(J->L, &ix.tabv, rcv);
1673 rc = rec_mm_arith(J, &ix, MM_unm); 1673 rc = rec_mm_arith(J, &ix, MM_unm);
1674 } 1674 }
1675 break; 1675 break;
1676 1676
1677 case BC_ADDNV: case BC_SUBNV: case BC_MULNV: case BC_DIVNV: case BC_MODNV: 1677 case BC_ADDNV: case BC_SUBNV: case BC_MULNV: case BC_DIVNV: case BC_MODNV:
1678 /* Swap rb/rc and rbv/rcv. rav is temp. */
1678 ix.tab = rc; ix.key = rc = rb; rb = ix.tab; 1679 ix.tab = rc; ix.key = rc = rb; rb = ix.tab;
1679 copyTV(J->L, &ix.valv, &ix.tabv); 1680 copyTV(J->L, rav, rbv);
1680 copyTV(J->L, &ix.tabv, &ix.keyv); 1681 copyTV(J->L, rbv, rcv);
1681 copyTV(J->L, &ix.keyv, &ix.valv); 1682 copyTV(J->L, rcv, rav);
1682 if (op == BC_MODNV) 1683 if (op == BC_MODNV)
1683 goto recmod; 1684 goto recmod;
1684 /* fallthrough */ 1685 /* fallthrough */
@@ -1686,7 +1687,7 @@ void lj_record_ins(jit_State *J)
1686 case BC_ADDVV: case BC_SUBVV: case BC_MULVV: case BC_DIVVV: { 1687 case BC_ADDVV: case BC_SUBVV: case BC_MULVV: case BC_DIVVV: {
1687 MMS mm = bcmode_mm(op); 1688 MMS mm = bcmode_mm(op);
1688 if (tref_isnumber_str(rb) && tref_isnumber_str(rc)) 1689 if (tref_isnumber_str(rb) && tref_isnumber_str(rc))
1689 rc = lj_opt_narrow_arith(J, rb, rc, &ix.tabv, &ix.keyv, 1690 rc = lj_opt_narrow_arith(J, rb, rc, rbv, rcv,
1690 (int)mm - (int)MM_add + (int)IR_ADD); 1691 (int)mm - (int)MM_add + (int)IR_ADD);
1691 else 1692 else
1692 rc = rec_mm_arith(J, &ix, mm); 1693 rc = rec_mm_arith(J, &ix, mm);