< prev index next >

src/cpu/aarch64/vm/aarch64.ad

Print this page
rev 12203 : [mq]: casfixes.patch

@@ -4280,17 +4280,16 @@
                Assembler::word, /*acquire*/ false, /*release*/ true,
                /*weak*/ false, noreg);
   %}
 
 
-  enc_class aarch64_enc_cmpxchg_oop_shenandoah(memory mem, iRegLNoSp oldval, iRegLNoSp newval, iRegP tmp) %{
+  enc_class aarch64_enc_cmpxchg_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
     MacroAssembler _masm(&cbuf);
     guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
     Register tmp = $tmp$$Register;
-    __ shenandoah_store_check($mem$$base$$Register, $newval$$Register);
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
-    __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register,
+    __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register,
                               Assembler::xword, /*acquire*/ false, /*release*/ true, /*weak*/ false);
   %}
 
   // The only difference between aarch64_enc_cmpxchg and
   // aarch64_enc_cmpxchg_acq is that we use load-acquire in the

@@ -4313,17 +4312,16 @@
                Assembler::word, /*acquire*/ true, /*release*/ true,
                /*weak*/ false, noreg);
   %}
 
 
-  enc_class aarch64_enc_cmpxchg_acq_oop_shenandoah(memory mem, iRegLNoSp oldval, iRegLNoSp newval, iRegP tmp) %{
+  enc_class aarch64_enc_cmpxchg_acq_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
     MacroAssembler _masm(&cbuf);
     guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
     Register tmp = $tmp$$Register;
-    __ shenandoah_store_check($mem$$base$$Register, $newval$$Register);
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
-    __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register,
+    __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register,
                               Assembler::xword, /*acquire*/ true, /*release*/ true, /*weak*/ false);
   %}
 
   // auxiliary used for CompareAndSwapX to set result register
   enc_class aarch64_enc_cset_eq(iRegINoSp res) %{

@@ -9647,11 +9645,11 @@
  ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval),
             aarch64_enc_cset_eq(res));
 
   ins_pipe(pipe_slow);
 %}
-instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegP tmp, rFlagsReg cr) %{
+instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
 
   predicate(UseShenandoahGC);
   match(Set res (CompareAndSwapP mem (Binary oldval newval)));
   ins_cost(3 * VOLATILE_REF_COST);
 

@@ -9685,11 +9683,11 @@
              aarch64_enc_cset_eq(res));
 
   ins_pipe(pipe_slow);
 %}
 
-instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegNNoSp newval, iRegP tmp, rFlagsReg cr) %{
+instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
 
   predicate(UseShenandoahGC);
   match(Set res (CompareAndSwapN mem (Binary oldval newval)));
   ins_cost(3 * VOLATILE_REF_COST);
 

@@ -9701,11 +9699,11 @@
  %}
 
   ins_encode %{
     Register tmp = $tmp$$Register;
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
-    __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false);
+    __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false);
     __ cset($res$$Register, Assembler::EQ);
   %}
 
   ins_pipe(pipe_slow);
 %}

@@ -9767,11 +9765,11 @@
             aarch64_enc_cset_eq(res));
 
   ins_pipe(pipe_slow);
 %}
 
-instruct compareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegP tmp, rFlagsReg cr) %{
+instruct compareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
 
   predicate(needs_acquiring_load_exclusive(n) && UseShenandoahGC);
   match(Set res (CompareAndSwapP mem (Binary oldval newval)));
   ins_cost(2 * VOLATILE_REF_COST);
 

@@ -9805,11 +9803,11 @@
             aarch64_enc_cset_eq(res));
 
   ins_pipe(pipe_slow);
 %}
 
-instruct compareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegNNoSp newval, iRegP tmp, rFlagsReg cr) %{
+instruct compareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
 
   predicate(needs_acquiring_load_exclusive(n) && UseShenandoahGC);
   match(Set res (CompareAndSwapN mem (Binary oldval newval)));
   ins_cost(3 * VOLATILE_REF_COST);
 

@@ -9821,11 +9819,11 @@
  %}
 
   ins_encode %{
     Register tmp = $tmp$$Register;
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
-    __ cmpxchg_oop_shenandoah($mem$$base$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ true, /*release*/ true, /*weak*/ false);
+    __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register, Assembler::word, /*acquire*/ true, /*release*/ true, /*weak*/ false);
     __ cset($res$$Register, Assembler::EQ);
   %}
 
   ins_pipe(pipe_slow);
 %}

