< prev index next >
src/cpu/sparc/vm/templateTable_sparc.cpp
Print this page
rev 12906 : [mq]: gc_interface
*** 21,30 ****
--- 21,31 ----
* questions.
*
*/
#include "precompiled.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"
*** 47,128 ****
Register base,
Register index,
int offset,
Register val,
Register tmp,
! BarrierSet::Name barrier,
! bool precise) {
assert(tmp != val && tmp != base && tmp != index, "register collision");
assert(index == noreg || offset == 0, "only one offset");
! switch (barrier) {
! #if INCLUDE_ALL_GCS
! case BarrierSet::G1SATBCTLogging:
! {
! // Load and record the previous value.
! __ g1_write_barrier_pre(base, index, offset,
! noreg /* pre_val */,
! tmp, true /*preserve_o_regs*/);
!
! // G1 barrier needs uncompressed oop for region cross check.
! Register new_val = val;
! if (UseCompressedOops && val != G0) {
! new_val = tmp;
! __ mov(val, new_val);
! }
!
! if (index == noreg ) {
! assert(Assembler::is_simm13(offset), "fix this code");
! __ store_heap_oop(val, base, offset);
! } else {
! __ store_heap_oop(val, base, index);
! }
!
! // No need for post barrier if storing NULL
! if (val != G0) {
! if (precise) {
! if (index == noreg) {
! __ add(base, offset, base);
! } else {
! __ add(base, index, base);
! }
! }
! __ g1_write_barrier_post(base, new_val, tmp);
! }
! }
! break;
! #endif // INCLUDE_ALL_GCS
! case BarrierSet::CardTableForRS:
! case BarrierSet::CardTableExtension:
! {
! if (index == noreg ) {
! assert(Assembler::is_simm13(offset), "fix this code");
! __ store_heap_oop(val, base, offset);
! } else {
! __ store_heap_oop(val, base, index);
! }
! // No need for post barrier if storing NULL
! if (val != G0) {
! if (precise) {
! if (index == noreg) {
! __ add(base, offset, base);
! } else {
! __ add(base, index, base);
! }
! }
! __ card_write_barrier_post(base, val, tmp);
! }
! }
! break;
! case BarrierSet::ModRef:
! ShouldNotReachHere();
! break;
! default :
! ShouldNotReachHere();
!
! }
}
//----------------------------------------------------------------------------------------------------
// Platform-dependent initialization
void TemplateTable::pd_initialize() {
--- 48,76 ----
Register base,
Register index,
int offset,
Register val,
Register tmp,
! DecoratorSet decorators) {
assert(tmp != val && tmp != base && tmp != index, "register collision");
assert(index == noreg || offset == 0, "only one offset");
! BarrierSetCodeGen *code_gen = Universe::heap()->barrier_set()->code_gen();
! code_gen->store_at(_masm, decorators, T_OBJECT, base, index, offset, val, tmp);
}
+ static void do_oop_load(InterpreterMacroAssembler* _masm,
+ Register base,
+ Register index,
+ int offset,
+ Register dst,
+ Register tmp,
+ DecoratorSet decorators) {
+ assert(tmp != dst && tmp != base && tmp != index, "register collision");
+ assert(index == noreg || offset == 0, "only one offset");
+ BarrierSetCodeGen *code_gen = Universe::heap()->barrier_set()->code_gen();
+ code_gen->load_at(_masm, decorators, T_OBJECT, base, index, offset, dst, tmp);
+ }
//----------------------------------------------------------------------------------------------------
// Platform-dependent initialization
void TemplateTable::pd_initialize() {
*** 584,594 ****
void TemplateTable::aaload() {
transition(itos, atos);
// Otos_i: index
// tos: array
__ index_check(O2, Otos_i, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O3);
! __ load_heap_oop(O3, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i);
__ verify_oop(Otos_i);
}
void TemplateTable::baload() {
--- 532,548 ----
void TemplateTable::aaload() {
transition(itos, atos);
// Otos_i: index
// tos: array
__ index_check(O2, Otos_i, UseCompressedOops ? 2 : LogBytesPerWord, G3_scratch, O3);
! do_oop_load(_masm,
! O3,
! noreg,
! arrayOopDesc::base_offset_in_bytes(T_OBJECT),
! Otos_i,
! G3_scratch,
! ACCESS_ON_HEAP | ACCESS_ON_ARRAY);
__ verify_oop(Otos_i);
}
void TemplateTable::baload() {
*** 884,900 ****
// Not a subtype; so must throw exception
__ throw_if_not_x( Assembler::never, Interpreter::_throw_ArrayStoreException_entry, G3_scratch );
// Store is OK.
__ bind(store_ok);
! do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i, G3_scratch, _bs->kind(), true);
__ ba(done);
__ delayed()->inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
__ bind(is_null);
! do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), G0, G4_scratch, _bs->kind(), true);
__ profile_null_seen(G3_scratch);
__ inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
__ bind(done);
}
--- 838,854 ----
// Not a subtype; so must throw exception
__ throw_if_not_x( Assembler::never, Interpreter::_throw_ArrayStoreException_entry, G3_scratch );
// Store is OK.
__ bind(store_ok);
! do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), Otos_i, G3_scratch, ACCESS_ON_HEAP | ACCESS_ON_ARRAY);
__ ba(done);
__ delayed()->inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
__ bind(is_null);
! do_oop_store(_masm, O1, noreg, arrayOopDesc::base_offset_in_bytes(T_OBJECT), G0, G4_scratch, ACCESS_ON_HEAP | ACCESS_ON_ARRAY);
__ profile_null_seen(G3_scratch);
__ inc(Lesp, 3* Interpreter::stackElementSize); // adj sp (pops array, index and value)
__ bind(done);
}
*** 2521,2531 ****
// atos
{
__ pop_ptr();
__ verify_oop(Otos_i);
! do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
__ ba(checkVolatile);
__ delayed()->tst(Lscratch);
}
__ bind(notObj);
--- 2475,2485 ----
// atos
{
__ pop_ptr();
__ verify_oop(Otos_i);
! do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, ACCESS_ON_HEAP);
__ ba(checkVolatile);
__ delayed()->tst(Lscratch);
}
__ bind(notObj);
*** 2566,2576 ****
// atos
{
__ pop_ptr();
pop_and_check_object(Rclass);
__ verify_oop(Otos_i);
! do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
if (rc == may_rewrite) patch_bytecode(Bytecodes::_fast_aputfield, G3_scratch, G4_scratch, true, byte_no);
__ ba(checkVolatile);
__ delayed()->tst(Lscratch);
}
--- 2520,2530 ----
// atos
{
__ pop_ptr();
pop_and_check_object(Rclass);
__ verify_oop(Otos_i);
! do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, ACCESS_ON_HEAP);
if (rc == may_rewrite) patch_bytecode(Bytecodes::_fast_aputfield, G3_scratch, G4_scratch, true, byte_no);
__ ba(checkVolatile);
__ delayed()->tst(Lscratch);
}
*** 2747,2757 ****
break;
case Bytecodes::_fast_dputfield:
__ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
break;
case Bytecodes::_fast_aputfield:
! do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, _bs->kind(), false);
break;
default:
ShouldNotReachHere();
}
--- 2701,2711 ----
break;
case Bytecodes::_fast_dputfield:
__ stf(FloatRegisterImpl::D, Ftos_d, Rclass, Roffset);
break;
case Bytecodes::_fast_aputfield:
! do_oop_store(_masm, Rclass, Roffset, 0, Otos_i, G1_scratch, ACCESS_ON_HEAP);
break;
default:
ShouldNotReachHere();
}
< prev index next >