< prev index next >
src/hotspot/cpu/x86/x86_64.ad
Print this page
@@ -528,10 +528,13 @@
source_hpp %{
#if INCLUDE_ZGC
#include "gc/z/zBarrierSetAssembler.hpp"
#endif
+#if INCLUDE_SHENANDOAHGC
+#include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
+#endif
%}
//----------SOURCE BLOCK-------------------------------------------------------
// This is a block of C++ code which provides values, functions, and
// definitions necessary in the rest of the architecture description
@@ -6690,10 +6693,63 @@
__ movl($dst$$Register, $src$$Register);
%}
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);
match(Set dst (EncodeP src));
effect(KILL cr);
@@ -7559,10 +7615,37 @@
REX_reg_breg(res, res), // movzbl
Opcode(0xF), Opcode(0xB6), reg_reg(res, res));
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,
rFlagsReg cr)
%{
@@ -7680,10 +7763,35 @@
REX_reg_breg(res, res), // movzbl
Opcode(0xF), Opcode(0xB6), reg_reg(res, res));
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,
rFlagsReg cr)
%{
@@ -7776,10 +7884,33 @@
reg_mem(newval, mem_ptr) // lock cmpxchg
);
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,
rFlagsReg cr)
%{
@@ -7796,10 +7927,36 @@
reg_mem(newval, mem_ptr) // lock cmpxchg
);
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));
effect(KILL cr);
format %{ "ADDB [$mem],$add" %}
< prev index next >