43
43
44
44
#define __ masm->
45
45
46
- address ShenandoahBarrierSetAssembler::_shenandoah_lrb = NULL ;
47
-
48
46
void ShenandoahBarrierSetAssembler::arraycopy_prologue (MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
49
47
Register src, Register dst, Register count, RegSet saved_regs) {
50
48
if (is_oop) {
@@ -227,18 +225,18 @@ void ShenandoahBarrierSetAssembler::resolve_forward_pointer_not_null(MacroAssemb
227
225
}
228
226
}
229
227
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 ) {
231
229
assert (ShenandoahLoadRefBarrier, " Should be enabled" );
232
230
assert (dst != rscratch2, " need rscratch2" );
233
231
assert_different_registers (load_addr.base (), load_addr.index (), rscratch1, rscratch2);
234
232
235
- Label done ;
233
+ Label heap_stable, not_cset ;
236
234
__ enter ();
237
235
Address gc_state (rthread, in_bytes (ShenandoahThreadLocalData::gc_state_offset ()));
238
236
__ ldrb (rscratch2, gc_state);
239
237
240
238
// Check for heap stability
241
- __ tbz (rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, done );
239
+ __ tbz (rscratch2, ShenandoahHeap::HAS_FORWARDED_BITPOS, heap_stable );
242
240
243
241
// use r1 for load address
244
242
Register result_dst = dst;
@@ -253,51 +251,36 @@ void ShenandoahBarrierSetAssembler::load_reference_barrier_not_null(MacroAssembl
253
251
__ lea (r1, load_addr);
254
252
__ mov (r0, dst);
255
253
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);
268
260
}
269
261
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);
288
262
__ 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
+ }
292
272
__ blr (lr);
293
- __ mov (rscratch2 , r0);
273
+ __ mov (rscratch1 , r0);
294
274
__ pop_call_clobbered_registers ();
295
- __ mov (dst, rscratch2 );
275
+ __ mov (r0, rscratch1 );
296
276
297
- __ bind (done);
277
+ __ bind (not_cset);
278
+
279
+ __ mov (result_dst, r0);
280
+ __ pop (to_save, sp);
281
+
282
+ __ bind (heap_stable);
298
283
__ leave ();
299
- __ bind (is_null);
300
- __ block_comment (" } load_reference_barrier_weak" );
301
284
}
302
285
303
286
void ShenandoahBarrierSetAssembler::storeval_barrier (MacroAssembler* masm, Register dst, Register tmp) {
@@ -308,15 +291,6 @@ void ShenandoahBarrierSetAssembler::storeval_barrier(MacroAssembler* masm, Regis
308
291
}
309
292
}
310
293
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
-
320
294
//
321
295
// Arguments:
322
296
//
@@ -352,11 +326,8 @@ void ShenandoahBarrierSetAssembler::load_at(MacroAssembler* masm, DecoratorSet d
352
326
353
327
BarrierSetAssembler::load_at (masm, decorators, type, dst, src, tmp1, tmp_thread);
354
328
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);
360
331
361
332
if (dst != result_dst) {
362
333
__ mov (result_dst, dst);
@@ -754,67 +725,3 @@ void ShenandoahBarrierSetAssembler::generate_c1_load_reference_barrier_runtime_s
754
725
#undef __
755
726
756
727
#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
- }
0 commit comments