From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp14.mail.ru (smtp14.mail.ru [94.100.181.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id F07A9469719 for ; Mon, 5 Oct 2020 09:37:14 +0300 (MSK) Date: Mon, 5 Oct 2020 09:36:50 +0300 From: Sergey Kaplun Message-ID: <20201005063650.GA32264@root> References: <6d5e5a28558cfb9f42e4a0bfe0000f67054c9b64.1600615976.git.skaplun@tarantool.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6d5e5a28558cfb9f42e4a0bfe0000f67054c9b64.1600615976.git.skaplun@tarantool.org> Subject: Re: [Tarantool-patches] [PATCH v3 1/2] core: introduce various platform metrics List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Igor Munkin , Sergey Ostanevich Cc: tarantool-patches@dev.tarantool.org On 20.09.20, Sergey Kaplun wrote: > This patch introduces the following counters: > This patch isn't relevant. You can see actual version here [1]. You can apply -R corresponding diff to return to this version. ================================================================== diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index 62f269e..4fd08b9 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h @@ -1289,18 +1289,6 @@ static void asm_tbar(ASMState *as, IRIns *ir) rset_exclude(rset_exclude(RSET_GPR, tab), link)); Reg mark = RID_TMP; MCLabel l_end = emit_label(as); - emit_lso(as, ARMI_STR, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.graynum)); - emit_dn(as, ARMI_ADD|ARMI_K12|1, RID_TMP, RID_TMP); - emit_lso(as, ARMI_LDR, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.graynum)); - - emit_lso(as, ARMI_STR, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.blacknum)); - emit_dn(as, ARMI_SUB|ARMI_K12|1, RID_TMP, RID_TMP); - emit_lso(as, ARMI_LDR, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.blacknum)); - emit_lso(as, ARMI_STR, link, tab, (int32_t)offsetof(GCtab, gclist)); emit_lso(as, ARMI_STRB, mark, tab, (int32_t)offsetof(GCtab, marked)); emit_lso(as, ARMI_STR, tab, gr, diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h index 6be912e..a32ba2d 100644 --- a/src/lj_asm_arm64.h +++ b/src/lj_asm_arm64.h @@ -1252,18 +1252,6 @@ static void asm_tbar(ASMState *as, IRIns *ir) rset_exclude(rset_exclude(RSET_GPR, tab), link)); Reg mark = RID_TMP; MCLabel l_end = emit_label(as); - emit_lso(as, A64I_STRx, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.graynum)); - emit_dn(as, (A64I_ADDx^A64I_K12) | A64F_U12(1), RID_TMP, RID_TMP); - emit_lso(as, A64I_LDRx, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.graynum)); - - emit_lso(as, A64I_STRx, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.blacknum)); - emit_dn(as, (A64I_SUBx^A64I_K12) | A64F_U12(1), RID_TMP, RID_TMP); - emit_lso(as, A64I_LDRx, RID_TMP, gr, - (int32_t)offsetof(global_State, gc.blacknum)); - emit_lso(as, A64I_STRx, link, tab, (int32_t)offsetof(GCtab, gclist)); emit_lso(as, A64I_STRB, mark, tab, (int32_t)offsetof(GCtab, marked)); emit_lso(as, A64I_STRx, tab, gr, diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index 0a1900f..f4b4b5d 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h @@ -1504,12 +1504,6 @@ static void asm_tbar(ASMState *as, IRIns *ir) emit_tsi(as, MIPSI_SB, mark, tab, (int32_t)offsetof(GCtab, marked)); emit_setgl(as, tab, gc.grayagain); emit_getgl(as, link, gc.grayagain); - emit_setgl(as, RID_TMP, gc.graynum); - emit_tsi(as, MIPSI_AADDIU, RID_TMP, RID_TMP, 1); - emit_getgl(as, RID_TMP, gc.graynum); - emit_setgl(as, RID_TMP, gc.blacknum); - emit_tsi(as, MIPSI_AADDIU, RID_TMP, RID_TMP, -1); - emit_getgl(as, RID_TMP, gc.blacknum); emit_dst(as, MIPSI_XOR, mark, mark, RID_TMP); /* Clear black bit. */ emit_branch(as, MIPSI_BEQ, RID_TMP, RID_ZERO, l_end); emit_tsi(as, MIPSI_ANDI, RID_TMP, mark, LJ_GC_BLACK); diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h index be4b872..aa2d45c 100644 --- a/src/lj_asm_ppc.h +++ b/src/lj_asm_ppc.h @@ -1089,12 +1089,6 @@ static void asm_tbar(ASMState *as, IRIns *ir) lua_assert(LJ_GC_BLACK == 0x04); emit_rot(as, PPCI_RLWINM, mark, mark, 0, 30, 28); /* Clear black bit. */ emit_getgl(as, link, gc.grayagain); - emit_setgl(as, RID_TMP, gc.graynum); - emit_tai(as, PPCI_ADDIC, RID_TMP, RID_TMP, 1); - emit_getgl(as, RID_TMP, gc.graynum); - emit_setgl(as, RID_TMP, gc.blacknum); - emit_tai(as, PPCI_ADDIC, RID_TMP, RID_TMP, -1); - emit_getgl(as, RID_TMP, gc.blacknum); emit_condbranch(as, PPCI_BC|PPCF_Y, CC_EQ, l_end); emit_asi(as, PPCI_ANDIDOT, RID_TMP, mark, LJ_GC_BLACK); emit_tai(as, PPCI_LBZ, mark, tab, (int32_t)offsetof(GCtab, marked)); diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 8c9cdaa..959fc2d 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h @@ -1865,12 +1865,6 @@ static void asm_tbar(ASMState *as, IRIns *ir) emit_movtomro(as, tmp|REX_GC64, tab, offsetof(GCtab, gclist)); emit_setgl(as, tab, gc.grayagain); emit_getgl(as, tmp, gc.grayagain); - emit_i8(as, 1); - emit_rmro(as, XO_ARITHi8, XOg_ADD, RID_NONE, - ptr2addr(&J2G(as->J)->gc.graynum)); - emit_i8(as, 1); - emit_rmro(as, XO_ARITHi8, XOg_SUB, RID_NONE, - ptr2addr(&J2G(as->J)->gc.blacknum)); emit_i8(as, ~LJ_GC_BLACK); emit_rmro(as, XO_ARITHib, XOg_AND, tab, offsetof(GCtab, marked)); emit_sjcc(as, CC_Z, l_end); diff --git a/src/lj_cdata.c b/src/lj_cdata.c index 5870ac4..0dd8553 100644 --- a/src/lj_cdata.c +++ b/src/lj_cdata.c @@ -64,13 +64,6 @@ void LJ_FASTCALL lj_cdata_free(global_State *g, GCcdata *cd) { if (LJ_UNLIKELY(cd->marked & LJ_GC_CDATA_FIN)) { GCobj *root; - /* Restore old value of color incremented before free. */ - if (iswhite(obj2gco(cd))) - g->gc.whitenum++; - else if (isblack(obj2gco(cd))) - g->gc.blacknum++; - else - g->gc.graynum++; makewhite(g, obj2gco(cd)); markfinalized(obj2gco(cd)); if ((root = gcref(g->gc.mmudata)) != NULL) { diff --git a/src/lj_gc.c b/src/lj_gc.c index c7616f6..44c8aa1 100644 --- a/src/lj_gc.c +++ b/src/lj_gc.c @@ -33,18 +33,8 @@ #define GCFINALIZECOST 100 /* Macros to set GCobj colors and flags. */ -#define white2gray(g, x) \ - ( (g)->gc.whitenum--, \ - (g)->gc.graynum++, \ - lua_assert((ssize_t)(g)->gc.whitenum >=2), \ - (x)->gch.marked &= (uint8_t)~LJ_GC_WHITES ) - -#define gray2black(g, x) \ - ( (g)->gc.graynum--, \ - (g)->gc.blacknum++, \ - lua_assert((ssize_t)(g)->gc.graynum >=0), \ - (x)->gch.marked |= LJ_GC_BLACK ) - +#define white2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_WHITES) +#define gray2black(x) ((x)->gch.marked |= LJ_GC_BLACK) #define isfinalized(u) ((u)->marked & LJ_GC_FINALIZED) /* -- Mark phase ---------------------------------------------------------- */ @@ -59,30 +49,24 @@ { if (iswhite(obj2gco(o))) gc_mark(g, obj2gco(o)); } /* Mark a string object. */ -#define gc_mark_str(g, s) \ - { if ((s)->marked & LJ_GC_WHITES) { \ - (g)->gc.whitenum--; \ - (g)->gc.graynum++; \ - lua_assert((ssize_t)(g)->gc.whitenum >=2); \ - }; \ - (s)->marked &= (uint8_t)~LJ_GC_WHITES; } +#define gc_mark_str(s) ((s)->marked &= (uint8_t)~LJ_GC_WHITES) /* Mark a white GCobj. */ static void gc_mark(global_State *g, GCobj *o) { int gct = o->gch.gct; lua_assert(iswhite(o) && !isdead(g, o)); - white2gray(g, o); + white2gray(o); if (LJ_UNLIKELY(gct == ~LJ_TUDATA)) { GCtab *mt = tabref(gco2ud(o)->metatable); - gray2black(g, o); /* Userdata are never gray. */ + gray2black(o); /* Userdata are never gray. */ if (mt) gc_markobj(g, mt); gc_markobj(g, tabref(gco2ud(o)->env)); } else if (LJ_UNLIKELY(gct == ~LJ_TUPVAL)) { GCupval *uv = gco2uv(o); gc_marktv(g, uvval(uv)); if (uv->closed) - gray2black(g, o); /* Closed upvalues are never gray. */ + gray2black(o); /* Closed upvalues are never gray. */ } else if (gct != ~LJ_TSTR && gct != ~LJ_TCDATA) { lua_assert(gct == ~LJ_TFUNC || gct == ~LJ_TTAB || gct == ~LJ_TTHREAD || gct == ~LJ_TPROTO || gct == ~LJ_TTRACE); @@ -246,7 +230,7 @@ static void gc_marktrace(global_State *g, TraceNo traceno) GCobj *o = obj2gco(traceref(G2J(g), traceno)); lua_assert(traceno != G2J(g)->cur.traceno); if (iswhite(o)) { - white2gray(g, o); + white2gray(o); setgcrefr(o->gch.gclist, g->gc.gray); setgcref(g->gc.gray, o); } @@ -280,7 +264,7 @@ static void gc_traverse_trace(global_State *g, GCtrace *T) static void gc_traverse_proto(global_State *g, GCproto *pt) { ptrdiff_t i; - gc_mark_str(g, proto_chunkname(pt)); + gc_mark_str(proto_chunkname(pt)); for (i = -(ptrdiff_t)pt->sizekgc; i < 0; i++) /* Mark collectable consts. */ gc_markobj(g, proto_kgc(pt, i)); #if LJ_HASJIT @@ -326,12 +310,12 @@ static size_t propagatemark(global_State *g) GCobj *o = gcref(g->gc.gray); int gct = o->gch.gct; lua_assert(isgray(o)); - gray2black(g, o); + gray2black(o); setgcrefr(g->gc.gray, o->gch.gclist); /* Remove from gray list. */ if (LJ_LIKELY(gct == ~LJ_TTAB)) { GCtab *t = gco2tab(o); if (gc_traverse_tab(g, t) > 0) - black2gray(g, o); /* Keep weak tables gray. */ + black2gray(o); /* Keep weak tables gray. */ return sizeof(GCtab) + sizeof(TValue) * t->asize + (t->hmask ? sizeof(Node) * (t->hmask + 1) : 0); } else if (LJ_LIKELY(gct == ~LJ_TFUNC)) { @@ -347,7 +331,7 @@ static size_t propagatemark(global_State *g) lua_State *th = gco2th(o); setgcrefr(th->gclist, g->gc.grayagain); setgcref(g->gc.grayagain, o); - black2gray(g, o); /* Threads are never black. */ + black2gray(o); /* Threads are never black. */ gc_traverse_thread(g, th); return sizeof(lua_State) + sizeof(TValue) * th->stacksize; } else { @@ -419,16 +403,6 @@ static GCRef *gc_sweep(global_State *g, GCRef *p, uint32_t lim) setgcrefr(*p, o->gch.nextgc); if (o == gcref(g->gc.root)) setgcrefr(g->gc.root, o->gch.nextgc); /* Adjust list anchor. */ - if (iswhite(o)) { - g->gc.whitenum--; - lua_assert((ssize_t)g->gc.whitenum >= 2); - } else if (isblack(o)) { - g->gc.blacknum--; - lua_assert((ssize_t)g->gc.blacknum >= 0); - } else { - g->gc.graynum--; - lua_assert((ssize_t)g->gc.graynum >= 0); - } gc_freefunc[o->gch.gct - ~LJ_TSTR](g, o); } } @@ -456,16 +430,6 @@ static GCRef *gc_sweep_str_chain(global_State *g, GCRef *p) } else { /* Otherwise value is dead, free it. */ lua_assert(isdead(g, o) || ow == LJ_GC_SFIXED); setgcrefr(*p, o->gch.nextgc); - if (iswhite(o)) { - g->gc.whitenum--; - lua_assert((ssize_t)g->gc.whitenum >= 2); - } else if (isblack(o)) { - g->gc.blacknum--; - lua_assert((ssize_t)g->gc.blacknum >= 0); - } else { - g->gc.graynum--; - lua_assert((ssize_t)g->gc.graynum >= 0); - } lj_str_free(g, &o->str); } } @@ -473,11 +437,11 @@ static GCRef *gc_sweep_str_chain(global_State *g, GCRef *p) } /* Check whether we can clear a key or a value slot from a table. */ -static int gc_mayclear(global_State *g, cTValue *o, int val) +static int gc_mayclear(cTValue *o, int val) { if (tvisgcv(o)) { /* Only collectable objects can be weak references. */ if (tvisstr(o)) { /* But strings cannot be used as weak references. */ - gc_mark_str(g, strV(o)); /* And need to be marked. */ + gc_mark_str(strV(o)); /* And need to be marked. */ return 0; } if (iswhite(gcV(o))) @@ -489,7 +453,7 @@ static int gc_mayclear(global_State *g, cTValue *o, int val) } /* Clear collected entries from weak tables. */ -static void gc_clearweak(global_State *g, GCobj *o) +static void gc_clearweak(GCobj *o) { while (o) { GCtab *t = gco2tab(o); @@ -499,7 +463,7 @@ static void gc_clearweak(global_State *g, GCobj *o) for (i = 0; i < asize; i++) { /* Clear array slot when value is about to be collected. */ TValue *tv = arrayslot(t, i); - if (gc_mayclear(g, tv, 1)) + if (gc_mayclear(tv, 1)) setnilV(tv); } } @@ -509,8 +473,8 @@ static void gc_clearweak(global_State *g, GCobj *o) for (i = 0; i <= hmask; i++) { Node *n = &node[i]; /* Clear hash slot when key or value is about to be collected. */ - if (!tvisnil(&n->val) && (gc_mayclear(g, &n->key, 0) || - gc_mayclear(g, &n->val, 1))) + if (!tvisnil(&n->val) && (gc_mayclear(&n->key, 0) || + gc_mayclear(&n->val, 1))) setnilV(&n->val); } } @@ -655,21 +619,12 @@ static void atomic(global_State *g, lua_State *L) udsize += gc_propagate_gray(g); /* And propagate the marks. */ /* All marking done, clear weak tables. */ - gc_clearweak(g, gcref(g->gc.weak)); + gc_clearweak(gcref(g->gc.weak)); lj_buf_shrink(L, &g->tmpbuf); /* Shrink temp buffer. */ /* Prepare for sweep phase. */ g->gc.currentwhite = (uint8_t)otherwhite(g); /* Flip current white. */ - if (g->strempty.marked & (uint8_t)LJ_GC_BLACK) { - g->gc.blacknum--; - g->gc.whitenum++; - lua_assert((ssize_t)g->gc.blacknum >=0); - } else if ((g->strempty.marked & (uint8_t)LJ_GC_WHITES) == 0) { - g->gc.graynum--; - g->gc.whitenum++; - lua_assert((ssize_t)g->gc.graynum >=0); - } g->strempty.marked = g->gc.currentwhite; setmref(g->gc.sweep, &g->gc.root); g->gc.estimate = g->gc.total - (GCSize)udsize; /* Initial estimate. */ @@ -854,18 +809,8 @@ void LJ_FASTCALL lj_gc_barrieruv(global_State *g, TValue *tv) (*((uint8_t *)(x) - offsetof(GCupval, tv) + offsetof(GCupval, marked))) if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) gc_mark(g, gcV(tv)); - else { - if (TV2MARKED(tv) & (uint8_t)LJ_GC_BLACK) { - g->gc.blacknum--; - g->gc.whitenum++; - lua_assert((ssize_t)g->gc.blacknum >=0); - } else if ((TV2MARKED(tv) & (uint8_t)LJ_GC_WHITES) == 0) { - g->gc.graynum--; - g->gc.whitenum++; - lua_assert((ssize_t)g->gc.graynum >=0); - } + else TV2MARKED(tv) = (TV2MARKED(tv) & (uint8_t)~LJ_GC_COLORS) | curwhite(g); - } #undef TV2MARKED } @@ -881,7 +826,7 @@ void lj_gc_closeuv(global_State *g, GCupval *uv) setgcref(g->gc.root, o); if (isgray(o)) { /* A closed upvalue is never gray, so fix this. */ if (g->gc.state == GCSpropagate || g->gc.state == GCSatomic) { - gray2black(g, o); /* Make it black and preserve invariant. */ + gray2black(o); /* Make it black and preserve invariant. */ if (tviswhite(&uv->tv)) lj_gc_barrierf(g, o, gcV(&uv->tv)); } else { diff --git a/src/lj_gc.h b/src/lj_gc.h index 25e319a..2051220 100644 --- a/src/lj_gc.h +++ b/src/lj_gc.h @@ -32,28 +32,11 @@ #define isdead(g, v) ((v)->gch.marked & otherwhite(g) & LJ_GC_WHITES) #define curwhite(g) ((g)->gc.currentwhite & LJ_GC_WHITES) -#define newwhite(g, x) \ - ( (g)->gc.whitenum++, \ - obj2gco(x)->gch.marked = (uint8_t)curwhite(g) ) - +#define newwhite(g, x) (obj2gco(x)->gch.marked = (uint8_t)curwhite(g)) #define makewhite(g, x) \ - ( iswhite(x) ? /* Nothing to do */ : \ - isblack(x) ? ((g)->gc.blacknum--, (g)->gc.whitenum++) : \ - (lua_assert(isgray(x)), (g)->gc.graynum--, (g)->gc.whitenum++), \ - lua_assert((ssize_t)(g)->gc.graynum >=0), \ - lua_assert((ssize_t)(g)->gc.blacknum >=0), \ - (x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g) ) - -#define flipwhite(x) \ - ( lua_assert(!isgray(x) && ! isblack(x)), \ - (x)->gch.marked ^= LJ_GC_WHITES ) - -#define black2gray(g, x) \ - ( (g)->gc.blacknum--, \ - (g)->gc.graynum++, \ - lua_assert((ssize_t)(g)->gc.blacknum >=0), \ - (x)->gch.marked &= (uint8_t)~LJ_GC_BLACK ) - + ((x)->gch.marked = ((x)->gch.marked & (uint8_t)~LJ_GC_COLORS) | curwhite(g)) +#define flipwhite(x) ((x)->gch.marked ^= LJ_GC_WHITES) +#define black2gray(x) ((x)->gch.marked &= (uint8_t)~LJ_GC_BLACK) #define fixstring(s) ((s)->marked |= LJ_GC_FIXED) #define markfinalized(x) ((x)->gch.marked |= LJ_GC_FINALIZED) @@ -95,7 +78,7 @@ static LJ_AINLINE void lj_gc_barrierback(global_State *g, GCtab *t) GCobj *o = obj2gco(t); lua_assert(isblack(o) && !isdead(g, o)); lua_assert(g->gc.state != GCSfinalize && g->gc.state != GCSpause); - black2gray(g, o); + black2gray(o); setgcrefr(t->gclist, g->gc.grayagain); setgcref(g->gc.grayagain, o); } diff --git a/src/lj_obj.h b/src/lj_obj.h index c9a6904..600b68d 100644 --- a/src/lj_obj.h +++ b/src/lj_obj.h @@ -609,9 +609,6 @@ typedef struct GCState { #ifdef LJ_HASFFI size_t cdatanum; /* Amount of allocated cdata objects. */ #endif - size_t whitenum; /* Amount of white objects. */ - size_t graynum; /* Amount of grey objects. */ - size_t blacknum; /* Amount of black objects. */ } GCState; /* Global state, shared by all threads of a Lua universe. */ @@ -630,7 +627,6 @@ typedef struct global_State { lua_Alloc allocf; /* Memory allocator. */ void *allocd; /* Memory allocator data. */ GCState gc; /* Garbage collector. */ - GCRef mainthref; /* Link to main thread. */ SBuf tmpbuf; /* Temporary string buffer. */ GCstr strempty; /* Empty string. */ uint8_t stremptyz; /* Zero terminator of empty string. */ @@ -638,8 +634,9 @@ typedef struct global_State { uint8_t dispatchmode; /* Dispatch mode. */ uint8_t vmevmask; /* VM event mask. */ int32_t hookcount; /* Instruction hook countdown. */ + GCRef mainthref; /* Link to main thread. */ TValue registrytv; /* Anchor for registry. */ - TValue tmptv, tmptv2; /* Temporary TValues. */ + TValue tmptv2, tmptv; /* Temporary TValues. */ Node nilnode; /* Fallback 1-element hash part (nil key and value). */ GCupval uvhead; /* Head of double-linked list of all open upvalues. */ volatile int32_t vmstate; /* VM state or current JIT code trace number. */ diff --git a/src/lj_state.c b/src/lj_state.c index d85a02a..1d9c628 100644 --- a/src/lj_state.c +++ b/src/lj_state.c @@ -164,10 +164,6 @@ static void close_state(lua_State *L) lj_gc_freeall(g); lua_assert(gcref(g->gc.root) == obj2gco(L)); lua_assert(g->strnum == 0); - lua_assert(g->gc.blacknum == 0); - lua_assert(g->gc.graynum == 0); - /* At least lua_State, strempty and state enviroment. */ - lua_assert(g->gc.whitenum >= 2); lj_trace_freestate(g); #if LJ_HASFFI lj_ctype_freestate(g); @@ -219,7 +215,6 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) setgcref(g->gc.root, obj2gco(L)); setmref(g->gc.sweep, &g->gc.root); g->gc.allocated = g->gc.total = sizeof(GG_State); - g->gc.whitenum = 2; /* State and strempty. */ g->gc.pause = LUAI_GCPAUSE; g->gc.stepmul = LUAI_GCMUL; lj_dispatch_init((GG_State *)L); diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc index ea3bf31..d4cdaf5 100644 --- a/src/vm_arm.dasc +++ b/src/vm_arm.dasc @@ -227,12 +227,6 @@ | |// Move table write barrier back. Overwrites mark and tmp. |.macro barrierback, tab, mark, tmp -| ldr tmp, [DISPATCH, #DISPATCH_GL(gc.graynum)] -| add tmp, tmp, #1 -| str tmp, [DISPATCH, #DISPATCH_GL(gc.graynum)] -| ldr tmp, [DISPATCH, #DISPATCH_GL(gc.blacknum)] -| sub tmp, tmp, #1 -| str tmp, [DISPATCH, #DISPATCH_GL(gc.blacknum)] | ldr tmp, [DISPATCH, #DISPATCH_GL(gc.grayagain)] | bic mark, mark, #LJ_GC_BLACK // black2gray(tab) | str tab, [DISPATCH, #DISPATCH_GL(gc.grayagain)] diff --git a/src/vm_arm64.dasc b/src/vm_arm64.dasc index a182f35..3eaf376 100644 --- a/src/vm_arm64.dasc +++ b/src/vm_arm64.dasc @@ -280,12 +280,6 @@ | |// Move table write barrier back. Overwrites mark and tmp. |.macro barrierback, tab, mark, tmp -| ldr tmp, GL->gc.blacknum -| sub tmp, tmp, #1 -| str tmp, GL->gc.blacknum -| ldr tmp, GL->gc.graynum -| add tmp, tmp, #1 -| str tmp, GL->gc.graynum | ldr tmp, GL->gc.grayagain | and mark, mark, #~LJ_GC_BLACK // black2gray(tab) | str tab, GL->gc.grayagain diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc index 7de8beb..1afd611 100644 --- a/src/vm_mips.dasc +++ b/src/vm_mips.dasc @@ -351,12 +351,6 @@ | |// Move table write barrier back. Overwrites mark and tmp. |.macro barrierback, tab, mark, tmp, target -| lw tmp, DISPATCH_GL(gc.blacknum)(DISPATCH) -| addiu tmp, tmp, -1 -| sw tmp, DISPATCH_GL(gc.blacknum)(DISPATCH) -| lw tmp, DISPATCH_GL(gc.graynum)(DISPATCH) -| addiu tmp, tmp, 1 -| sw tmp, DISPATCH_GL(gc.graynum)(DISPATCH) | lw tmp, DISPATCH_GL(gc.grayagain)(DISPATCH) | andi mark, mark, ~LJ_GC_BLACK & 255 // black2gray(tab) | sw tab, DISPATCH_GL(gc.grayagain)(DISPATCH) diff --git a/src/vm_mips64.dasc b/src/vm_mips64.dasc index 30cab6c..c06270a 100644 --- a/src/vm_mips64.dasc +++ b/src/vm_mips64.dasc @@ -350,12 +350,6 @@ | |// Move table write barrier back. Overwrites mark and tmp. |.macro barrierback, tab, mark, tmp, target -| ld tmp, DISPATCH_GL(gc.blacknum)(DISPATCH) -| addiu tmp, tmp, -1 -| sd tmp, DISPATCH_GL(gc.blacknum)(DISPATCH) -| ld tmp, DISPATCH_GL(gc.graynum)(DISPATCH) -| addiu tmp, tmp, 1 -| sd tmp, DISPATCH_GL(gc.graynum)(DISPATCH) | ld tmp, DISPATCH_GL(gc.grayagain)(DISPATCH) | andi mark, mark, ~LJ_GC_BLACK & 255 // black2gray(tab) | sd tab, DISPATCH_GL(gc.grayagain)(DISPATCH) diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index 3015869..b4260eb 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc @@ -474,12 +474,6 @@ | |// Move table write barrier back. Overwrites mark and tmp. |.macro barrierback, tab, mark, tmp -| lwz tmp, DISPATCH_GL(gc.graynum)(DISPATCH) -| addic tmp, tmp, 1 -| stw tmp, DISPATCH_GL(gc.graynum)(DISPATCH) -| lwz tmp, DISPATCH_GL(gc.blacknum)(DISPATCH) -| subic tmp, tmp, 1 -| stw tmp, DISPATCH_GL(gc.blacknum)(DISPATCH) | lwz tmp, DISPATCH_GL(gc.grayagain)(DISPATCH) | // Assumes LJ_GC_BLACK is 0x04. | rlwinm mark, mark, 0, 30, 28 // black2gray(tab) diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc index d37b310..80753e0 100644 --- a/src/vm_x64.dasc +++ b/src/vm_x64.dasc @@ -372,8 +372,6 @@ |// Move table write barrier back. Overwrites reg. |.macro barrierback, tab, reg | and byte tab->marked, (uint8_t)~LJ_GC_BLACK // black2gray(tab) -| sub qword [DISPATCH+DISPATCH_GL(gc.blacknum)], 1 -| add qword [DISPATCH+DISPATCH_GL(gc.graynum)], 1 | mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)] | mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab | mov tab->gclist, reg diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc index 3e35cc6..56bee14 100644 --- a/src/vm_x86.dasc +++ b/src/vm_x86.dasc @@ -477,8 +477,6 @@ |// Move table write barrier back. Overwrites reg. |.macro barrierback, tab, reg | and byte tab->marked, (uint8_t)~LJ_GC_BLACK // black2gray(tab) -| sub dword [DISPATCH+DISPATCH_GL(gc.blacknum)], 1 -| add dword [DISPATCH+DISPATCH_GL(gc.graynum)], 1 | mov reg, [DISPATCH+DISPATCH_GL(gc.grayagain)] | mov [DISPATCH+DISPATCH_GL(gc.grayagain)], tab | mov tab->gclist, reg ================================================================== [1]: https://lists.tarantool.org/pipermail/tarantool-patches/2020-October/019881.html -- Best regards, Sergey Kaplun