--- old/src/hotspot/cpu/x86/x86_64.ad 2018-11-26 21:29:44.336273630 +0100 +++ new/src/hotspot/cpu/x86/x86_64.ad 2018-11-26 21:29:44.183274979 +0100 @@ -530,6 +530,9 @@ #if INCLUDE_ZGC #include "gc/z/zBarrierSetAssembler.hpp" #endif +#if INCLUDE_SHENANDOAHGC +#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp" +#endif %} //----------SOURCE BLOCK------------------------------------------------------- @@ -6692,6 +6695,59 @@ ins_pipe(ialu_reg_reg); // XXX %} +instruct shenandoahRB(rRegP dst, rRegP src, rFlagsReg cr) %{ + match(Set dst (ShenandoahReadBarrier src)); + effect(DEF dst, USE src); + ins_cost(125); // XXX + format %{ "shenandoah_rb $dst, $src" %} + ins_encode %{ +#if INCLUDE_SHENANDOAHGC + Register d = $dst$$Register; + Register s = $src$$Register; + __ movptr(d, Address(s, ShenandoahBrooksPointer::byte_offset())); +#else + ShouldNotReachHere(); +#endif + %} + ins_pipe(ialu_reg_mem); +%} + +instruct shenandoahRBNarrow(rRegP dst, rRegN src) %{ + predicate(UseCompressedOops && (Universe::narrow_oop_shift() == 0)); + match(Set dst (ShenandoahReadBarrier (DecodeN src))); + effect(DEF dst, USE src); + ins_cost(125); // XXX + format %{ "shenandoah_rb $dst, $src" %} + ins_encode %{ +#if INCLUDE_SHENANDOAHGC + Register d = $dst$$Register; + Register s = $src$$Register; + __ movptr(d, Address(r12, s, Address::times_1, ShenandoahBrooksPointer::byte_offset())); +#else + ShouldNotReachHere(); +#endif + %} + ins_pipe(ialu_reg_mem); +%} + +instruct shenandoahRBNarrowShift(rRegP dst, rRegN src) %{ + predicate(UseCompressedOops && (Universe::narrow_oop_shift() == Address::times_8)); + match(Set dst (ShenandoahReadBarrier (DecodeN src))); + effect(DEF dst, USE src); + ins_cost(125); // XXX + format %{ "shenandoah_rb $dst, $src" %} + ins_encode %{ +#if INCLUDE_SHENANDOAHGC + Register d = $dst$$Register; + Register s = $src$$Register; + __ movptr(d, Address(r12, s, Address::times_8, ShenandoahBrooksPointer::byte_offset())); +#else + ShouldNotReachHere(); +#endif + %} + ins_pipe(ialu_reg_mem); +%} + // Convert oop pointer into compressed form instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull); @@ -7561,6 +7617,33 @@ ins_pipe( pipe_cmpxchg ); %} +instruct compareAndSwapP_shenandoah(rRegI res, + memory mem_ptr, + rRegP tmp1, rRegP tmp2, + rax_RegP oldval, rRegP newval, + rFlagsReg cr) +%{ + predicate(VM_Version::supports_cx8()); + match(Set res (ShenandoahCompareAndSwapP mem_ptr (Binary oldval newval))); + match(Set res (ShenandoahWeakCompareAndSwapP mem_ptr (Binary oldval newval))); + effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval); + + format %{ "shenandoah_cas_oop $mem_ptr,$newval" %} + + ins_encode %{ +#if INCLUDE_SHENANDOAHGC + ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, + $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register, + false, // swap + false, $tmp1$$Register, $tmp2$$Register + ); +#else + ShouldNotReachHere(); +#endif + %} + ins_pipe( pipe_cmpxchg ); +%} + instruct compareAndSwapL(rRegI res, memory mem_ptr, rax_RegL oldval, rRegL newval, @@ -7682,6 +7765,31 @@ ins_pipe( pipe_cmpxchg ); %} +instruct compareAndSwapN_shenandoah(rRegI res, + memory mem_ptr, + rRegP tmp1, rRegP tmp2, + rax_RegN oldval, rRegN newval, + rFlagsReg cr) %{ + match(Set res (ShenandoahCompareAndSwapN mem_ptr (Binary oldval newval))); + match(Set res (ShenandoahWeakCompareAndSwapN mem_ptr (Binary oldval newval))); + effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval); + + format %{ "shenandoah_cas_oop $mem_ptr,$newval" %} + + ins_encode %{ +#if INCLUDE_SHENANDOAHGC + ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, + $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register, + false, // swap + false, $tmp1$$Register, $tmp2$$Register + ); +#else + ShouldNotReachHere(); +#endif + %} + ins_pipe( pipe_cmpxchg ); +%} + instruct compareAndExchangeB( memory mem_ptr, rax_RegI oldval, rRegI newval, @@ -7778,6 +7886,29 @@ ins_pipe( pipe_cmpxchg ); %} +instruct compareAndExchangeN_shenandoah(memory mem_ptr, + rax_RegN oldval, rRegN newval, + rRegP tmp1, rRegP tmp2, + rFlagsReg cr) %{ + match(Set oldval (ShenandoahCompareAndExchangeN mem_ptr (Binary oldval newval))); + effect(TEMP tmp1, TEMP tmp2, KILL cr); + + format %{ "shenandoah_cas_oop $mem_ptr,$newval" %} + + ins_encode %{ +#if INCLUDE_SHENANDOAHGC + ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, + NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register, + true, // exchange + false, $tmp1$$Register, $tmp2$$Register + ); +#else + ShouldNotReachHere(); +#endif + %} + ins_pipe( pipe_cmpxchg ); +%} + instruct compareAndExchangeP( memory mem_ptr, rax_RegP oldval, rRegP newval, @@ -7798,6 +7929,32 @@ ins_pipe( pipe_cmpxchg ); %} +instruct compareAndExchangeP_shenandoah(memory mem_ptr, + rax_RegP oldval, rRegP newval, + rRegP tmp1, rRegP tmp2, + rFlagsReg cr) +%{ + predicate(VM_Version::supports_cx8()); + match(Set oldval (ShenandoahCompareAndExchangeP mem_ptr (Binary oldval newval))); + effect(KILL cr, TEMP tmp1, TEMP tmp2); + ins_cost(1000); + + format %{ "shenandoah_cas_oop $mem_ptr,$newval" %} + + ins_encode %{ +#if INCLUDE_SHENANDOAHGC + ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, + NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register, + true, // exchange + false, $tmp1$$Register, $tmp2$$Register + ); +#else + ShouldNotReachHere(); +#endif + %} + ins_pipe( pipe_cmpxchg ); +%} + instruct xaddB_no_res( memory mem, Universe dummy, immI add, rFlagsReg cr) %{ predicate(n->as_LoadStore()->result_not_used()); match(Set dummy (GetAndAddB mem add));