< prev index next >

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

Print this page
rev 55609 : Eliminate extra forwarding pointer per object

@@ -26,87 +26,87 @@
 #include "gc/shenandoah/c2/shenandoahSupport.hpp"
 %}
 
 instruct compareAndSwapP_shenandoah(rRegI res,
                                     memory mem_ptr,
-                                    rRegP tmp1, rRegP tmp2,
+                                    rRegP tmp1, rRegP tmp2, rRegP tmp3,
                                     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);
+  effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr, KILL oldval);
 
   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 
   ins_encode %{
     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
                                                    false, // swap
-                                                   $tmp1$$Register, $tmp2$$Register
+                                                   $tmp1$$Register, $tmp2$$Register, $tmp3$$Register
                                                    );
   %}
   ins_pipe( pipe_cmpxchg );
 %}
 
 instruct compareAndSwapN_shenandoah(rRegI res,
                                     memory mem_ptr,
-                                    rRegP tmp1, rRegP tmp2,
+                                    rRegP tmp1, rRegP tmp2, rRegP tmp3,
                                     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);
+  effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr, KILL oldval);
 
   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 
   ins_encode %{
     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
                                                    $res$$Register, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
                                                    false, // swap
-                                                   $tmp1$$Register, $tmp2$$Register
+                                                   $tmp1$$Register, $tmp2$$Register, $tmp3$$Register
                                                    );
   %}
   ins_pipe( pipe_cmpxchg );
 %}
 
 instruct compareAndExchangeN_shenandoah(memory mem_ptr,
                                         rax_RegN oldval, rRegN newval,
-                                        rRegP tmp1, rRegP tmp2,
+                                        rRegP tmp1, rRegP tmp2, rRegP tmp3,
                                         rFlagsReg cr) %{
   match(Set oldval (ShenandoahCompareAndExchangeN mem_ptr (Binary oldval newval)));
-  effect(TEMP tmp1, TEMP tmp2, KILL cr);
+  effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr);
 
   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 
   ins_encode %{
     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
                                                    NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
                                                    true, // exchange
-                                                   $tmp1$$Register, $tmp2$$Register
+                                                   $tmp1$$Register, $tmp2$$Register, $tmp3$$Register
                                                    );
   %}
   ins_pipe( pipe_cmpxchg );
 %}
 
 instruct compareAndExchangeP_shenandoah(memory mem_ptr,
                                         rax_RegP oldval, rRegP newval,
-                                        rRegP tmp1, rRegP tmp2,
+                                        rRegP tmp1, rRegP tmp2, rRegP tmp3,
                                         rFlagsReg cr)
 %{
   predicate(VM_Version::supports_cx8());
   match(Set oldval (ShenandoahCompareAndExchangeP mem_ptr (Binary oldval newval)));
-  effect(KILL cr, TEMP tmp1, TEMP tmp2);
+  effect(KILL cr, TEMP tmp1, TEMP tmp2, TEMP tmp3);
   ins_cost(1000);
 
   format %{ "shenandoah_cas_oop $mem_ptr,$newval" %}
 
   ins_encode %{
     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm,
                                                    NULL, $mem_ptr$$Address, $oldval$$Register, $newval$$Register,
                                                    true,  // exchange
-                                                   $tmp1$$Register, $tmp2$$Register
+                                                   $tmp1$$Register, $tmp2$$Register, $tmp3$$Register
                                                    );
   %}
   ins_pipe( pipe_cmpxchg );
 %}
< prev index next >