--- old/src/cpu/x86/vm/c1_Runtime1_x86.cpp 2015-10-08 22:15:30.843705818 +0200 +++ new/src/cpu/x86/vm/c1_Runtime1_x86.cpp 2015-10-08 22:15:30.793707012 +0200 @@ -39,6 +39,7 @@ #include "utilities/macros.hpp" #include "vmreg_x86.inline.hpp" #if INCLUDE_ALL_GCS +#include "gc/shenandoah/shenandoahBarrierSet.hpp" #include "gc/g1/g1SATBCardTableModRefBS.hpp" #endif @@ -1657,13 +1658,24 @@ break; #if INCLUDE_ALL_GCS + case shenandoah_write_barrier_slow_id: + { + StubFrame f(sasm, "shenandoah_write_barrier", dont_gc_arguments); + + save_live_registers(sasm, 1); + __ call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahBarrierSet::resolve_and_maybe_copy_oop_c1), r15_thread, rax); + restore_live_registers_except_rax(sasm); + __ verify_oop(rax); + + } + break; case g1_pre_barrier_slow_id: { StubFrame f(sasm, "g1_pre_barrier", dont_gc_arguments); // arg0 : previous value of memory BarrierSet* bs = Universe::heap()->barrier_set(); - if (bs->kind() != BarrierSet::G1SATBCTLogging) { + if (bs->kind() != BarrierSet::G1SATBCTLogging && bs->kind() != BarrierSet::ShenandoahBarrierSet) { __ movptr(rax, (int)id); __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax); __ should_not_reach_here(); @@ -1741,8 +1753,15 @@ // arg0: store_address Address store_addr(rbp, 2*BytesPerWord); + BarrierSet* bs = Universe::heap()->barrier_set(); + if (bs->kind() == BarrierSet::ShenandoahBarrierSet) { + __ movptr(rax, (int)id); + __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax); + __ should_not_reach_here(); + break; + } CardTableModRefBS* ct = - barrier_set_cast(Universe::heap()->barrier_set()); + barrier_set_cast(bs); assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code"); Label done;