@@ -9842,11 +9840,11 @@
 
 
 instruct compareAndExchangeB(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{
   match(Set res (CompareAndExchangeB mem (Binary oldval newval)));
   ins_cost(2 * VOLATILE_REF_COST);
-  effect(KILL cr);
+  effect(TEMP_DEF res, KILL cr);
   format %{
     "cmpxchg $res = $mem, $oldval, $newval\t# (byte, weak) if $mem == $oldval then $mem <-- $newval"
   %}
   ins_encode %{
     __ uxtbw(rscratch2, $oldval$$Register);

@@ -9859,11 +9857,11 @@
 %}
 
 instruct compareAndExchangeS(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{
   match(Set res (CompareAndExchangeS mem (Binary oldval newval)));
   ins_cost(2 * VOLATILE_REF_COST);
-  effect(KILL cr);
+  effect(TEMP_DEF res, KILL cr);
   format %{
     "cmpxchg $res = $mem, $oldval, $newval\t# (short, weak) if $mem == $oldval then $mem <-- $newval"
   %}
   ins_encode %{
     __ uxthw(rscratch2, $oldval$$Register);

@@ -9876,11 +9874,11 @@
 %}
 
 instruct compareAndExchangeI(iRegI_R0 res, indirect mem, iRegI_R2 oldval, iRegI_R3 newval, rFlagsReg cr) %{
   match(Set res (CompareAndExchangeI mem (Binary oldval newval)));
   ins_cost(2 * VOLATILE_REF_COST);
-  effect(KILL cr);
+  effect(TEMP_DEF res, KILL cr);
   format %{
     "cmpxchg $res = $mem, $oldval, $newval\t# (int, weak) if $mem == $oldval then $mem <-- $newval"
   %}
   ins_encode %{
     __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,

@@ -9891,11 +9889,11 @@
 %}
 
 instruct compareAndExchangeL(iRegL_R0 res, indirect mem, iRegL_R2 oldval, iRegL_R3 newval, rFlagsReg cr) %{
   match(Set res (CompareAndExchangeL mem (Binary oldval newval)));
   ins_cost(2 * VOLATILE_REF_COST);
-  effect(KILL cr);
+  effect(TEMP_DEF res, KILL cr);
   format %{
     "cmpxchg $res = $mem, $oldval, $newval\t# (long, weak) if $mem == $oldval then $mem <-- $newval"
   %}
   ins_encode %{
     __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,

@@ -9907,11 +9905,11 @@
 
 instruct compareAndExchangeN(iRegN_R0 res, indirect mem, iRegN_R2 oldval, iRegN_R3 newval, rFlagsReg cr) %{
   predicate(! UseShenandoahGC);
   match(Set res (CompareAndExchangeN mem (Binary oldval newval)));
   ins_cost(2 * VOLATILE_REF_COST);
-  effect(KILL cr);
+  effect(TEMP_DEF res, KILL cr);
   format %{
     "cmpxchg $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval"
   %}
   ins_encode %{
     __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,

@@ -9919,33 +9917,32 @@
                /*weak*/ false, $res$$Register);
   %}
   ins_pipe(pipe_slow);
 %}
 
-instruct compareAndExchangeN_shenandoah(iRegN_R0 res, indirect mem, iRegN_R2 oldval, iRegN_R3 newval, iRegP tmp, rFlagsReg cr) %{
+instruct compareAndExchangeN_shenandoah(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
   predicate(UseShenandoahGC);
   match(Set res (CompareAndExchangeN mem (Binary oldval newval)));
   ins_cost(3 * VOLATILE_REF_COST);
-  effect(TEMP tmp, KILL cr);
+  effect(TEMP_DEF res, TEMP tmp, KILL cr);
   format %{
     "cmpxchg_oop_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval"
   %}
   ins_encode %{
     Register tmp = $tmp$$Register;
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
     __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register,
-                              Assembler::word, /*acquire*/ false, /*release*/ true,
-                              /*weak*/ false, $res$$Register);
+                              Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ false, $res$$Register);
   %}
   ins_pipe(pipe_slow);
 %}
 
 instruct compareAndExchangeP(iRegP_R0 res, indirect mem, iRegP_R2 oldval, iRegP_R3 newval, rFlagsReg cr) %{
   predicate(!UseShenandoahGC || n->in(3)->in(1)->bottom_type() == TypePtr::NULL_PTR);
   match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
   ins_cost(2 * VOLATILE_REF_COST);
-  effect(KILL cr);
+  effect(TEMP_DEF res, KILL cr);
   format %{
     "cmpxchg $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval"
   %}
   ins_encode %{
     __ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,

@@ -9953,24 +9950,23 @@
                /*weak*/ false, $res$$Register);
   %}
   ins_pipe(pipe_slow);
 %}
 
-instruct compareAndExchangeP_shenandoah(iRegP_R0 res, indirect mem, iRegP_R2 oldval, iRegP_R3 newval, iRegP tmp, rFlagsReg cr) %{
+instruct compareAndExchangeP_shenandoah(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
   predicate(UseShenandoahGC);
   match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
   ins_cost(3 * VOLATILE_REF_COST);
-  effect(TEMP tmp, KILL cr);
+  effect(TEMP_DEF res, TEMP tmp, KILL cr);
   format %{
     "cmpxchg_oop_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
   %}
   ins_encode %{
     Register tmp = $tmp$$Register;
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
     __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register,
-                              Assembler::xword, /*acquire*/ false, /*release*/ true,
-                              /*weak*/ false, $res$$Register);
+                              Assembler::xword, /*acquire*/ false, /*release*/ true, /*weak*/ false, $res$$Register);
   %}
   ins_pipe(pipe_slow);
 %}
 
 instruct weakCompareAndSwapB(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{

@@ -10059,11 +10055,11 @@
     __ csetw($res$$Register, Assembler::EQ);
   %}
   ins_pipe(pipe_slow);
 %}
 
-instruct weakCompareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegP tmp, rFlagsReg cr) %{
+instruct weakCompareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
   predicate(UseShenandoahGC);
   match(Set res (WeakCompareAndSwapN mem (Binary oldval newval)));
   ins_cost(3 * VOLATILE_REF_COST);
   effect(TEMP tmp, KILL cr);
   format %{

@@ -10072,12 +10068,11 @@
   %}
   ins_encode %{
     Register tmp = $tmp$$Register;
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
     __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register,
-                              Assembler::word, /*acquire*/ false, /*release*/ true,
-                              /*weak*/ true);
+                              Assembler::word, /*acquire*/ false, /*release*/ true, /*weak*/ true);
     __ csetw($res$$Register, Assembler::EQ);
   %}
   ins_pipe(pipe_slow);
 %}
 

@@ -10097,11 +10092,11 @@
     __ csetw($res$$Register, Assembler::EQ);
   %}
   ins_pipe(pipe_slow);
 %}
 
-instruct weakCompareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegP tmp, rFlagsReg cr) %{
+instruct weakCompareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
   predicate(UseShenandoahGC);
   match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
   ins_cost(3 * VOLATILE_REF_COST);
   effect(TEMP tmp, KILL cr);
   format %{

@@ -10110,12 +10105,11 @@
   %}
   ins_encode %{
     Register tmp = $tmp$$Register;
     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
     __ cmpxchg_oop_shenandoah($mem$$Register, tmp, $newval$$Register,
-                              Assembler::xword, /*acquire*/ false, /*release*/ true,
-                              /*weak*/ true);
+                              Assembler::xword, /*acquire*/ false, /*release*/ true, /*weak*/ true);
     __ csetw($res$$Register, Assembler::EQ);
   %}
   ins_pipe(pipe_slow);
 %}
 // ---------------------------------------------------------------------
< prev index next >