Skip to content

Commit 8c10a4d

Browse files
committed
Merge remote-tracking branch 'upstream/v2.1' into v2.1
2 parents c597e02 + becf5cc commit 8c10a4d

17 files changed

+104
-55
lines changed

src/lib_base.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,10 @@ static int ffh_resume(lua_State *L, lua_State *co, int wrap)
616616
setstrV(L, L->base-LJ_FR2, lj_err_str(L, em));
617617
return FFH_RES(2);
618618
}
619-
lj_state_growstack(co, (MSize)(L->top - L->base));
619+
if (lj_state_cpgrowstack(co, (MSize)(L->top - L->base)) != LUA_OK) {
620+
cTValue *msg = --co->top;
621+
lj_err_callermsg(L, strVdata(msg));
622+
}
620623
return FFH_RETRY;
621624
}
622625

src/lib_ffi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ LJLIB_CF(ffi_abi) LJLIB_REC(.)
746746
"\003win"
747747
#endif
748748
#if LJ_ABI_PAUTH
749-
"\007pauth"
749+
"\005pauth"
750750
#endif
751751
#if LJ_TARGET_UWP
752752
"\003uwp"

src/lj_api.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,12 @@ LUA_API int lua_checkstack(lua_State *L, int size)
104104
if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) {
105105
return 0; /* Stack overflow. */
106106
} else if (size > 0) {
107-
lj_state_checkstack(L, (MSize)size);
107+
int avail = (int)(mref(L->maxstack, TValue) - L->top);
108+
if (size > avail &&
109+
lj_state_cpgrowstack(L, (MSize)(size - avail)) != LUA_OK) {
110+
L->top--;
111+
return 0; /* Out of memory. */
112+
}
108113
}
109114
return 1;
110115
}

src/lj_asm_arm64.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ static uint32_t asm_fuseopm(ASMState *as, A64Ins ai, IRRef ref, RegSet allow)
222222
return A64F_M(ir->r);
223223
} else if (irref_isk(ref)) {
224224
int64_t k = get_k64val(as, ref);
225-
uint32_t m = logical ? emit_isk13(k, irt_is64(ir->t)) : emit_isk12(k);
225+
uint32_t m = logical ? emit_isk13(k, irt_is64(ir->t)) :
226+
emit_isk12(irt_is64(ir->t) ? k : (int32_t)k);
226227
if (m)
227228
return m;
228229
} else if (mayfuse(as, ref)) {
@@ -786,7 +787,7 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
786787
int destused = ra_used(ir);
787788
Reg dest = ra_dest(as, ir, allow);
788789
Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));
789-
Reg key = 0, tmp = RID_TMP, type = RID_NONE, tkey;
790+
Reg tmp = RID_TMP, type = RID_NONE, key, tkey;
790791
IRRef refkey = ir->op2;
791792
IRIns *irkey = IR(refkey);
792793
int isk = irref_isk(refkey);
@@ -796,26 +797,22 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
796797
MCLabel l_end, l_loop;
797798
rset_clear(allow, tab);
798799

