< 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 >