diff options
author | Mike Pall <mike> | 2023-09-09 17:21:32 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2023-09-09 17:21:32 +0200 |
commit | c1877e648a5eeb96deda7080c6a43aed1b1a35ea (patch) | |
tree | affeaa4acb759654642ed9130af864528f248fea /src | |
parent | c2bdce399ebd89a171d2622dd6e0b738aa94a3f5 (diff) | |
download | luajit-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.h | 8 |
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 | ||