diff options
author | Mike Pall <mike> | 2011-03-19 17:46:10 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-03-19 17:46:10 +0100 |
commit | 7088abce8f811f68d3375771ba04f24b82e4a72a (patch) | |
tree | bcf50c67465c02112f5f24ab25e172fb2f24dd2d | |
parent | a1c887e3b960f99e293817ac0cbfda57a4ae42c5 (diff) | |
download | luajit-7088abce8f811f68d3375771ba04f24b82e4a72a.tar.gz luajit-7088abce8f811f68d3375771ba04f24b82e4a72a.tar.bz2 luajit-7088abce8f811f68d3375771ba04f24b82e4a72a.zip |
DUALNUM: Fix narrowing of unary minus.
-rw-r--r-- | src/lj_record.c | 15 |
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); |