--- old/src/cpu/aarch64/vm/templateTable_aarch64.cpp 2017-09-19 10:53:25.232341432 -0400 +++ new/src/cpu/aarch64/vm/templateTable_aarch64.cpp 2017-09-19 10:53:24.971331357 -0400 @@ -25,6 +25,7 @@ #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" @@ -141,76 +142,20 @@ // 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, + Address dst, Register val, - BarrierSet::Name barrier, - bool precise) { + DecoratorSet decorators) { 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(); + 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) { @@ -727,7 +672,10 @@ 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))); + do_oop_load(_masm, + Address(r1, arrayOopDesc::base_offset_in_bytes(T_OBJECT)), + r0, + ACCESS_IN_HEAP | ACCESS_IN_HEAP_ARRAY); } void TemplateTable::baload() @@ -1055,7 +1003,7 @@ // 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); + do_oop_store(_masm, element_address, r0, ACCESS_IN_HEAP); __ b(done); // Have a NULL in r0, r3=array, r2=index. Store NULL at ary[idx] @@ -1063,7 +1011,7 @@ __ profile_null_seen(r2); // Store a NULL - do_oop_store(_masm, element_address, noreg, _bs->kind(), true); + do_oop_store(_masm, element_address, noreg, ACCESS_IN_HEAP); // Pop stack arguments __ bind(done); @@ -2455,7 +2403,7 @@ __ cmp(flags, atos); __ br(Assembler::NE, notObj); // atos - __ load_heap_oop(r0, field); + do_oop_load(_masm, field, r0, ACCESS_IN_HEAP); __ push(atos); if (rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_agetfield, bc, r1); @@ -2698,7 +2646,7 @@ __ pop(atos); if (!is_static) pop_and_check_object(obj); // Store into the field - do_oop_store(_masm, field, r0, _bs->kind(), false); + do_oop_store(_masm, field, r0, ACCESS_IN_HEAP); if (rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_aputfield, bc, r1, true, byte_no); } @@ -2918,7 +2866,7 @@ // access field switch (bytecode()) { case Bytecodes::_fast_aputfield: - do_oop_store(_masm, field, r0, _bs->kind(), false); + do_oop_store(_masm, field, r0, ACCESS_IN_HEAP); break; case Bytecodes::_fast_lputfield: __ str(r0, field); @@ -3010,7 +2958,7 @@ // access field switch (bytecode()) { case Bytecodes::_fast_agetfield: - __ load_heap_oop(r0, field); + do_oop_load(_masm, field, r0, ACCESS_IN_HEAP); __ verify_oop(r0); break; case Bytecodes::_fast_lgetfield: @@ -3080,7 +3028,7 @@ __ ldrw(r0, Address(r0, r1, Address::lsl(0))); break; case atos: - __ load_heap_oop(r0, Address(r0, r1, Address::lsl(0))); + do_oop_load(_masm, Address(r0, r1, Address::lsl(0)), r0, ACCESS_IN_HEAP); __ verify_oop(r0); break; case ftos: