< prev index next >

src/hotspot/cpu/x86/gc/shenandoah/shenandoah_x86_64.ad

Print this page
@@ -20,92 +20,221 @@
  // or visit www.oracle.com if you need additional information or have any
  // questions.
  //
  //
  
- source_hpp %{
- #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
- #include "gc/shenandoah/c2/shenandoahSupport.hpp"
+ source %{
+ #include "gc/shenandoah/shenandoahBarrierSet.hpp"
+ #include "gc/shenandoah/shenandoahBarrierSetAssembler_x86.hpp"
+ #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
  %}
  
- instruct compareAndSwapP_shenandoah(rRegI res,
-                                     memory mem_ptr,
-                                     rRegP tmp1, rRegP tmp2,
-                                     rax_RegP oldval, rRegP newval,
-                                     rFlagsReg cr)
- %{
-   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);
+ // ---------------------------------- LOADS ---------------------------------------
+ //
  
-   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
+ instruct loadP_shenandoah(rRegP dst, memory mem, rFlagsReg cr)
+ %{
+   match(Set dst (LoadP mem));
+   predicate(UseShenandoahGC && n->as_Load()->barrier_data() != 0);
+   effect(TEMP_DEF dst, KILL cr);
+   // The main load is a candidate to implement implicit null checks.
+   ins_is_late_expanded_null_check_candidate(true);
+   format %{ "shenandoah_load $dst, $mem\t# ptr" %}
+   ins_encode %{
+     ShenandoahBarrierSet::assembler()->load_c2(this, masm,
+       $dst$$Register,
+       $mem$$Address
+     );
+   %}
+   ins_cost(125);
+   ins_pipe(ialu_cr_reg_mem);
+ %}
  
+ instruct loadN_shenandoah(rRegN dst, memory mem, rFlagsReg cr)
+ %{
+   match(Set dst (LoadN mem));
+   predicate(UseShenandoahGC && n->as_Load()->barrier_data() != 0);
+   effect(TEMP_DEF dst, KILL cr);
+   // The main load is a candidate to implement implicit null checks.
+   ins_is_late_expanded_null_check_candidate(true);
+   format %{ "shenandoah_load $dst, $mem\t# compressed ptr" %}
    ins_encode %{
-     ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm,
-                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
-                                                    false, // swap
-                                                    $tmp1$$Register, $tmp2$$Register
-                                                    );
+     ShenandoahBarrierSet::assembler()->load_c2(this, masm,
+       $dst$$Register,
+       $mem$$Address
+     );
    %}
-   ins_pipe( pipe_cmpxchg );
+   ins_cost(125);
+   ins_pipe(ialu_cr_reg_mem);
  %}
  
- 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);
+ // ---------------------------------- STORES ---------------------------------------
+ //
  
-   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
+ instruct storeP_shenandoah(memory mem, any_RegP src, rRegP tmp, rFlagsReg cr)
+ %{
+   match(Set mem (StoreP mem src));
+   predicate(UseShenandoahGC && n->as_Store()->barrier_data() != 0);
+   effect(TEMP tmp, KILL cr);
+   format %{ "shenandoah_store $mem, $src\t# ptr" %}
+   ins_encode %{
+     ShenandoahBarrierSet::assembler()->store_c2(this, masm,
+       $mem$$Address,  /* dst_narrow = */ false,
+       $src$$Register, /* src_narrow = */ false,
+       $tmp$$Register);
+   %}
+   ins_cost(125);
+   ins_pipe(ialu_cr_reg_mem);
+ %}
  
+ instruct storeN_shenandoah(memory mem, rRegN src, rRegP tmp, rFlagsReg cr)
+ %{
+   match(Set mem (StoreN mem src));
+   predicate(UseShenandoahGC && n->as_Store()->barrier_data() != 0);
+   effect(TEMP tmp, KILL cr);
+   format %{ "shenandoah_store $mem, $src\t# compressed ptr" %}
    ins_encode %{
-     ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm,
-                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
-                                                    false, // swap
-                                                    $tmp1$$Register, $tmp2$$Register
-                                                    );
+     ShenandoahBarrierSet::assembler()->store_c2(this, masm,
+       $mem$$Address,  /* dst_narrow = */ true,
+       $src$$Register, /* src_narrow = */ true,
+       $tmp$$Register);
    %}
-   ins_pipe( pipe_cmpxchg );
+   ins_cost(125);
+   ins_pipe(ialu_cr_reg_mem);
  %}
  
- 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);
+ instruct encodePAndStoreN_shenandoah(memory mem, any_RegP src, rRegP tmp, rFlagsReg cr)
+ %{
+   match(Set mem (StoreN mem (EncodeP src)));
+   predicate(UseShenandoahGC && n->as_Store()->barrier_data() != 0);
+   effect(TEMP tmp, KILL cr);
+   format %{ "shenandoah_store $mem, $src\t# compressed ptr (with encoding)" %}
+   ins_encode %{
+     ShenandoahBarrierSet::assembler()->store_c2(this, masm,
+       $mem$$Address,  /* dst_narrow = */ true,
+       $src$$Register, /* src_narrow = */ false,
+       $tmp$$Register);
+   %}
+   ins_cost(125);
+   ins_pipe(ialu_cr_reg_mem);
+ %}
+ 
+ // ---------------------- LOAD-STORES -----------------------------------
  
