[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / arm64-atomic-128.ll
bloba3d8531f5c76593c1e9a9914a22f679357f8eb48
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-LLSC-O1
3 ; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -mattr=+lse -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-CAS-O1
4 ; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -O0 -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-LLSC-O0
5 ; RUN: llc < %s -mtriple=arm64-linux-gnu -verify-machineinstrs -O0 -mattr=+lse -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=CHECK-CAS-O0
6 @var = global i128 0
8 define void @val_compare_and_swap(ptr %p, i128 %oldval, i128 %newval) {
9 ; CHECK-LLSC-O1-LABEL: val_compare_and_swap:
10 ; CHECK-LLSC-O1:       // %bb.0:
11 ; CHECK-LLSC-O1-NEXT:  .LBB0_1: // =>This Inner Loop Header: Depth=1
12 ; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]
13 ; CHECK-LLSC-O1-NEXT:    cmp x8, x2
14 ; CHECK-LLSC-O1-NEXT:    cset w10, ne
15 ; CHECK-LLSC-O1-NEXT:    cmp x9, x3
16 ; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne
17 ; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB0_3
18 ; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB0_1 Depth=1
19 ; CHECK-LLSC-O1-NEXT:    stxp w10, x8, x9, [x0]
20 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB0_1
21 ; CHECK-LLSC-O1-NEXT:    b .LBB0_4
22 ; CHECK-LLSC-O1-NEXT:  .LBB0_3: // in Loop: Header=BB0_1 Depth=1
23 ; CHECK-LLSC-O1-NEXT:    stxp w10, x4, x5, [x0]
24 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB0_1
25 ; CHECK-LLSC-O1-NEXT:  .LBB0_4:
26 ; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x8
27 ; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x9
28 ; CHECK-LLSC-O1-NEXT:    str q0, [x0]
29 ; CHECK-LLSC-O1-NEXT:    ret
31 ; CHECK-CAS-O1-LABEL: val_compare_and_swap:
32 ; CHECK-CAS-O1:       // %bb.0:
33 ; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3
34 ; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5
35 ; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3
36 ; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5
37 ; CHECK-CAS-O1-NEXT:    caspa x2, x3, x4, x5, [x0]
38 ; CHECK-CAS-O1-NEXT:    mov v0.d[0], x2
39 ; CHECK-CAS-O1-NEXT:    mov v0.d[1], x3
40 ; CHECK-CAS-O1-NEXT:    str q0, [x0]
41 ; CHECK-CAS-O1-NEXT:    ret
43 ; CHECK-LLSC-O0-LABEL: val_compare_and_swap:
44 ; CHECK-LLSC-O0:       // %bb.0:
45 ; CHECK-LLSC-O0-NEXT:  .LBB0_1: // =>This Inner Loop Header: Depth=1
46 ; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]
47 ; CHECK-LLSC-O0-NEXT:    cmp x9, x2
48 ; CHECK-LLSC-O0-NEXT:    cset w10, ne
49 ; CHECK-LLSC-O0-NEXT:    cmp x8, x3
50 ; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne
51 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB0_3
52 ; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB0_1 Depth=1
53 ; CHECK-LLSC-O0-NEXT:    stxp w10, x4, x5, [x0]
54 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB0_1
55 ; CHECK-LLSC-O0-NEXT:    b .LBB0_4
56 ; CHECK-LLSC-O0-NEXT:  .LBB0_3: // in Loop: Header=BB0_1 Depth=1
57 ; CHECK-LLSC-O0-NEXT:    stxp w10, x9, x8, [x0]
58 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB0_1
59 ; CHECK-LLSC-O0-NEXT:  .LBB0_4:
60 ; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0
61 ; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9
62 ; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8
63 ; CHECK-LLSC-O0-NEXT:    str q0, [x0]
64 ; CHECK-LLSC-O0-NEXT:    ret
66 ; CHECK-CAS-O0-LABEL: val_compare_and_swap:
67 ; CHECK-CAS-O0:       // %bb.0:
68 ; CHECK-CAS-O0-NEXT:    sub sp, sp, #16
69 ; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16
70 ; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Folded Spill
71 ; CHECK-CAS-O0-NEXT:    mov x1, x5
72 ; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Folded Reload
73 ; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3
74 ; CHECK-CAS-O0-NEXT:    mov x3, x5
75 ; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5
76 ; CHECK-CAS-O0-NEXT:    mov x5, x1
77 ; CHECK-CAS-O0-NEXT:    caspa x2, x3, x4, x5, [x0]
78 ; CHECK-CAS-O0-NEXT:    mov x9, x2
79 ; CHECK-CAS-O0-NEXT:    mov x8, x3
80 ; CHECK-CAS-O0-NEXT:    // implicit-def: $q0
81 ; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9
82 ; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8
83 ; CHECK-CAS-O0-NEXT:    str q0, [x0]
84 ; CHECK-CAS-O0-NEXT:    add sp, sp, #16
85 ; CHECK-CAS-O0-NEXT:    ret
87 %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval acquire acquire
88   %val = extractvalue { i128, i1 } %pair, 0
89   store i128 %val, ptr %p
90   ret void
93 define void @val_compare_and_swap_monotonic_seqcst(ptr %p, i128 %oldval, i128 %newval) {
94 ; CHECK-LLSC-O1-LABEL: val_compare_and_swap_monotonic_seqcst:
95 ; CHECK-LLSC-O1:       // %bb.0:
96 ; CHECK-LLSC-O1-NEXT:  .LBB1_1: // =>This Inner Loop Header: Depth=1
97 ; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]
98 ; CHECK-LLSC-O1-NEXT:    cmp x8, x2
99 ; CHECK-LLSC-O1-NEXT:    cset w10, ne
100 ; CHECK-LLSC-O1-NEXT:    cmp x9, x3
101 ; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne
102 ; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB1_3
103 ; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB1_1 Depth=1
104 ; CHECK-LLSC-O1-NEXT:    stlxp w10, x8, x9, [x0]
105 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB1_1
106 ; CHECK-LLSC-O1-NEXT:    b .LBB1_4
107 ; CHECK-LLSC-O1-NEXT:  .LBB1_3: // in Loop: Header=BB1_1 Depth=1
108 ; CHECK-LLSC-O1-NEXT:    stlxp w10, x4, x5, [x0]
109 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB1_1
110 ; CHECK-LLSC-O1-NEXT:  .LBB1_4:
111 ; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x8
112 ; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x9
113 ; CHECK-LLSC-O1-NEXT:    str q0, [x0]
114 ; CHECK-LLSC-O1-NEXT:    ret
116 ; CHECK-CAS-O1-LABEL: val_compare_and_swap_monotonic_seqcst:
117 ; CHECK-CAS-O1:       // %bb.0:
118 ; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3
119 ; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5
120 ; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3
121 ; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5
122 ; CHECK-CAS-O1-NEXT:    caspal x2, x3, x4, x5, [x0]
123 ; CHECK-CAS-O1-NEXT:    mov v0.d[0], x2
124 ; CHECK-CAS-O1-NEXT:    mov v0.d[1], x3
125 ; CHECK-CAS-O1-NEXT:    str q0, [x0]
126 ; CHECK-CAS-O1-NEXT:    ret
128 ; CHECK-LLSC-O0-LABEL: val_compare_and_swap_monotonic_seqcst:
129 ; CHECK-LLSC-O0:       // %bb.0:
130 ; CHECK-LLSC-O0-NEXT:  .LBB1_1: // =>This Inner Loop Header: Depth=1
131 ; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]
132 ; CHECK-LLSC-O0-NEXT:    cmp x9, x2
133 ; CHECK-LLSC-O0-NEXT:    cset w10, ne
134 ; CHECK-LLSC-O0-NEXT:    cmp x8, x3
135 ; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne
136 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB1_3
137 ; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB1_1 Depth=1
138 ; CHECK-LLSC-O0-NEXT:    stlxp w10, x4, x5, [x0]
139 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB1_1
140 ; CHECK-LLSC-O0-NEXT:    b .LBB1_4
141 ; CHECK-LLSC-O0-NEXT:  .LBB1_3: // in Loop: Header=BB1_1 Depth=1
142 ; CHECK-LLSC-O0-NEXT:    stlxp w10, x9, x8, [x0]
143 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB1_1
144 ; CHECK-LLSC-O0-NEXT:  .LBB1_4:
145 ; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0
146 ; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9
147 ; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8
148 ; CHECK-LLSC-O0-NEXT:    str q0, [x0]
149 ; CHECK-LLSC-O0-NEXT:    ret
151 ; CHECK-CAS-O0-LABEL: val_compare_and_swap_monotonic_seqcst:
152 ; CHECK-CAS-O0:       // %bb.0:
153 ; CHECK-CAS-O0-NEXT:    sub sp, sp, #16
154 ; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16
155 ; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Folded Spill
156 ; CHECK-CAS-O0-NEXT:    mov x1, x5
157 ; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Folded Reload
158 ; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3
159 ; CHECK-CAS-O0-NEXT:    mov x3, x5
160 ; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5
161 ; CHECK-CAS-O0-NEXT:    mov x5, x1
162 ; CHECK-CAS-O0-NEXT:    caspal x2, x3, x4, x5, [x0]
163 ; CHECK-CAS-O0-NEXT:    mov x9, x2
164 ; CHECK-CAS-O0-NEXT:    mov x8, x3
165 ; CHECK-CAS-O0-NEXT:    // implicit-def: $q0
166 ; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9
167 ; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8
168 ; CHECK-CAS-O0-NEXT:    str q0, [x0]
169 ; CHECK-CAS-O0-NEXT:    add sp, sp, #16
170 ; CHECK-CAS-O0-NEXT:    ret
172   %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval monotonic seq_cst
173   %val = extractvalue { i128, i1 } %pair, 0
174   store i128 %val, ptr %p
175   ret void
178 define void @val_compare_and_swap_release_acquire(ptr %p, i128 %oldval, i128 %newval) {
179 ; CHECK-LLSC-O1-LABEL: val_compare_and_swap_release_acquire:
180 ; CHECK-LLSC-O1:       // %bb.0:
181 ; CHECK-LLSC-O1-NEXT:  .LBB2_1: // =>This Inner Loop Header: Depth=1
182 ; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]
183 ; CHECK-LLSC-O1-NEXT:    cmp x8, x2
184 ; CHECK-LLSC-O1-NEXT:    cset w10, ne
185 ; CHECK-LLSC-O1-NEXT:    cmp x9, x3
186 ; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne
187 ; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB2_3
188 ; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB2_1 Depth=1
189 ; CHECK-LLSC-O1-NEXT:    stlxp w10, x8, x9, [x0]
190 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB2_1
191 ; CHECK-LLSC-O1-NEXT:    b .LBB2_4
192 ; CHECK-LLSC-O1-NEXT:  .LBB2_3: // in Loop: Header=BB2_1 Depth=1
193 ; CHECK-LLSC-O1-NEXT:    stlxp w10, x4, x5, [x0]
194 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB2_1
195 ; CHECK-LLSC-O1-NEXT:  .LBB2_4:
196 ; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x8
197 ; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x9
198 ; CHECK-LLSC-O1-NEXT:    str q0, [x0]
199 ; CHECK-LLSC-O1-NEXT:    ret
201 ; CHECK-CAS-O1-LABEL: val_compare_and_swap_release_acquire:
202 ; CHECK-CAS-O1:       // %bb.0:
203 ; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3
204 ; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5
205 ; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3
206 ; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5
207 ; CHECK-CAS-O1-NEXT:    caspal x2, x3, x4, x5, [x0]
208 ; CHECK-CAS-O1-NEXT:    mov v0.d[0], x2
209 ; CHECK-CAS-O1-NEXT:    mov v0.d[1], x3
210 ; CHECK-CAS-O1-NEXT:    str q0, [x0]
211 ; CHECK-CAS-O1-NEXT:    ret
213 ; CHECK-LLSC-O0-LABEL: val_compare_and_swap_release_acquire:
214 ; CHECK-LLSC-O0:       // %bb.0:
215 ; CHECK-LLSC-O0-NEXT:  .LBB2_1: // =>This Inner Loop Header: Depth=1
216 ; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]
217 ; CHECK-LLSC-O0-NEXT:    cmp x9, x2
218 ; CHECK-LLSC-O0-NEXT:    cset w10, ne
219 ; CHECK-LLSC-O0-NEXT:    cmp x8, x3
220 ; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne
221 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB2_3
222 ; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB2_1 Depth=1
223 ; CHECK-LLSC-O0-NEXT:    stlxp w10, x4, x5, [x0]
224 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB2_1
225 ; CHECK-LLSC-O0-NEXT:    b .LBB2_4
226 ; CHECK-LLSC-O0-NEXT:  .LBB2_3: // in Loop: Header=BB2_1 Depth=1
227 ; CHECK-LLSC-O0-NEXT:    stlxp w10, x9, x8, [x0]
228 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB2_1
229 ; CHECK-LLSC-O0-NEXT:  .LBB2_4:
230 ; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0
231 ; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9
232 ; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8
233 ; CHECK-LLSC-O0-NEXT:    str q0, [x0]
234 ; CHECK-LLSC-O0-NEXT:    ret
236 ; CHECK-CAS-O0-LABEL: val_compare_and_swap_release_acquire:
237 ; CHECK-CAS-O0:       // %bb.0:
238 ; CHECK-CAS-O0-NEXT:    sub sp, sp, #16
239 ; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16
240 ; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Folded Spill
241 ; CHECK-CAS-O0-NEXT:    mov x1, x5
242 ; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Folded Reload
243 ; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3
244 ; CHECK-CAS-O0-NEXT:    mov x3, x5
245 ; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5
246 ; CHECK-CAS-O0-NEXT:    mov x5, x1
247 ; CHECK-CAS-O0-NEXT:    caspal x2, x3, x4, x5, [x0]
248 ; CHECK-CAS-O0-NEXT:    mov x9, x2
249 ; CHECK-CAS-O0-NEXT:    mov x8, x3
250 ; CHECK-CAS-O0-NEXT:    // implicit-def: $q0
251 ; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9
252 ; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8
253 ; CHECK-CAS-O0-NEXT:    str q0, [x0]
254 ; CHECK-CAS-O0-NEXT:    add sp, sp, #16
255 ; CHECK-CAS-O0-NEXT:    ret
257   %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval release acquire
258   %val = extractvalue { i128, i1 } %pair, 0
259   store i128 %val, ptr %p
260   ret void
263 define void @val_compare_and_swap_monotonic(ptr %p, i128 %oldval, i128 %newval) {
264 ; CHECK-LLSC-O1-LABEL: val_compare_and_swap_monotonic:
265 ; CHECK-LLSC-O1:       // %bb.0:
266 ; CHECK-LLSC-O1-NEXT:  .LBB3_1: // =>This Inner Loop Header: Depth=1
267 ; CHECK-LLSC-O1-NEXT:    ldaxp x8, x9, [x0]
268 ; CHECK-LLSC-O1-NEXT:    cmp x8, x2
269 ; CHECK-LLSC-O1-NEXT:    cset w10, ne
270 ; CHECK-LLSC-O1-NEXT:    cmp x9, x3
271 ; CHECK-LLSC-O1-NEXT:    cinc w10, w10, ne
272 ; CHECK-LLSC-O1-NEXT:    cbz w10, .LBB3_3
273 ; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB3_1 Depth=1
274 ; CHECK-LLSC-O1-NEXT:    stlxp w10, x8, x9, [x0]
275 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB3_1
276 ; CHECK-LLSC-O1-NEXT:    b .LBB3_4
277 ; CHECK-LLSC-O1-NEXT:  .LBB3_3: // in Loop: Header=BB3_1 Depth=1
278 ; CHECK-LLSC-O1-NEXT:    stlxp w10, x4, x5, [x0]
279 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB3_1
280 ; CHECK-LLSC-O1-NEXT:  .LBB3_4:
281 ; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x8
282 ; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x9
283 ; CHECK-LLSC-O1-NEXT:    str q0, [x0]
284 ; CHECK-LLSC-O1-NEXT:    ret
286 ; CHECK-CAS-O1-LABEL: val_compare_and_swap_monotonic:
287 ; CHECK-CAS-O1:       // %bb.0:
288 ; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3
289 ; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5
290 ; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3
291 ; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5
292 ; CHECK-CAS-O1-NEXT:    caspal x2, x3, x4, x5, [x0]
293 ; CHECK-CAS-O1-NEXT:    mov v0.d[0], x2
294 ; CHECK-CAS-O1-NEXT:    mov v0.d[1], x3
295 ; CHECK-CAS-O1-NEXT:    str q0, [x0]
296 ; CHECK-CAS-O1-NEXT:    ret
298 ; CHECK-LLSC-O0-LABEL: val_compare_and_swap_monotonic:
299 ; CHECK-LLSC-O0:       // %bb.0:
300 ; CHECK-LLSC-O0-NEXT:  .LBB3_1: // =>This Inner Loop Header: Depth=1
301 ; CHECK-LLSC-O0-NEXT:    ldaxp x9, x8, [x0]
302 ; CHECK-LLSC-O0-NEXT:    cmp x9, x2
303 ; CHECK-LLSC-O0-NEXT:    cset w10, ne
304 ; CHECK-LLSC-O0-NEXT:    cmp x8, x3
305 ; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne
306 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB3_3
307 ; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB3_1 Depth=1
308 ; CHECK-LLSC-O0-NEXT:    stlxp w10, x4, x5, [x0]
309 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB3_1
310 ; CHECK-LLSC-O0-NEXT:    b .LBB3_4
311 ; CHECK-LLSC-O0-NEXT:  .LBB3_3: // in Loop: Header=BB3_1 Depth=1
312 ; CHECK-LLSC-O0-NEXT:    stlxp w10, x9, x8, [x0]
313 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB3_1
314 ; CHECK-LLSC-O0-NEXT:  .LBB3_4:
315 ; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0
316 ; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9
317 ; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8
318 ; CHECK-LLSC-O0-NEXT:    str q0, [x0]
319 ; CHECK-LLSC-O0-NEXT:    ret
321 ; CHECK-CAS-O0-LABEL: val_compare_and_swap_monotonic:
322 ; CHECK-CAS-O0:       // %bb.0:
323 ; CHECK-CAS-O0-NEXT:    sub sp, sp, #16
324 ; CHECK-CAS-O0-NEXT:    .cfi_def_cfa_offset 16
325 ; CHECK-CAS-O0-NEXT:    str x3, [sp, #8] // 8-byte Folded Spill
326 ; CHECK-CAS-O0-NEXT:    mov x1, x5
327 ; CHECK-CAS-O0-NEXT:    ldr x5, [sp, #8] // 8-byte Folded Reload
328 ; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3
329 ; CHECK-CAS-O0-NEXT:    mov x3, x5
330 ; CHECK-CAS-O0-NEXT:    // kill: def $x4 killed $x4 def $x4_x5
331 ; CHECK-CAS-O0-NEXT:    mov x5, x1
332 ; CHECK-CAS-O0-NEXT:    caspal x2, x3, x4, x5, [x0]
333 ; CHECK-CAS-O0-NEXT:    mov x9, x2
334 ; CHECK-CAS-O0-NEXT:    mov x8, x3
335 ; CHECK-CAS-O0-NEXT:    // implicit-def: $q0
336 ; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9
337 ; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8
338 ; CHECK-CAS-O0-NEXT:    str q0, [x0]
339 ; CHECK-CAS-O0-NEXT:    add sp, sp, #16
340 ; CHECK-CAS-O0-NEXT:    ret
341   %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval release acquire
342   %val = extractvalue { i128, i1 } %pair, 0
343   store i128 %val, ptr %p
344   ret void
347 define void @atomic_load_relaxed(i64, i64, ptr %p, ptr %p2) {
348 ; CHECK-LLSC-O1-LABEL: atomic_load_relaxed:
349 ; CHECK-LLSC-O1:       // %bb.0:
350 ; CHECK-LLSC-O1-NEXT:  .LBB4_1: // %atomicrmw.start
351 ; CHECK-LLSC-O1-NEXT:    // =>This Inner Loop Header: Depth=1
352 ; CHECK-LLSC-O1-NEXT:    ldxp x9, x8, [x2]
353 ; CHECK-LLSC-O1-NEXT:    stxp w10, x9, x8, [x2]
354 ; CHECK-LLSC-O1-NEXT:    cbnz w10, .LBB4_1
355 ; CHECK-LLSC-O1-NEXT:  // %bb.2: // %atomicrmw.end
356 ; CHECK-LLSC-O1-NEXT:    mov v0.d[0], x9
357 ; CHECK-LLSC-O1-NEXT:    mov v0.d[1], x8
358 ; CHECK-LLSC-O1-NEXT:    str q0, [x3]
359 ; CHECK-LLSC-O1-NEXT:    ret
361 ; CHECK-CAS-O1-LABEL: atomic_load_relaxed:
362 ; CHECK-CAS-O1:       // %bb.0:
363 ; CHECK-CAS-O1-NEXT:    mov x0, xzr
364 ; CHECK-CAS-O1-NEXT:    mov x1, xzr
365 ; CHECK-CAS-O1-NEXT:    casp x0, x1, x0, x1, [x2]
366 ; CHECK-CAS-O1-NEXT:    mov v0.d[0], x0
367 ; CHECK-CAS-O1-NEXT:    mov v0.d[1], x1
368 ; CHECK-CAS-O1-NEXT:    str q0, [x3]
369 ; CHECK-CAS-O1-NEXT:    ret
371 ; CHECK-LLSC-O0-LABEL: atomic_load_relaxed:
372 ; CHECK-LLSC-O0:       // %bb.0:
373 ; CHECK-LLSC-O0-NEXT:    mov x11, xzr
374 ; CHECK-LLSC-O0-NEXT:  .LBB4_1: // =>This Inner Loop Header: Depth=1
375 ; CHECK-LLSC-O0-NEXT:    ldxp x9, x8, [x2]
376 ; CHECK-LLSC-O0-NEXT:    cmp x9, x11
377 ; CHECK-LLSC-O0-NEXT:    cset w10, ne
378 ; CHECK-LLSC-O0-NEXT:    cmp x8, x11
379 ; CHECK-LLSC-O0-NEXT:    cinc w10, w10, ne
380 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB4_3
381 ; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB4_1 Depth=1
382 ; CHECK-LLSC-O0-NEXT:    stxp w10, x11, x11, [x2]
383 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB4_1
384 ; CHECK-LLSC-O0-NEXT:    b .LBB4_4
385 ; CHECK-LLSC-O0-NEXT:  .LBB4_3: // in Loop: Header=BB4_1 Depth=1
386 ; CHECK-LLSC-O0-NEXT:    stxp w10, x9, x8, [x2]
387 ; CHECK-LLSC-O0-NEXT:    cbnz w10, .LBB4_1
388 ; CHECK-LLSC-O0-NEXT:  .LBB4_4:
389 ; CHECK-LLSC-O0-NEXT:    // implicit-def: $q0
390 ; CHECK-LLSC-O0-NEXT:    mov v0.d[0], x9
391 ; CHECK-LLSC-O0-NEXT:    mov v0.d[1], x8
392 ; CHECK-LLSC-O0-NEXT:    str q0, [x3]
393 ; CHECK-LLSC-O0-NEXT:    ret
395 ; CHECK-CAS-O0-LABEL: atomic_load_relaxed:
396 ; CHECK-CAS-O0:       // %bb.0:
397 ; CHECK-CAS-O0-NEXT:    mov x8, xzr
398 ; CHECK-CAS-O0-NEXT:    mov x0, x8
399 ; CHECK-CAS-O0-NEXT:    mov x1, x8
400 ; CHECK-CAS-O0-NEXT:    mov x4, x8
401 ; CHECK-CAS-O0-NEXT:    mov x5, x8
402 ; CHECK-CAS-O0-NEXT:    casp x0, x1, x4, x5, [x2]
403 ; CHECK-CAS-O0-NEXT:    mov x9, x0
404 ; CHECK-CAS-O0-NEXT:    mov x8, x1
405 ; CHECK-CAS-O0-NEXT:    // implicit-def: $q0
406 ; CHECK-CAS-O0-NEXT:    mov v0.d[0], x9
407 ; CHECK-CAS-O0-NEXT:    mov v0.d[1], x8
408 ; CHECK-CAS-O0-NEXT:    str q0, [x3]
409 ; CHECK-CAS-O0-NEXT:    ret
411     %r = load atomic i128, ptr %p monotonic, align 16
412     store i128 %r, ptr %p2
413     ret void
416 define i128 @val_compare_and_swap_return(ptr %p, i128 %oldval, i128 %newval) {
417 ; CHECK-LLSC-O1-LABEL: val_compare_and_swap_return:
418 ; CHECK-LLSC-O1:       // %bb.0:
419 ; CHECK-LLSC-O1-NEXT:  .LBB5_1: // =>This Inner Loop Header: Depth=1
420 ; CHECK-LLSC-O1-NEXT:    ldaxp x8, x1, [x0]
421 ; CHECK-LLSC-O1-NEXT:    cmp x8, x2
422 ; CHECK-LLSC-O1-NEXT:    cset w9, ne
423 ; CHECK-LLSC-O1-NEXT:    cmp x1, x3
424 ; CHECK-LLSC-O1-NEXT:    cinc w9, w9, ne
425 ; CHECK-LLSC-O1-NEXT:    cbz w9, .LBB5_3
426 ; CHECK-LLSC-O1-NEXT:  // %bb.2: // in Loop: Header=BB5_1 Depth=1
427 ; CHECK-LLSC-O1-NEXT:    stxp w9, x8, x1, [x0]
428 ; CHECK-LLSC-O1-NEXT:    cbnz w9, .LBB5_1
429 ; CHECK-LLSC-O1-NEXT:    b .LBB5_4
430 ; CHECK-LLSC-O1-NEXT:  .LBB5_3: // in Loop: Header=BB5_1 Depth=1
431 ; CHECK-LLSC-O1-NEXT:    stxp w9, x4, x5, [x0]
432 ; CHECK-LLSC-O1-NEXT:    cbnz w9, .LBB5_1
433 ; CHECK-LLSC-O1-NEXT:  .LBB5_4:
434 ; CHECK-LLSC-O1-NEXT:    mov x0, x8
435 ; CHECK-LLSC-O1-NEXT:    ret
437 ; CHECK-CAS-O1-LABEL: val_compare_and_swap_return:
438 ; CHECK-CAS-O1:       // %bb.0:
439 ; CHECK-CAS-O1-NEXT:    // kill: def $x2 killed $x2 killed $x2_x3 def $x2_x3
440 ; CHECK-CAS-O1-NEXT:    // kill: def $x4 killed $x4 killed $x4_x5 def $x4_x5
441 ; CHECK-CAS-O1-NEXT:    // kill: def $x3 killed $x3 killed $x2_x3 def $x2_x3
442 ; CHECK-CAS-O1-NEXT:    // kill: def $x5 killed $x5 killed $x4_x5 def $x4_x5
443 ; CHECK-CAS-O1-NEXT:    caspa x2, x3, x4, x5, [x0]
444 ; CHECK-CAS-O1-NEXT:    mov x0, x2
445 ; CHECK-CAS-O1-NEXT:    mov x1, x3
446 ; CHECK-CAS-O1-NEXT:    ret
448 ; CHECK-LLSC-O0-LABEL: val_compare_and_swap_return:
449 ; CHECK-LLSC-O0:       // %bb.0:
450 ; CHECK-LLSC-O0-NEXT:    mov x9, x0
451 ; CHECK-LLSC-O0-NEXT:  .LBB5_1: // =>This Inner Loop Header: Depth=1
452 ; CHECK-LLSC-O0-NEXT:    ldaxp x0, x1, [x9]
453 ; CHECK-LLSC-O0-NEXT:    cmp x0, x2
454 ; CHECK-LLSC-O0-NEXT:    cset w8, ne
455 ; CHECK-LLSC-O0-NEXT:    cmp x1, x3
456 ; CHECK-LLSC-O0-NEXT:    cinc w8, w8, ne
457 ; CHECK-LLSC-O0-NEXT:    cbnz w8, .LBB5_3
458 ; CHECK-LLSC-O0-NEXT:  // %bb.2: // in Loop: Header=BB5_1 Depth=1
459 ; CHECK-LLSC-O0-NEXT:    stxp w8, x4, x5, [x9]
460 ; CHECK-LLSC-O0-NEXT:    cbnz w8, .LBB5_1
461 ; CHECK-LLSC-O0-NEXT:    b .LBB5_4
462 ; CHECK-LLSC-O0-NEXT:  .LBB5_3: // in Loop: Header=BB5_1 Depth=1
463 ; CHECK-LLSC-O0-NEXT:    stxp w8, x0, x1, [x9]
464 ; CHECK-LLSC-O0-NEXT:    cbnz w8, .LBB5_1
465 ; CHECK-LLSC-O0-NEXT:  .LBB5_4:
466 ; CHECK-LLSC-O0-NEXT:    ret
468 ; CHECK-CAS-O0-LABEL: val_compare_and_swap_return:
469 ; CHECK-CAS-O0:       // %bb.0:
470 ; CHECK-CAS-O0-NEXT:    mov x8, x0
471 ; CHECK-CAS-O0-NEXT:    mov x1, x3
472 ; CHECK-CAS-O0-NEXT:    mov x0, x4
473 ; CHECK-CAS-O0-NEXT:    // kill: def $x2 killed $x2 def $x2_x3
474 ; CHECK-CAS-O0-NEXT:    mov x3, x1
475 ; CHECK-CAS-O0-NEXT:    // kill: def $x0 killed $x0 def $x0_x1
476 ; CHECK-CAS-O0-NEXT:    mov x1, x5
477 ; CHECK-CAS-O0-NEXT:    caspa x2, x3, x0, x1, [x8]
478 ; CHECK-CAS-O0-NEXT:    mov x0, x2
479 ; CHECK-CAS-O0-NEXT:    mov x1, x3
480 ; CHECK-CAS-O0-NEXT:    ret
482   %pair = cmpxchg ptr %p, i128 %oldval, i128 %newval acquire acquire
483   %val = extractvalue { i128, i1 } %pair, 0
484   ret i128 %val