799-
/* Allocate registers outside of the loop. */
800-
if (irkey->o != IR_KNUM || !(k = emit_isk12((int64_t)ir_knum(irkey)->u64))) {
801-
key = ra_alloc1(as, refkey, irt_isnum(kt) ? RSET_FPR : allow);
802-
rset_clear(allow, key);
803-
}
804-
if (!isk) {
805-
tkey = ra_scratch(as, allow);
806-
rset_clear(allow, tkey);
807-
} else if (irt_isnum(kt)) {
808-
tkey = key; /* Assumes -0.0 is already canonicalized to +0.0. */
809-
} else {
800+
/* Allocate register for tkey outside of the loop. */
801+
if (isk) {
810802
int64_t kk;
811803
if (irt_isaddr(kt)) {
812804
kk = ((int64_t)irt_toitype(kt) << 47) | irkey[1].tv.u64;
805+
} else if (irt_isnum(kt)) {
806+
kk = (int64_t)ir_knum(irkey)->u64;
807+
/* Assumes -0.0 is already canonicalized to +0.0. */
813808
} else {
814809
lj_assertA(irt_ispri(kt) && !irt_isnil(kt), "bad HREF key type");
815810
kk = ~((int64_t)~irt_toitype(kt) << 47);
816811
}
817-
tkey = ra_allock(as, kk, allow);
818-
rset_clear(allow, tkey);
812+
k = emit_isk12(kk);
813+
tkey = k ? 0 : ra_allock(as, kk, allow);
814+
} else {
815+
tkey = ra_scratch(as, allow);
819816
}
820817

821818
/* Key not found in chain: jump to exit (if merged) or load niltv. */
@@ -848,10 +845,13 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
848845
/* Construct tkey as canonicalized or tagged key. */
849846
if (!isk) {
850847
if (irt_isnum(kt)) {
848+
key = ra_alloc1(as, refkey, RSET_FPR);
851849
emit_dnm(as, A64I_CSELx | A64F_CC(CC_EQ), tkey, RID_ZERO, tkey);
850+
/* A64I_FMOV_R_D from key to tkey done below. */
852851
} else {
853852
lj_assertA(irt_isaddr(kt), "bad HREF key type");
854-
type = ra_allock(as, irt_toitype(kt) << 15, allow);
853+
key = ra_alloc1(as, refkey, allow);
854+
type = ra_allock(as, irt_toitype(kt) << 15, rset_clear(allow, key));
855855
emit_dnm(as, A64I_ADDx | A64F_SH(A64SH_LSL, 32), tkey, key, type);
856856
}
857857
}

src/lj_asm_x86.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ static IRRef asm_fuseabase(ASMState *as, IRRef ref)
140140
}
141141
} else if (irb->o == IR_ADD && irref_isk(irb->op2)) {
142142
/* 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;
144145
return irb->op1;
145146
}
146147
return ref; /* Otherwise use the given array base. */

src/lj_def.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ typedef unsigned int uintptr_t;
6969
#define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */
7070

7171
#define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */
72-
#define LJ_STACK_EXTRA (5+2*LJ_FR2) /* Extra stack space (metamethods). */
72+
#define LJ_STACK_EXTRA (5+3*LJ_FR2) /* Extra stack space (metamethods). */
7373

7474
#define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */
7575

src/lj_dispatch.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ static int call_init(lua_State *L, GCfunc *fn)
453453
int numparams = pt->numparams;
454454
int gotparams = (int)(L->top - L->base);
455455
int need = pt->framesize;
456-
if ((pt->flags & PROTO_VARARG)) need += 1+gotparams;
456+
if ((pt->flags & PROTO_VARARG)) need += 1+LJ_FR2+gotparams;
457457
lj_state_checkstack(L, (MSize)need);
458458
numparams -= gotparams;
459459
return numparams >= 0 ? numparams : 0;

src/lj_err.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,15 @@ static void *err_unwind(lua_State *L, void *stopcf, int errcode)
174174
case FRAME_PCALL: /* FF pcall() frame. */
175175
case FRAME_PCALLH: /* FF pcall() frame inside hook. */
176176
if (errcode) {
177+
global_State *g;
177178
if (errcode == LUA_YIELD) {
178179
frame = frame_prevd(frame);
179180
break;
180181
}
182+
g = G(L);
183+
setgcref(g->cur_L, obj2gco(L));
181184
if (frame_typep(frame) == FRAME_PCALL)
182-
hook_leave(G(L));
185+
hook_leave(g);
183186
L->base = frame_prevd(frame) + 1;
184187
L->cframe = cf;
185188
unwindstack(L, L->base);

src/lj_ffrecord.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,7 @@ static TRef recff_sbufx_check(jit_State *J, RecordFFData *rd, ptrdiff_t arg)
11301130
/* Emit BUFHDR for write to extended string buffer. */
11311131
static TRef recff_sbufx_write(jit_State *J, TRef ud)
11321132
{
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)));
11341134
return emitir(IRT(IR_BUFHDR, IRT_PGC), trbuf, IRBUFHDR_WRITE);
11351135
}
11361136

