< prev index next >
src/cpu/x86/vm/templateTable_x86_64.cpp
Print this page
rev 11463 : Backport Traversal GC
*** 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->
*** 138,148 ****
assert(val == noreg || val == rax, "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.disp() == 0) {
if (obj.base() != rdx) {
__ movq(rdx, obj.base());
--- 141,150 ----
*** 172,181 ****
--- 174,209 ----
r8 /* tmp */,
rbx /* tmp2 */);
}
}
break;
+ case BarrierSet::ShenandoahBarrierSet:
+ {
+ // flatten object address if needed
+ if (obj.index() == noreg && obj.disp() == 0) {
+ if (obj.base() != rdx) {
+ __ movq(rdx, obj.base());
+ }
+ } else {
+ __ leaq(rdx, obj);
+ }
+ if (ShenandoahSATBBarrier) {
+ __ g1_write_barrier_pre(rdx /* obj */,
+ rbx /* pre_val */,
+ r15_thread /* thread */,
+ r8 /* tmp */,
+ val != noreg /* tosca_live */,
+ false /* expand_call */);
+ }
+ if (val == noreg) {
+ __ store_heap_oop_null(Address(rdx, 0));
+ } else {
+ ShenandoahBarrierSetAssembler::bsasm()->storeval_barrier(_masm, val, r8);
+ __ store_heap_oop(Address(rdx, 0), val);
+ }
+ }
+ break;
#endif // INCLUDE_ALL_GCS
case BarrierSet::CardTableModRef:
case BarrierSet::CardTableExtension:
{
if (val == noreg) {
< prev index next >