< prev index next >

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

Print this page
rev 53513 : 8217016: Shenandoah: Streamline generation of CAS barriers


  66   ins_pipe(ialu_reg_mem);
  67 %}
  68 
  69 instruct compareAndSwapP_shenandoah(rRegI res,
  70                                     memory mem_ptr,
  71                                     rRegP tmp1, rRegP tmp2,
  72                                     rax_RegP oldval, rRegP newval,
  73                                     rFlagsReg cr)
  74 %{
  75   predicate(VM_Version::supports_cx8());
  76   match(Set res (ShenandoahCompareAndSwapP mem_ptr (Binary oldval newval)));
  77   match(Set res (ShenandoahWeakCompareAndSwapP mem_ptr (Binary oldval newval)));
  78   effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
  79 
  80   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
  81 
  82   ins_encode %{
  83     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
  84                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
  85                                                    false, // swap
  86                                                    false, $tmp1$$Register, $tmp2$$Register
  87                                                    );
  88   %}
  89   ins_pipe( pipe_cmpxchg );
  90 %}
  91 
  92 instruct compareAndSwapN_shenandoah(rRegI res,
  93                                     memory mem_ptr,
  94                                     rRegP tmp1, rRegP tmp2,
  95                                     rax_RegN oldval, rRegN newval,
  96                                     rFlagsReg cr) %{
  97   match(Set res (ShenandoahCompareAndSwapN mem_ptr (Binary oldval newval)));
  98   match(Set res (ShenandoahWeakCompareAndSwapN mem_ptr (Binary oldval newval)));
  99   effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
 100 
 101   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 102 
 103   ins_encode %{
 104     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
 105                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
 106                                                    false, // swap
 107                                                    false, $tmp1$$Register, $tmp2$$Register
 108                                                    );
 109   %}
 110   ins_pipe( pipe_cmpxchg );
 111 %}
 112 
 113 instruct compareAndExchangeN_shenandoah(memory mem_ptr,
 114                                         rax_RegN oldval, rRegN newval,
 115                                         rRegP tmp1, rRegP tmp2,
 116                                         rFlagsReg cr) %{
 117   match(Set oldval (ShenandoahCompareAndExchangeN mem_ptr (Binary oldval newval)));
 118   effect(TEMP tmp1, TEMP tmp2, KILL cr);
 119 
 120   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 121 
 122   ins_encode %{
 123     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
 124                                                    NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
 125                                                    true, // exchange
 126                                                    false, $tmp1$$Register, $tmp2$$Register
 127                                                    );
 128   %}
 129   ins_pipe( pipe_cmpxchg );
 130 %}
 131 
 132 instruct compareAndExchangeP_shenandoah(memory mem_ptr,
 133                                         rax_RegP oldval, rRegP newval,
 134                                         rRegP tmp1, rRegP tmp2,
 135                                         rFlagsReg cr)
 136 %{
 137   predicate(VM_Version::supports_cx8());
 138   match(Set oldval (ShenandoahCompareAndExchangeP mem_ptr (Binary oldval newval)));
 139   effect(KILL cr, TEMP tmp1, TEMP tmp2);
 140   ins_cost(1000);
 141 
 142   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 143 
 144   ins_encode %{
 145     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
 146                                                    NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
 147                                                    true,  // exchange
 148                                                    false, $tmp1$$Register, $tmp2$$Register
 149                                                    );
 150   %}
 151   ins_pipe( pipe_cmpxchg );
 152 %}


  66   ins_pipe(ialu_reg_mem);
  67 %}
  68 
  69 instruct compareAndSwapP_shenandoah(rRegI res,
  70                                     memory mem_ptr,
  71                                     rRegP tmp1, rRegP tmp2,
  72                                     rax_RegP oldval, rRegP newval,
  73                                     rFlagsReg cr)
  74 %{
  75   predicate(VM_Version::supports_cx8());
  76   match(Set res (ShenandoahCompareAndSwapP mem_ptr (Binary oldval newval)));
  77   match(Set res (ShenandoahWeakCompareAndSwapP mem_ptr (Binary oldval newval)));
  78   effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
  79 
  80   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
  81 
  82   ins_encode %{
  83     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
  84                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
  85                                                    false, // swap
  86                                                    $tmp1$$Register, $tmp2$$Register
  87                                                    );
  88   %}
  89   ins_pipe( pipe_cmpxchg );
  90 %}
  91 
  92 instruct compareAndSwapN_shenandoah(rRegI res,
  93                                     memory mem_ptr,
  94                                     rRegP tmp1, rRegP tmp2,
  95                                     rax_RegN oldval, rRegN newval,
  96                                     rFlagsReg cr) %{
  97   match(Set res (ShenandoahCompareAndSwapN mem_ptr (Binary oldval newval)));
  98   match(Set res (ShenandoahWeakCompareAndSwapN mem_ptr (Binary oldval newval)));
  99   effect(TEMP tmp1, TEMP tmp2, KILL cr, KILL oldval);
 100 
 101   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 102 
 103   ins_encode %{
 104     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
 105                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
 106                                                    false, // swap
 107                                                    $tmp1$$Register, $tmp2$$Register
 108                                                    );
 109   %}
 110   ins_pipe( pipe_cmpxchg );
 111 %}
 112 
 113 instruct compareAndExchangeN_shenandoah(memory mem_ptr,
 114                                         rax_RegN oldval, rRegN newval,
 115                                         rRegP tmp1, rRegP tmp2,
 116                                         rFlagsReg cr) %{
 117   match(Set oldval (ShenandoahCompareAndExchangeN mem_ptr (Binary oldval newval)));
 118   effect(TEMP tmp1, TEMP tmp2, KILL cr);
 119 
 120   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 121 
 122   ins_encode %{
 123     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
 124                                                    NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
 125                                                    true, // exchange
 126                                                    $tmp1$$Register, $tmp2$$Register
 127                                                    );
 128   %}
 129   ins_pipe( pipe_cmpxchg );
 130 %}
 131 
 132 instruct compareAndExchangeP_shenandoah(memory mem_ptr,
 133                                         rax_RegP oldval, rRegP newval,
 134                                         rRegP tmp1, rRegP tmp2,
 135                                         rFlagsReg cr)
 136 %{
 137   predicate(VM_Version::supports_cx8());
 138   match(Set oldval (ShenandoahCompareAndExchangeP mem_ptr (Binary oldval newval)));
 139   effect(KILL cr, TEMP tmp1, TEMP tmp2);
 140   ins_cost(1000);
 141 
 142   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 143 
 144   ins_encode %{
 145     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
 146                                                    NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
 147                                                    true,  // exchange
 148                                                    $tmp1$$Register, $tmp2$$Register
 149                                                    );
 150   %}
 151   ins_pipe( pipe_cmpxchg );
 152 %}
< prev index next >