@@ -1164,20 +1164,19 @@ static void LJ_FASTCALL recff_buffer_method_reset(jit_State *J, RecordFFData *rd
11641164
SBufExt *sbx = bufV(&rd->argv[0]);
11651165
int iscow = (int)sbufiscow(sbx);
11661166
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));
1168-
TRef zero = lj_ir_kint(J, 0);
1169-
emitir(IRTG(iscow ? IR_NE : IR_EQ, IRT_IGC), trcow, zero);
1167+
TRef trcow = emitir(IRT(IR_BAND, IRT_IGC), trl, lj_ir_kintpgc(J, SBUF_FLAG_COW));
1168+
TRef zeropgc = lj_ir_kintpgc(J, 0);
1169+
emitir(IRTG(iscow ? IR_NE : IR_EQ, IRT_IGC), trcow, zeropgc);
11701170
if (iscow) {
1171-
trl = emitir(IRT(IR_BXOR, IRT_IGC), trl,
1172-
LJ_GC64 ? lj_ir_kint64(J, SBUF_FLAG_COW) :
1173-
lj_ir_kint(J, SBUF_FLAG_COW));
1174-
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_W, zero);
1175-
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_E, zero);
1176-
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_B, zero);
1171+
TRef zerop = lj_ir_kintp(J, 0);
1172+
trl = emitir(IRT(IR_BXOR, IRT_IGC), trl, lj_ir_kintpgc(J, SBUF_FLAG_COW));
1173+
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_W, zerop);
1174+
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_E, zerop);
1175+
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_B, zerop);
11771176
recff_sbufx_set_L(J, ud, trl);
11781177
emitir(IRT(IR_FSTORE, IRT_PGC),
1179-
emitir(IRT(IR_FREF, IRT_PGC), ud, IRFL_SBUF_REF), zero);
1180-
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_R, zero);
1178+
emitir(IRT(IR_FREF, IRT_PGC), ud, IRFL_SBUF_REF), zeropgc);
1179+
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_R, zerop);
11811180
} else {
11821181
TRef trb = recff_sbufx_get_ptr(J, ud, IRFL_SBUF_B);
11831182
recff_sbufx_set_ptr(J, ud, IRFL_SBUF_W, trb);

src/lj_iropt.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ LJ_FUNC TRef lj_ir_ktrace(jit_State *J);
5656
#define lj_ir_kintp(J, k) lj_ir_kint(J, (int32_t)(k))
5757
#endif
5858

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+
5965
static LJ_AINLINE TRef lj_ir_knum(jit_State *J, lua_Number n)
6066
{
6167
TValue tv;

src/lj_opt_dce.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ static void dce_propagate(jit_State *J)
4444
IRIns *ir = IR(ins);
4545
if (irt_ismarked(ir->t)) {
4646
irt_clearmark(ir->t);
47-
pchain[ir->o] = &ir->prev;
4847
} else if (!ir_sideeff(ir)) {
4948
*pchain[ir->o] = ir->prev; /* Reroute original instruction chain. */
5049
lj_ir_nop(ir);
5150
continue;
5251
}
52+
pchain[ir->o] = &ir->prev;
5353
if (ir->op1 >= REF_FIRST) irt_setmark(IR(ir->op1)->t);
5454
if (ir->op2 >= REF_FIRST) irt_setmark(IR(ir->op2)->t);
5555
}

src/lj_record.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,7 +1781,7 @@ static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)
17811781
emitir(IRTG(IR_EQ, IRT_PGC),
17821782
REF_BASE,
17831783
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)));
17851785
slot -= (int32_t)J->baseslot; /* Note: slot number may be negative! */
17861786
if (val == 0) {
17871787
return getslot(J, slot);
@@ -1794,7 +1794,7 @@ static TRef rec_upvalue(jit_State *J, uint32_t uv, TRef val)
17941794
}
17951795
emitir(IRTG(IR_UGT, IRT_PGC),
17961796
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));
17981798
} else {
17991799
needbarrier = 1;
18001800
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)
19721972
emitir(IRTGI(IR_EQ), fr,
19731973
lj_ir_kint(J, (int32_t)frame_ftsz(J->L->base-1)));
19741974
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)));
19761977
for (i = 0; i < nload; i++) {
19771978
IRType t = itype2irt(&J->L->base[i-1-LJ_FR2-nvararg]);
19781979
J->base[dst+i] = lj_record_vload(J, vbase, (MSize)i, t);
@@ -1991,8 +1992,11 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
19911992
TRef tr = TREF_NIL;
19921993
ptrdiff_t idx = lj_ffrecord_select_mode(J, tridx, &J->L->base[dst-1]);
19931994
if (idx < 0) goto nyivarg;
1994-
if (idx != 0 && !tref_isinteger(tridx))
1995+
if (idx != 0 && !tref_isinteger(tridx)) {
1996+
if (tref_isstr(tridx))
1997+
tridx = emitir(IRTG(IR_STRTO, IRT_NUM), tridx, 0);
19951998
tridx = emitir(IRTGI(IR_CONV), tridx, IRCONV_INT_NUM|IRCONV_INDEX);
1999+
}
19962000
if (idx != 0 && tref_isk(tridx)) {
19972001
emitir(IRTGI(idx <= nvararg ? IR_GE : IR_LT),
19982002
fr, lj_ir_kint(J, frofs+8*(int32_t)idx));
@@ -2020,7 +2024,7 @@ static void rec_varg(jit_State *J, BCReg dst, ptrdiff_t nresults)
20202024
IRType t;
20212025
TRef aref, vbase = emitir(IRT(IR_SUB, IRT_IGC), REF_BASE, fr);
20222026
vbase = emitir(IRT(IR_ADD, IRT_PGC), vbase,
2023-
lj_ir_kint(J, frofs-(8<<LJ_FR2)));
2027+
lj_ir_kintpgc(J, frofs-(8<<LJ_FR2)));
20242028
t = itype2irt(&J->L->base[idx-2-LJ_FR2-nvararg]);
20252029
aref = emitir(IRT(IR_AREF, IRT_PGC), vbase, tridx);
20262030
tr = lj_record_vload(J, aref, 0, t);

src/lj_state.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,17 @@ void lj_state_shrinkstack(lua_State *L, MSize used)
103103
void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)
104104
{
105105
MSize n;
106-
if (L->stacksize > LJ_STACK_MAXEX) /* Overflow while handling overflow? */
107-
lj_err_throw(L, LUA_ERRERR);
106+
if (L->stacksize >= LJ_STACK_MAXEX) {
107+
/* 4. Throw 'error in error handling' when we are _over_ the limit. */
108+
if (L->stacksize > LJ_STACK_MAXEX)
109+
lj_err_throw(L, LUA_ERRERR); /* Does not invoke an error handler. */
110+
/* 1. We are _at_ the limit after the last growth. */
111+
if (L->status < LUA_ERRRUN) { /* 2. Throw 'stack overflow'. */
112+
L->status = LUA_ERRRUN; /* Prevent ending here again for pushed msg. */
113+
lj_err_msg(L, LJ_ERR_STKOV); /* May invoke an error handler. */
114+
}
115+
/* 3. Add space (over the limit) for pushed message and error handler. */
116+
}
108117
n = L->stacksize + need;
109118
if (n > LJ_STACK_MAX) {
110119
n += 2*LUA_MINSTACK;
@@ -114,15 +123,25 @@ void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)
114123
n = LJ_STACK_MAX;
115124
}
116125
resizestack(L, n);
117-
if (L->stacksize >= LJ_STACK_MAXEX)
118-
lj_err_msg(L, LJ_ERR_STKOV);
119126
}
120127