-   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
+ instruct compareAndSwapP_shenandoah(rRegI res, memory mem, rRegP tmp1, rRegP tmp2, rax_RegP oldval, rRegP newval, rFlagsReg cr)
+ %{
+   match(Set res (CompareAndSwapP mem (Binary oldval newval)));
+   match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
+   predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
+   effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
+   format %{ "shenandoah_cas $mem, $newval\t# ptr" %}
+   ins_encode %{
+     ShenandoahBarrierSet::assembler()->cae_c2(this, masm,
+       $res$$Register,
+       $mem$$Address,
+       $oldval$$Register,
+       $newval$$Register,
+       $tmp1$$Register,
+       $tmp2$$Register,
+       /* exchange = */ false,
+       /* maybe_null = */ true,
+       /* narrow = */ false);
+   %}
+   ins_pipe(pipe_cmpxchg);
+ %}
  
+ instruct compareAndSwapN_shenandoah(rRegI res, memory mem, rRegP tmp1, rRegP tmp2, rax_RegN oldval, rRegN newval, rFlagsReg cr)
+ %{
+   match(Set res (CompareAndSwapN mem (Binary oldval newval)));
+   match(Set res (WeakCompareAndSwapN mem (Binary oldval newval)));
+   predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
+   effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
+   format %{ "shenandoah_cas $mem, $newval\t# compressed ptr" %}
    ins_encode %{
-     ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm,
-                                                    noreg, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
-                                                    true, // exchange
-                                                    $tmp1$$Register, $tmp2$$Register
-                                                    );
+     ShenandoahBarrierSet::assembler()->cae_c2(this, masm,
+       $res$$Register,
+       $mem$$Address,
+       $oldval$$Register,
+       $newval$$Register,
+       $tmp1$$Register,
+       $tmp2$$Register,
+       /* exchange = */ false,
+       /* maybe_null = */ true,
+       /* narrow = */ true);
    %}
-   ins_pipe( pipe_cmpxchg );
+   ins_pipe(pipe_cmpxchg);
  %}
  
- instruct compareAndExchangeP_shenandoah(memory mem_ptr,
-                                         rax_RegP oldval, rRegP newval,
-                                         rRegP tmp1, rRegP tmp2,
-                                         rFlagsReg cr)
+ instruct compareAndExchangeP_shenandoah(memory mem, rax_RegP oldval, rRegP newval, rRegP tmp1, rRegP tmp2, rFlagsReg cr)
  %{
-   match(Set oldval (ShenandoahCompareAndExchangeP mem_ptr (Binary oldval newval)));
+   match(Set oldval (CompareAndExchangeP mem (Binary oldval newval)));
+   predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
    effect(KILL cr, TEMP tmp1, TEMP tmp2);
    ins_cost(1000);
+   format %{ "shenandoah_cae $mem, $newval\t# ptr" %}
+   ins_encode %{
+     ShenandoahBarrierSet::assembler()->cae_c2(this, masm,
+       noreg,
+       $mem$$Address,
+       $oldval$$Register,
+       $newval$$Register,
+       $tmp1$$Register,
+       $tmp2$$Register,
+       /* exchange = */ true,
+       /* maybe_null = */ true,
+       /* narrow = */ false);
+   %}
+   ins_pipe(pipe_cmpxchg);
+ %}
  
-   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
+ instruct compareAndExchangeN_shenandoah(memory mem, rax_RegN oldval, rRegN newval, rRegP tmp1, rRegP tmp2, rFlagsReg cr)
+ %{
+   match(Set oldval (CompareAndExchangeN mem (Binary oldval newval)));
+   predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
+   effect(TEMP tmp1, TEMP tmp2, KILL cr);
+   format %{ "shenandoah_cae $mem, $newval\t# compressed ptr" %}
+   ins_encode %{
+     ShenandoahBarrierSet::assembler()->cae_c2(this, masm,
+       noreg,
+       $mem$$Address,
+       $oldval$$Register,
+       $newval$$Register,
+       $tmp1$$Register,
+       $tmp2$$Register,
+       /* exchange = */ true,
+       /* maybe_null = */ true,
+       /* narrow = */ true);
+   %}
+   ins_pipe(pipe_cmpxchg);
+ %}
  
+ instruct getAndSetP_shenandoah(memory mem, rRegP newval, rRegP tmp, rFlagsReg cr)
+ %{
+   match(Set newval (GetAndSetP mem newval));
+   predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
+   effect(TEMP tmp, KILL cr);
+   format %{ "shenandoah_gas $newval, $mem\t# ptr" %}
+   ins_encode %{
+     ShenandoahBarrierSet::assembler()->get_and_set_c2(this, masm,
+       $newval$$Register,
+       $mem$$Address,
+       $tmp$$Register
+     );
+   %}
+   ins_pipe(pipe_cmpxchg);
+ %}
+ 
+ instruct getAndSetN_shenandoah(memory mem, rRegN newval, rRegP tmp, rFlagsReg cr)
+ %{
+   match(Set newval (GetAndSetN mem newval));
+   predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
+   effect(TEMP tmp, KILL cr);
+   format %{ "shenandoah_gas $newval, $mem\t# compressed ptr" %}
    ins_encode %{
-     ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm,
-                                                    noreg, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
-                                                    true,  // exchange
-                                                    $tmp1$$Register, $tmp2$$Register
-                                                    );
+     ShenandoahBarrierSet::assembler()->get_and_set_c2(this, masm,
+       $newval$$Register,
+       $mem$$Address,
+       $tmp$$Register
+     );
    %}
-   ins_pipe( pipe_cmpxchg );
+   ins_pipe(pipe_cmpxchg);
  %}
< prev index next >