Skip to content

Commit 93ef009

Browse files
committed
8255762: Shenandoah: Consolidate/streamline interpreter LRBs
Reviewed-by: shade
1 parent 63461d5 commit 93ef009

File tree

4 files changed

+110
-377
lines changed

4 files changed

+110
-377
lines changed

src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.cpp

Lines changed: 28 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@
4343

4444
#define __ masm->
4545

46-
address ShenandoahBarrierSetAssembler::_shenandoah_lrb = NULL;
47-
4846
void ShenandoahBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
4947
Register src, Register dst, Register count, RegSet saved_regs) {
5048
if (is_oop) {
@@ -227,18 +225,18 @@ void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssemb
227225
}
228226
}
229227

230-
void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembler* masm, Register dst, Address load_addr) {
228+
void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr, bool weak) {
231229
assert(ShenandoahLoadRefBarrier, "Should be enabled");
232230
assert(dst != rscratch2, "need rscratch2");
233231
assert_different_registers(load_addr.base(), load_addr.index(), rscratch1, rscratch2);
234232

235-
Label done;
233+
Label heap_stable, not_cset;
236234
__ enter();
237235
Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
238236
__ ldrb(rscratch2, gc_state);
239237

240238
// Check for heap stability
241-
__ tbz(rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, done);
239+
__ tbz(rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, heap_stable);
242240

243241
// use r1 for load address
244242
Register result_dst = dst;
@@ -253,51 +251,36 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembl
253251
__ lea(r1, load_addr);
254252
__ mov(r0, dst);
255253

256-
__ far_call(RuntimeAddress(CAST_FROM_FN_PTR(address, ShenandoahBarrierSetAssembler::shenandoah_lrb())));
257-
258-
__ mov(result_dst, r0);
259-
__ pop(to_save, sp);
260-
261-
__ bind(done);
262-
__ leave();
263-
}
264-
265-
void ShenandoahBarrierSetAssembler::load_reference_barrier_weak(MacroAssembler* masm, Register dst, Address load_addr) {
266-
if (!ShenandoahLoadRefBarrier) {
267-
return;
254+
// Test for in-cset
255+
if (!weak) {
256+
__ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
257+
__ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
258+
__ ldrb(rscratch2, Address(rscratch2, rscratch1));
259+
__ tbz(rscratch2, 0, not_cset);
268260
}
269261

270-
assert(dst != rscratch2, "need rscratch2");
271-
272-
Label is_null;
273-
Label done;
274-
275-
__ block_comment("load_reference_barrier_weak { ");
276-
277-
__ cbz(dst, is_null);
278-
279-
__ enter();
280-
281-
Address gc_state(rthread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
282-
__ ldrb(rscratch2, gc_state);
283-
284-
// Check for heap in evacuation phase
285-
__ tbz(rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, done);
286-
287-
__ mov(rscratch2, dst);
288262
__ push_call_clobbered_registers();
289-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
290-
__ lea(r1, load_addr);
291-
__ mov(r0, rscratch2);
263+
if (weak) {
264+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_weak));
265+
} else {
266+
if (UseCompressedOops) {
267+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_narrow));
268+
} else {
269+
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
270+
}
271+
}
292272
__ blr(lr);
293-
__ mov(rscratch2, r0);
273+
__ mov(rscratch1, r0);
294274
__ pop_call_clobbered_registers();
295-
__ mov(dst, rscratch2);
275+
__ mov(r0, rscratch1);
296276

297-
__ bind(done);
277+
__ bind(not_cset);
278+
279+
__ mov(result_dst, r0);
280+
__ pop(to_save, sp);
281+
282+
__ bind(heap_stable);
298283
__ leave();
299-
__ bind(is_null);
300-
__ block_comment("} load_reference_barrier_weak");
301284
}
302285

303286
void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Register dst, Register tmp) {
@@ -308,15 +291,6 @@ void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Regis
308291
}
309292
}
310293

311-
void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr) {
312-
if (ShenandoahLoadRefBarrier) {
313-
Label is_null;
314-
__ cbz(dst, is_null);
315-
load_reference_barrier_not_null(masm, dst, load_addr);
316-
__ bind(is_null);
317-
}
318-
}
319-
320294
//
321295
// Arguments:
322296
//
@@ -352,11 +326,8 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
352326

353327
BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
354328

355-
if (ShenandoahBarrierSet::use_load_reference_barrier_weak(decorators, type)) {
356-
load_reference_barrier_weak(masm, dst, src);
357-
} else {
358-
load_reference_barrier(masm, dst, src);
359-
}
329+
bool weak = ShenandoahBarrierSet::use_load_reference_barrier_weak(decorators, type);
330+
load_reference_barrier(masm, dst, src, weak);
360331

