diff options
author | Mike Pall <mike> | 2017-03-21 00:58:02 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2017-03-21 00:58:02 +0100 |
commit | fa126c5f979a191eaec40a0967795f4512c5fe1b (patch) | |
tree | 18e4ba924e18f50ab6f84c8687a52251836e47ec | |
parent | 779a1eb8e6342986b80afbb5d0a378ad175939f6 (diff) | |
download | luajit-fa126c5f979a191eaec40a0967795f4512c5fe1b.tar.gz luajit-fa126c5f979a191eaec40a0967795f4512c5fe1b.tar.bz2 luajit-fa126c5f979a191eaec40a0967795f4512c5fe1b.zip |
x64/LJ_GC64: Fix assembly of CNEWI with 64 bit constant pointer.
Tracked down by Luke Gorrie.
-rw-r--r-- | src/lj_asm_x86.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index fceb1877..3e189b1d 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h | |||
@@ -1791,8 +1791,9 @@ static void asm_cnew(ASMState *as, IRIns *ir) | |||
1791 | Reg r64 = sz == 8 ? REX_64 : 0; | 1791 | Reg r64 = sz == 8 ? REX_64 : 0; |
1792 | if (irref_isk(ir->op2)) { | 1792 | if (irref_isk(ir->op2)) { |
1793 | IRIns *irk = IR(ir->op2); | 1793 | IRIns *irk = IR(ir->op2); |
1794 | uint64_t k = irk->o == IR_KINT64 ? ir_k64(irk)->u64 : | 1794 | uint64_t k = (irk->o == IR_KINT64 || |
1795 | (uint64_t)(uint32_t)irk->i; | 1795 | (LJ_GC64 && (irk->o == IR_KPTR || irk->o == IR_KKPTR))) ? |
1796 | ir_k64(irk)->u64 : (uint64_t)(uint32_t)irk->i; | ||
1796 | if (sz == 4 || checki32((int64_t)k)) { | 1797 | if (sz == 4 || checki32((int64_t)k)) { |
1797 | emit_i32(as, (int32_t)k); | 1798 | emit_i32(as, (int32_t)k); |
1798 | emit_rmro(as, XO_MOVmi, r64, RID_RET, sizeof(GCcdata)); | 1799 | emit_rmro(as, XO_MOVmi, r64, RID_RET, sizeof(GCcdata)); |