6 // This code is free software; you can redistribute it and/or modify it
7 // under the terms of the GNU General Public License version 2 only, as
8 // published by the Free Software Foundation.
9 //
10 // This code is distributed in the hope that it will be useful, but WITHOUT
11 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 // version 2 for more details (a copy is included in the LICENSE file that
14 // accompanied this code).
15 //
16 // You should have received a copy of the GNU General Public License version
17 // 2 along with this work; if not, write to the Free Software Foundation,
18 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 //
20 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 // or visit www.oracle.com if you need additional information or have any
22 // questions.
23 //
24 //
25
26 source_hpp %{
27 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
28 #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
29 %}
30
31 instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
32 match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
33 ins_cost(10 * DEFAULT_COST);
34
35 effect(TEMP tmp, KILL cr);
36
37 format %{
38 "cmpxchg_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp, #@compareAndSwapP_shenandoah"
39 %}
40
41 ins_encode %{
42 Register tmp = $tmp$$Register;
43 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
44 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
45 Assembler::relaxed /* acquire */, Assembler::rl /* release */,
46 false /* is_cae */, $res$$Register);
47 %}
48
49 ins_pipe(pipe_slow);
50 %}
51
52 instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
53 match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
54 ins_cost(10 * DEFAULT_COST);
55
56 effect(TEMP tmp, KILL cr);
57
58 format %{
59 "cmpxchgw_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp, #@compareAndSwapN_shenandoah"
60 %}
61
62 ins_encode %{
63 Register tmp = $tmp$$Register;
64 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
65 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
66 Assembler::relaxed /* acquire */, Assembler::rl /* release */,
67 false /* is_cae */, $res$$Register);
68 %}
69
70 ins_pipe(pipe_slow);
71 %}
72
73 instruct compareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
74 predicate(needs_acquiring_load_reserved(n));
75 match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
76 ins_cost(10 * DEFAULT_COST);
77
78 effect(TEMP tmp, KILL cr);
79
80 format %{
81 "cmpxchg_acq_shenandoah_oop $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp, #@compareAndSwapPAcq_shenandoah"
82 %}
83
84 ins_encode %{
85 Register tmp = $tmp$$Register;
86 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
87 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
88 Assembler::aq /* acquire */, Assembler::rl /* release */,
89 false /* is_cae */, $res$$Register);
90 %}
91
92 ins_pipe(pipe_slow);
93 %}
94
95 instruct compareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
96 predicate(needs_acquiring_load_reserved(n));
97 match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
98 ins_cost(10 * DEFAULT_COST);
99
100 effect(TEMP tmp, KILL cr);
101
102 format %{
103 "cmpxchgw_acq_shenandoah_narrow_oop $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp, #@compareAndSwapNAcq_shenandoah"
104 %}
105
106 ins_encode %{
107 Register tmp = $tmp$$Register;
108 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
109 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
110 Assembler::aq /* acquire */, Assembler::rl /* release */,
111 false /* is_cae */, $res$$Register);
112 %}
113
114 ins_pipe(pipe_slow);
115 %}
116
117 instruct compareAndExchangeN_shenandoah(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
118 match(Set res (ShenandoahCompareAndExchangeN mem (Binary oldval newval)));
119 ins_cost(10 * DEFAULT_COST);
120 effect(TEMP_DEF res, TEMP tmp, KILL cr);
121
122 format %{
123 "cmpxchgw_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval, #@compareAndExchangeN_shenandoah"
124 %}
125
126 ins_encode %{
127 Register tmp = $tmp$$Register;
128 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
129 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
130 Assembler::relaxed /* acquire */, Assembler::rl /* release */,
131 true /* is_cae */, $res$$Register);
132 %}
133
134 ins_pipe(pipe_slow);
135 %}
136
137 instruct compareAndExchangeP_shenandoah(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
138 match(Set res (ShenandoahCompareAndExchangeP mem (Binary oldval newval)));
139 ins_cost(10 * DEFAULT_COST);
140
141 effect(TEMP_DEF res, TEMP tmp, KILL cr);
142 format %{
143 "cmpxchg_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp, #@compareAndExchangeP_shenandoah"
144 %}
145
146 ins_encode %{
147 Register tmp = $tmp$$Register;
148 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
149 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
150 Assembler::relaxed /* acquire */, Assembler::rl /* release */,
151 true /* is_cae */, $res$$Register);
152 %}
153
154 ins_pipe(pipe_slow);
155 %}
156
157 instruct weakCompareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
158 match(Set res (ShenandoahWeakCompareAndSwapN mem (Binary oldval newval)));
159 ins_cost(10 * DEFAULT_COST);
160
161 effect(TEMP tmp, KILL cr);
162 format %{
163 "cmpxchgw_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval, #@weakCompareAndSwapN_shenandoah"
164 "mv $res, EQ\t# $res <-- (EQ ? 1 : 0)"
165 %}
166
167 ins_encode %{
168 Register tmp = $tmp$$Register;
169 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
170 // Weak is not current supported by ShenandoahBarrierSet::cmpxchg_oop
171 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
172 Assembler::relaxed /* acquire */, Assembler::rl /* release */,
173 false /* is_cae */, $res$$Register);
174 %}
175
176 ins_pipe(pipe_slow);
177 %}
178
179 instruct compareAndExchangeNAcq_shenandoah(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
180 predicate(needs_acquiring_load_reserved(n));
181 match(Set res (ShenandoahCompareAndExchangeN mem (Binary oldval newval)));
182 ins_cost(10 * DEFAULT_COST);
183
184 effect(TEMP_DEF res, TEMP tmp, KILL cr);
185 format %{
186 "cmpxchgw_acq_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval, #@compareAndExchangeNAcq_shenandoah"
187 %}
188
189 ins_encode %{
190 Register tmp = $tmp$$Register;
191 __ mv(tmp, $oldval$$Register);
192 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
193 Assembler::aq /* acquire */, Assembler::rl /* release */,
194 true /* is_cae */, $res$$Register);
195 %}
196
197 ins_pipe(pipe_slow);
198 %}
199
200 instruct compareAndExchangePAcq_shenandoah(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
201 predicate(needs_acquiring_load_reserved(n));
202 match(Set res (ShenandoahCompareAndExchangeP mem (Binary oldval newval)));
203 ins_cost(10 * DEFAULT_COST);
204
205 effect(TEMP_DEF res, TEMP tmp, KILL cr);
206 format %{
207 "cmpxchg_acq_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop, weak) if $mem == $oldval then $mem <-- $newval, #@compareAndExchangePAcq_shenandoah"
208 %}
209
210 ins_encode %{
211 Register tmp = $tmp$$Register;
212 __ mv(tmp, $oldval$$Register);
213 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
214 Assembler::aq /* acquire */, Assembler::rl /* release */,
215 true /* is_cae */, $res$$Register);
216 %}
217
218 ins_pipe(pipe_slow);
219 %}
220
221 instruct weakCompareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
222 match(Set res (ShenandoahWeakCompareAndSwapP mem (Binary oldval newval)));
223 ins_cost(10 * DEFAULT_COST);
224
225 effect(TEMP tmp, KILL cr);
226 format %{
227 "cmpxchg_shenandoah $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval, #@weakCompareAndSwapP_shenandoah"
228 %}
229
230 ins_encode %{
231 Register tmp = $tmp$$Register;
232 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
233 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
234 Assembler::relaxed /* acquire */, Assembler::rl /* release */,
235 false /* is_cae */, $res$$Register);
236 %}
237
238 ins_pipe(pipe_slow);
239 %}
240
241 instruct weakCompareAndSwapNAcq_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
242 predicate(needs_acquiring_load_reserved(n));
243 match(Set res (ShenandoahWeakCompareAndSwapN mem (Binary oldval newval)));
244 ins_cost(10 * DEFAULT_COST);
245
246 effect(TEMP tmp, KILL cr);
247 format %{
248 "cmpxchgw_acq_shenandoah $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval, #@weakCompareAndSwapNAcq_shenandoah"
249 "mv $res, EQ\t# $res <-- (EQ ? 1 : 0)"
250 %}
251
252 ins_encode %{
253 Register tmp = $tmp$$Register;
254 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
255 // Weak is not current supported by ShenandoahBarrierSet::cmpxchg_oop
256 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
257 Assembler::aq /* acquire */, Assembler::rl /* release */,
258 false /* is_cae */, $res$$Register);
259 %}
260
261 ins_pipe(pipe_slow);
262 %}
263
264 instruct weakCompareAndSwapPAcq_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
265 predicate(needs_acquiring_load_reserved(n));
266 match(Set res (ShenandoahWeakCompareAndSwapP mem (Binary oldval newval)));
267 ins_cost(10 * DEFAULT_COST);
268
269 effect(TEMP tmp, KILL cr);
270 format %{
271 "cmpxchg_acq_shenandoah $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval, #@weakCompareAndSwapPAcq_shenandoah"
272 "mv $res, EQ\t# $res <-- (EQ ? 1 : 0)"
273 %}
274
275 ins_encode %{
276 Register tmp = $tmp$$Register;
277 __ mv(tmp, $oldval$$Register); // Must not clobber oldval.
278 // Weak is not current supported by ShenandoahBarrierSet::cmpxchg_oop
279 ShenandoahBarrierSet::assembler()->cmpxchg_oop(masm, $mem$$Register, tmp, $newval$$Register,
280 Assembler::aq /* acquire */, Assembler::rl /* release */,
281 false /* is_cae */, $res$$Register);
282 %}
283
284 ins_pipe(pipe_slow);
285 %}
|
6 // This code is free software; you can redistribute it and/or modify it
7 // under the terms of the GNU General Public License version 2 only, as
8 // published by the Free Software Foundation.
9 //
10 // This code is distributed in the hope that it will be useful, but WITHOUT
11 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 // version 2 for more details (a copy is included in the LICENSE file that
14 // accompanied this code).
15 //
16 // You should have received a copy of the GNU General Public License version
17 // 2 along with this work; if not, write to the Free Software Foundation,
18 // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 //
20 // Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 // or visit www.oracle.com if you need additional information or have any
22 // questions.
23 //
24 //
25
26 source %{
27 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
28 #include "gc/shenandoah/shenandoahBarrierSetAssembler_riscv.hpp"
29 #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
30 %}
31
32 // Load Pointer
33 instruct loadP_shenandoah(iRegPNoSp dst, memory mem)
34 %{
35 match(Set dst (LoadP mem));
36 predicate(UseShenandoahGC && n->as_Load()->barrier_data() != 0);
37
38 effect(TEMP_DEF dst);
39 ins_is_late_expanded_null_check_candidate(true);
40
41 ins_cost(3 * LOAD_COST);
42 format %{ "ld $dst, $mem\t# ptr, shenandoah late-barrier, #@loadP_shenandoah" %}
43
44 ins_encode %{
45 ShenandoahBarrierSet::assembler()->load_c2(this, masm, as_Register($dst$$reg),
46 Address(as_Register($mem$$base), $mem$$disp));
47 %}
48
49 ins_pipe(iload_reg_mem);
50 %}
51
52 // Load Compressed Pointer
53 instruct loadN_shenandoah(iRegNNoSp dst, memory mem)
54 %{
55 match(Set dst (LoadN mem));
56 predicate(UseShenandoahGC && n->as_Load()->barrier_data() != 0);
57
58 effect(TEMP_DEF dst);
59 ins_is_late_expanded_null_check_candidate(true);
60
61 ins_cost(3 * LOAD_COST);
62 format %{ "lwu $dst, $mem\t# compressed ptr, shenandoah late-barrier, #@loadN_shenandoah" %}
63
64 ins_encode %{
65 ShenandoahBarrierSet::assembler()->load_c2(this, masm, as_Register($dst$$reg),
66 Address(as_Register($mem$$base), $mem$$disp));
67 %}
68
69 ins_pipe(iload_reg_mem);
70 %}
71
72 // Store Pointer
73 instruct storeP_shenandoah(memory mem, iRegP src, iRegPNoSp tmp, rFlagsReg cr)
74 %{
75 match(Set mem (StoreP mem src));
76 predicate(UseShenandoahGC && n->as_Store()->barrier_data() != 0);
77
78 effect(TEMP tmp, KILL cr);
79
80 ins_cost(3 * STORE_COST);
81 format %{ "sd $src, $mem\t# ptr, shenandoah late-barrier, #@storeP_shenandoah" %}
82
83 ins_encode %{
84 ShenandoahBarrierSet::assembler()->store_c2(this, masm,
85 Address(as_Register($mem$$base), $mem$$disp),
86 /* dst_narrow = */ false,
87 as_Register($src$$reg),
88 /* src_narrow = */ false,
89 as_Register($tmp$$reg));
90 %}
91
92 ins_pipe(istore_reg_mem);
93 %}
94
95 // Store Compressed Pointer
96 instruct storeN_shenandoah(memory mem, iRegN src, iRegNNoSp tmp, rFlagsReg cr)
97 %{
98 match(Set mem (StoreN mem src));
99 predicate(UseShenandoahGC && n->as_Store()->barrier_data() != 0);
100
101 effect(TEMP tmp, KILL cr);
102
103 ins_cost(3 * STORE_COST);
104 format %{ "sw $src, $mem\t# compressed ptr, shenandoah late-barrier, #@storeN_shenandoah" %}
105
106 ins_encode %{
107 ShenandoahBarrierSet::assembler()->store_c2(this, masm,
108 Address(as_Register($mem$$base), $mem$$disp),
109 /* dst_narrow = */ true,
110 as_Register($src$$reg),
111 /* src_narrow = */ true,
112 as_Register($tmp$$reg));
113 %}
114
115 ins_pipe(istore_reg_mem);
116 %}
117
118 // Encode and Store Compressed Pointer
119 instruct encodePAndStoreN_shenandoah(memory mem, iRegP src, iRegPNoSp tmp, rFlagsReg cr)
120 %{
121 match(Set mem (StoreN mem (EncodeP src)));
122 predicate(UseShenandoahGC && n->as_Store()->barrier_data() != 0);
123
124 effect(TEMP tmp, KILL cr);
125
126 ins_cost(4 * STORE_COST);
127 format %{
128 "encode_heap_oop $tmp, $src\n\t"
129 "sw $tmp, $mem\t# compressed ptr, shenandoah late-barrier, #@encodePAndStoreN_shenandoah"
130 %}
131
132 ins_encode %{
133 ShenandoahBarrierSet::assembler()->store_c2(this, masm,
134 Address(as_Register($mem$$base), $mem$$disp),
135 /* dst_narrow = */ true,
136 as_Register($src$$reg),
137 /* src_narrow = */ false,
138 as_Register($tmp$$reg));
139 %}
140
141 ins_pipe(istore_reg_mem);
142 %}
143
144 instruct compareAndSwap_P_shenandoah(iRegINoSp res, indirect mem, iRegPNoSp oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
145 match(Set res (CompareAndSwapP mem (Binary oldval newval)));
146 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
147 ins_cost(10 * DEFAULT_COST);
148
149 effect(TEMP_DEF res, TEMP tmp, KILL cr);
150
151 format %{
152 "cmpxchg_P_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval, #@compareAndSwap_P_shenandoah"
153 %}
154
155 ins_encode %{
156 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
157 as_Register($res$$reg),
158 as_Register($mem$$base),
159 as_Register($oldval$$reg),
160 as_Register($newval$$reg),
161 as_Register($tmp$$reg),
162 /* exchange */ false,
163 /* maybe_null */ true,
164 /* is_narrow */ false,
165 /* weak */ false);
166 %}
167
168 ins_pipe(pipe_slow);
169 %}
170
171 instruct compareAndSwap_N_shenandoah(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
172 match(Set res (CompareAndSwapN mem (Binary oldval newval)));
173 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
174 ins_cost(10 * DEFAULT_COST);
175
176 effect(TEMP_DEF res, TEMP tmp, KILL cr);
177
178 format %{
179 "cmpxchg_N_shenandoah $mem, $oldval, $newval\t# (narrow ptr) if $mem == $oldval then $mem <-- $newval, #@compareAndSwap_N_shenandoah"
180 %}
181
182 ins_encode %{
183 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
184 as_Register($res$$reg),
185 as_Register($mem$$base),
186 as_Register($oldval$$reg),
187 as_Register($newval$$reg),
188 as_Register($tmp$$reg),
189 /* exchange */ false,
190 /* maybe_null */ true,
191 /* is_narrow */ true,
192 /* weak */ false);
193 %}
194
195 ins_pipe(pipe_slow);
196 %}
197
198 instruct compareAndExchange_N_shenandoah(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
199 match(Set res (CompareAndExchangeN mem (Binary oldval newval)));
200 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
201 ins_cost(10 * DEFAULT_COST);
202 effect(TEMP_DEF res, TEMP tmp, KILL cr);
203
204 format %{
205 "cae_N_shenandoah $res = $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval, #@compareAndExchange_N_shenandoah"
206 %}
207
208 ins_encode %{
209 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
210 as_Register($res$$reg),
211 as_Register($mem$$base),
212 as_Register($oldval$$reg),
213 as_Register($newval$$reg),
214 as_Register($tmp$$reg),
215 /* exchange */ true,
216 /* maybe_null */ (this->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull),
217 /* is_narrow */ true,
218 /* weak */ false);
219 %}
220
221 ins_pipe(pipe_slow);
222 %}
223
224 instruct compareAndExchange_P_shenandoah(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
225 match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
226 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
227 ins_cost(10 * DEFAULT_COST);
228
229 effect(TEMP_DEF res, TEMP tmp, KILL cr);
230 format %{
231 "cae_P_shenandoah $res = $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval, #@compareAndExchange_P_shenandoah"
232 %}
233
234 ins_encode %{
235 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
236 as_Register($res$$reg),
237 as_Register($mem$$base),
238 as_Register($oldval$$reg),
239 as_Register($newval$$reg),
240 as_Register($tmp$$reg),
241 /* exchange */ true,
242 /* maybe_null */ (this->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull),
243 /* is_narrow */ false,
244 /* weak */ false);
245 %}
246
247 ins_pipe(pipe_slow);
248 %}
249
250 instruct weakCompareAndSwap_N_shenandoah(iRegINoSp res, indirect mem, iRegNNoSp oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
251 match(Set res (WeakCompareAndSwapN mem (Binary oldval newval)));
252 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
253 ins_cost(10 * DEFAULT_COST);
254
255 effect(TEMP_DEF res, TEMP tmp, KILL cr);
256 format %{
257 "cae_N_weak_shenandoah $res = $mem, $oldval, $newval\t# (N, weak) if $mem == $oldval then $mem <-- $newval, #@weakCompareAndSwap_N_shenandoah"
258 %}
259
260 ins_encode %{
261 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
262 as_Register($res$$reg),
263 as_Register($mem$$base),
264 as_Register($oldval$$reg),
265 as_Register($newval$$reg),
266 as_Register($tmp$$reg),
267 /* exchange */ false,
268 /* maybe_null */ true,
269 /* is_narrow */ true,
270 /* weak */ true);
271 %}
272
273 ins_pipe(pipe_slow);
274 %}
275
276 instruct weakCompareAndSwap_P_shenandoah(iRegINoSp res, indirect mem, iRegPNoSp oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
277 match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
278 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
279 ins_cost(10 * DEFAULT_COST);
280
281 effect(TEMP_DEF res, TEMP tmp, KILL cr);
282 format %{
283 "cae_P_weak_shenandoah $res = $mem, $oldval, $newval\t# (P, weak) if $mem == $oldval then $mem <-- $newval, #@weakCompareAndSwap_P_shenandoah"
284 %}
285
286 ins_encode %{
287 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
288 as_Register($res$$reg),
289 as_Register($mem$$base),
290 as_Register($oldval$$reg),
291 as_Register($newval$$reg),
292 as_Register($tmp$$reg),
293 /* exchange */ false,
294 /* maybe_null */ true,
295 /* is_narrow */ false,
296 /* weak */ true);
297 %}
298
299 ins_pipe(pipe_slow);
300 %}
301
302 instruct getAndSet_P_shenandoah(indirect mem, iRegP newval, iRegPNoSp preval, iRegPNoSp tmp, rFlagsReg cr)
303 %{
304 match(Set preval (GetAndSetP mem newval));
305 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
306 effect(TEMP_DEF preval, TEMP tmp, KILL cr);
307 ins_cost(10 * DEFAULT_COST);
308 format %{ "get_and_set_P $preval, $newval, [$mem], #@getAndSet_P_shenandoah" %}
309 ins_encode %{
310 ShenandoahBarrierSet::assembler()->get_and_set_c2(this, masm,
311 as_Register($preval$$reg),
312 as_Register($newval$$reg),
313 as_Register($mem$$base),
314 as_Register($tmp$$reg));
315 %}
316 ins_pipe(pipe_slow);
317 %}
318
319 instruct getAndSet_N_shenandoah(indirect mem, iRegN newval, iRegNNoSp preval, iRegNNoSp tmp, rFlagsReg cr)
320 %{
321 match(Set preval (GetAndSetN mem newval));
322 predicate(UseShenandoahGC && n->as_LoadStore()->barrier_data() != 0);
323 effect(TEMP_DEF preval, TEMP tmp, KILL cr);
324 ins_cost(10 * DEFAULT_COST);
325 format %{ "get_and_set_N $preval, $newval, [$mem], #@getAndSet_N_shenandoah" %}
326 ins_encode %{
327 ShenandoahBarrierSet::assembler()->get_and_set_c2(this, masm,
328 as_Register($preval$$reg),
329 as_Register($newval$$reg),
330 as_Register($mem$$base),
331 as_Register($tmp$$reg));
332 %}
333 ins_pipe(pipe_slow);
334 %}
|