361332
if (dst != result_dst) {
362333
__ mov(result_dst, dst);
@@ -754,67 +725,3 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
754725
#undef __
755726

756727
#endif // COMPILER1
757-
758-
address ShenandoahBarrierSetAssembler::shenandoah_lrb() {
759-
assert(_shenandoah_lrb != NULL, "need load reference barrier stub");
760-
return _shenandoah_lrb;
761-
}
762-
763-
#define __ cgen->assembler()->
764-
765-
// Shenandoah load reference barrier.
766-
//
767-
// Input:
768-
// r0: OOP to evacuate. Not null.
769-
// r1: load address
770-
//
771-
// Output:
772-
// r0: Pointer to evacuated OOP.
773-
//
774-
// Trash rscratch1, rscratch2. Preserve everything else.
775-
address ShenandoahBarrierSetAssembler::generate_shenandoah_lrb(StubCodeGenerator* cgen) {
776-
777-
__ align(6);
778-
StubCodeMark mark(cgen, "StubRoutines", "shenandoah_lrb");
779-
address start = __ pc();
780-
781-
Label slow_path;
782-
__ mov(rscratch2, ShenandoahHeap::in_cset_fast_test_addr());
783-
__ lsr(rscratch1, r0, ShenandoahHeapRegion::region_size_bytes_shift_jint());
784-
__ ldrb(rscratch2, Address(rscratch2, rscratch1));
785-
__ tbnz(rscratch2, 0, slow_path);
786-
__ ret(lr);
787-
788-
__ bind(slow_path);
789-
__ enter(); // required for proper stackwalking of RuntimeStub frame
790-
791-
__ push_call_clobbered_registers();
792-
793-
if (UseCompressedOops) {
794-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier_narrow));
795-
} else {
796-
__ mov(lr, CAST_FROM_FN_PTR(address, ShenandoahRuntime::load_reference_barrier));
797-
}
798-
__ blr(lr);
799-
__ mov(rscratch1, r0);
800-
__ pop_call_clobbered_registers();
801-
__ mov(r0, rscratch1);
802-
803-
__ leave(); // required for proper stackwalking of RuntimeStub frame
804-
__ ret(lr);
805-
806-
return start;
807-
}
808-
809-
#undef __
810-
811-
void ShenandoahBarrierSetAssembler::barrier_stubs_init() {
812-
if (ShenandoahLoadRefBarrier) {
813-
int stub_code_size = 2048;
814-
ResourceMark rm;
815-
BufferBlob* bb = BufferBlob::create("shenandoah_barrier_stubs", stub_code_size);
816-
CodeBuffer buf(bb);
817-
StubCodeGenerator cgen(&buf);
818-
_shenandoah_lrb = generate_shenandoah_lrb(&cgen);
819-
}
820-
}

src/hotspot/cpu/aarch64/gc/shenandoah/shenandoahBarrierSetAssembler_aarch64.hpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ class StubCodeGenerator;
3838
class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
3939
private:
4040

41-
static address _shenandoah_lrb;
42-
4341
void satb_write_barrier_pre(MacroAssembler* masm,
4442
Register obj,
4543
Register pre_val,
@@ -57,14 +55,9 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
5755

5856
void resolve_forward_pointer(MacroAssembler* masm, Register dst, Register tmp = noreg);
5957
void resolve_forward_pointer_not_null(MacroAssembler* masm, Register dst, Register tmp = noreg);
60-
void load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr);
61-
void load_reference_barrier_not_null(MacroAssembler* masm, Register dst, Address load_addr);
62-
void load_reference_barrier_weak(MacroAssembler* masm, Register dst, Address load_addr);
63-
64-
address generate_shenandoah_lrb(StubCodeGenerator* cgen);
58+
void load_reference_barrier(MacroAssembler* masm, Register dst, Address load_addr, bool weak);
6559

6660
public:
67-
static address shenandoah_lrb();
6861

6962
void storeval_barrier(MacroAssembler* masm, Register dst, Register tmp);
7063

@@ -85,8 +78,6 @@ class ShenandoahBarrierSetAssembler: public BarrierSetAssembler {
8578
Register obj, Register tmp, Label& slowpath);
8679
void cmpxchg_oop(MacroAssembler* masm, Register addr, Register expected, Register new_val,
8780
bool acquire, bool release, bool is_cae, Register result);
88-
89-
virtual void barrier_stubs_init();
9081
};
9182

9283
#endif // CPU_AARCH64_GC_SHENANDOAH_SHENANDOAHBARRIERSETASSEMBLER_AARCH64_HPP

0 commit comments

Comments
 (0)