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 | |
| 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
| -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 | ||
