Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / LoongArch / ir-instruction / load-store-atomic.ll
blobc51fded410e83b03df4cde5791a71368b02d1ecc
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3 ; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
5 define i8 @load_acquire_i8(ptr %ptr) {
6 ; LA32-LABEL: load_acquire_i8:
7 ; LA32:       # %bb.0:
8 ; LA32-NEXT:    ld.b $a0, $a0, 0
9 ; LA32-NEXT:    dbar 20
10 ; LA32-NEXT:    ret
12 ; LA64-LABEL: load_acquire_i8:
13 ; LA64:       # %bb.0:
14 ; LA64-NEXT:    ld.b $a0, $a0, 0
15 ; LA64-NEXT:    dbar 20
16 ; LA64-NEXT:    ret
17   %val = load atomic i8, ptr %ptr acquire, align 1
18   ret i8 %val
21 define i16 @load_acquire_i16(ptr %ptr) {
22 ; LA32-LABEL: load_acquire_i16:
23 ; LA32:       # %bb.0:
24 ; LA32-NEXT:    ld.h $a0, $a0, 0
25 ; LA32-NEXT:    dbar 20
26 ; LA32-NEXT:    ret
28 ; LA64-LABEL: load_acquire_i16:
29 ; LA64:       # %bb.0:
30 ; LA64-NEXT:    ld.h $a0, $a0, 0
31 ; LA64-NEXT:    dbar 20
32 ; LA64-NEXT:    ret
33   %val = load atomic i16, ptr %ptr acquire, align 2
34   ret i16 %val
37 define i32 @load_acquire_i32(ptr %ptr) {
38 ; LA32-LABEL: load_acquire_i32:
39 ; LA32:       # %bb.0:
40 ; LA32-NEXT:    ld.w $a0, $a0, 0
41 ; LA32-NEXT:    dbar 20
42 ; LA32-NEXT:    ret
44 ; LA64-LABEL: load_acquire_i32:
45 ; LA64:       # %bb.0:
46 ; LA64-NEXT:    ld.w $a0, $a0, 0
47 ; LA64-NEXT:    dbar 20
48 ; LA64-NEXT:    ret
49   %val = load atomic i32, ptr %ptr acquire, align 4
50   ret i32 %val
53 define i64 @load_acquire_i64(ptr %ptr) {
54 ; LA32-LABEL: load_acquire_i64:
55 ; LA32:       # %bb.0:
56 ; LA32-NEXT:    addi.w $sp, $sp, -16
57 ; LA32-NEXT:    .cfi_def_cfa_offset 16
58 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
59 ; LA32-NEXT:    .cfi_offset 1, -4
60 ; LA32-NEXT:    ori $a1, $zero, 2
61 ; LA32-NEXT:    bl %plt(__atomic_load_8)
62 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
63 ; LA32-NEXT:    addi.w $sp, $sp, 16
64 ; LA32-NEXT:    ret
66 ; LA64-LABEL: load_acquire_i64:
67 ; LA64:       # %bb.0:
68 ; LA64-NEXT:    ld.d $a0, $a0, 0
69 ; LA64-NEXT:    dbar 20
70 ; LA64-NEXT:    ret
71   %val = load atomic i64, ptr %ptr acquire, align 8
72   ret i64 %val
75 define i8 @load_unordered_i8(ptr %ptr) {
76 ; LA32-LABEL: load_unordered_i8:
77 ; LA32:       # %bb.0:
78 ; LA32-NEXT:    ld.b $a0, $a0, 0
79 ; LA32-NEXT:    ret
81 ; LA64-LABEL: load_unordered_i8:
82 ; LA64:       # %bb.0:
83 ; LA64-NEXT:    ld.b $a0, $a0, 0
84 ; LA64-NEXT:    ret
85   %val = load atomic i8, ptr %ptr unordered, align 1
86   ret i8 %val
89 define i16 @load_unordered_i16(ptr %ptr) {
90 ; LA32-LABEL: load_unordered_i16:
91 ; LA32:       # %bb.0:
92 ; LA32-NEXT:    ld.h $a0, $a0, 0
93 ; LA32-NEXT:    ret
95 ; LA64-LABEL: load_unordered_i16:
96 ; LA64:       # %bb.0:
97 ; LA64-NEXT:    ld.h $a0, $a0, 0
98 ; LA64-NEXT:    ret
99   %val = load atomic i16, ptr %ptr unordered, align 2
100   ret i16 %val
103 define i32 @load_unordered_i32(ptr %ptr) {
104 ; LA32-LABEL: load_unordered_i32:
105 ; LA32:       # %bb.0:
106 ; LA32-NEXT:    ld.w $a0, $a0, 0
107 ; LA32-NEXT:    ret
109 ; LA64-LABEL: load_unordered_i32:
110 ; LA64:       # %bb.0:
111 ; LA64-NEXT:    ld.w $a0, $a0, 0
112 ; LA64-NEXT:    ret
113   %val = load atomic i32, ptr %ptr unordered, align 4
114   ret i32 %val
117 define i64 @load_unordered_i64(ptr %ptr) {
118 ; LA32-LABEL: load_unordered_i64:
119 ; LA32:       # %bb.0:
120 ; LA32-NEXT:    addi.w $sp, $sp, -16
121 ; LA32-NEXT:    .cfi_def_cfa_offset 16
122 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
123 ; LA32-NEXT:    .cfi_offset 1, -4
124 ; LA32-NEXT:    move $a1, $zero
125 ; LA32-NEXT:    bl %plt(__atomic_load_8)
126 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
127 ; LA32-NEXT:    addi.w $sp, $sp, 16
128 ; LA32-NEXT:    ret
130 ; LA64-LABEL: load_unordered_i64:
131 ; LA64:       # %bb.0:
132 ; LA64-NEXT:    ld.d $a0, $a0, 0
133 ; LA64-NEXT:    ret
134   %val = load atomic i64, ptr %ptr unordered, align 8
135   ret i64 %val
138 define i8 @load_monotonic_i8(ptr %ptr) {
139 ; LA32-LABEL: load_monotonic_i8:
140 ; LA32:       # %bb.0:
141 ; LA32-NEXT:    ld.b $a0, $a0, 0
142 ; LA32-NEXT:    ret
144 ; LA64-LABEL: load_monotonic_i8:
145 ; LA64:       # %bb.0:
146 ; LA64-NEXT:    ld.b $a0, $a0, 0
147 ; LA64-NEXT:    ret
148   %val = load atomic i8, ptr %ptr monotonic, align 1
149   ret i8 %val
152 define i16 @load_monotonic_i16(ptr %ptr) {
153 ; LA32-LABEL: load_monotonic_i16:
154 ; LA32:       # %bb.0:
155 ; LA32-NEXT:    ld.h $a0, $a0, 0
156 ; LA32-NEXT:    ret
158 ; LA64-LABEL: load_monotonic_i16:
159 ; LA64:       # %bb.0:
160 ; LA64-NEXT:    ld.h $a0, $a0, 0
161 ; LA64-NEXT:    ret
162   %val = load atomic i16, ptr %ptr monotonic, align 2
163   ret i16 %val
166 define i32 @load_monotonic_i32(ptr %ptr) {
167 ; LA32-LABEL: load_monotonic_i32:
168 ; LA32:       # %bb.0:
169 ; LA32-NEXT:    ld.w $a0, $a0, 0
170 ; LA32-NEXT:    ret
172 ; LA64-LABEL: load_monotonic_i32:
173 ; LA64:       # %bb.0:
174 ; LA64-NEXT:    ld.w $a0, $a0, 0
175 ; LA64-NEXT:    ret
176   %val = load atomic i32, ptr %ptr monotonic, align 4
177   ret i32 %val
180 define i64 @load_monotonic_i64(ptr %ptr) {
181 ; LA32-LABEL: load_monotonic_i64:
182 ; LA32:       # %bb.0:
183 ; LA32-NEXT:    addi.w $sp, $sp, -16
184 ; LA32-NEXT:    .cfi_def_cfa_offset 16
185 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
186 ; LA32-NEXT:    .cfi_offset 1, -4
187 ; LA32-NEXT:    move $a1, $zero
188 ; LA32-NEXT:    bl %plt(__atomic_load_8)
189 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
190 ; LA32-NEXT:    addi.w $sp, $sp, 16
191 ; LA32-NEXT:    ret
193 ; LA64-LABEL: load_monotonic_i64:
194 ; LA64:       # %bb.0:
195 ; LA64-NEXT:    ld.d $a0, $a0, 0
196 ; LA64-NEXT:    ret
197   %val = load atomic i64, ptr %ptr monotonic, align 8
198   ret i64 %val
201 define i8 @load_seq_cst_i8(ptr %ptr) {
202 ; LA32-LABEL: load_seq_cst_i8:
203 ; LA32:       # %bb.0:
204 ; LA32-NEXT:    ld.b $a0, $a0, 0
205 ; LA32-NEXT:    dbar 16
206 ; LA32-NEXT:    ret
208 ; LA64-LABEL: load_seq_cst_i8:
209 ; LA64:       # %bb.0:
210 ; LA64-NEXT:    ld.b $a0, $a0, 0
211 ; LA64-NEXT:    dbar 16
212 ; LA64-NEXT:    ret
213   %val = load atomic i8, ptr %ptr seq_cst, align 1
214   ret i8 %val
217 define i16 @load_seq_cst_i16(ptr %ptr) {
218 ; LA32-LABEL: load_seq_cst_i16:
219 ; LA32:       # %bb.0:
220 ; LA32-NEXT:    ld.h $a0, $a0, 0
221 ; LA32-NEXT:    dbar 16
222 ; LA32-NEXT:    ret
224 ; LA64-LABEL: load_seq_cst_i16:
225 ; LA64:       # %bb.0:
226 ; LA64-NEXT:    ld.h $a0, $a0, 0
227 ; LA64-NEXT:    dbar 16
228 ; LA64-NEXT:    ret
229   %val = load atomic i16, ptr %ptr seq_cst, align 2
230   ret i16 %val
233 define i32 @load_seq_cst_i32(ptr %ptr) {
234 ; LA32-LABEL: load_seq_cst_i32:
235 ; LA32:       # %bb.0:
236 ; LA32-NEXT:    ld.w $a0, $a0, 0
237 ; LA32-NEXT:    dbar 16
238 ; LA32-NEXT:    ret
240 ; LA64-LABEL: load_seq_cst_i32:
241 ; LA64:       # %bb.0:
242 ; LA64-NEXT:    ld.w $a0, $a0, 0
243 ; LA64-NEXT:    dbar 16
244 ; LA64-NEXT:    ret
245   %val = load atomic i32, ptr %ptr seq_cst, align 4
246   ret i32 %val
249 define i64 @load_seq_cst_i64(ptr %ptr) {
250 ; LA32-LABEL: load_seq_cst_i64:
251 ; LA32:       # %bb.0:
252 ; LA32-NEXT:    addi.w $sp, $sp, -16
253 ; LA32-NEXT:    .cfi_def_cfa_offset 16
254 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
255 ; LA32-NEXT:    .cfi_offset 1, -4
256 ; LA32-NEXT:    ori $a1, $zero, 5
257 ; LA32-NEXT:    bl %plt(__atomic_load_8)
258 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
259 ; LA32-NEXT:    addi.w $sp, $sp, 16
260 ; LA32-NEXT:    ret
262 ; LA64-LABEL: load_seq_cst_i64:
263 ; LA64:       # %bb.0:
264 ; LA64-NEXT:    ld.d $a0, $a0, 0
265 ; LA64-NEXT:    dbar 16
266 ; LA64-NEXT:    ret
267   %val = load atomic i64, ptr %ptr seq_cst, align 8
268   ret i64 %val
271 define void @store_release_i8(ptr %ptr, i8 signext %v) {
272 ; LA32-LABEL: store_release_i8:
273 ; LA32:       # %bb.0:
274 ; LA32-NEXT:    dbar 18
275 ; LA32-NEXT:    st.b $a1, $a0, 0
276 ; LA32-NEXT:    ret
278 ; LA64-LABEL: store_release_i8:
279 ; LA64:       # %bb.0:
280 ; LA64-NEXT:    dbar 18
281 ; LA64-NEXT:    st.b $a1, $a0, 0
282 ; LA64-NEXT:    ret
283   store atomic i8 %v, ptr %ptr release, align 1
284   ret void
287 define void @store_release_i16(ptr %ptr, i16 signext %v) {
288 ; LA32-LABEL: store_release_i16:
289 ; LA32:       # %bb.0:
290 ; LA32-NEXT:    dbar 18
291 ; LA32-NEXT:    st.h $a1, $a0, 0
292 ; LA32-NEXT:    ret
294 ; LA64-LABEL: store_release_i16:
295 ; LA64:       # %bb.0:
296 ; LA64-NEXT:    dbar 18
297 ; LA64-NEXT:    st.h $a1, $a0, 0
298 ; LA64-NEXT:    ret
299   store atomic i16 %v, ptr %ptr release, align 2
300   ret void
303 define void @store_release_i32(ptr %ptr, i32 signext %v) {
304 ; LA32-LABEL: store_release_i32:
305 ; LA32:       # %bb.0:
306 ; LA32-NEXT:    dbar 18
307 ; LA32-NEXT:    st.w $a1, $a0, 0
308 ; LA32-NEXT:    ret
310 ; LA64-LABEL: store_release_i32:
311 ; LA64:       # %bb.0:
312 ; LA64-NEXT:    amswap_db.w $zero, $a1, $a0
313 ; LA64-NEXT:    ret
314   store atomic i32 %v, ptr %ptr release, align 4
315   ret void
318 define void @store_release_i64(ptr %ptr, i64 %v) {
319 ; LA32-LABEL: store_release_i64:
320 ; LA32:       # %bb.0:
321 ; LA32-NEXT:    addi.w $sp, $sp, -16
322 ; LA32-NEXT:    .cfi_def_cfa_offset 16
323 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
324 ; LA32-NEXT:    .cfi_offset 1, -4
325 ; LA32-NEXT:    ori $a3, $zero, 3
326 ; LA32-NEXT:    bl %plt(__atomic_store_8)
327 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
328 ; LA32-NEXT:    addi.w $sp, $sp, 16
329 ; LA32-NEXT:    ret
331 ; LA64-LABEL: store_release_i64:
332 ; LA64:       # %bb.0:
333 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
334 ; LA64-NEXT:    ret
335   store atomic i64 %v, ptr %ptr release, align 8
336   ret void
339 define void @store_unordered_i8(ptr %ptr, i8 signext %v) {
340 ; LA32-LABEL: store_unordered_i8:
341 ; LA32:       # %bb.0:
342 ; LA32-NEXT:    st.b $a1, $a0, 0
343 ; LA32-NEXT:    ret
345 ; LA64-LABEL: store_unordered_i8:
346 ; LA64:       # %bb.0:
347 ; LA64-NEXT:    st.b $a1, $a0, 0
348 ; LA64-NEXT:    ret
349   store atomic i8 %v, ptr %ptr unordered, align 1
350   ret void
353 define void @store_unordered_i16(ptr %ptr, i16 signext %v) {
354 ; LA32-LABEL: store_unordered_i16:
355 ; LA32:       # %bb.0:
356 ; LA32-NEXT:    st.h $a1, $a0, 0
357 ; LA32-NEXT:    ret
359 ; LA64-LABEL: store_unordered_i16:
360 ; LA64:       # %bb.0:
361 ; LA64-NEXT:    st.h $a1, $a0, 0
362 ; LA64-NEXT:    ret
363   store atomic i16 %v, ptr %ptr unordered, align 2
364   ret void
367 define void @store_unordered_i32(ptr %ptr, i32 signext %v) {
368 ; LA32-LABEL: store_unordered_i32:
369 ; LA32:       # %bb.0:
370 ; LA32-NEXT:    st.w $a1, $a0, 0
371 ; LA32-NEXT:    ret
373 ; LA64-LABEL: store_unordered_i32:
374 ; LA64:       # %bb.0:
375 ; LA64-NEXT:    st.w $a1, $a0, 0
376 ; LA64-NEXT:    ret
377   store atomic i32 %v, ptr %ptr unordered, align 4
378   ret void
381 define void @store_unordered_i64(ptr %ptr, i64 %v) {
382 ; LA32-LABEL: store_unordered_i64:
383 ; LA32:       # %bb.0:
384 ; LA32-NEXT:    addi.w $sp, $sp, -16
385 ; LA32-NEXT:    .cfi_def_cfa_offset 16
386 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
387 ; LA32-NEXT:    .cfi_offset 1, -4
388 ; LA32-NEXT:    move $a3, $zero
389 ; LA32-NEXT:    bl %plt(__atomic_store_8)
390 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
391 ; LA32-NEXT:    addi.w $sp, $sp, 16
392 ; LA32-NEXT:    ret
394 ; LA64-LABEL: store_unordered_i64:
395 ; LA64:       # %bb.0:
396 ; LA64-NEXT:    st.d $a1, $a0, 0
397 ; LA64-NEXT:    ret
398   store atomic i64 %v, ptr %ptr unordered, align 8
399   ret void
402 define void @store_monotonic_i8(ptr %ptr, i8 signext %v) {
403 ; LA32-LABEL: store_monotonic_i8:
404 ; LA32:       # %bb.0:
405 ; LA32-NEXT:    st.b $a1, $a0, 0
406 ; LA32-NEXT:    ret
408 ; LA64-LABEL: store_monotonic_i8:
409 ; LA64:       # %bb.0:
410 ; LA64-NEXT:    st.b $a1, $a0, 0
411 ; LA64-NEXT:    ret
412   store atomic i8 %v, ptr %ptr monotonic, align 1
413   ret void
416 define void @store_monotonic_i16(ptr %ptr, i16 signext %v) {
417 ; LA32-LABEL: store_monotonic_i16:
418 ; LA32:       # %bb.0:
419 ; LA32-NEXT:    st.h $a1, $a0, 0
420 ; LA32-NEXT:    ret
422 ; LA64-LABEL: store_monotonic_i16:
423 ; LA64:       # %bb.0:
424 ; LA64-NEXT:    st.h $a1, $a0, 0
425 ; LA64-NEXT:    ret
426   store atomic i16 %v, ptr %ptr monotonic, align 2
427   ret void
430 define void @store_monotonic_i32(ptr %ptr, i32 signext %v) {
431 ; LA32-LABEL: store_monotonic_i32:
432 ; LA32:       # %bb.0:
433 ; LA32-NEXT:    st.w $a1, $a0, 0
434 ; LA32-NEXT:    ret
436 ; LA64-LABEL: store_monotonic_i32:
437 ; LA64:       # %bb.0:
438 ; LA64-NEXT:    st.w $a1, $a0, 0
439 ; LA64-NEXT:    ret
440   store atomic i32 %v, ptr %ptr monotonic, align 4
441   ret void
444 define void @store_monotonic_i64(ptr %ptr, i64 %v) {
445 ; LA32-LABEL: store_monotonic_i64:
446 ; LA32:       # %bb.0:
447 ; LA32-NEXT:    addi.w $sp, $sp, -16
448 ; LA32-NEXT:    .cfi_def_cfa_offset 16
449 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
450 ; LA32-NEXT:    .cfi_offset 1, -4
451 ; LA32-NEXT:    move $a3, $zero
452 ; LA32-NEXT:    bl %plt(__atomic_store_8)
453 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
454 ; LA32-NEXT:    addi.w $sp, $sp, 16
455 ; LA32-NEXT:    ret
457 ; LA64-LABEL: store_monotonic_i64:
458 ; LA64:       # %bb.0:
459 ; LA64-NEXT:    st.d $a1, $a0, 0
460 ; LA64-NEXT:    ret
461   store atomic i64 %v, ptr %ptr monotonic, align 8
462   ret void
465 define void @store_seq_cst_i8(ptr %ptr, i8 signext %v) {
466 ; LA32-LABEL: store_seq_cst_i8:
467 ; LA32:       # %bb.0:
468 ; LA32-NEXT:    dbar 16
469 ; LA32-NEXT:    st.b $a1, $a0, 0
470 ; LA32-NEXT:    dbar 16
471 ; LA32-NEXT:    ret
473 ; LA64-LABEL: store_seq_cst_i8:
474 ; LA64:       # %bb.0:
475 ; LA64-NEXT:    dbar 16
476 ; LA64-NEXT:    st.b $a1, $a0, 0
477 ; LA64-NEXT:    dbar 16
478 ; LA64-NEXT:    ret
479   store atomic i8 %v, ptr %ptr seq_cst, align 1
480   ret void
483 define void @store_seq_cst_i16(ptr %ptr, i16 signext %v) {
484 ; LA32-LABEL: store_seq_cst_i16:
485 ; LA32:       # %bb.0:
486 ; LA32-NEXT:    dbar 16
487 ; LA32-NEXT:    st.h $a1, $a0, 0
488 ; LA32-NEXT:    dbar 16
489 ; LA32-NEXT:    ret
491 ; LA64-LABEL: store_seq_cst_i16:
492 ; LA64:       # %bb.0:
493 ; LA64-NEXT:    dbar 16
494 ; LA64-NEXT:    st.h $a1, $a0, 0
495 ; LA64-NEXT:    dbar 16
496 ; LA64-NEXT:    ret
497   store atomic i16 %v, ptr %ptr seq_cst, align 2
498   ret void
501 define void @store_seq_cst_i32(ptr %ptr, i32 signext %v) {
502 ; LA32-LABEL: store_seq_cst_i32:
503 ; LA32:       # %bb.0:
504 ; LA32-NEXT:    dbar 16
505 ; LA32-NEXT:    st.w $a1, $a0, 0
506 ; LA32-NEXT:    dbar 16
507 ; LA32-NEXT:    ret
509 ; LA64-LABEL: store_seq_cst_i32:
510 ; LA64:       # %bb.0:
511 ; LA64-NEXT:    amswap_db.w $zero, $a1, $a0
512 ; LA64-NEXT:    ret
513   store atomic i32 %v, ptr %ptr seq_cst, align 4
514   ret void
517 define void @store_seq_cst_i64(ptr %ptr, i64 %v) {
518 ; LA32-LABEL: store_seq_cst_i64:
519 ; LA32:       # %bb.0:
520 ; LA32-NEXT:    addi.w $sp, $sp, -16
521 ; LA32-NEXT:    .cfi_def_cfa_offset 16
522 ; LA32-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
523 ; LA32-NEXT:    .cfi_offset 1, -4
524 ; LA32-NEXT:    ori $a3, $zero, 5
525 ; LA32-NEXT:    bl %plt(__atomic_store_8)
526 ; LA32-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
527 ; LA32-NEXT:    addi.w $sp, $sp, 16
528 ; LA32-NEXT:    ret
530 ; LA64-LABEL: store_seq_cst_i64:
531 ; LA64:       # %bb.0:
532 ; LA64-NEXT:    amswap_db.d $zero, $a1, $a0
533 ; LA64-NEXT:    ret
534   store atomic i64 %v, ptr %ptr seq_cst, align 8
535   ret void