aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2023-09-09 17:21:32 +0200
committerMike Pall <mike>2023-09-09 17:21:32 +0200
commitc1877e648a5eeb96deda7080c6a43aed1b1a35ea (patch)
treeaffeaa4acb759654642ed9130af864528f248fea /src
parentc2bdce399ebd89a171d2622dd6e0b738aa94a3f5 (diff)
downloadluajit-c1877e648a5eeb96deda7080c6a43aed1b1a35ea.tar.gz
luajit-c1877e648a5eeb96deda7080c6a43aed1b1a35ea.tar.bz2
luajit-c1877e648a5eeb96deda7080c6a43aed1b1a35ea.zip
ARM64: Improve IR_OBAR code generation.
Thanks to Peter Cawley. #1070
Diffstat (limited to 'src')
-rw-r--r--src/lj_asm_arm64.h8
1 files changed, 3 insertions, 5 deletions
diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h
index 68749284..5fd7bf07 100644
--- a/src/lj_asm_arm64.h
+++ b/src/lj_asm_arm64.h
@@ -1283,7 +1283,6 @@ static void asm_obar(ASMState *as, IRIns *ir)
1283 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv]; 1283 const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];
1284 IRRef args[2]; 1284 IRRef args[2];
1285 MCLabel l_end; 1285 MCLabel l_end;
1286 RegSet allow = RSET_GPR;
1287 Reg obj, val, tmp; 1286 Reg obj, val, tmp;
1288 /* No need for other object barriers (yet). */ 1287 /* No need for other object barriers (yet). */
1289 lj_assertA(IR(ir->op1)->o == IR_UREFC, "bad OBAR type"); 1288 lj_assertA(IR(ir->op1)->o == IR_UREFC, "bad OBAR type");
@@ -1294,14 +1293,13 @@ static void asm_obar(ASMState *as, IRIns *ir)
1294 asm_gencall(as, ci, args); 1293 asm_gencall(as, ci, args);
1295 emit_dm(as, A64I_MOVx, ra_releasetmp(as, ASMREF_TMP1), RID_GL); 1294 emit_dm(as, A64I_MOVx, ra_releasetmp(as, ASMREF_TMP1), RID_GL);
1296 obj = IR(ir->op1)->r; 1295 obj = IR(ir->op1)->r;
1297 tmp = ra_scratch(as, rset_exclude(allow, obj)); 1296 tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));
1298 emit_cond_branch(as, CC_EQ, l_end); 1297 emit_tnb(as, A64I_TBZ, tmp, lj_ffs(LJ_GC_BLACK), l_end);
1299 emit_n(as, A64I_TSTw^emit_isk13(LJ_GC_BLACK, 0), tmp);
1300 emit_cond_branch(as, CC_EQ, l_end); 1298 emit_cond_branch(as, CC_EQ, l_end);
1301 emit_n(as, A64I_TSTw^emit_isk13(LJ_GC_WHITES, 0), RID_TMP); 1299 emit_n(as, A64I_TSTw^emit_isk13(LJ_GC_WHITES, 0), RID_TMP);
1302 val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj)); 1300 val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));
1303 emit_lso(as, A64I_LDRB, tmp, obj, 1301 emit_lso(as, A64I_LDRB, tmp, obj,
1304 (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv)); 1302 (int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));
1305 emit_lso(as, A64I_LDRB, RID_TMP, val, (int32_t)offsetof(GChead, marked)); 1303 emit_lso(as, A64I_LDRB, RID_TMP, val, (int32_t)offsetof(GChead, marked));
1306} 1304}
1307 1305