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 // Weak compareAndSwap operations are treated as strong compareAndSwap operations.
32 // This is motivated by the retry logic of ShenandoahBarrierSetAssembler::cmpxchg_oop which is hard to realise
33 // using weak CAS operations.
34
35 instruct compareAndSwapP_shenandoah(iRegIdst res, indirect mem, iRegPsrc oldval, iRegPsrc newval,
36 iRegPdst tmp1, iRegPdst tmp2, flagsRegCR0 cr) %{
37 match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
38 match(Set res (ShenandoahWeakCompareAndSwapP mem (Binary oldval newval)));
39 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
40
41 predicate(((CompareAndSwapNode*)n)->order() != MemNode::acquire
42 && ((CompareAndSwapNode*)n)->order() != MemNode::seqcst);
43
44 format %{ "CMPXCHG $res, $mem, $oldval, $newval; as bool; ptr" %}
45 ins_encode %{
46 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
47 masm,
48 $mem$$Register, $oldval$$Register, $newval$$Register,
49 $tmp1$$Register, $tmp2$$Register,
50 false, $res$$Register
51 );
52 %}
53 ins_pipe(pipe_class_default);
54 %}
55
56 instruct compareAndSwapN_shenandoah(iRegIdst res, indirect mem, iRegNsrc oldval, iRegNsrc newval,
57 iRegNdst tmp1, iRegNdst tmp2, flagsRegCR0 cr) %{
58 match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
59 match(Set res (ShenandoahWeakCompareAndSwapN mem (Binary oldval newval)));
60 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
61
62 predicate(((CompareAndSwapNode*)n)->order() != MemNode::acquire
63 && ((CompareAndSwapNode*)n)->order() != MemNode::seqcst);
64
65 format %{ "CMPXCHG $res, $mem, $oldval, $newval; as bool; ptr" %}
66 ins_encode %{
67 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
68 masm,
69 $mem$$Register, $oldval$$Register, $newval$$Register,
70 $tmp1$$Register, $tmp2$$Register,
71 false, $res$$Register
72 );
73 %}
74 ins_pipe(pipe_class_default);
75 %}
76
77 instruct compareAndSwapP_acq_shenandoah(iRegIdst res, indirect mem, iRegPsrc oldval, iRegPsrc newval,
78 iRegPdst tmp1, iRegPdst tmp2, flagsRegCR0 cr) %{
79 match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
80 match(Set res (ShenandoahWeakCompareAndSwapP mem (Binary oldval newval)));
81 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
82
83 predicate(((CompareAndSwapNode*)n)->order() == MemNode::acquire
84 || ((CompareAndSwapNode*)n)->order() == MemNode::seqcst);
85
86 format %{ "CMPXCHGD acq $res, $mem, $oldval, $newval; as bool; ptr" %}
87 ins_encode %{
88 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
89 masm,
90 $mem$$Register, $oldval$$Register, $newval$$Register,
91 $tmp1$$Register, $tmp2$$Register,
92 false, $res$$Register
93 );
94 if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
95 __ isync();
96 } else {
97 __ sync();
98 }
99 %}
100 ins_pipe(pipe_class_default);
101 %}
102
103 instruct compareAndSwapN_acq_shenandoah(iRegIdst res, indirect mem, iRegNsrc oldval, iRegNsrc newval,
104 iRegNdst tmp1, iRegNdst tmp2, flagsRegCR0 cr) %{
105 match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
106 match(Set res (ShenandoahWeakCompareAndSwapN mem (Binary oldval newval)));
107 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
108
109 predicate(((CompareAndSwapNode*)n)->order() == MemNode::acquire
110 || ((CompareAndSwapNode*)n)->order() == MemNode::seqcst);
111
112 format %{ "CMPXCHGD acq $res, $mem, $oldval, $newval; as bool; ptr" %}
113 ins_encode %{
114 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
115 masm,
116 $mem$$Register, $oldval$$Register, $newval$$Register,
117 $tmp1$$Register, $tmp2$$Register,
118 false, $res$$Register
119 );
120 if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
121 __ isync();
122 } else {
123 __ sync();
124 }
125 %}
126 ins_pipe(pipe_class_default);
127 %}
128
129 instruct compareAndExchangeP_shenandoah(iRegPdst res, indirect mem, iRegPsrc oldval, iRegPsrc newval,
130 iRegPdst tmp1, iRegPdst tmp2, flagsRegCR0 cr) %{
131 match(Set res (ShenandoahCompareAndExchangeP mem (Binary oldval newval)));
132 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
133
134 predicate(((CompareAndSwapNode*)n)->order() != MemNode::acquire
135 && ((CompareAndSwapNode*)n)->order() != MemNode::seqcst);
136
137 format %{ "CMPXCHGD $res, $mem, $oldval, $newval; as ptr; ptr" %}
138 ins_encode %{
139 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
140 masm,
141 $mem$$Register, $oldval$$Register, $newval$$Register,
142 $tmp1$$Register, $tmp2$$Register,
143 true, $res$$Register
144 );
145 %}
146 ins_pipe(pipe_class_default);
147 %}
148
149 instruct compareAndExchangeN_shenandoah(iRegNdst res, indirect mem, iRegNsrc oldval, iRegNsrc newval,
150 iRegNdst tmp1, iRegNdst tmp2, flagsRegCR0 cr) %{
151 match(Set res (ShenandoahCompareAndExchangeN mem (Binary oldval newval)));
152 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
153
154 predicate(((CompareAndSwapNode*)n)->order() != MemNode::acquire
155 && ((CompareAndSwapNode*)n)->order() != MemNode::seqcst);
156
157 format %{ "CMPXCHGD $res, $mem, $oldval, $newval; as ptr; ptr" %}
158 ins_encode %{
159 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
160 masm,
161 $mem$$Register, $oldval$$Register, $newval$$Register,
162 $tmp1$$Register, $tmp2$$Register,
163 true, $res$$Register
164 );
165 %}
166 ins_pipe(pipe_class_default);
167 %}
168
169 instruct compareAndExchangePAcq_shenandoah(iRegPdst res, indirect mem, iRegPsrc oldval, iRegPsrc newval,
170 iRegPdst tmp1, iRegPdst tmp2, flagsRegCR0 cr) %{
171 match(Set res (ShenandoahCompareAndExchangeP mem (Binary oldval newval)));
172 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
173
174 predicate(((CompareAndSwapNode*)n)->order() == MemNode::acquire
175 || ((CompareAndSwapNode*)n)->order() == MemNode::seqcst);
176
177 format %{ "CMPXCHGD acq $res, $mem, $oldval, $newval; as ptr; ptr" %}
178 ins_encode %{
179 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
180 masm,
181 $mem$$Register, $oldval$$Register, $newval$$Register,
182 $tmp1$$Register, $tmp2$$Register,
183 true, $res$$Register
184 );
185 if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
186 __ isync();
187 } else {
188 __ sync();
189 }
190 %}
191 ins_pipe(pipe_class_default);
192 %}
193
194 instruct compareAndExchangeNAcq_shenandoah(iRegNdst res, indirect mem, iRegNsrc oldval, iRegNsrc newval,
195 iRegNdst tmp1, iRegNdst tmp2, flagsRegCR0 cr) %{
196 match(Set res (ShenandoahCompareAndExchangeN mem (Binary oldval newval)));
197 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, KILL cr);
198
199 predicate(((CompareAndSwapNode*)n)->order() == MemNode::acquire
200 || ((CompareAndSwapNode*)n)->order() == MemNode::seqcst);
201
202 format %{ "CMPXCHGD acq $res, $mem, $oldval, $newval; as ptr; ptr" %}
203 ins_encode %{
204 ShenandoahBarrierSet::assembler()->cmpxchg_oop(
205 masm,
206 $mem$$Register, $oldval$$Register, $newval$$Register,
207 $tmp1$$Register, $tmp2$$Register,
208 true, $res$$Register
209 );
210 if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
211 __ isync();
212 } else {
213 __ sync();
214 }
215 %}
216 ins_pipe(pipe_class_default);
217 %}
|
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 bool need_acquire_load(const Node* n);
31 bool need_acquire_load_store(const Node *load);
32 %}
33
34 source %{
35 bool need_acquire_load(const Node* n) {
36 return !n->as_Load()->is_unordered() && !followed_by_acquire(n);
37 }
38 bool need_acquire_load_store(const Node* n) {
39 MemNode::MemOrd order = ((CompareAndSwapNode*)n->as_LoadStore())->order();
40 return (order == MemNode::acquire) || (order == MemNode::seqcst);
41 }
42 %}
43
44 // ---------------------------------- LOADS ---------------------------------------
45 //
46
47 instruct loadN_shenandoah(iRegNdst dst, memory mem, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, flagsRegCR0 cr0) %{
48 match(Set dst (LoadN mem));
49 effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, KILL cr0);
50 predicate(UseShenandoahGC && (n->as_Load()->barrier_data() != 0) && !need_acquire_load(n));
51 // The main load is a candidate to implement implicit null checks.
52 ins_is_late_expanded_null_check_candidate(true);
53 format %{ "shenandoah_load $dst, $mem\t# ptr" %}
54 ins_encode %{
55 ShenandoahBarrierSet::assembler()->load_c2(this, masm,
56 $dst$$Register,
57 $mem$$base$$Register,
58 $mem$$disp,
59 $tmp1$$Register,
60 $tmp2$$Register,
61 /* narrow = */ true,
62 /* acquire = */ false
63 );
64 %}
65 ins_cost(MEMORY_REF_COST);
66 ins_pipe(pipe_class_memory);
67 %}
68
69 instruct loadN_acq_shenandoah(iRegNdst dst, memory mem, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, flagsRegCR0 cr0) %{
70 match(Set dst (LoadN mem));
71 effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, KILL cr0);
72 predicate(UseShenandoahGC && (n->as_Load()->barrier_data() != 0) && need_acquire_load(n));
73 // The main load is a candidate to implement implicit null checks.
74 ins_is_late_expanded_null_check_candidate(true);
75 format %{ "shenandoah_load $dst, $mem\t# ptr (acquire)" %}
76 ins_encode %{
77 ShenandoahBarrierSet::assembler()->load_c2(this, masm,
78 $dst$$Register,
79 $mem$$base$$Register,
80 $mem$$disp,
81 $tmp1$$Register,
82 $tmp2$$Register,
83 /* narrow = */ true,
84 /* acquire = */ true
85 );
86 %}
87 ins_cost(3*MEMORY_REF_COST);
88 ins_pipe(pipe_class_memory);
89 %}
90
91 instruct loadP_shenandoah(iRegPdst dst, memoryAlg4 mem, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, flagsRegCR0 cr0) %{
92 match(Set dst (LoadP mem));
93 effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, KILL cr0);
94 predicate(UseShenandoahGC && (n->as_Load()->barrier_data() != 0) && !need_acquire_load(n));
95 // The main load is a candidate to implement implicit null checks.
96 ins_is_late_expanded_null_check_candidate(true);
97 format %{ "shenandoah_load $dst, $mem\t# ptr" %}
98 ins_encode %{
99 ShenandoahBarrierSet::assembler()->load_c2(this, masm,
100 $dst$$Register,
101 $mem$$base$$Register,
102 $mem$$disp,
103 $tmp1$$Register,
104 $tmp2$$Register,
105 /* narrow = */ false,
106 /* acquire = */ false
107 );
108 %}
109 ins_cost(MEMORY_REF_COST);
110 ins_pipe(pipe_class_memory);
111 %}
112
113 instruct loadP_acq_shenandoah(iRegPdst dst, memoryAlg4 mem, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, flagsRegCR0 cr0) %{
114 match(Set dst (LoadP mem));
115 effect(TEMP_DEF dst, TEMP tmp1, TEMP tmp2, KILL cr0);
116 predicate(UseShenandoahGC && (n->as_Load()->barrier_data() != 0) && need_acquire_load(n));
117 // The main load is a candidate to implement implicit null checks.
118 ins_is_late_expanded_null_check_candidate(true);
119 format %{ "shenandoah_load $dst, $mem\t# ptr (acquire)" %}
120 ins_encode %{
121 ShenandoahBarrierSet::assembler()->load_c2(this, masm,
122 $dst$$Register,
123 $mem$$base$$Register,
124 $mem$$disp,
125 $tmp1$$Register,
126 $tmp2$$Register,
127 /* narrow = */ false,
128 /* acquire = */ true
129 );
130 %}
131 ins_cost(3*MEMORY_REF_COST);
132 ins_pipe(pipe_class_memory);
133 %}
134
135 // ---------------------------------- STORES ---------------------------------------
136 //
137
138 instruct storeN_shenandoah(memory dst, iRegN_P2N src, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
139 match(Set dst (StoreN dst src));
140 predicate(UseShenandoahGC && (n->as_Store()->barrier_data() != 0));
141 effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
142 format %{ "shenandoah_store $dst, $src\t# compressed ptr" %}
143 ins_encode %{
144 ShenandoahBarrierSet::assembler()->store_c2(this, masm,
145 $dst$$base$$Register,
146 $dst$$disp,
147 /* dst_narrow = */ true,
148 $src$$Register,
149 /* src_narrow = */ true,
150 $tmp1$$Register,
151 $tmp2$$Register,
152 $tmp3$$Register
153 );
154 %}
155 ins_cost(MEMORY_REF_COST);
156 ins_pipe(pipe_class_memory);
157 %}
158
159 instruct storeP_shenandoah(memoryAlg4 dst, iRegPsrc src, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
160 match(Set dst (StoreP dst src));
161 predicate(UseShenandoahGC && (n->as_Store()->barrier_data() != 0));
162 effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
163 format %{ "shenandoah_store $dst, $src\t# ptr" %}
164 ins_encode %{
165 ShenandoahBarrierSet::assembler()->store_c2(this, masm,
166 $dst$$base$$Register,
167 $dst$$disp,
168 /* dst_narrow = */ false,
169 $src$$Register,
170 /* src_narrow = */ false,
171 $tmp1$$Register,
172 $tmp2$$Register,
173 $tmp3$$Register
174 );
175 %}
176 ins_cost(MEMORY_REF_COST);
177 ins_pipe(pipe_class_memory);
178 %}
179
180 instruct encodePAndStoreN_shenandoah(memory dst, iRegPsrc src, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
181 match(Set dst (StoreN dst (EncodeP src)));
182 predicate(UseShenandoahGC && (n->as_Store()->barrier_data() != 0));
183 effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
184 format %{ "shenandoah_store $dst, $src\t# compressed ptr (with encoding)" %}
185 ins_encode %{
186 ShenandoahBarrierSet::assembler()->store_c2(this, masm,
187 $dst$$base$$Register,
188 $dst$$disp,
189 /* dst_narrow = */ true,
190 $src$$Register,
191 /* src_narrow = */ false,
192 $tmp1$$Register,
193 $tmp2$$Register,
194 $tmp3$$Register
195 );
196 %}
197 ins_cost(MEMORY_REF_COST);
198 ins_pipe(pipe_class_memory);
199 %}
200
201 // ---------------------- LOAD-STORES -----------------------------------
202 //
203
204 instruct compareAndSwapN_regP_regN_regN_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegNsrc src1, iRegNsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
205 match(Set res (CompareAndSwapN mem_ptr (Binary src1 src2)));
206 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && !need_acquire_load_store(n));
207 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
208 format %{ "CMPXCHGW $res, $mem_ptr, $src1, $src2; as bool" %}
209 ins_encode %{
210 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
211 $res$$Register,
212 $mem_ptr$$Register,
213 $src1$$Register,
214 $src2$$Register,
215 $tmp1$$Register,
216 $tmp2$$Register,
217 $tmp3$$Register,
218 /* exchange */ false,
219 /* is_narrow */ true,
220 /* weak */ false,
221 /* acquire */ false);
222 %}
223 ins_pipe(pipe_class_default);
224 %}
225
226 instruct compareAndSwapN_acq_regP_regN_regN_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegNsrc src1, iRegNsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
227 match(Set res (CompareAndSwapN mem_ptr (Binary src1 src2)));
228 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && need_acquire_load_store(n));
229 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
230 format %{ "CMPXCHGW $res, $mem_ptr, $src1, $src2; as bool" %}
231 ins_encode %{
232 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
233 $res$$Register,
234 $mem_ptr$$Register,
235 $src1$$Register,
236 $src2$$Register,
237 $tmp1$$Register,
238 $tmp2$$Register,
239 $tmp3$$Register,
240 /* exchange */ false,
241 /* is_narrow */ true,
242 /* weak */ false,
243 /* acquire */ true);
244 %}
245 ins_pipe(pipe_class_default);
246 %}
247
248 instruct compareAndSwapP_regP_regP_regP_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegPsrc src1, iRegPsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
249 match(Set res (CompareAndSwapP mem_ptr (Binary src1 src2)));
250 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
251 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && !need_acquire_load_store(n));
252 format %{ "CMPXCHGD $res, $mem_ptr, $src1, $src2; as bool; ptr" %}
253 ins_encode %{
254 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
255 $res$$Register,
256 $mem_ptr$$Register,
257 $src1$$Register,
258 $src2$$Register,
259 $tmp1$$Register,
260 $tmp2$$Register,
261 $tmp3$$Register,
262 /* exchange */ false,
263 /* is_narrow */ false,
264 /* weak */ false,
265 /* acquire */ false);
266 %}
267 ins_pipe(pipe_class_default);
268 %}
269
270 instruct compareAndSwapP_acq_regP_regP_regP_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegPsrc src1, iRegPsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
271 match(Set res (CompareAndSwapP mem_ptr (Binary src1 src2)));
272 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
273 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && need_acquire_load_store(n));
274 format %{ "CMPXCHGD $res, $mem_ptr, $src1, $src2; as bool; ptr" %}
275 ins_encode %{
276 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
277 $res$$Register,
278 $mem_ptr$$Register,
279 $src1$$Register,
280 $src2$$Register,
281 $tmp1$$Register,
282 $tmp2$$Register,
283 $tmp3$$Register,
284 /* exchange */ false,
285 /* is_narrow */ false,
286 /* weak */ false,
287 /* acquire */ true);
288 %}
289 ins_pipe(pipe_class_default);
290 %}
291
292 instruct weakCompareAndSwapN_regP_regN_regN_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegNsrc src1, iRegNsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
293 match(Set res (WeakCompareAndSwapN mem_ptr (Binary src1 src2)));
294 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && !need_acquire_load_store(n));
295 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
296 format %{ "weak CMPXCHGW acq $res, $mem_ptr, $src1, $src2; as bool" %}
297 ins_encode %{
298 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
299 $res$$Register,
300 $mem_ptr$$Register,
301 $src1$$Register,
302 $src2$$Register,
303 $tmp1$$Register,
304 $tmp2$$Register,
305 $tmp3$$Register,
306 /* exchange */ false,
307 /* is_narrow */ true,
308 /* weak */ true,
309 /* acquire */ false);
310 %}
311 ins_pipe(pipe_class_default);
312 %}
313
314 instruct weakCompareAndSwapN_acq_regP_regN_regN_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegNsrc src1, iRegNsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
315 match(Set res (WeakCompareAndSwapN mem_ptr (Binary src1 src2)));
316 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && need_acquire_load_store(n));
317 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
318 format %{ "weak CMPXCHGW acq $res, $mem_ptr, $src1, $src2; as bool" %}
319 ins_encode %{
320 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
321 $res$$Register,
322 $mem_ptr$$Register,
323 $src1$$Register,
324 $src2$$Register,
325 $tmp1$$Register,
326 $tmp2$$Register,
327 $tmp3$$Register,
328 /* exchange */ false,
329 /* is_narrow */ true,
330 /* weak */ true,
331 /* acquire */ true);
332 %}
333 ins_pipe(pipe_class_default);
334 %}
335
336 instruct weakCompareAndSwapP_regP_regP_regP_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegPsrc src1, iRegPsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
337 match(Set res (WeakCompareAndSwapP mem_ptr (Binary src1 src2)));
338 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && !need_acquire_load_store(n));
339 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
340 format %{ "weak CMPXCHGD $res, $mem_ptr, $src1, $src2; as bool; ptr" %}
341 ins_encode %{
342 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
343 $res$$Register,
344 $mem_ptr$$Register,
345 $src1$$Register,
346 $src2$$Register,
347 $tmp1$$Register,
348 $tmp2$$Register,
349 $tmp3$$Register,
350 /* exchange */ false,
351 /* is_narrow */ false,
352 /* weak */ true,
353 /* acquire */ false);
354 %}
355 ins_pipe(pipe_class_default);
356 %}
357
358 instruct weakCompareAndSwapP_acq_regP_regP_regP_shenandoah(iRegIdst res, iRegPdst mem_ptr, iRegPsrc src1, iRegPsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
359 match(Set res (WeakCompareAndSwapP mem_ptr (Binary src1 src2)));
360 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && need_acquire_load_store(n));
361 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0); // TEMP_DEF to avoid jump
362 format %{ "weak CMPXCHGD $res, $mem_ptr, $src1, $src2; as bool; ptr" %}
363 ins_encode %{
364 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
365 $res$$Register,
366 $mem_ptr$$Register,
367 $src1$$Register,
368 $src2$$Register,
369 $tmp1$$Register,
370 $tmp2$$Register,
371 $tmp3$$Register,
372 /* exchange */ false,
373 /* is_narrow */ false,
374 /* weak */ true,
375 /* acquire */ true);
376 %}
377 ins_pipe(pipe_class_default);
378 %}
379
380 instruct compareAndExchangeN_regP_regN_regN_shenandoah(iRegNdst res, iRegPdst mem_ptr, iRegNsrc src1, iRegNsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
381 match(Set res (CompareAndExchangeN mem_ptr (Binary src1 src2)));
382 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && !need_acquire_load_store(n));
383 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
384 format %{ "CMPXCHGW $res, $mem_ptr, $src1, $src2; as narrow oop" %}
385 ins_encode %{
386 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
387 $res$$Register,
388 $mem_ptr$$Register,
389 $src1$$Register,
390 $src2$$Register,
391 $tmp1$$Register,
392 $tmp2$$Register,
393 $tmp3$$Register,
394 /* exchange */ true,
395 /* is_narrow */ true,
396 /* weak */ false,
397 /* acquire */ false);
398 %}
399 ins_pipe(pipe_class_default);
400 %}
401
402 instruct compareAndExchangeN_acq_regP_regN_regN_shenandoah(iRegNdst res, iRegPdst mem_ptr, iRegNsrc src1, iRegNsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
403 match(Set res (CompareAndExchangeN mem_ptr (Binary src1 src2)));
404 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && need_acquire_load_store(n));
405 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
406 format %{ "CMPXCHGW $res, $mem_ptr, $src1, $src2; as narrow oop" %}
407 ins_encode %{
408 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
409 $res$$Register,
410 $mem_ptr$$Register,
411 $src1$$Register,
412 $src2$$Register,
413 $tmp1$$Register,
414 $tmp2$$Register,
415 $tmp3$$Register,
416 /* exchange */ true,
417 /* is_narrow */ true,
418 /* weak */ false,
419 /* acquire */ true);
420 %}
421 ins_pipe(pipe_class_default);
422 %}
423
424 instruct compareAndExchangeP_regP_regP_regP_shenandoah(iRegPdst res, iRegPdst mem_ptr, iRegPsrc src1, iRegPsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
425 match(Set res (CompareAndExchangeP mem_ptr (Binary src1 src2)));
426 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && !need_acquire_load_store(n));
427 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
428 format %{ "CMPXCHGD $res, $mem_ptr, $src1, $src2; as ptr; ptr" %}
429 ins_encode %{
430 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
431 $res$$Register,
432 $mem_ptr$$Register,
433 $src1$$Register,
434 $src2$$Register,
435 $tmp1$$Register,
436 $tmp2$$Register,
437 $tmp3$$Register,
438 /* exchange */ true,
439 /* is_narrow */ false,
440 /* weak */ false,
441 /* acquire */ false);
442 %}
443 ins_pipe(pipe_class_default);
444 %}
445
446 instruct compareAndExchangeP_acq_regP_regP_regP_shenandoah(iRegPdst res, iRegPdst mem_ptr, iRegPsrc src1, iRegPsrc src2, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
447 match(Set res (CompareAndExchangeP mem_ptr (Binary src1 src2)));
448 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0) && need_acquire_load_store(n));
449 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
450 format %{ "CMPXCHGD $res, $mem_ptr, $src1, $src2; as ptr; ptr" %}
451 ins_encode %{
452 ShenandoahBarrierSet::assembler()->compare_and_set_c2(this, masm,
453 $res$$Register,
454 $mem_ptr$$Register,
455 $src1$$Register,
456 $src2$$Register,
457 $tmp1$$Register,
458 $tmp2$$Register,
459 $tmp3$$Register,
460 /* exchange */ true,
461 /* is_narrow */ false,
462 /* weak */ false,
463 /* acquire */ true);
464 %}
465 ins_pipe(pipe_class_default);
466 %}
467
468 instruct getAndSetP_shenandoah(iRegPdst res, iRegPdst mem_ptr, iRegPsrc src, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
469 match(Set res (GetAndSetP mem_ptr src));
470 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0));
471 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
472 format %{ "GetAndSetP $res, $mem_ptr, $src" %}
473 ins_encode %{
474 ShenandoahBarrierSet::assembler()->get_and_set_c2(this, masm,
475 $res$$Register,
476 $src$$Register,
477 $mem_ptr$$Register,
478 $tmp1$$Register,
479 $tmp2$$Register,
480 $tmp3$$Register);
481 %}
482 ins_pipe(pipe_class_default);
483 %}
484
485 instruct getAndSetN_shenandoah(iRegNdst res, iRegPdst mem_ptr, iRegNsrc src, iRegPdstNoScratch tmp1, iRegPdstNoScratch tmp2, iRegPdstNoScratch tmp3, flagsRegCR0 cr0) %{
486 match(Set res (GetAndSetN mem_ptr src));
487 predicate(UseShenandoahGC && (n->as_LoadStore()->barrier_data() != 0));
488 effect(TEMP_DEF res, TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr0);
489 format %{ "GetAndSetN $res, $mem_ptr, $src" %}
490 ins_encode %{
491 ShenandoahBarrierSet::assembler()->get_and_set_c2(this, masm,
492 $res$$Register,
493 $src$$Register,
494 $mem_ptr$$Register,
495 $tmp1$$Register,
496 $tmp2$$Register,
497 $tmp3$$Register);
498 %}
499 ins_pipe(pipe_class_default);
500 %}
501
|