diff options
author | Mike Pall <mike> | 2023-09-21 03:46:33 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2023-09-21 03:46:33 +0200 |
commit | b8919781d4717d8c3171b0002d230e03304d8174 (patch) | |
tree | da31753f1fad2e7ae1abc46b86fb8cc18aa5d770 /src | |
parent | 91592899275cbb540ca67bbf95b41a2200e4fdbd (diff) | |
download | luajit-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.h | 3 | ||||
-rw-r--r-- | src/lj_ffrecord.c | 23 | ||||
-rw-r--r-- | src/lj_iropt.h | 6 | ||||
-rw-r--r-- | src/lj_record.c | 9 |
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. */ |
1131 | static TRef recff_sbufx_write(jit_State *J, TRef ud) | 1131 | static 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 | |||
59 | static LJ_AINLINE TRef lj_ir_knum(jit_State *J, lua_Number n) | 65 | static 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); |