@@ -79,7 +79,7 @@ static void z_load_barrier(MacroAssembler& _masm, const MachNode* node, Address
7979
8080static void z_store_barrier(MacroAssembler& _masm, const MachNode* node, Address ref_addr, Register rnew_zaddress, Register rnew_zpointer, Register tmp, bool is_atomic) {
8181 if (node->barrier_data() == ZBarrierElided) {
82- z_color(_masm, node, rnew_zpointer, rnew_zaddress, t0 );
82+ z_color(_masm, node, rnew_zpointer, rnew_zaddress, tmp );
8383 } else {
8484 bool is_native = (node->barrier_data() & ZBarrierNative) != 0;
8585 ZStoreBarrierStubC2* const stub = ZStoreBarrierStubC2::create(node, ref_addr, rnew_zaddress, rnew_zpointer, is_native, is_atomic);
@@ -90,11 +90,11 @@ static void z_store_barrier(MacroAssembler& _masm, const MachNode* node, Address
9090%}
9191
9292// Load Pointer
93- instruct zLoadP(iRegPNoSp dst, memory mem)
93+ instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp )
9494%{
9595 match(Set dst (LoadP mem));
9696 predicate(UseZGC && ZGenerational && n->as_Load()->barrier_data() != 0);
97- effect(TEMP dst);
97+ effect(TEMP dst, TEMP tmp );
9898
9999 ins_cost(4 * DEFAULT_COST);
100100
@@ -103,34 +103,35 @@ instruct zLoadP(iRegPNoSp dst, memory mem)
103103 ins_encode %{
104104 const Address ref_addr(as_Register($mem$$base), $mem$$disp);
105105 __ ld($dst$$Register, ref_addr);
106- z_load_barrier(_masm, this, ref_addr, $dst$$Register, t0 );
106+ z_load_barrier(_masm, this, ref_addr, $dst$$Register, $tmp$$Register );
107107 %}
108108
109109 ins_pipe(iload_reg_mem);
110110%}
111111
112112// Store Pointer
113- instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp, rFlagsReg cr )
113+ instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2 )
114114%{
115115 predicate(UseZGC && ZGenerational && n->as_Store()->barrier_data() != 0);
116116 match(Set mem (StoreP mem src));
117- effect(TEMP tmp, KILL cr );
117+ effect(TEMP tmp1, TEMP tmp2 );
118118
119119 ins_cost(125); // XXX
120120 format %{ "sd $mem, $src\t# ptr" %}
121121 ins_encode %{
122122 const Address ref_addr(as_Register($mem$$base), $mem$$disp);
123- z_store_barrier(_masm, this, ref_addr, $src$$Register, $tmp $$Register, t1 , false /* is_atomic */);
124- __ sd($tmp $$Register, ref_addr);
123+ z_store_barrier(_masm, this, ref_addr, $src$$Register, $tmp1 $$Register, $tmp2$$Register , false /* is_atomic */);
124+ __ sd($tmp1 $$Register, ref_addr);
125125 %}
126126 ins_pipe(pipe_serial);
127127%}
128128
129- instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
129+ instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
130+ iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
130131 match(Set res (CompareAndSwapP mem (Binary oldval newval)));
131132 match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
132133 predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
133- effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr , TEMP_DEF res);
134+ effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1 , TEMP_DEF res);
134135
135136 ins_cost(2 * VOLATILE_REF_COST);
136137
@@ -140,19 +141,20 @@ instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
140141 ins_encode %{
141142 guarantee($mem$$disp == 0, "impossible encoding");
142143 Address ref_addr($mem$$Register);
143- z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0 );
144- z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1 , true /* is_atomic */);
144+ z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register );
145+ z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register , true /* is_atomic */);
145146 __ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::relaxed /* acquire */, Assembler::rl /* release */, $res$$Register, true /* result_as_bool */);
146147 %}
147148
148149 ins_pipe(pipe_slow);
149150%}
150151
151- instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
152+ instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
153+ iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
152154 match(Set res (CompareAndSwapP mem (Binary oldval newval)));
153155 match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
154156 predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
155- effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr , TEMP_DEF res);
157+ effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1 , TEMP_DEF res);
156158
157159 ins_cost(2 * VOLATILE_REF_COST);
158160
@@ -162,18 +164,19 @@ instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
162164 ins_encode %{
163165 guarantee($mem$$disp == 0, "impossible encoding");
164166 Address ref_addr($mem$$Register);
165- z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0 );
166- z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1 , true /* is_atomic */);
167+ z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register );
168+ z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register , true /* is_atomic */);
167169 __ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::aq /* acquire */, Assembler::rl /* release */, $res$$Register, true /* result_as_bool */);
168170 %}
169171
170172 ins_pipe(pipe_slow);
171173%}
172174
173- instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
175+ instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
176+ iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
174177 match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
175178 predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
176- effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr , TEMP_DEF res);
179+ effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1 , TEMP_DEF res);
177180
178181 ins_cost(2 * VOLATILE_REF_COST);
179182
@@ -182,19 +185,20 @@ instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
182185 ins_encode %{
183186 guarantee($mem$$disp == 0, "impossible encoding");
184187 Address ref_addr($mem$$Register);
185- z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0 );
186- z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1 , true /* is_atomic */);
188+ z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register );
189+ z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register , true /* is_atomic */);
187190 __ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::relaxed /* acquire */, Assembler::rl /* release */, $res$$Register);
188191 z_uncolor(_masm, this, $res$$Register);
189192 %}
190193
191194 ins_pipe(pipe_slow);
192195%}
193196
194- instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, rFlagsReg cr) %{
197+ instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
198+ iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
195199 match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
196200 predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
197- effect(TEMP oldval_tmp, TEMP newval_tmp, KILL cr , TEMP_DEF res);
201+ effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1 , TEMP_DEF res);
198202
199203 ins_cost(2 * VOLATILE_REF_COST);
200204
@@ -203,44 +207,44 @@ instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
203207 ins_encode %{
204208 guarantee($mem$$disp == 0, "impossible encoding");
205209 Address ref_addr($mem$$Register);
206- z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, t0 );
207- z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, t1 , true /* is_atomic */);
210+ z_color(_masm, this, $oldval_tmp$$Register, $oldval$$Register, $tmp1$$Register );
211+ z_store_barrier(_masm, this, ref_addr, $newval$$Register, $newval_tmp$$Register, $tmp1$$Register , true /* is_atomic */);
208212 __ cmpxchg($mem$$Register, $oldval_tmp$$Register, $newval_tmp$$Register, Assembler::int64, Assembler::aq /* acquire */, Assembler::rl /* release */, $res$$Register);
209213 z_uncolor(_masm, this, $res$$Register);
210214 %}
211215
212216 ins_pipe(pipe_slow);
213217%}
214218
215- instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr ) %{
219+ instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp ) %{
216220 match(Set prev (GetAndSetP mem newv));
217221 predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
218- effect(TEMP_DEF prev, KILL cr );
222+ effect(TEMP_DEF prev, TEMP tmp );
219223
220224 ins_cost(2 * VOLATILE_REF_COST);
221225
222226 format %{ "atomic_xchg $prev, $newv, [$mem], #@zGetAndSetP" %}
223227
224228 ins_encode %{
225- z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, t1 , true /* is_atomic */);
229+ z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, $tmp$$Register , true /* is_atomic */);
226230 __ atomic_xchg($prev$$Register, $prev$$Register, $mem$$Register);
227231 z_uncolor(_masm, this, $prev$$Register);
228232 %}
229233
230234 ins_pipe(pipe_serial);
231235%}
232236
233- instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, rFlagsReg cr ) %{
237+ instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp ) %{
234238 match(Set prev (GetAndSetP mem newv));
235239 predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
236- effect(TEMP_DEF prev, KILL cr );
240+ effect(TEMP_DEF prev, TEMP tmp );
237241
238242 ins_cost(2 * VOLATILE_REF_COST);
239243
240244 format %{ "atomic_xchg_acq $prev, $newv, [$mem], #@zGetAndSetPAcq" %}
241245
242246 ins_encode %{
243- z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, t1 , true /* is_atomic */);
247+ z_store_barrier(_masm, this, Address($mem$$Register), $newv$$Register, $prev$$Register, $tmp$$Register , true /* is_atomic */);
244248 __ atomic_xchgal($prev$$Register, $prev$$Register, $mem$$Register);
245249 z_uncolor(_masm, this, $prev$$Register);
246250 %}
0 commit comments