121128
void LJ_FASTCALL lj_state_growstack1(lua_State *L)
122129
{
123130
lj_state_growstack(L, 1);
124131
}
125132

133+
static TValue *cpgrowstack(lua_State *co, lua_CFunction dummy, void *ud)
134+
{
135+
UNUSED(dummy);
136+
lj_state_growstack(co, *(MSize *)ud);
137+
return NULL;
138+
}
139+
140+
int LJ_FASTCALL lj_state_cpgrowstack(lua_State *L, MSize need)
141+
{
142+
return lj_vm_cpcall(L, NULL, &need, cpgrowstack);
143+
}
144+
126145
/* Allocate basic stack for new state. */
127146
static void stack_init(lua_State *L1, lua_State *L)
128147
{

src/lj_state.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ LJ_FUNC void lj_state_relimitstack(lua_State *L);
1818
LJ_FUNC void lj_state_shrinkstack(lua_State *L, MSize used);
1919
LJ_FUNCA void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need);
2020
LJ_FUNC void LJ_FASTCALL lj_state_growstack1(lua_State *L);
21+
LJ_FUNC int LJ_FASTCALL lj_state_cpgrowstack(lua_State *L, MSize need);
2122

2223
static LJ_AINLINE void lj_state_checkstack(lua_State *L, MSize need)
2324
{

src/lj_trace.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -613,21 +613,27 @@ static int trace_abort(jit_State *J)
613613
J->cur.link = 0;
614614
J->cur.linktype = LJ_TRLINK_NONE;
615615
lj_vmevent_send(L, TRACE,
616-
TValue *frame;
616+
cTValue *bot = tvref(L->stack)+LJ_FR2;
617+
cTValue *frame;
617618
const BCIns *pc;
618-
GCfunc *fn;
619+
BCPos pos = 0;
619620
setstrV(L, L->top++, lj_str_newlit(L, "abort"));
620621
setintV(L->top++, traceno);
621622
/* Find original Lua function call to generate a better error message. */
622-
frame = J->L->base-1;
623-
pc = J->pc;
624-
while (!isluafunc(frame_func(frame))) {
625-
pc = (frame_iscont(frame) ? frame_contpc(frame) : frame_pc(frame)) - 1;
626-
frame = frame_prev(frame);
623+
for (frame = J->L->base-1, pc = J->pc; ; frame = frame_prev(frame)) {
624+
if (isluafunc(frame_func(frame))) {
625+
pos = proto_bcpos(funcproto(frame_func(frame)), pc);
626+
break;
627+
} else if (frame_prev(frame) <= bot) {
628+
break;
629+
} else if (frame_iscont(frame)) {
630+
pc = frame_contpc(frame) - 1;
631+
} else {
632+
pc = frame_pc(frame) - 1;
633+
}
627634
}
628-
fn = frame_func(frame);
629-
setfuncV(L, L->top++, fn);
630-
setintV(L->top++, proto_bcpos(funcproto(fn), pc));
635+
setfuncV(L, L->top++, frame_func(frame));
636+
setintV(L->top++, pos);
631637
copyTV(L, L->top++, restorestack(L, errobj));
632638
copyTV(L, L->top++, &J->errinfo);
633639
);

src/vm_arm64.dasc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3916,6 +3916,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
39163916
| add TMP2, BASE, RC
39173917
| add LFUNC:CARG3, CARG3, TMP0, lsl #47
39183918
| add RA, RA, RC
3919+
| sub CARG1, CARG1, #8
39193920
| add TMP0, RC, #16+FRAME_VARG
39203921
| str LFUNC:CARG3, [TMP2], #8 // Store (tagged) copy of LFUNC.
39213922
| ldr KBASE, [PC, #-4+PC2PROTO(k)]

src/vm_mips64.dasc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5396,6 +5396,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
53965396
| settp LFUNC:RB, TMP0
53975397
| daddu TMP0, RA, RC
53985398
| sd LFUNC:RB, 0(TMP1) // Store (tagged) copy of LFUNC.
5399+
| daddiu TMP2, TMP2, -8
53995400
| daddiu TMP3, RC, 16+FRAME_VARG
54005401
| sltu AT, TMP0, TMP2
54015402
| ld KBASE, -4+PC2PROTO(k)(PC)

0 commit comments

Comments
 (0)