< prev index next >

src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp

Print this page

        

*** 690,721 **** address entry = __ pc(); const int referent_offset = java_lang_ref_Reference::referent_offset; guarantee(referent_offset > 0, "referent offset not initialized"); ! if (UseG1GC) { Label slow_path; const Register local_0 = c_rarg0; // Check if local 0 != NULL // If the receiver is null then it is OK to jump to the slow path. __ ldr(local_0, Address(esp, 0)); __ cbz(local_0, slow_path); // Load the value of the referent field. const Address field_address(local_0, referent_offset); __ load_heap_oop(local_0, field_address); __ mov(r19, r13); // Move senderSP to a callee-saved register // Generate the G1 pre-barrier code to log the value of // the referent field in an SATB buffer. __ enter(); // g1_write may call runtime __ g1_write_barrier_pre(noreg /* obj */, local_0 /* pre_val */, rthread /* thread */, rscratch2 /* tmp */, true /* tosca_live */, true /* expand_call */); __ leave(); // areturn __ andr(sp, r19, -16); // done with stack __ ret(lr); --- 690,728 ---- address entry = __ pc(); const int referent_offset = java_lang_ref_Reference::referent_offset; guarantee(referent_offset > 0, "referent offset not initialized"); ! if (UseG1GC || (UseShenandoahGC && ShenandoahSATBBarrier)) { Label slow_path; const Register local_0 = c_rarg0; // Check if local 0 != NULL // If the receiver is null then it is OK to jump to the slow path. __ ldr(local_0, Address(esp, 0)); + __ mov(r19, r13); // First call-saved register __ cbz(local_0, slow_path); // Load the value of the referent field. const Address field_address(local_0, referent_offset); __ load_heap_oop(local_0, field_address); __ mov(r19, r13); // Move senderSP to a callee-saved register // Generate the G1 pre-barrier code to log the value of // the referent field in an SATB buffer. __ enter(); // g1_write may call runtime + if (UseShenandoahGC) { + __ push_call_clobbered_registers(); + } __ g1_write_barrier_pre(noreg /* obj */, local_0 /* pre_val */, rthread /* thread */, rscratch2 /* tmp */, true /* tosca_live */, true /* expand_call */); + if (UseShenandoahGC) { + __ pop_call_clobbered_registers(); + } __ leave(); // areturn __ andr(sp, r19, -16); // done with stack __ ret(lr);
*** 1186,1196 **** STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u); __ tbz(r0, 0, not_weak); // Test for jweak tag. // Resolve jweak. __ ldr(r0, Address(r0, -JNIHandles::weak_tag_value)); #if INCLUDE_ALL_GCS ! if (UseG1GC) { __ enter(); // Barrier may call runtime. __ g1_write_barrier_pre(noreg /* obj */, r0 /* pre_val */, rthread /* thread */, t /* tmp */, --- 1193,1203 ---- STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u); __ tbz(r0, 0, not_weak); // Test for jweak tag. // Resolve jweak. __ ldr(r0, Address(r0, -JNIHandles::weak_tag_value)); #if INCLUDE_ALL_GCS ! if (UseG1GC || (UseShenandoahGC && ShenandoahSATBBarrier)) { __ enter(); // Barrier may call runtime. __ g1_write_barrier_pre(noreg /* obj */, r0 /* pre_val */, rthread /* thread */, t /* tmp */,
< prev index next >