LJ_GC64: Introduce IRT_PGC.
Contributed by Peter Cawley.
This commit is contained in:
@@ -173,7 +173,7 @@ static void LJ_FASTCALL recff_nyi(jit_State *J, RecordFFData *rd)
|
||||
/* Emit BUFHDR for the global temporary buffer. */
|
||||
static TRef recff_bufhdr(jit_State *J)
|
||||
{
|
||||
return emitir(IRT(IR_BUFHDR, IRT_P32),
|
||||
return emitir(IRT(IR_BUFHDR, IRT_PGC),
|
||||
lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ static void LJ_FASTCALL recff_setmetatable(jit_State *J, RecordFFData *rd)
|
||||
ix.tab = tr;
|
||||
copyTV(J->L, &ix.tabv, &rd->argv[0]);
|
||||
lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */
|
||||
fref = emitir(IRT(IR_FREF, IRT_P32), tr, IRFL_TAB_META);
|
||||
fref = emitir(IRT(IR_FREF, IRT_PGC), tr, IRFL_TAB_META);
|
||||
mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt;
|
||||
emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref);
|
||||
if (!tref_isnil(mt))
|
||||
@@ -289,7 +289,7 @@ int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv)
|
||||
if (strV(tv)->len == 1) {
|
||||
emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv)));
|
||||
} else {
|
||||
TRef trptr = emitir(IRT(IR_STRREF, IRT_P32), tr, lj_ir_kint(J, 0));
|
||||
TRef trptr = emitir(IRT(IR_STRREF, IRT_PGC), tr, lj_ir_kint(J, 0));
|
||||
TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY);
|
||||
emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#'));
|
||||
}
|
||||
@@ -814,7 +814,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
|
||||
/* Also handle empty range here, to avoid extra traces. */
|
||||
TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart);
|
||||
emitir(IRTGI(IR_GE), trslen, tr0);
|
||||
trptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
|
||||
trptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
|
||||
J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen);
|
||||
} else { /* Range underflow: return empty string. */
|
||||
emitir(IRTGI(IR_LT), trend, trstart);
|
||||
@@ -830,7 +830,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
|
||||
rd->nres = len;
|
||||
for (i = 0; i < len; i++) {
|
||||
TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i));
|
||||
tmp = emitir(IRT(IR_STRREF, IRT_P32), trstr, tmp);
|
||||
tmp = emitir(IRT(IR_STRREF, IRT_PGC), trstr, tmp);
|
||||
J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY);
|
||||
}
|
||||
} else { /* Empty range or range underflow: return no results. */
|
||||
@@ -852,7 +852,7 @@ static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)
|
||||
if (i > 1) { /* Concatenate the strings, if there's more than one. */
|
||||
TRef hdr = recff_bufhdr(J), tr = hdr;
|
||||
for (i = 0; J->base[i] != 0; i++)
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, J->base[i]);
|
||||
J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
|
||||
}
|
||||
UNUSED(rd);
|
||||
@@ -869,14 +869,14 @@ static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd)
|
||||
emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));
|
||||
if (vrep > 1) {
|
||||
TRef hdr2 = recff_bufhdr(J);
|
||||
TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), hdr2, sep);
|
||||
tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), tr2, str);
|
||||
TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), hdr2, sep);
|
||||
tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), tr2, str);
|
||||
str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);
|
||||
}
|
||||
}
|
||||
tr = hdr = recff_bufhdr(J);
|
||||
if (str2) {
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, str);
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, str);
|
||||
str = str2;
|
||||
rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));
|
||||
}
|
||||
@@ -927,8 +927,8 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
|
||||
if ((J->base[2] && tref_istruecond(J->base[3])) ||
|
||||
(emitir(IRTG(IR_EQ, IRT_STR), trpat, lj_ir_kstr(J, pat)),
|
||||
!lj_str_haspattern(pat))) { /* Search for fixed string. */
|
||||
TRef trsptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
|
||||
TRef trpptr = emitir(IRT(IR_STRREF, IRT_P32), trpat, tr0);
|
||||
TRef trsptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
|
||||
TRef trpptr = emitir(IRT(IR_STRREF, IRT_PGC), trpat, tr0);
|
||||
TRef trslen = emitir(IRTI(IR_SUB), trlen, trstart);
|
||||
TRef trplen = emitir(IRTI(IR_FLOAD), trpat, IRFL_STR_LEN);
|
||||
TRef tr = lj_ir_call(J, IRCALL_lj_str_find, trsptr, trpptr, trslen, trplen);
|
||||
@@ -936,13 +936,13 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
|
||||
if (lj_str_find(strdata(str)+(MSize)start, strdata(pat),
|
||||
str->len-(MSize)start, pat->len)) {
|
||||
TRef pos;
|
||||
emitir(IRTG(IR_NE, IRT_P32), tr, trp0);
|
||||
pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_P32), trstr, tr0));
|
||||
emitir(IRTG(IR_NE, IRT_PGC), tr, trp0);
|
||||
pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr0));
|
||||
J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));
|
||||
J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);
|
||||
rd->nres = 2;
|
||||
} else {
|
||||
emitir(IRTG(IR_EQ, IRT_P32), tr, trp0);
|
||||
emitir(IRTG(IR_EQ, IRT_PGC), tr, trp0);
|
||||
J->base[0] = TREF_NIL;
|
||||
}
|
||||
} else { /* Search for pattern. */
|
||||
@@ -969,7 +969,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
||||
IRCallID id;
|
||||
switch (STRFMT_TYPE(sf)) {
|
||||
case STRFMT_LIT:
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
|
||||
lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len)));
|
||||
break;
|
||||
case STRFMT_INT:
|
||||
@@ -978,7 +978,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
||||
if (!tref_isinteger(tra))
|
||||
goto handle_num;
|
||||
if (sf == STRFMT_INT) { /* Shortcut for plain %d. */
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
|
||||
emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT));
|
||||
} else {
|
||||
#if LJ_HASFFI
|
||||
@@ -1008,7 +1008,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
||||
return;
|
||||
}
|
||||
if (sf == STRFMT_STR) /* Shortcut for plain %s. */
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, tra);
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, tra);
|
||||
else if ((sf & STRFMT_T_QUOTED))
|
||||
tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra);
|
||||
else
|
||||
@@ -1017,7 +1017,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
|
||||
case STRFMT_CHAR:
|
||||
tra = lj_opt_narrow_toint(J, tra);
|
||||
if (sf == STRFMT_CHAR) /* Shortcut for plain %c. */
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
|
||||
tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
|
||||
emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR));
|
||||
else
|
||||
tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra);
|
||||
@@ -1125,7 +1125,7 @@ static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)
|
||||
ptrdiff_t i = rd->data == 0 ? 1 : 0;
|
||||
for (; J->base[i]; i++) {
|
||||
TRef str = lj_ir_tostr(J, J->base[i]);
|
||||
TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);
|
||||
TRef buf = emitir(IRT(IR_STRREF, IRT_PGC), str, zero);
|
||||
TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);
|
||||
if (tref_isk(len) && IR(tref_ref(len))->i == 1) {
|
||||
IRIns *irs = IR(tref_ref(str));
|
||||
|
||||
Reference in New Issue
Block a user