< prev index next >
src/cpu/aarch64/vm/templateTable_aarch64.cpp
Print this page
rev 13551 : imported patch gcinterface-aarch64-5.patch
*** 23,32 ****
--- 23,33 ----
*
*/
#include "precompiled.hpp"
#include "asm/macroAssembler.hpp"
+ #include "gc/shared/barrierSetCodeGen.hpp"
#include "interpreter/interpreter.hpp"
#include "interpreter/interpreterRuntime.hpp"
#include "interpreter/interp_masm.hpp"
#include "interpreter/templateTable.hpp"
#include "memory/universe.inline.hpp"
*** 139,218 ****
// Miscelaneous helper routines
// Store an oop (or NULL) at the Address described by obj.
// If val == noreg this means store a NULL
static void do_oop_store(InterpreterMacroAssembler* _masm,
! Address obj,
Register val,
! BarrierSet::Name barrier,
! bool precise) {
assert(val == noreg || val == r0, "parameter is just for looks");
! switch (barrier) {
! #if INCLUDE_ALL_GCS
! case BarrierSet::G1BarrierSet:
! {
! // flatten object address if needed
! if (obj.index() == noreg && obj.offset() == 0) {
! if (obj.base() != r3) {
! __ mov(r3, obj.base());
! }
! } else {
! __ lea(r3, obj);
! }
! __ g1_write_barrier_pre(r3 /* obj */,
! r1 /* pre_val */,
! rthread /* thread */,
! r10 /* tmp */,
! val != noreg /* tosca_live */,
! false /* expand_call */);
! if (val == noreg) {
! __ store_heap_oop_null(Address(r3, 0));
! } else {
! // G1 barrier needs uncompressed oop for region cross check.
! Register new_val = val;
! if (UseCompressedOops) {
! new_val = rscratch2;
! __ mov(new_val, val);
! }
! __ store_heap_oop(Address(r3, 0), val);
! __ g1_write_barrier_post(r3 /* store_adr */,
! new_val /* new_val */,
! rthread /* thread */,
! r10 /* tmp */,
! r1 /* tmp2 */);
! }
!
! }
! break;
! #endif // INCLUDE_ALL_GCS
! case BarrierSet::CardTableModRef:
! {
! if (val == noreg) {
! __ store_heap_oop_null(obj);
! } else {
! __ store_heap_oop(obj, val);
! // flatten object address if needed
! if (!precise || (obj.index() == noreg && obj.offset() == 0)) {
! __ store_check(obj.base());
! } else {
! __ lea(r3, obj);
! __ store_check(r3);
! }
! }
! }
! break;
! case BarrierSet::ModRef:
! if (val == noreg) {
! __ store_heap_oop_null(obj);
! } else {
! __ store_heap_oop(obj, val);
! }
! break;
! default :
! ShouldNotReachHere();
! }
}
Address TemplateTable::at_bcp(int offset) {
assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
return Address(rbcp, offset);
--- 140,163 ----
// Miscelaneous helper routines
// Store an oop (or NULL) at the Address described by obj.
// If val == noreg this means store a NULL
static void do_oop_store(InterpreterMacroAssembler* _masm,
! Address dst,
Register val,
! DecoratorSet decorators) {
assert(val == noreg || val == r0, "parameter is just for looks");
! BarrierSetCodeGen *code_gen = Universe::heap()->barrier_set()->code_gen();
! code_gen->store_at(_masm, decorators, T_OBJECT, dst, val, /*tmp1*/ r10, /*tmp2*/ r1);
! }
! static void do_oop_load(InterpreterMacroAssembler* _masm,
! Address src,
! Register dst,
! DecoratorSet decorators) {
! BarrierSetCodeGen *code_gen = Universe::heap()->barrier_set()->code_gen();
! code_gen->load_at(_masm, decorators, T_OBJECT, dst, src, /*tmp1*/ r10, /*tmp_thread*/ r1);
}
Address TemplateTable::at_bcp(int offset) {
assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
return Address(rbcp, offset);
*** 725,735 ****
// r0: array
// r1: index
index_check(r0, r1); // leaves index in r1, kills rscratch1
int s = (UseCompressedOops ? 2 : 3);
__ lea(r1, Address(r0, r1, Address::uxtw(s)));
! __ load_heap_oop(r0, Address(r1, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
}
void TemplateTable::baload()
{
transition(itos, itos);
--- 670,683 ----
// r0: array
// r1: index
index_check(r0, r1); // leaves index in r1, kills rscratch1
int s = (UseCompressedOops ? 2 : 3);
__ lea(r1, Address(r0, r1, Address::uxtw(s)));
! do_oop_load(_masm,
! Address(r1, arrayOopDesc::base_offset_in_bytes(T_OBJECT)),
! r0,
! ACCESS_IN_HEAP | ACCESS_IN_HEAP_ARRAY);
}
void TemplateTable::baload()
{
transition(itos, itos);
*** 1053,1071 ****
__ bind(ok_is_subtype);
// Get the value we will store
__ ldr(r0, at_tos());
// Now store using the appropriate barrier
! do_oop_store(_masm, element_address, r0, _bs->kind(), true);
__ b(done);
// Have a NULL in r0, r3=array, r2=index. Store NULL at ary[idx]
__ bind(is_null);
__ profile_null_seen(r2);
// Store a NULL
! do_oop_store(_masm, element_address, noreg, _bs->kind(), true);
// Pop stack arguments
__ bind(done);
__ add(esp, esp, 3 * Interpreter::stackElementSize);
}
--- 1001,1019 ----
__ bind(ok_is_subtype);
// Get the value we will store
__ ldr(r0, at_tos());
// Now store using the appropriate barrier
! do_oop_store(_masm, element_address, r0, ACCESS_IN_HEAP | ACCESS_IN_HEAP_ARRAY);
__ b(done);
// Have a NULL in r0, r3=array, r2=index. Store NULL at ary[idx]
__ bind(is_null);
__ profile_null_seen(r2);
// Store a NULL
! do_oop_store(_masm, element_address, noreg, ACCESS_IN_HEAP | ACCESS_IN_HEAP_ARRAY);
// Pop stack arguments
__ bind(done);
__ add(esp, esp, 3 * Interpreter::stackElementSize);
}
*** 2453,2463 ****
__ bind(notBool);
__ cmp(flags, atos);
__ br(Assembler::NE, notObj);
// atos
! __ load_heap_oop(r0, field);
__ push(atos);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_agetfield, bc, r1);
}
__ b(Done);
--- 2401,2411 ----
__ bind(notBool);
__ cmp(flags, atos);
__ br(Assembler::NE, notObj);
// atos
! do_oop_load(_masm, field, r0, ACCESS_IN_HEAP);
__ push(atos);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_agetfield, bc, r1);
}
__ b(Done);
*** 2696,2706 ****
// atos
{
__ pop(atos);
if (!is_static) pop_and_check_object(obj);
// Store into the field
! do_oop_store(_masm, field, r0, _bs->kind(), false);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_aputfield, bc, r1, true, byte_no);
}
__ b(Done);
}
--- 2644,2654 ----
// atos
{
__ pop(atos);
if (!is_static) pop_and_check_object(obj);
// Store into the field
! do_oop_store(_masm, field, r0, ACCESS_IN_HEAP);
if (rc == may_rewrite) {
patch_bytecode(Bytecodes::_fast_aputfield, bc, r1, true, byte_no);
}
__ b(Done);
}
*** 2916,2926 ****
const Address field(r2, r1);
// access field
switch (bytecode()) {
case Bytecodes::_fast_aputfield:
! do_oop_store(_masm, field, r0, _bs->kind(), false);
break;
case Bytecodes::_fast_lputfield:
__ str(r0, field);
break;
case Bytecodes::_fast_iputfield:
--- 2864,2874 ----
const Address field(r2, r1);
// access field
switch (bytecode()) {
case Bytecodes::_fast_aputfield:
! do_oop_store(_masm, field, r0, ACCESS_IN_HEAP);
break;
case Bytecodes::_fast_lputfield:
__ str(r0, field);
break;
case Bytecodes::_fast_iputfield:
*** 3008,3018 ****
}
// access field
switch (bytecode()) {
case Bytecodes::_fast_agetfield:
! __ load_heap_oop(r0, field);
__ verify_oop(r0);
break;
case Bytecodes::_fast_lgetfield:
__ ldr(r0, field);
break;
--- 2956,2966 ----
}
// access field
switch (bytecode()) {
case Bytecodes::_fast_agetfield:
! do_oop_load(_masm, field, r0, ACCESS_IN_HEAP);
__ verify_oop(r0);
break;
case Bytecodes::_fast_lgetfield:
__ ldr(r0, field);
break;
*** 3078,3088 ****
switch (state) {
case itos:
__ ldrw(r0, Address(r0, r1, Address::lsl(0)));
break;
case atos:
! __ load_heap_oop(r0, Address(r0, r1, Address::lsl(0)));
__ verify_oop(r0);
break;
case ftos:
__ ldrs(v0, Address(r0, r1, Address::lsl(0)));
break;
--- 3026,3036 ----
switch (state) {
case itos:
__ ldrw(r0, Address(r0, r1, Address::lsl(0)));
break;
case atos:
! do_oop_load(_masm, Address(r0, r1, Address::lsl(0)), r0, ACCESS_IN_HEAP);
__ verify_oop(r0);
break;
case ftos:
__ ldrs(v0, Address(r0, r1, Address::lsl(0)));
break;
< prev index next >