< prev index next >
src/cpu/aarch64/vm/templateTable_aarch64.cpp
Print this page
rev 11463 : Backport Traversal GC
*** 36,45 ****
--- 36,48 ----
#include "oops/oop.inline.hpp"
#include "prims/methodHandles.hpp"
#include "runtime/sharedRuntime.hpp"
#include "runtime/stubRoutines.hpp"
#include "runtime/synchronizer.hpp"
+ #if INCLUDE_ALL_GCS
+ #include "shenandoahBarrierSetAssembler_aarch64.hpp"
+ #endif
#ifndef CC_INTERP
#define __ _masm->
*** 150,160 ****
assert(val == noreg || val == r0, "parameter is just for looks");
switch (barrier) {
#if INCLUDE_ALL_GCS
case BarrierSet::G1SATBCT:
case BarrierSet::G1SATBCTLogging:
- case BarrierSet::ShenandoahBarrierSet:
{
// flatten object address if needed
if (obj.index() == noreg && obj.offset() == 0) {
if (obj.base() != r3) {
__ mov(r3, obj.base());
--- 153,162 ----
*** 187,196 ****
--- 189,227 ----
r1 /* tmp2 */);
}
}
break;
+ case BarrierSet::ShenandoahBarrierSet:
+ {
+ // flatten object address if needed
+ if (obj.index() == noreg && obj.offset() == 0) {
+ if (obj.base() != r3) {
+ __ mov(r3, obj.base());
+ }
+ } else {
+ __ lea(r3, obj);
+ }
+ if (ShenandoahSATBBarrier) {
+ __ 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 {
+ if (ShenandoahStoreValEnqueueBarrier) {
+ ShenandoahBarrierSetAssembler::bsasm()->storeval_barrier(_masm, val, r10);
+ }
+ __ store_heap_oop(Address(r3, 0), val);
+ }
+
+ }
+ break;
#endif // INCLUDE_ALL_GCS
case BarrierSet::CardTableModRef:
case BarrierSet::CardTableExtension:
{
if (val == noreg) {
< prev index next >