< prev index next >
src/hotspot/cpu/arm/templateInterpreterGenerator_arm.cpp
Print this page
rev 49916 : 8201786: Modularize interpreter GC barriers: leftovers for ARM32
Reviewed-by: enevill
*** 850,885 ****
//
// (*) - AArch64 only
//
address TemplateInterpreterGenerator::generate_Reference_get_entry(void) {
- #if INCLUDE_ALL_GCS
- if (UseG1GC) {
// Code: _aload_0, _getfield, _areturn
// parameter size = 1
//
// The code that gets generated by this routine is split into 2 parts:
! // 1. The "intrinsified" code for G1 (or any SATB based GC),
// 2. The slow path - which is an expansion of the regular method entry.
//
// Notes:-
! // * In the G1 code we do not check whether we need to block for
! // a safepoint. If G1 is enabled then we must execute the specialized
! // code for Reference.get (except when the Reference object is null)
! // so that we can log the value in the referent field with an SATB
! // update buffer.
! // If the code for the getfield template is modified so that the
! // G1 pre-barrier code is executed when the current method is
! // Reference.get() then going through the normal method entry
! // will be fine.
! // * The G1 code can, however, check the receiver object (the instance
! // of java.lang.Reference) and jump to the slow path if null. If the
! // Reference object is null then we obviously cannot fetch the referent
! // and so we don't need to call the G1 pre-barrier. Thus we can use the
! // regular method entry code to generate the NPE.
! //
! // This code is based on generate_accessor_enty.
//
// Rmethod: Method*
// Rthread: thread
// Rsender_sp: sender sp, must be preserved for slow path, set SP to it on fast path
// Rparams: parameters
--- 850,871 ----
//
// (*) - AArch64 only
//
address TemplateInterpreterGenerator::generate_Reference_get_entry(void) {
// Code: _aload_0, _getfield, _areturn
// parameter size = 1
//
// The code that gets generated by this routine is split into 2 parts:
! // 1. The "intrinsified" code performing an ON_WEAK_OOP_REF load,
// 2. The slow path - which is an expansion of the regular method entry.
//
// Notes:-
! // * An intrinsic is always executed, where an ON_WEAK_OOP_REF load is performed.
! // * We may jump to the slow path iff the receiver is null. If the
! // Reference object is null then we no longer perform an ON_WEAK_OOP_REF load
! // Thus we can use the regular method entry code to generate the NPE.
//
// Rmethod: Method*
// Rthread: thread
// Rsender_sp: sender sp, must be preserved for slow path, set SP to it on fast path
// Rparams: parameters
*** 896,933 ****
// Check if local 0 != NULL
// If the receiver is null then it is OK to jump to the slow path.
__ ldr(Rthis, Address(Rparams));
__ cbz(Rthis, slow_path);
- // Generate the G1 pre-barrier code to log the value of
- // the referent field in an SATB buffer.
-
- // Load the value of the referent field.
- __ load_heap_oop(R0, Address(Rthis, referent_offset));
-
// Preserve LR
__ mov(Rret_addr, LR);
! __ g1_write_barrier_pre(noreg, // store_addr
! noreg, // new_val
! R0, // pre_val
! Rtemp, // tmp1
! R1_tmp); // tmp2
// _areturn
__ mov(SP, Rsender_sp);
__ ret(Rret_addr);
// generate a vanilla interpreter entry as the slow path
__ bind(slow_path);
__ jump_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals));
return entry;
- }
- #endif // INCLUDE_ALL_GCS
-
- // If G1 is not enabled then attempt to go through the normal entry point
- return NULL;
}
// Not supported
address TemplateInterpreterGenerator::generate_CRC32_update_entry() { return NULL; }
address TemplateInterpreterGenerator::generate_CRC32_updateBytes_entry(AbstractInterpreter::MethodKind kind) { return NULL; }
--- 882,906 ----
// Check if local 0 != NULL
// If the receiver is null then it is OK to jump to the slow path.
__ ldr(Rthis, Address(Rparams));
__ cbz(Rthis, slow_path);
// Preserve LR
__ mov(Rret_addr, LR);
! // Load the value of the referent field.
! const Address field_address(Rthis, referent_offset);
! __ load_heap_oop(R0, field_address, R0, Rtemp, R1_tmp);
// _areturn
__ mov(SP, Rsender_sp);
__ ret(Rret_addr);
// generate a vanilla interpreter entry as the slow path
__ bind(slow_path);
__ jump_to_entry(Interpreter::entry_for_kind(Interpreter::zerolocals));
return entry;
}
// Not supported
address TemplateInterpreterGenerator::generate_CRC32_update_entry() { return NULL; }
address TemplateInterpreterGenerator::generate_CRC32_updateBytes_entry(AbstractInterpreter::MethodKind kind) { return NULL; }
< prev index next >