diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_asm_arm64.h | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h index 34960d7c..1d5cca4f 100644 --- a/src/lj_asm_arm64.h +++ b/src/lj_asm_arm64.h | |||
@@ -1289,8 +1289,9 @@ static void asm_tbar(ASMState *as, IRIns *ir) | |||
1289 | Reg link = ra_scratch(as, rset_exclude(RSET_GPR, tab)); | 1289 | Reg link = ra_scratch(as, rset_exclude(RSET_GPR, tab)); |
1290 | Reg mark = RID_TMP; | 1290 | Reg mark = RID_TMP; |
1291 | MCLabel l_end = emit_label(as); | 1291 | MCLabel l_end = emit_label(as); |
1292 | emit_lso(as, A64I_STRx, link, tab, (int32_t)offsetof(GCtab, gclist)); | ||
1293 | emit_lso(as, A64I_STRB, mark, tab, (int32_t)offsetof(GCtab, marked)); | 1292 | emit_lso(as, A64I_STRB, mark, tab, (int32_t)offsetof(GCtab, marked)); |
1293 | /* Keep STRx in the middle to avoid LDP/STP fusion with surrounding code. */ | ||
1294 | emit_lso(as, A64I_STRx, link, tab, (int32_t)offsetof(GCtab, gclist)); | ||
1294 | emit_setgl(as, tab, gc.grayagain); | 1295 | emit_setgl(as, tab, gc.grayagain); |
1295 | emit_dn(as, A64I_ANDw^emit_isk13(~LJ_GC_BLACK, 0), mark, mark); | 1296 | emit_dn(as, A64I_ANDw^emit_isk13(~LJ_GC_BLACK, 0), mark, mark); |
1296 | emit_getgl(as, link, gc.grayagain); | 1297 | emit_getgl(as, link, gc.grayagain); |