--- old/src/cpu/x86/vm/templateTable_x86.cpp 2017-04-25 16:43:58.835176453 +0200 +++ new/src/cpu/x86/vm/templateTable_x86.cpp 2017-04-25 16:43:58.687176458 +0200 @@ -24,6 +24,8 @@ #include "precompiled.hpp" #include "asm/macroAssembler.hpp" +#include "gc/shared/barrierSet.hpp" +#include "gc/shared/barrierSetCodeGen.hpp" #include "interpreter/interpreter.hpp" #include "interpreter/interpreterRuntime.hpp" #include "interpreter/interp_masm.hpp" @@ -147,85 +149,20 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, - Address obj, + Address dst, Register val, - BarrierSet::Name barrier, - bool precise) { + DecoratorSet decorators) { assert(val == noreg || val == rax, "parameter is just for looks"); - switch (barrier) { -#if INCLUDE_ALL_GCS - case BarrierSet::G1SATBCTLogging: - { - // flatten object address if needed - // We do it regardless of precise because we need the registers - if (obj.index() == noreg && obj.disp() == 0) { - if (obj.base() != rdx) { - __ movptr(rdx, obj.base()); - } - } else { - __ lea(rdx, obj); - } - - Register rtmp = LP64_ONLY(r8) NOT_LP64(rsi); - Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx); - - NOT_LP64(__ get_thread(rcx)); - NOT_LP64(__ save_bcp()); - - __ g1_write_barrier_pre(rdx /* obj */, - rbx /* pre_val */, - rthread /* thread */, - rtmp /* tmp */, - val != noreg /* tosca_live */, - false /* expand_call */); - if (val == noreg) { - __ store_heap_oop_null(Address(rdx, 0)); - } else { - // G1 barrier needs uncompressed oop for region cross check. - Register new_val = val; - if (UseCompressedOops) { - new_val = rbx; - __ movptr(new_val, val); - } - __ store_heap_oop(Address(rdx, 0), val); - __ g1_write_barrier_post(rdx /* store_adr */, - new_val /* new_val */, - rthread /* thread */, - rtmp /* tmp */, - rbx /* tmp2 */); - } - NOT_LP64( __ restore_bcp()); - } - break; -#endif // INCLUDE_ALL_GCS - case BarrierSet::CardTableForRS: - case BarrierSet::CardTableExtension: - { - 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.disp() == 0)) { - __ store_check(obj.base()); - } else { - __ lea(rdx, obj); - __ store_check(rdx); - } - } - } - 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*/ rdx, /*tmp2*/ rbx); +} - } +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*/ rdx, /*tmp2*/ rbx); } Address TemplateTable::at_bcp(int offset) { @@ -746,9 +683,12 @@ // rax: index // rdx: array index_check(rdx, rax); // kills rbx - __ load_heap_oop(rax, Address(rdx, rax, - UseCompressedOops ? Address::times_4 : Address::times_ptr, - arrayOopDesc::base_offset_in_bytes(T_OBJECT))); + do_oop_load(_masm, + Address(rdx, rax, + UseCompressedOops ? Address::times_4 : Address::times_ptr, + arrayOopDesc::base_offset_in_bytes(T_OBJECT)), + rax, + ACCESS_ON_HEAP | ACCESS_ON_ARRAY); } void TemplateTable::baload() { @@ -1059,7 +999,7 @@ // Get the value we will store __ movptr(rax, at_tos()); // Now store using the appropriate barrier - do_oop_store(_masm, Address(rdx, 0), rax, _bs->kind(), true); + do_oop_store(_masm, Address(rdx, 0), rax, ACCESS_ON_HEAP); __ jmp(done); // Have a NULL in rax, rdx=array, ecx=index. Store NULL at ary[idx] @@ -1067,7 +1007,7 @@ __ profile_null_seen(rbx); // Store a NULL - do_oop_store(_masm, element_address, noreg, _bs->kind(), true); + do_oop_store(_masm, element_address, noreg, ACCESS_ON_HEAP); // Pop stack arguments __ bind(done); @@ -3076,7 +3016,7 @@ __ pop(atos); if (!is_static) pop_and_check_object(obj); // Store into the field - do_oop_store(_masm, field, rax, _bs->kind(), false); + do_oop_store(_masm, field, rax, ACCESS_ON_HEAP | ACCESS_ON_ARRAY); if (!is_static && rc == may_rewrite) { patch_bytecode(Bytecodes::_fast_aputfield, bc, rbx, true, byte_no); } @@ -3328,7 +3268,7 @@ // access field switch (bytecode()) { case Bytecodes::_fast_aputfield: - do_oop_store(_masm, field, rax, _bs->kind(), false); + do_oop_store(_masm, field, rax, ACCESS_ON_HEAP | ACCESS_ON_ARRAY); break; case Bytecodes::_fast_lputfield: #ifdef _LP64