< prev index next >
src/cpu/x86/vm/templateTable_x86_32.cpp
Print this page
*** 34,43 ****
--- 34,46 ----
#include "prims/methodHandles.hpp"
#include "runtime/sharedRuntime.hpp"
#include "runtime/stubRoutines.hpp"
#include "runtime/synchronizer.hpp"
#include "utilities/macros.hpp"
+ #if INCLUDE_ALL_GCS
+ #include "shenandoahBarrierSetAssembler_x86.hpp"
+ #endif
#ifndef CC_INTERP
#define __ _masm->
//----------------------------------------------------------------------------------------------------
*** 163,172 ****
--- 166,210 ----
}
__ restore_bcp();
}
break;
+ case BarrierSet::ShenandoahBarrierSet:
+ {
+ // 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) {
+ __ movl(rdx, obj.base());
+ }
+ } else {
+ __ leal(rdx, obj);
+ }
+ __ get_thread(rcx);
+ __ save_bcp();
+ if (ShenandoahSATBBarrier) {
+ __ g1_write_barrier_pre(rdx /* obj */,
+ rbx /* pre_val */,
+ rcx /* thread */,
+ rsi /* tmp */,
+ val != noreg /* tosca_live */,
+ false /* expand_call */);
+ }
+
+ // Do the actual store
+ // noreg means NULL
+ if (val == noreg) {
+ __ movptr(Address(rdx, 0), NULL_WORD);
+ // No post barrier for NULL
+ } else {
+ ShenandoahBarrierSetAssembler::bsasm()->storeval_barrier(_masm, val, rsi);
+ __ movl(Address(rdx, 0), val);
+ }
+ __ restore_bcp();
+
+ }
+ break;
#endif // INCLUDE_ALL_GCS
case BarrierSet::CardTableModRef:
case BarrierSet::CardTableExtension:
{
if (val == noreg) {
*** 666,676 ****
--- 704,721 ----
void TemplateTable::aaload() {
transition(itos, atos);
// rdx: array
index_check(rdx, rax); // kills rbx,
// rax,: index
+ #if INCLUDE_ALL_GCS
+ if (UseShenandoahGC) {
+ // Needs GC barriers
+ __ load_heap_oop(rax, Address(rdx, rax, Address::times_ptr, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
+ } else
+ #endif
__ movptr(rax, Address(rdx, rax, Address::times_ptr, arrayOopDesc::base_offset_in_bytes(T_OBJECT)));
+
}
void TemplateTable::baload() {
transition(itos, itos);
*** 2301,2310 ****
--- 2346,2361 ----
__ bind(notInt);
// atos
__ cmpl(flags, atos );
__ jcc(Assembler::notEqual, notObj);
+ #if INCLUDE_ALL_GCS
+ if (UseShenandoahGC) {
+ // Needs GC barriers
+ __ load_heap_oop(rax, lo);
+ } else
+ #endif
__ movl(rax, lo );
__ push(atos);
if (!is_static) {
patch_bytecode(Bytecodes::_fast_agetfield, rcx, rbx);
}
*** 2869,2879 ****
case Bytecodes::_fast_cgetfield: __ load_unsigned_short(rax, lo ); break;
case Bytecodes::_fast_igetfield: __ movl(rax, lo); break;
case Bytecodes::_fast_lgetfield: __ stop("should not be rewritten"); break;
case Bytecodes::_fast_fgetfield: __ fld_s(lo); break;
case Bytecodes::_fast_dgetfield: __ fld_d(lo); break;
! case Bytecodes::_fast_agetfield: __ movptr(rax, lo); __ verify_oop(rax); break;
default:
ShouldNotReachHere();
}
// Doug Lea believes this is not needed with current Sparcs(TSO) and Intel(PSO)
--- 2920,2939 ----
case Bytecodes::_fast_cgetfield: __ load_unsigned_short(rax, lo ); break;
case Bytecodes::_fast_igetfield: __ movl(rax, lo); break;
case Bytecodes::_fast_lgetfield: __ stop("should not be rewritten"); break;
case Bytecodes::_fast_fgetfield: __ fld_s(lo); break;
case Bytecodes::_fast_dgetfield: __ fld_d(lo); break;
! case Bytecodes::_fast_agetfield:
! #if INCLUDE_ALL_GCS
! if (UseShenandoahGC) {
! // Needs GC barriers
! __ load_heap_oop(rax, lo);
! } else
! #endif
! __ movptr(rax, lo);
! __ verify_oop(rax);
! break;
default:
ShouldNotReachHere();
}
// Doug Lea believes this is not needed with current Sparcs(TSO) and Intel(PSO)
*** 2895,2904 ****
--- 2955,2970 ----
__ null_check(rax);
const Address lo = Address(rax, rbx, Address::times_1, 0*wordSize);
if (state == itos) {
__ movl(rax, lo);
} else if (state == atos) {
+ #if INCLUDE_ALL_GCS
+ if (UseShenandoahGC) {
+ // Needs GC barriers
+ __ load_heap_oop(rax, lo);
+ } else
+ #endif
__ movptr(rax, lo);
__ verify_oop(rax);
} else if (state == ftos) {
__ fld_s(lo);
} else {
*** 2950,2959 ****
--- 3016,3031 ----
// maybe push appendix to arguments (just before return address)
if (is_invokedynamic || is_invokehandle) {
Label L_no_push;
__ testl(flags, (1 << ConstantPoolCacheEntry::has_appendix_shift));
+ #if INCLUDE_ALL_GCS
+ if (UseShenandoahGC) {
+ // Shenandoah barrier is too large to make short jump.
+ __ jcc(Assembler::zero, L_no_push);
+ } else
+ #endif
__ jccb(Assembler::zero, L_no_push);
// Push the appendix as a trailing parameter.
// This must be done before we get the receiver,
// since the parameter_size includes it.
__ push(rbx);
< prev index next >