aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2023-09-21 03:46:33 +0200
committerMike Pall <mike>2023-09-21 03:46:33 +0200
commitb8919781d4717d8c3171b0002d230e03304d8174 (patch)
treeda31753f1fad2e7ae1abc46b86fb8cc18aa5d770 /src
parent91592899275cbb540ca67bbf95b41a2200e4fdbd (diff)
downloadluajit-b8919781d4717d8c3171b0002d230e03304d8174.tar.gz
luajit-b8919781d4717d8c3171b0002d230e03304d8174.tar.bz2
luajit-b8919781d4717d8c3171b0002d230e03304d8174.zip
Consistently use 64 bit constants for 64 bit IR instructions.
Thanks to Peter Cawley. #1084
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm_x86.h3
-rw-r--r--src/lj_ffrecord.c23
-rw-r--r--src/lj_iropt.h6
-rw-r--r--src/lj_record.c9
4 files changed, 24 insertions, 17 deletions
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h
index 9f779bf5..c92de3d8 100644
--- a/src/lj_asm_x86.h
+++ b/src/lj_asm_x86.h
@@ -140,7 +140,8 @@ static IRRef asm_fuseabase(ASMState *as, IRRef ref)
140 } 140 }
141 } else if (irb->o == IR_ADD && irref_isk(irb->op2)) { 141 } else if (irb->o == IR_ADD && irref_isk(irb->op2)) {
142 /* Fuse base offset (vararg load). */ 142 /* Fuse base offset (vararg load). */
143 as->mrm.ofs = IR(irb->op2)->i; 143 IRIns *irk = IR(irb->op2);
144 as->mrm.ofs = irk->o == IR_KINT ? irk->i : (int32_t)ir_kint64(irk)->u64;
144 return irb->op1; 145 return irb->op1;
145 } 146 }
146 return ref; /* Otherwise use the given array base. */ 147 return ref; /* Otherwise use the given array base. */
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 8ebf4165..1233e5f7 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -1130,7 +1130,7 @@ static TRef recff_sbufx_check(jit_State *J, RecordFFData *rd, ptrdiff_t arg)
1130/* Emit BUFHDR for write to extended string buffer. */ 1130/* Emit BUFHDR for write to extended string buffer. */
1131static TRef recff_sbufx_write(jit_State *J, TRef ud) 1131static TRef recff_sbufx_write(jit_State *J, TRef ud)
1132{ 1132{
1133 TRef trbuf = emitir(IRT(IR_ADD, IRT_PGC), ud, lj_ir_kint(J, sizeof(GCudata))); 1133 TRef trbuf = emitir(IRT(IR_ADD, IRT_PGC), ud, lj_ir_kintpgc(J, sizeof(GCudata)));
1134 return emitir(IRT(IR_BUFHDR, IRT_PGC), trbuf, IRBUFHDR_WRITE); 1134 return emitir(IRT(IR_BUFHDR, IRT_PGC), trbuf, IRBUFHDR_WRITE);
1135} 1135}
1136 1136
@@ -1164,20 +1164,19 @@ static void LJ_FASTCALL recff_buffer_method_reset(jit_State *J, RecordFFData *rd
1164 SBufExt *sbx = bufV(&rd->argv[0]); 1164 SBufExt *sbx = bufV(&rd->argv[0]);
1165 int iscow = (int)sbufiscow(sbx); 1165 int iscow = (int)sbufiscow(sbx);
1166 TRef trl = recff_sbufx_get_L(J, ud); 1166 TRef trl = recff_sbufx_get_L(J, ud);
1167 TRef trcow = emitir(IRT(IR_BAND, IRT_IGC), trl, lj_ir_kint(J, SBUF_FLAG_COW)); 1167 TRef trcow = emitir(IRT(IR_BAND, IRT_IGC), trl, lj_ir_kintpgc(J, SBUF_FLAG_COW));
1168 TRef zero = lj_ir_kint(J, 0); 1168 TRef zeropgc = lj_ir_kintpgc(J, 0);
1169 emitir(IRTG(iscow ? IR_NE : IR_EQ, IRT_IGC), trcow, zero); 1169 emitir(IRTG(iscow ? IR_NE : IR_EQ, IRT_IGC), trcow, zeropgc);
1170 if (iscow) { 1170 if (iscow) {
1171 trl = emitir(IRT(IR_BXOR, IRT_IGC), trl, 1171 TRef zerop = lj_ir_kintp(J, 0);
1172 LJ_GC64 ? lj_ir_kint64(J, SBUF_FLAG_COW) : 1172 trl = emitir(IRT(IR_BXOR, IRT_IGC), trl, lj_ir_kintpgc(J, SBUF_FLAG_COW));
1173 lj_ir_kint(J, SBUF_FLAG_COW)); 1173 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_W, zerop);
1174 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_W, zero); 1174 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_E, zerop);
1175 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_E, zero); 1175 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_B, zerop);
1176 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_B, zero);
1177 recff_sbufx_set_L(J, ud, trl); 1176 recff_sbufx_set_L(J, ud, trl);
1178 emitir(IRT(IR_FSTORE, IRT_PGC), 1177 emitir(IRT(IR_FSTORE, IRT_PGC),
1179 emitir(IRT(IR_FREF, IRT_PGC), ud, IRFL_SBUF_REF), zero); 1178 emitir(IRT(IR_FREF, IRT_PGC), ud, IRFL_SBUF_REF), zeropgc);
1180 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_R, zero); 1179 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_R, zerop);
1181 } else { 1180 } else {
1182 TRef trb = recff_sbufx_get_ptr(J, ud, IRFL_SBUF_B); 1181 TRef trb = recff_sbufx_get_ptr(J, ud, IRFL_SBUF_B);
1183 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_W, trb); 1182 recff_sbufx_set_ptr(J, ud, IRFL_SBUF_W, trb);
diff --git a/src/lj_iropt.h b/src/lj_iropt.h
index 458a5511..a71a717b 100644
--- a/src/lj_iropt.h
+++ b/src/lj_iropt.h
@@ -56,6 +56,12 @@ LJ_FUNC TRef lj_ir_ktrace(jit_State *J);
56#define lj_ir_kintp(J, k) lj_ir_kint(J, (int32_t)(k)) 56#define lj_ir_kintp(J, k) lj_ir_kint(J, (int32_t)(k))
57#endif 57#endif
58 58
59#if LJ_GC64
60#define lj_ir_kintpgc lj_ir_kintp
61#else
62#define lj_ir_kintpgc lj_ir_kint
63#endif
64
59static LJ_AINLINE TRef lj_ir_knum(jit_State *J, lua_Number n) 65static LJ_AINLINE TRef lj_ir_knum(jit_State *J, lua_Number n)
60{ 66{
61 TValue tv; 67 TValue tv;
diff --git a/src/lj_record.c b/src/lj_record.c
index 7a970628..d44f7737 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -1781,7 +1781,7 @@ noconstify:
1781 emitir(IRTG(IR_EQ, IRT_PGC), 1781 emitir(IRTG(IR_EQ, IRT_PGC),
1782 REF_BASE, 1782 REF_BASE,
1783 emitir(IRT(IR_ADD, IRT_PGC), uref, 1783 emitir(IRT(IR_ADD, IRT_PGC), uref,
1784 lj_ir_kint(J, (slot - 1 - LJ_FR2) * -8))); 1784 lj_ir_kintpgc(J, (slot - 1 - LJ_FR2) * -8)));
1785 slot -= (int32_t)J->baseslot; /* Note: slot number may be negative! */ 1785 slot -= (int32_t)J->baseslot; /* Note: slot number may be negative! */
1786 if (val == 0) { 1786 if (val == 0) {
1787 return getslot(J, slot); 1787 return getslot(J, slot);
@@ -1794,7 +1794,7 @@ noconstify:
1794 } 1794 }
1795 emitir(IRTG(IR_UGT, IRT_PGC), 1795 emitir(IRTG(IR_UGT, IRT_PGC),
1796 emitir(IRT(IR_SUB, IRT_PGC), uref, REF_BASE), 1796 emitir(IRT(IR_SUB, IRT_PGC), uref, REF_BASE),
1797 lj_ir_kint(J, (J->baseslot + J->maxslot) * 8)); 1797 lj_ir_kintpgc(J, (J->baseslot + J->maxslot) * 8));
1798 } else { 1798 } else {
1799 needbarrier = 1; 1799 needbarrier = 1;
1800 uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_PGC), fn, uv)); 1800 uref = tref_ref(emitir(IRTG(IR_UREFC, IRT_PGC), fn, uv));
@@ -1972,7 +1972,8 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
1972 emitir(IRTGI(IR_EQ), fr, 1972 emitir(IRTGI(IR_EQ), fr,
1973 lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1))); 1973 lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1)));
1974 vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr); 1974 vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
1975 vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase, lj_ir_kint(J, frofs-8*(1+LJ_FR2))); 1975 vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase,
1976 lj_ir_kintpgc(J, frofs-8*(1+LJ_FR2)));
1976 for (i = 0; i < nload; i++) { 1977 for (i = 0; i < nload; i++) {
1977 IRType t = itype2irt(&J->L->base[i-1-LJ_FR2-nvararg]); 1978 IRType t = itype2irt(&J->L->base[i-1-LJ_FR2-nvararg]);
1978 J->base[dst+i] = lj_record_vload(J, vbase, (MSize)i, t); 1979 J->base[dst+i] = lj_record_vload(J, vbase, (MSize)i, t);
@@ -2023,7 +2024,7 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
2023 IRType t; 2024 IRType t;
2024 TRef aref, vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr); 2025 TRef aref, vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
2025 vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase, 2026 vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase,
2026 lj_ir_kint(J, frofs-(8<<LJ_FR2))); 2027 lj_ir_kintpgc(J, frofs-(8<<LJ_FR2)));
2027 t = itype2irt(&J->L->base[idx-2-LJ_FR2-nvararg]); 2028 t = itype2irt(&J->L->base[idx-2-LJ_FR2-nvararg]);
2028 aref = emitir(IRT(IR_AREF, IRT_PGC), vbase, tridx); 2029 aref = emitir(IRT(IR_AREF, IRT_PGC), vbase, tridx);
2029 tr = lj_record_vload(J, aref, 0, t); 2030 tr = lj_record_vload(J, aref, 0, t);