Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / X86 / pcsections-atomics.ll
blobcfc9d50763af4a7842538ffe553801eaac60af16
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
3 ; Test that atomic ops in IR marked with !pcsections end up in a PC section in
4 ; asm. All functions start with a non-atomic access, continue with an atomic
5 ; access, and end with another non-atomic access; this is to test that the
6 ; !pcsections propagation doesn't accidentally touch adjacent instructions.
8 ; RUN: llc -O0 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O0
9 ; RUN: llc -O1 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O1
10 ; RUN: llc -O2 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O2
11 ; RUN: llc -O3 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O3
13 target triple = "x86_64-unknown-linux-gnu"
15 @foo = dso_local global i64 0, align 8
17 define void @mixed_atomic_non_atomic(ptr %a) {
18 ; O0-LABEL: mixed_atomic_non_atomic:
19 ; O0:       # %bb.0: # %entry
20 ; O0-NEXT:    movl (%rdi), %eax
21 ; O0-NEXT:    incl %eax
22 ; O0-NEXT:    movl %eax, (%rdi)
23 ; O0-NEXT:  .Lpcsection0:
24 ; O0-NEXT:    movl $1, (%rdi)
25 ; O0-NEXT:    movl (%rdi), %eax
26 ; O0-NEXT:    addl $-1, %eax
27 ; O0-NEXT:    movl %eax, (%rdi)
28 ; O0-NEXT:    retq
30 ; O1-LABEL: mixed_atomic_non_atomic:
31 ; O1:       # %bb.0: # %entry
32 ; O1-NEXT:    incl (%rdi)
33 ; O1-NEXT:  .Lpcsection0:
34 ; O1-NEXT:    movl $1, (%rdi)
35 ; O1-NEXT:    decl (%rdi)
36 ; O1-NEXT:    retq
38 ; O2-LABEL: mixed_atomic_non_atomic:
39 ; O2:       # %bb.0: # %entry
40 ; O2-NEXT:    incl (%rdi)
41 ; O2-NEXT:  .Lpcsection0:
42 ; O2-NEXT:    movl $1, (%rdi)
43 ; O2-NEXT:    decl (%rdi)
44 ; O2-NEXT:    retq
46 ; O3-LABEL: mixed_atomic_non_atomic:
47 ; O3:       # %bb.0: # %entry
48 ; O3-NEXT:    incl (%rdi)
49 ; O3-NEXT:  .Lpcsection0:
50 ; O3-NEXT:    movl $1, (%rdi)
51 ; O3-NEXT:    decl (%rdi)
52 ; O3-NEXT:    retq
53 entry:
54   ; Accesses the same location atomically and non-atomically.
55   %0 = load volatile i32, ptr %a, align 4
56   %inc = add nsw i32 %0, 1
57   store volatile i32 %inc, ptr %a, align 4
58   store atomic volatile i32 1, ptr %a monotonic, align 4, !pcsections !0
59   %1 = load volatile i32, ptr %a, align 4
60   %dec = add nsw i32 %1, -1
61   store volatile i32 %dec, ptr %a, align 4
62   ret void
65 define i64 @mixed_complex_atomic_non_atomic(ptr %a, ptr %b) {
66 ; O0-LABEL: mixed_complex_atomic_non_atomic:
67 ; O0:       # %bb.0: # %entry
68 ; O0-NEXT:    movl $1, %ecx
69 ; O0-NEXT:  .Lpcsection1:
70 ; O0-NEXT:    lock xaddq %rcx, (%rdi)
71 ; O0-NEXT:    movq (%rsi), %rax
72 ; O0-NEXT:    movq %rax, %rdx
73 ; O0-NEXT:    addq $1, %rdx
74 ; O0-NEXT:    movq %rdx, (%rsi)
75 ; O0-NEXT:    addq %rcx, %rax
76 ; O0-NEXT:    retq
78 ; O1-LABEL: mixed_complex_atomic_non_atomic:
79 ; O1:       # %bb.0: # %entry
80 ; O1-NEXT:    movl $1, %eax
81 ; O1-NEXT:  .Lpcsection1:
82 ; O1-NEXT:    lock xaddq %rax, (%rdi)
83 ; O1-NEXT:    movq (%rsi), %rcx
84 ; O1-NEXT:    leaq 1(%rcx), %rdx
85 ; O1-NEXT:    movq %rdx, (%rsi)
86 ; O1-NEXT:    addq %rcx, %rax
87 ; O1-NEXT:    retq
89 ; O2-LABEL: mixed_complex_atomic_non_atomic:
90 ; O2:       # %bb.0: # %entry
91 ; O2-NEXT:    movl $1, %eax
92 ; O2-NEXT:  .Lpcsection1:
93 ; O2-NEXT:    lock xaddq %rax, (%rdi)
94 ; O2-NEXT:    movq (%rsi), %rcx
95 ; O2-NEXT:    leaq 1(%rcx), %rdx
96 ; O2-NEXT:    movq %rdx, (%rsi)
97 ; O2-NEXT:    addq %rcx, %rax
98 ; O2-NEXT:    retq
100 ; O3-LABEL: mixed_complex_atomic_non_atomic:
101 ; O3:       # %bb.0: # %entry
102 ; O3-NEXT:    movl $1, %eax
103 ; O3-NEXT:  .Lpcsection1:
104 ; O3-NEXT:    lock xaddq %rax, (%rdi)
105 ; O3-NEXT:    movq (%rsi), %rcx
106 ; O3-NEXT:    leaq 1(%rcx), %rdx
107 ; O3-NEXT:    movq %rdx, (%rsi)
108 ; O3-NEXT:    addq %rcx, %rax
109 ; O3-NEXT:    retq
110 entry:
111   %0 = atomicrmw add ptr %a, i64 1 monotonic, align 8, !pcsections !0
112   %1 = load i64, ptr %b, align 8
113   %inc = add nsw i64 %1, 1
114   store i64 %inc, ptr %b, align 8
115   %add = add nsw i64 %1, %0
116   ret i64 %add
119 define i8 @atomic8_load_unordered(ptr %a) {
120 ; O0-LABEL: atomic8_load_unordered:
121 ; O0:       # %bb.0: # %entry
122 ; O0-NEXT:    movq foo(%rip), %rax
123 ; O0-NEXT:  .Lpcsection2:
124 ; O0-NEXT:    movb (%rdi), %al
125 ; O0-NEXT:    movq $1, foo
126 ; O0-NEXT:    retq
128 ; O1-LABEL: atomic8_load_unordered:
129 ; O1:       # %bb.0: # %entry
130 ; O1-NEXT:    movq foo(%rip), %rax
131 ; O1-NEXT:  .Lpcsection2:
132 ; O1-NEXT:    movzbl (%rdi), %eax
133 ; O1-NEXT:    movq $1, foo(%rip)
134 ; O1-NEXT:    retq
136 ; O2-LABEL: atomic8_load_unordered:
137 ; O2:       # %bb.0: # %entry
138 ; O2-NEXT:    movq foo(%rip), %rax
139 ; O2-NEXT:  .Lpcsection2:
140 ; O2-NEXT:    movzbl (%rdi), %eax
141 ; O2-NEXT:    movq $1, foo(%rip)
142 ; O2-NEXT:    retq
144 ; O3-LABEL: atomic8_load_unordered:
145 ; O3:       # %bb.0: # %entry
146 ; O3-NEXT:    movq foo(%rip), %rax
147 ; O3-NEXT:  .Lpcsection2:
148 ; O3-NEXT:    movzbl (%rdi), %eax
149 ; O3-NEXT:    movq $1, foo(%rip)
150 ; O3-NEXT:    retq
151 entry:
152   load volatile i64, ptr @foo, align 8
153   %x = load atomic i8, ptr %a unordered, align 1, !pcsections !0
154   store volatile i64 1, ptr @foo, align 8
155   ret i8 %x
158 define i8 @atomic8_load_monotonic(ptr %a) {
159 ; O0-LABEL: atomic8_load_monotonic:
160 ; O0:       # %bb.0: # %entry
161 ; O0-NEXT:    movq foo(%rip), %rax
162 ; O0-NEXT:  .Lpcsection3:
163 ; O0-NEXT:    movb (%rdi), %al
164 ; O0-NEXT:    movq $1, foo
165 ; O0-NEXT:    retq
167 ; O1-LABEL: atomic8_load_monotonic:
168 ; O1:       # %bb.0: # %entry
169 ; O1-NEXT:    movq foo(%rip), %rax
170 ; O1-NEXT:  .Lpcsection3:
171 ; O1-NEXT:    movzbl (%rdi), %eax
172 ; O1-NEXT:    movq $1, foo(%rip)
173 ; O1-NEXT:    retq
175 ; O2-LABEL: atomic8_load_monotonic:
176 ; O2:       # %bb.0: # %entry
177 ; O2-NEXT:    movq foo(%rip), %rax
178 ; O2-NEXT:  .Lpcsection3:
179 ; O2-NEXT:    movzbl (%rdi), %eax
180 ; O2-NEXT:    movq $1, foo(%rip)
181 ; O2-NEXT:    retq
183 ; O3-LABEL: atomic8_load_monotonic:
184 ; O3:       # %bb.0: # %entry
185 ; O3-NEXT:    movq foo(%rip), %rax
186 ; O3-NEXT:  .Lpcsection3:
187 ; O3-NEXT:    movzbl (%rdi), %eax
188 ; O3-NEXT:    movq $1, foo(%rip)
189 ; O3-NEXT:    retq
190 entry:
191   load volatile i64, ptr @foo, align 8
192   %x = load atomic i8, ptr %a monotonic, align 1, !pcsections !0
193   store volatile i64 1, ptr @foo, align 8
194   ret i8 %x
197 define i8 @atomic8_load_acquire(ptr %a) {
198 ; O0-LABEL: atomic8_load_acquire:
199 ; O0:       # %bb.0: # %entry
200 ; O0-NEXT:    movq foo(%rip), %rax
201 ; O0-NEXT:  .Lpcsection4:
202 ; O0-NEXT:    movb (%rdi), %al
203 ; O0-NEXT:    movq $1, foo
204 ; O0-NEXT:    retq
206 ; O1-LABEL: atomic8_load_acquire:
207 ; O1:       # %bb.0: # %entry
208 ; O1-NEXT:    movq foo(%rip), %rax
209 ; O1-NEXT:  .Lpcsection4:
210 ; O1-NEXT:    movzbl (%rdi), %eax
211 ; O1-NEXT:    movq $1, foo(%rip)
212 ; O1-NEXT:    retq
214 ; O2-LABEL: atomic8_load_acquire:
215 ; O2:       # %bb.0: # %entry
216 ; O2-NEXT:    movq foo(%rip), %rax
217 ; O2-NEXT:  .Lpcsection4:
218 ; O2-NEXT:    movzbl (%rdi), %eax
219 ; O2-NEXT:    movq $1, foo(%rip)
220 ; O2-NEXT:    retq
222 ; O3-LABEL: atomic8_load_acquire:
223 ; O3:       # %bb.0: # %entry
224 ; O3-NEXT:    movq foo(%rip), %rax
225 ; O3-NEXT:  .Lpcsection4:
226 ; O3-NEXT:    movzbl (%rdi), %eax
227 ; O3-NEXT:    movq $1, foo(%rip)
228 ; O3-NEXT:    retq
229 entry:
230   load volatile i64, ptr @foo, align 8
231   %x = load atomic i8, ptr %a acquire, align 1, !pcsections !0
232   store volatile i64 1, ptr @foo, align 8
233   ret i8 %x
236 define i8 @atomic8_load_seq_cst(ptr %a) {
237 ; O0-LABEL: atomic8_load_seq_cst:
238 ; O0:       # %bb.0: # %entry
239 ; O0-NEXT:    movq foo(%rip), %rax
240 ; O0-NEXT:  .Lpcsection5:
241 ; O0-NEXT:    movb (%rdi), %al
242 ; O0-NEXT:    movq $1, foo
243 ; O0-NEXT:    retq
245 ; O1-LABEL: atomic8_load_seq_cst:
246 ; O1:       # %bb.0: # %entry
247 ; O1-NEXT:    movq foo(%rip), %rax
248 ; O1-NEXT:  .Lpcsection5:
249 ; O1-NEXT:    movzbl (%rdi), %eax
250 ; O1-NEXT:    movq $1, foo(%rip)
251 ; O1-NEXT:    retq
253 ; O2-LABEL: atomic8_load_seq_cst:
254 ; O2:       # %bb.0: # %entry
255 ; O2-NEXT:    movq foo(%rip), %rax
256 ; O2-NEXT:  .Lpcsection5:
257 ; O2-NEXT:    movzbl (%rdi), %eax
258 ; O2-NEXT:    movq $1, foo(%rip)
259 ; O2-NEXT:    retq
261 ; O3-LABEL: atomic8_load_seq_cst:
262 ; O3:       # %bb.0: # %entry
263 ; O3-NEXT:    movq foo(%rip), %rax
264 ; O3-NEXT:  .Lpcsection5:
265 ; O3-NEXT:    movzbl (%rdi), %eax
266 ; O3-NEXT:    movq $1, foo(%rip)
267 ; O3-NEXT:    retq
268 entry:
269   load volatile i64, ptr @foo, align 8
270   %x = load atomic i8, ptr %a seq_cst, align 1, !pcsections !0
271   store volatile i64 1, ptr @foo, align 8
272   ret i8 %x
275 define void @atomic8_store_unordered(ptr %a) {
276 ; O0-LABEL: atomic8_store_unordered:
277 ; O0:       # %bb.0: # %entry
278 ; O0-NEXT:    movq foo(%rip), %rax
279 ; O0-NEXT:  .Lpcsection6:
280 ; O0-NEXT:    movb $42, (%rdi)
281 ; O0-NEXT:    movq $1, foo
282 ; O0-NEXT:    retq
284 ; O1-LABEL: atomic8_store_unordered:
285 ; O1:       # %bb.0: # %entry
286 ; O1-NEXT:    movq foo(%rip), %rax
287 ; O1-NEXT:  .Lpcsection6:
288 ; O1-NEXT:    movb $42, (%rdi)
289 ; O1-NEXT:    movq $1, foo(%rip)
290 ; O1-NEXT:    retq
292 ; O2-LABEL: atomic8_store_unordered:
293 ; O2:       # %bb.0: # %entry
294 ; O2-NEXT:    movq foo(%rip), %rax
295 ; O2-NEXT:  .Lpcsection6:
296 ; O2-NEXT:    movb $42, (%rdi)
297 ; O2-NEXT:    movq $1, foo(%rip)
298 ; O2-NEXT:    retq
300 ; O3-LABEL: atomic8_store_unordered:
301 ; O3:       # %bb.0: # %entry
302 ; O3-NEXT:    movq foo(%rip), %rax
303 ; O3-NEXT:  .Lpcsection6:
304 ; O3-NEXT:    movb $42, (%rdi)
305 ; O3-NEXT:    movq $1, foo(%rip)
306 ; O3-NEXT:    retq
307 entry:
308   load volatile i64, ptr @foo, align 8
309   store atomic i8 42, ptr %a unordered, align 1, !pcsections !0
310   store volatile i64 1, ptr @foo, align 8
311   ret void
314 define void @atomic8_store_monotonic(ptr %a) {
315 ; O0-LABEL: atomic8_store_monotonic:
316 ; O0:       # %bb.0: # %entry
317 ; O0-NEXT:    movq foo(%rip), %rax
318 ; O0-NEXT:  .Lpcsection7:
319 ; O0-NEXT:    movb $42, (%rdi)
320 ; O0-NEXT:    movq $1, foo
321 ; O0-NEXT:    retq
323 ; O1-LABEL: atomic8_store_monotonic:
324 ; O1:       # %bb.0: # %entry
325 ; O1-NEXT:    movq foo(%rip), %rax
326 ; O1-NEXT:  .Lpcsection7:
327 ; O1-NEXT:    movb $42, (%rdi)
328 ; O1-NEXT:    movq $1, foo(%rip)
329 ; O1-NEXT:    retq
331 ; O2-LABEL: atomic8_store_monotonic:
332 ; O2:       # %bb.0: # %entry
333 ; O2-NEXT:    movq foo(%rip), %rax
334 ; O2-NEXT:  .Lpcsection7:
335 ; O2-NEXT:    movb $42, (%rdi)
336 ; O2-NEXT:    movq $1, foo(%rip)
337 ; O2-NEXT:    retq
339 ; O3-LABEL: atomic8_store_monotonic:
340 ; O3:       # %bb.0: # %entry
341 ; O3-NEXT:    movq foo(%rip), %rax
342 ; O3-NEXT:  .Lpcsection7:
343 ; O3-NEXT:    movb $42, (%rdi)
344 ; O3-NEXT:    movq $1, foo(%rip)
345 ; O3-NEXT:    retq
346 entry:
347   load volatile i64, ptr @foo, align 8
348   store atomic i8 42, ptr %a monotonic, align 1, !pcsections !0
349   store volatile i64 1, ptr @foo, align 8
350   ret void
353 define void @atomic8_store_release(ptr %a) {
354 ; O0-LABEL: atomic8_store_release:
355 ; O0:       # %bb.0: # %entry
356 ; O0-NEXT:    movq foo(%rip), %rax
357 ; O0-NEXT:  .Lpcsection8:
358 ; O0-NEXT:    movb $42, (%rdi)
359 ; O0-NEXT:    movq $1, foo
360 ; O0-NEXT:    retq
362 ; O1-LABEL: atomic8_store_release:
363 ; O1:       # %bb.0: # %entry
364 ; O1-NEXT:    movq foo(%rip), %rax
365 ; O1-NEXT:  .Lpcsection8:
366 ; O1-NEXT:    movb $42, (%rdi)
367 ; O1-NEXT:    movq $1, foo(%rip)
368 ; O1-NEXT:    retq
370 ; O2-LABEL: atomic8_store_release:
371 ; O2:       # %bb.0: # %entry
372 ; O2-NEXT:    movq foo(%rip), %rax
373 ; O2-NEXT:  .Lpcsection8:
374 ; O2-NEXT:    movb $42, (%rdi)
375 ; O2-NEXT:    movq $1, foo(%rip)
376 ; O2-NEXT:    retq
378 ; O3-LABEL: atomic8_store_release:
379 ; O3:       # %bb.0: # %entry
380 ; O3-NEXT:    movq foo(%rip), %rax
381 ; O3-NEXT:  .Lpcsection8:
382 ; O3-NEXT:    movb $42, (%rdi)
383 ; O3-NEXT:    movq $1, foo(%rip)
384 ; O3-NEXT:    retq
385 entry:
386   load volatile i64, ptr @foo, align 8
387   store atomic i8 42, ptr %a release, align 1, !pcsections !0
388   store volatile i64 1, ptr @foo, align 8
389   ret void
392 define void @atomic8_store_seq_cst(ptr %a) {
393 ; O0-LABEL: atomic8_store_seq_cst:
394 ; O0:       # %bb.0: # %entry
395 ; O0-NEXT:    movq foo(%rip), %rax
396 ; O0-NEXT:    movb $42, %al
397 ; O0-NEXT:  .Lpcsection9:
398 ; O0-NEXT:    xchgb %al, (%rdi)
399 ; O0-NEXT:    movq $1, foo
400 ; O0-NEXT:    retq
402 ; O1-LABEL: atomic8_store_seq_cst:
403 ; O1:       # %bb.0: # %entry
404 ; O1-NEXT:    movq foo(%rip), %rax
405 ; O1-NEXT:    movb $42, %al
406 ; O1-NEXT:  .Lpcsection9:
407 ; O1-NEXT:    xchgb %al, (%rdi)
408 ; O1-NEXT:    movq $1, foo(%rip)
409 ; O1-NEXT:    retq
411 ; O2-LABEL: atomic8_store_seq_cst:
412 ; O2:       # %bb.0: # %entry
413 ; O2-NEXT:    movq foo(%rip), %rax
414 ; O2-NEXT:    movb $42, %al
415 ; O2-NEXT:  .Lpcsection9:
416 ; O2-NEXT:    xchgb %al, (%rdi)
417 ; O2-NEXT:    movq $1, foo(%rip)
418 ; O2-NEXT:    retq
420 ; O3-LABEL: atomic8_store_seq_cst:
421 ; O3:       # %bb.0: # %entry
422 ; O3-NEXT:    movq foo(%rip), %rax
423 ; O3-NEXT:    movb $42, %al
424 ; O3-NEXT:  .Lpcsection9:
425 ; O3-NEXT:    xchgb %al, (%rdi)
426 ; O3-NEXT:    movq $1, foo(%rip)
427 ; O3-NEXT:    retq
428 entry:
429   load volatile i64, ptr @foo, align 8
430   store atomic i8 42, ptr %a seq_cst, align 1, !pcsections !0
431   store volatile i64 1, ptr @foo, align 8
432   ret void
435 define void @atomic8_xchg_monotonic(ptr %a) {
436 ; O0-LABEL: atomic8_xchg_monotonic:
437 ; O0:       # %bb.0: # %entry
438 ; O0-NEXT:    movq foo(%rip), %rax
439 ; O0-NEXT:    movb $42, %al
440 ; O0-NEXT:  .Lpcsection10:
441 ; O0-NEXT:    xchgb %al, (%rdi)
442 ; O0-NEXT:    movq $1, foo
443 ; O0-NEXT:    retq
445 ; O1-LABEL: atomic8_xchg_monotonic:
446 ; O1:       # %bb.0: # %entry
447 ; O1-NEXT:    movq foo(%rip), %rax
448 ; O1-NEXT:    movb $42, %al
449 ; O1-NEXT:  .Lpcsection10:
450 ; O1-NEXT:    xchgb %al, (%rdi)
451 ; O1-NEXT:    movq $1, foo(%rip)
452 ; O1-NEXT:    retq
454 ; O2-LABEL: atomic8_xchg_monotonic:
455 ; O2:       # %bb.0: # %entry
456 ; O2-NEXT:    movq foo(%rip), %rax
457 ; O2-NEXT:    movb $42, %al
458 ; O2-NEXT:  .Lpcsection10:
459 ; O2-NEXT:    xchgb %al, (%rdi)
460 ; O2-NEXT:    movq $1, foo(%rip)
461 ; O2-NEXT:    retq
463 ; O3-LABEL: atomic8_xchg_monotonic:
464 ; O3:       # %bb.0: # %entry
465 ; O3-NEXT:    movq foo(%rip), %rax
466 ; O3-NEXT:    movb $42, %al
467 ; O3-NEXT:  .Lpcsection10:
468 ; O3-NEXT:    xchgb %al, (%rdi)
469 ; O3-NEXT:    movq $1, foo(%rip)
470 ; O3-NEXT:    retq
471 entry:
472   load volatile i64, ptr @foo, align 8
473   %x = atomicrmw xchg ptr %a, i8 42 monotonic, align 1, !pcsections !0
474   store volatile i64 1, ptr @foo, align 8
475   ret void
478 define void @atomic8_add_monotonic(ptr %a) {
479 ; O0-LABEL: atomic8_add_monotonic:
480 ; O0:       # %bb.0: # %entry
481 ; O0-NEXT:    movq foo(%rip), %rax
482 ; O0-NEXT:  .Lpcsection11:
483 ; O0-NEXT:    lock addb $42, (%rdi)
484 ; O0-NEXT:    movq $1, foo
485 ; O0-NEXT:    retq
487 ; O1-LABEL: atomic8_add_monotonic:
488 ; O1:       # %bb.0: # %entry
489 ; O1-NEXT:    movq foo(%rip), %rax
490 ; O1-NEXT:  .Lpcsection11:
491 ; O1-NEXT:    lock addb $42, (%rdi)
492 ; O1-NEXT:    movq $1, foo(%rip)
493 ; O1-NEXT:    retq
495 ; O2-LABEL: atomic8_add_monotonic:
496 ; O2:       # %bb.0: # %entry
497 ; O2-NEXT:    movq foo(%rip), %rax
498 ; O2-NEXT:  .Lpcsection11:
499 ; O2-NEXT:    lock addb $42, (%rdi)
500 ; O2-NEXT:    movq $1, foo(%rip)
501 ; O2-NEXT:    retq
503 ; O3-LABEL: atomic8_add_monotonic:
504 ; O3:       # %bb.0: # %entry
505 ; O3-NEXT:    movq foo(%rip), %rax
506 ; O3-NEXT:  .Lpcsection11:
507 ; O3-NEXT:    lock addb $42, (%rdi)
508 ; O3-NEXT:    movq $1, foo(%rip)
509 ; O3-NEXT:    retq
510 entry:
511   load volatile i64, ptr @foo, align 8
512   %x = atomicrmw add ptr %a, i8 42 monotonic, align 1, !pcsections !0
513   store volatile i64 1, ptr @foo, align 8
514   ret void
517 define void @atomic8_sub_monotonic(ptr %a) {
518 ; O0-LABEL: atomic8_sub_monotonic:
519 ; O0:       # %bb.0: # %entry
520 ; O0-NEXT:    movq foo(%rip), %rax
521 ; O0-NEXT:  .Lpcsection12:
522 ; O0-NEXT:    lock subb $42, (%rdi)
523 ; O0-NEXT:    movq $1, foo
524 ; O0-NEXT:    retq
526 ; O1-LABEL: atomic8_sub_monotonic:
527 ; O1:       # %bb.0: # %entry
528 ; O1-NEXT:    movq foo(%rip), %rax
529 ; O1-NEXT:  .Lpcsection12:
530 ; O1-NEXT:    lock subb $42, (%rdi)
531 ; O1-NEXT:    movq $1, foo(%rip)
532 ; O1-NEXT:    retq
534 ; O2-LABEL: atomic8_sub_monotonic:
535 ; O2:       # %bb.0: # %entry
536 ; O2-NEXT:    movq foo(%rip), %rax
537 ; O2-NEXT:  .Lpcsection12:
538 ; O2-NEXT:    lock subb $42, (%rdi)
539 ; O2-NEXT:    movq $1, foo(%rip)
540 ; O2-NEXT:    retq
542 ; O3-LABEL: atomic8_sub_monotonic:
543 ; O3:       # %bb.0: # %entry
544 ; O3-NEXT:    movq foo(%rip), %rax
545 ; O3-NEXT:  .Lpcsection12:
546 ; O3-NEXT:    lock subb $42, (%rdi)
547 ; O3-NEXT:    movq $1, foo(%rip)
548 ; O3-NEXT:    retq
549 entry:
550   load volatile i64, ptr @foo, align 8
551   %x = atomicrmw sub ptr %a, i8 42 monotonic, align 1, !pcsections !0
552   store volatile i64 1, ptr @foo, align 8
553   ret void
556 define void @atomic8_and_monotonic(ptr %a) {
557 ; O0-LABEL: atomic8_and_monotonic:
558 ; O0:       # %bb.0: # %entry
559 ; O0-NEXT:    movq foo(%rip), %rax
560 ; O0-NEXT:  .Lpcsection13:
561 ; O0-NEXT:    lock andb $42, (%rdi)
562 ; O0-NEXT:    movq $1, foo
563 ; O0-NEXT:    retq
565 ; O1-LABEL: atomic8_and_monotonic:
566 ; O1:       # %bb.0: # %entry
567 ; O1-NEXT:    movq foo(%rip), %rax
568 ; O1-NEXT:  .Lpcsection13:
569 ; O1-NEXT:    lock andb $42, (%rdi)
570 ; O1-NEXT:    movq $1, foo(%rip)
571 ; O1-NEXT:    retq
573 ; O2-LABEL: atomic8_and_monotonic:
574 ; O2:       # %bb.0: # %entry
575 ; O2-NEXT:    movq foo(%rip), %rax
576 ; O2-NEXT:  .Lpcsection13:
577 ; O2-NEXT:    lock andb $42, (%rdi)
578 ; O2-NEXT:    movq $1, foo(%rip)
579 ; O2-NEXT:    retq
581 ; O3-LABEL: atomic8_and_monotonic:
582 ; O3:       # %bb.0: # %entry
583 ; O3-NEXT:    movq foo(%rip), %rax
584 ; O3-NEXT:  .Lpcsection13:
585 ; O3-NEXT:    lock andb $42, (%rdi)
586 ; O3-NEXT:    movq $1, foo(%rip)
587 ; O3-NEXT:    retq
588 entry:
589   load volatile i64, ptr @foo, align 8
590   %x = atomicrmw and ptr %a, i8 42 monotonic, align 1, !pcsections !0
591   store volatile i64 1, ptr @foo, align 8
592   ret void
595 define void @atomic8_or_monotonic(ptr %a) {
596 ; O0-LABEL: atomic8_or_monotonic:
597 ; O0:       # %bb.0: # %entry
598 ; O0-NEXT:    movq foo(%rip), %rax
599 ; O0-NEXT:  .Lpcsection14:
600 ; O0-NEXT:    lock orb $42, (%rdi)
601 ; O0-NEXT:    movq $1, foo
602 ; O0-NEXT:    retq
604 ; O1-LABEL: atomic8_or_monotonic:
605 ; O1:       # %bb.0: # %entry
606 ; O1-NEXT:    movq foo(%rip), %rax
607 ; O1-NEXT:  .Lpcsection14:
608 ; O1-NEXT:    lock orb $42, (%rdi)
609 ; O1-NEXT:    movq $1, foo(%rip)
610 ; O1-NEXT:    retq
612 ; O2-LABEL: atomic8_or_monotonic:
613 ; O2:       # %bb.0: # %entry
614 ; O2-NEXT:    movq foo(%rip), %rax
615 ; O2-NEXT:  .Lpcsection14:
616 ; O2-NEXT:    lock orb $42, (%rdi)
617 ; O2-NEXT:    movq $1, foo(%rip)
618 ; O2-NEXT:    retq
620 ; O3-LABEL: atomic8_or_monotonic:
621 ; O3:       # %bb.0: # %entry
622 ; O3-NEXT:    movq foo(%rip), %rax
623 ; O3-NEXT:  .Lpcsection14:
624 ; O3-NEXT:    lock orb $42, (%rdi)
625 ; O3-NEXT:    movq $1, foo(%rip)
626 ; O3-NEXT:    retq
627 entry:
628   load volatile i64, ptr @foo, align 8
629   %x = atomicrmw or ptr %a, i8 42 monotonic, align 1, !pcsections !0
630   store volatile i64 1, ptr @foo, align 8
631   ret void
634 define void @atomic8_xor_monotonic(ptr %a) {
635 ; O0-LABEL: atomic8_xor_monotonic:
636 ; O0:       # %bb.0: # %entry
637 ; O0-NEXT:    movq foo(%rip), %rax
638 ; O0-NEXT:  .Lpcsection15:
639 ; O0-NEXT:    lock xorb $42, (%rdi)
640 ; O0-NEXT:    movq $1, foo
641 ; O0-NEXT:    retq
643 ; O1-LABEL: atomic8_xor_monotonic:
644 ; O1:       # %bb.0: # %entry
645 ; O1-NEXT:    movq foo(%rip), %rax
646 ; O1-NEXT:  .Lpcsection15:
647 ; O1-NEXT:    lock xorb $42, (%rdi)
648 ; O1-NEXT:    movq $1, foo(%rip)
649 ; O1-NEXT:    retq
651 ; O2-LABEL: atomic8_xor_monotonic:
652 ; O2:       # %bb.0: # %entry
653 ; O2-NEXT:    movq foo(%rip), %rax
654 ; O2-NEXT:  .Lpcsection15:
655 ; O2-NEXT:    lock xorb $42, (%rdi)
656 ; O2-NEXT:    movq $1, foo(%rip)
657 ; O2-NEXT:    retq
659 ; O3-LABEL: atomic8_xor_monotonic:
660 ; O3:       # %bb.0: # %entry
661 ; O3-NEXT:    movq foo(%rip), %rax
662 ; O3-NEXT:  .Lpcsection15:
663 ; O3-NEXT:    lock xorb $42, (%rdi)
664 ; O3-NEXT:    movq $1, foo(%rip)
665 ; O3-NEXT:    retq
666 entry:
667   load volatile i64, ptr @foo, align 8
668   %x = atomicrmw xor ptr %a, i8 42 monotonic, align 1, !pcsections !0
669   store volatile i64 1, ptr @foo, align 8
670   ret void
673 define void @atomic8_nand_monotonic(ptr %a) {
674 ; O0-LABEL: atomic8_nand_monotonic:
675 ; O0:       # %bb.0: # %entry
676 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
677 ; O0-NEXT:    movq foo, %rax
678 ; O0-NEXT:  .Lpcsection16:
679 ; O0-NEXT:    movb (%rdi), %al
680 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
681 ; O0-NEXT:  .LBB16_1: # %atomicrmw.start
682 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
683 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
684 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
685 ; O0-NEXT:    movb %al, %dl
686 ; O0-NEXT:  .Lpcsection17:
687 ; O0-NEXT:    notb %dl
688 ; O0-NEXT:  .Lpcsection18:
689 ; O0-NEXT:    orb $-43, %dl
690 ; O0-NEXT:  .Lpcsection19:
691 ; O0-NEXT:    lock cmpxchgb %dl, (%rcx)
692 ; O0-NEXT:  .Lpcsection20:
693 ; O0-NEXT:    sete %cl
694 ; O0-NEXT:  .Lpcsection21:
695 ; O0-NEXT:    testb $1, %cl
696 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
697 ; O0-NEXT:  .Lpcsection22:
698 ; O0-NEXT:    jne .LBB16_2
699 ; O0-NEXT:    jmp .LBB16_1
700 ; O0-NEXT:  .LBB16_2: # %atomicrmw.end
701 ; O0-NEXT:    movq $1, foo
702 ; O0-NEXT:    retq
704 ; O1-LABEL: atomic8_nand_monotonic:
705 ; O1:       # %bb.0: # %entry
706 ; O1-NEXT:    movq foo(%rip), %rax
707 ; O1-NEXT:  .Lpcsection16:
708 ; O1-NEXT:    movzbl (%rdi), %eax
709 ; O1-NEXT:    .p2align 4, 0x90
710 ; O1-NEXT:  .LBB16_1: # %atomicrmw.start
711 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
712 ; O1-NEXT:    movl %eax, %ecx
713 ; O1-NEXT:  .Lpcsection17:
714 ; O1-NEXT:    notb %cl
715 ; O1-NEXT:  .Lpcsection18:
716 ; O1-NEXT:    orb $-43, %cl
717 ; O1-NEXT:  .Lpcsection19:
718 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
719 ; O1-NEXT:  .Lpcsection20:
720 ; O1-NEXT:    jne .LBB16_1
721 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
722 ; O1-NEXT:    movq $1, foo(%rip)
723 ; O1-NEXT:    retq
725 ; O2-LABEL: atomic8_nand_monotonic:
726 ; O2:       # %bb.0: # %entry
727 ; O2-NEXT:    movq foo(%rip), %rax
728 ; O2-NEXT:  .Lpcsection16:
729 ; O2-NEXT:    movzbl (%rdi), %eax
730 ; O2-NEXT:    .p2align 4, 0x90
731 ; O2-NEXT:  .LBB16_1: # %atomicrmw.start
732 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
733 ; O2-NEXT:    movl %eax, %ecx
734 ; O2-NEXT:  .Lpcsection17:
735 ; O2-NEXT:    notb %cl
736 ; O2-NEXT:  .Lpcsection18:
737 ; O2-NEXT:    orb $-43, %cl
738 ; O2-NEXT:  .Lpcsection19:
739 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
740 ; O2-NEXT:  .Lpcsection20:
741 ; O2-NEXT:    jne .LBB16_1
742 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
743 ; O2-NEXT:    movq $1, foo(%rip)
744 ; O2-NEXT:    retq
746 ; O3-LABEL: atomic8_nand_monotonic:
747 ; O3:       # %bb.0: # %entry
748 ; O3-NEXT:    movq foo(%rip), %rax
749 ; O3-NEXT:  .Lpcsection16:
750 ; O3-NEXT:    movzbl (%rdi), %eax
751 ; O3-NEXT:    .p2align 4, 0x90
752 ; O3-NEXT:  .LBB16_1: # %atomicrmw.start
753 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
754 ; O3-NEXT:    movl %eax, %ecx
755 ; O3-NEXT:  .Lpcsection17:
756 ; O3-NEXT:    notb %cl
757 ; O3-NEXT:  .Lpcsection18:
758 ; O3-NEXT:    orb $-43, %cl
759 ; O3-NEXT:  .Lpcsection19:
760 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
761 ; O3-NEXT:  .Lpcsection20:
762 ; O3-NEXT:    jne .LBB16_1
763 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
764 ; O3-NEXT:    movq $1, foo(%rip)
765 ; O3-NEXT:    retq
766 entry:
767   load volatile i64, ptr @foo, align 8
768   %x = atomicrmw nand ptr %a, i8 42 monotonic, align 1, !pcsections !0
769   store volatile i64 1, ptr @foo, align 8
770   ret void
773 define void @atomic8_xchg_acquire(ptr %a) {
774 ; O0-LABEL: atomic8_xchg_acquire:
775 ; O0:       # %bb.0: # %entry
776 ; O0-NEXT:    movq foo(%rip), %rax
777 ; O0-NEXT:    movb $42, %al
778 ; O0-NEXT:  .Lpcsection23:
779 ; O0-NEXT:    xchgb %al, (%rdi)
780 ; O0-NEXT:    movq $1, foo
781 ; O0-NEXT:    retq
783 ; O1-LABEL: atomic8_xchg_acquire:
784 ; O1:       # %bb.0: # %entry
785 ; O1-NEXT:    movq foo(%rip), %rax
786 ; O1-NEXT:    movb $42, %al
787 ; O1-NEXT:  .Lpcsection21:
788 ; O1-NEXT:    xchgb %al, (%rdi)
789 ; O1-NEXT:    movq $1, foo(%rip)
790 ; O1-NEXT:    retq
792 ; O2-LABEL: atomic8_xchg_acquire:
793 ; O2:       # %bb.0: # %entry
794 ; O2-NEXT:    movq foo(%rip), %rax
795 ; O2-NEXT:    movb $42, %al
796 ; O2-NEXT:  .Lpcsection21:
797 ; O2-NEXT:    xchgb %al, (%rdi)
798 ; O2-NEXT:    movq $1, foo(%rip)
799 ; O2-NEXT:    retq
801 ; O3-LABEL: atomic8_xchg_acquire:
802 ; O3:       # %bb.0: # %entry
803 ; O3-NEXT:    movq foo(%rip), %rax
804 ; O3-NEXT:    movb $42, %al
805 ; O3-NEXT:  .Lpcsection21:
806 ; O3-NEXT:    xchgb %al, (%rdi)
807 ; O3-NEXT:    movq $1, foo(%rip)
808 ; O3-NEXT:    retq
809 entry:
810   load volatile i64, ptr @foo, align 8
811   %x = atomicrmw xchg ptr %a, i8 42 acquire, align 1, !pcsections !0
812   store volatile i64 1, ptr @foo, align 8
813   ret void
816 define void @atomic8_add_acquire(ptr %a) {
817 ; O0-LABEL: atomic8_add_acquire:
818 ; O0:       # %bb.0: # %entry
819 ; O0-NEXT:    movq foo(%rip), %rax
820 ; O0-NEXT:  .Lpcsection24:
821 ; O0-NEXT:    lock addb $42, (%rdi)
822 ; O0-NEXT:    movq $1, foo
823 ; O0-NEXT:    retq
825 ; O1-LABEL: atomic8_add_acquire:
826 ; O1:       # %bb.0: # %entry
827 ; O1-NEXT:    movq foo(%rip), %rax
828 ; O1-NEXT:  .Lpcsection22:
829 ; O1-NEXT:    lock addb $42, (%rdi)
830 ; O1-NEXT:    movq $1, foo(%rip)
831 ; O1-NEXT:    retq
833 ; O2-LABEL: atomic8_add_acquire:
834 ; O2:       # %bb.0: # %entry
835 ; O2-NEXT:    movq foo(%rip), %rax
836 ; O2-NEXT:  .Lpcsection22:
837 ; O2-NEXT:    lock addb $42, (%rdi)
838 ; O2-NEXT:    movq $1, foo(%rip)
839 ; O2-NEXT:    retq
841 ; O3-LABEL: atomic8_add_acquire:
842 ; O3:       # %bb.0: # %entry
843 ; O3-NEXT:    movq foo(%rip), %rax
844 ; O3-NEXT:  .Lpcsection22:
845 ; O3-NEXT:    lock addb $42, (%rdi)
846 ; O3-NEXT:    movq $1, foo(%rip)
847 ; O3-NEXT:    retq
848 entry:
849   load volatile i64, ptr @foo, align 8
850   %x = atomicrmw add ptr %a, i8 42 acquire, align 1, !pcsections !0
851   store volatile i64 1, ptr @foo, align 8
852   ret void
855 define void @atomic8_sub_acquire(ptr %a) {
856 ; O0-LABEL: atomic8_sub_acquire:
857 ; O0:       # %bb.0: # %entry
858 ; O0-NEXT:    movq foo(%rip), %rax
859 ; O0-NEXT:  .Lpcsection25:
860 ; O0-NEXT:    lock subb $42, (%rdi)
861 ; O0-NEXT:    movq $1, foo
862 ; O0-NEXT:    retq
864 ; O1-LABEL: atomic8_sub_acquire:
865 ; O1:       # %bb.0: # %entry
866 ; O1-NEXT:    movq foo(%rip), %rax
867 ; O1-NEXT:  .Lpcsection23:
868 ; O1-NEXT:    lock subb $42, (%rdi)
869 ; O1-NEXT:    movq $1, foo(%rip)
870 ; O1-NEXT:    retq
872 ; O2-LABEL: atomic8_sub_acquire:
873 ; O2:       # %bb.0: # %entry
874 ; O2-NEXT:    movq foo(%rip), %rax
875 ; O2-NEXT:  .Lpcsection23:
876 ; O2-NEXT:    lock subb $42, (%rdi)
877 ; O2-NEXT:    movq $1, foo(%rip)
878 ; O2-NEXT:    retq
880 ; O3-LABEL: atomic8_sub_acquire:
881 ; O3:       # %bb.0: # %entry
882 ; O3-NEXT:    movq foo(%rip), %rax
883 ; O3-NEXT:  .Lpcsection23:
884 ; O3-NEXT:    lock subb $42, (%rdi)
885 ; O3-NEXT:    movq $1, foo(%rip)
886 ; O3-NEXT:    retq
887 entry:
888   load volatile i64, ptr @foo, align 8
889   %x = atomicrmw sub ptr %a, i8 42 acquire, align 1, !pcsections !0
890   store volatile i64 1, ptr @foo, align 8
891   ret void
894 define void @atomic8_and_acquire(ptr %a) {
895 ; O0-LABEL: atomic8_and_acquire:
896 ; O0:       # %bb.0: # %entry
897 ; O0-NEXT:    movq foo(%rip), %rax
898 ; O0-NEXT:  .Lpcsection26:
899 ; O0-NEXT:    lock andb $42, (%rdi)
900 ; O0-NEXT:    movq $1, foo
901 ; O0-NEXT:    retq
903 ; O1-LABEL: atomic8_and_acquire:
904 ; O1:       # %bb.0: # %entry
905 ; O1-NEXT:    movq foo(%rip), %rax
906 ; O1-NEXT:  .Lpcsection24:
907 ; O1-NEXT:    lock andb $42, (%rdi)
908 ; O1-NEXT:    movq $1, foo(%rip)
909 ; O1-NEXT:    retq
911 ; O2-LABEL: atomic8_and_acquire:
912 ; O2:       # %bb.0: # %entry
913 ; O2-NEXT:    movq foo(%rip), %rax
914 ; O2-NEXT:  .Lpcsection24:
915 ; O2-NEXT:    lock andb $42, (%rdi)
916 ; O2-NEXT:    movq $1, foo(%rip)
917 ; O2-NEXT:    retq
919 ; O3-LABEL: atomic8_and_acquire:
920 ; O3:       # %bb.0: # %entry
921 ; O3-NEXT:    movq foo(%rip), %rax
922 ; O3-NEXT:  .Lpcsection24:
923 ; O3-NEXT:    lock andb $42, (%rdi)
924 ; O3-NEXT:    movq $1, foo(%rip)
925 ; O3-NEXT:    retq
926 entry:
927   load volatile i64, ptr @foo, align 8
928   %x = atomicrmw and ptr %a, i8 42 acquire, align 1, !pcsections !0
929   store volatile i64 1, ptr @foo, align 8
930   ret void
933 define void @atomic8_or_acquire(ptr %a) {
934 ; O0-LABEL: atomic8_or_acquire:
935 ; O0:       # %bb.0: # %entry
936 ; O0-NEXT:    movq foo(%rip), %rax
937 ; O0-NEXT:  .Lpcsection27:
938 ; O0-NEXT:    lock orb $42, (%rdi)
939 ; O0-NEXT:    movq $1, foo
940 ; O0-NEXT:    retq
942 ; O1-LABEL: atomic8_or_acquire:
943 ; O1:       # %bb.0: # %entry
944 ; O1-NEXT:    movq foo(%rip), %rax
945 ; O1-NEXT:  .Lpcsection25:
946 ; O1-NEXT:    lock orb $42, (%rdi)
947 ; O1-NEXT:    movq $1, foo(%rip)
948 ; O1-NEXT:    retq
950 ; O2-LABEL: atomic8_or_acquire:
951 ; O2:       # %bb.0: # %entry
952 ; O2-NEXT:    movq foo(%rip), %rax
953 ; O2-NEXT:  .Lpcsection25:
954 ; O2-NEXT:    lock orb $42, (%rdi)
955 ; O2-NEXT:    movq $1, foo(%rip)
956 ; O2-NEXT:    retq
958 ; O3-LABEL: atomic8_or_acquire:
959 ; O3:       # %bb.0: # %entry
960 ; O3-NEXT:    movq foo(%rip), %rax
961 ; O3-NEXT:  .Lpcsection25:
962 ; O3-NEXT:    lock orb $42, (%rdi)
963 ; O3-NEXT:    movq $1, foo(%rip)
964 ; O3-NEXT:    retq
965 entry:
966   load volatile i64, ptr @foo, align 8
967   %x = atomicrmw or ptr %a, i8 42 acquire, align 1, !pcsections !0
968   store volatile i64 1, ptr @foo, align 8
969   ret void
972 define void @atomic8_xor_acquire(ptr %a) {
973 ; O0-LABEL: atomic8_xor_acquire:
974 ; O0:       # %bb.0: # %entry
975 ; O0-NEXT:    movq foo(%rip), %rax
976 ; O0-NEXT:  .Lpcsection28:
977 ; O0-NEXT:    lock xorb $42, (%rdi)
978 ; O0-NEXT:    movq $1, foo
979 ; O0-NEXT:    retq
981 ; O1-LABEL: atomic8_xor_acquire:
982 ; O1:       # %bb.0: # %entry
983 ; O1-NEXT:    movq foo(%rip), %rax
984 ; O1-NEXT:  .Lpcsection26:
985 ; O1-NEXT:    lock xorb $42, (%rdi)
986 ; O1-NEXT:    movq $1, foo(%rip)
987 ; O1-NEXT:    retq
989 ; O2-LABEL: atomic8_xor_acquire:
990 ; O2:       # %bb.0: # %entry
991 ; O2-NEXT:    movq foo(%rip), %rax
992 ; O2-NEXT:  .Lpcsection26:
993 ; O2-NEXT:    lock xorb $42, (%rdi)
994 ; O2-NEXT:    movq $1, foo(%rip)
995 ; O2-NEXT:    retq
997 ; O3-LABEL: atomic8_xor_acquire:
998 ; O3:       # %bb.0: # %entry
999 ; O3-NEXT:    movq foo(%rip), %rax
1000 ; O3-NEXT:  .Lpcsection26:
1001 ; O3-NEXT:    lock xorb $42, (%rdi)
1002 ; O3-NEXT:    movq $1, foo(%rip)
1003 ; O3-NEXT:    retq
1004 entry:
1005   load volatile i64, ptr @foo, align 8
1006   %x = atomicrmw xor ptr %a, i8 42 acquire, align 1, !pcsections !0
1007   store volatile i64 1, ptr @foo, align 8
1008   ret void
1011 define void @atomic8_nand_acquire(ptr %a) {
1012 ; O0-LABEL: atomic8_nand_acquire:
1013 ; O0:       # %bb.0: # %entry
1014 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
1015 ; O0-NEXT:    movq foo, %rax
1016 ; O0-NEXT:  .Lpcsection29:
1017 ; O0-NEXT:    movb (%rdi), %al
1018 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
1019 ; O0-NEXT:  .LBB23_1: # %atomicrmw.start
1020 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
1021 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
1022 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
1023 ; O0-NEXT:    movb %al, %dl
1024 ; O0-NEXT:  .Lpcsection30:
1025 ; O0-NEXT:    notb %dl
1026 ; O0-NEXT:  .Lpcsection31:
1027 ; O0-NEXT:    orb $-43, %dl
1028 ; O0-NEXT:  .Lpcsection32:
1029 ; O0-NEXT:    lock cmpxchgb %dl, (%rcx)
1030 ; O0-NEXT:  .Lpcsection33:
1031 ; O0-NEXT:    sete %cl
1032 ; O0-NEXT:  .Lpcsection34:
1033 ; O0-NEXT:    testb $1, %cl
1034 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
1035 ; O0-NEXT:  .Lpcsection35:
1036 ; O0-NEXT:    jne .LBB23_2
1037 ; O0-NEXT:    jmp .LBB23_1
1038 ; O0-NEXT:  .LBB23_2: # %atomicrmw.end
1039 ; O0-NEXT:    movq $1, foo
1040 ; O0-NEXT:    retq
1042 ; O1-LABEL: atomic8_nand_acquire:
1043 ; O1:       # %bb.0: # %entry
1044 ; O1-NEXT:    movq foo(%rip), %rax
1045 ; O1-NEXT:  .Lpcsection27:
1046 ; O1-NEXT:    movzbl (%rdi), %eax
1047 ; O1-NEXT:    .p2align 4, 0x90
1048 ; O1-NEXT:  .LBB23_1: # %atomicrmw.start
1049 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1050 ; O1-NEXT:    movl %eax, %ecx
1051 ; O1-NEXT:  .Lpcsection28:
1052 ; O1-NEXT:    notb %cl
1053 ; O1-NEXT:  .Lpcsection29:
1054 ; O1-NEXT:    orb $-43, %cl
1055 ; O1-NEXT:  .Lpcsection30:
1056 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
1057 ; O1-NEXT:  .Lpcsection31:
1058 ; O1-NEXT:    jne .LBB23_1
1059 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
1060 ; O1-NEXT:    movq $1, foo(%rip)
1061 ; O1-NEXT:    retq
1063 ; O2-LABEL: atomic8_nand_acquire:
1064 ; O2:       # %bb.0: # %entry
1065 ; O2-NEXT:    movq foo(%rip), %rax
1066 ; O2-NEXT:  .Lpcsection27:
1067 ; O2-NEXT:    movzbl (%rdi), %eax
1068 ; O2-NEXT:    .p2align 4, 0x90
1069 ; O2-NEXT:  .LBB23_1: # %atomicrmw.start
1070 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1071 ; O2-NEXT:    movl %eax, %ecx
1072 ; O2-NEXT:  .Lpcsection28:
1073 ; O2-NEXT:    notb %cl
1074 ; O2-NEXT:  .Lpcsection29:
1075 ; O2-NEXT:    orb $-43, %cl
1076 ; O2-NEXT:  .Lpcsection30:
1077 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
1078 ; O2-NEXT:  .Lpcsection31:
1079 ; O2-NEXT:    jne .LBB23_1
1080 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
1081 ; O2-NEXT:    movq $1, foo(%rip)
1082 ; O2-NEXT:    retq
1084 ; O3-LABEL: atomic8_nand_acquire:
1085 ; O3:       # %bb.0: # %entry
1086 ; O3-NEXT:    movq foo(%rip), %rax
1087 ; O3-NEXT:  .Lpcsection27:
1088 ; O3-NEXT:    movzbl (%rdi), %eax
1089 ; O3-NEXT:    .p2align 4, 0x90
1090 ; O3-NEXT:  .LBB23_1: # %atomicrmw.start
1091 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1092 ; O3-NEXT:    movl %eax, %ecx
1093 ; O3-NEXT:  .Lpcsection28:
1094 ; O3-NEXT:    notb %cl
1095 ; O3-NEXT:  .Lpcsection29:
1096 ; O3-NEXT:    orb $-43, %cl
1097 ; O3-NEXT:  .Lpcsection30:
1098 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
1099 ; O3-NEXT:  .Lpcsection31:
1100 ; O3-NEXT:    jne .LBB23_1
1101 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
1102 ; O3-NEXT:    movq $1, foo(%rip)
1103 ; O3-NEXT:    retq
1104 entry:
1105   load volatile i64, ptr @foo, align 8
1106   %x = atomicrmw nand ptr %a, i8 42 acquire, align 1, !pcsections !0
1107   store volatile i64 1, ptr @foo, align 8
1108   ret void
1111 define void @atomic8_xchg_release(ptr %a) {
1112 ; O0-LABEL: atomic8_xchg_release:
1113 ; O0:       # %bb.0: # %entry
1114 ; O0-NEXT:    movq foo(%rip), %rax
1115 ; O0-NEXT:    movb $42, %al
1116 ; O0-NEXT:  .Lpcsection36:
1117 ; O0-NEXT:    xchgb %al, (%rdi)
1118 ; O0-NEXT:    movq $1, foo
1119 ; O0-NEXT:    retq
1121 ; O1-LABEL: atomic8_xchg_release:
1122 ; O1:       # %bb.0: # %entry
1123 ; O1-NEXT:    movq foo(%rip), %rax
1124 ; O1-NEXT:    movb $42, %al
1125 ; O1-NEXT:  .Lpcsection32:
1126 ; O1-NEXT:    xchgb %al, (%rdi)
1127 ; O1-NEXT:    movq $1, foo(%rip)
1128 ; O1-NEXT:    retq
1130 ; O2-LABEL: atomic8_xchg_release:
1131 ; O2:       # %bb.0: # %entry
1132 ; O2-NEXT:    movq foo(%rip), %rax
1133 ; O2-NEXT:    movb $42, %al
1134 ; O2-NEXT:  .Lpcsection32:
1135 ; O2-NEXT:    xchgb %al, (%rdi)
1136 ; O2-NEXT:    movq $1, foo(%rip)
1137 ; O2-NEXT:    retq
1139 ; O3-LABEL: atomic8_xchg_release:
1140 ; O3:       # %bb.0: # %entry
1141 ; O3-NEXT:    movq foo(%rip), %rax
1142 ; O3-NEXT:    movb $42, %al
1143 ; O3-NEXT:  .Lpcsection32:
1144 ; O3-NEXT:    xchgb %al, (%rdi)
1145 ; O3-NEXT:    movq $1, foo(%rip)
1146 ; O3-NEXT:    retq
1147 entry:
1148   load volatile i64, ptr @foo, align 8
1149   %x = atomicrmw xchg ptr %a, i8 42 release, align 1, !pcsections !0
1150   store volatile i64 1, ptr @foo, align 8
1151   ret void
1154 define void @atomic8_add_release(ptr %a) {
1155 ; O0-LABEL: atomic8_add_release:
1156 ; O0:       # %bb.0: # %entry
1157 ; O0-NEXT:    movq foo(%rip), %rax
1158 ; O0-NEXT:  .Lpcsection37:
1159 ; O0-NEXT:    lock addb $42, (%rdi)
1160 ; O0-NEXT:    movq $1, foo
1161 ; O0-NEXT:    retq
1163 ; O1-LABEL: atomic8_add_release:
1164 ; O1:       # %bb.0: # %entry
1165 ; O1-NEXT:    movq foo(%rip), %rax
1166 ; O1-NEXT:  .Lpcsection33:
1167 ; O1-NEXT:    lock addb $42, (%rdi)
1168 ; O1-NEXT:    movq $1, foo(%rip)
1169 ; O1-NEXT:    retq
1171 ; O2-LABEL: atomic8_add_release:
1172 ; O2:       # %bb.0: # %entry
1173 ; O2-NEXT:    movq foo(%rip), %rax
1174 ; O2-NEXT:  .Lpcsection33:
1175 ; O2-NEXT:    lock addb $42, (%rdi)
1176 ; O2-NEXT:    movq $1, foo(%rip)
1177 ; O2-NEXT:    retq
1179 ; O3-LABEL: atomic8_add_release:
1180 ; O3:       # %bb.0: # %entry
1181 ; O3-NEXT:    movq foo(%rip), %rax
1182 ; O3-NEXT:  .Lpcsection33:
1183 ; O3-NEXT:    lock addb $42, (%rdi)
1184 ; O3-NEXT:    movq $1, foo(%rip)
1185 ; O3-NEXT:    retq
1186 entry:
1187   load volatile i64, ptr @foo, align 8
1188   %x = atomicrmw add ptr %a, i8 42 release, align 1, !pcsections !0
1189   store volatile i64 1, ptr @foo, align 8
1190   ret void
1193 define void @atomic8_sub_release(ptr %a) {
1194 ; O0-LABEL: atomic8_sub_release:
1195 ; O0:       # %bb.0: # %entry
1196 ; O0-NEXT:    movq foo(%rip), %rax
1197 ; O0-NEXT:  .Lpcsection38:
1198 ; O0-NEXT:    lock subb $42, (%rdi)
1199 ; O0-NEXT:    movq $1, foo
1200 ; O0-NEXT:    retq
1202 ; O1-LABEL: atomic8_sub_release:
1203 ; O1:       # %bb.0: # %entry
1204 ; O1-NEXT:    movq foo(%rip), %rax
1205 ; O1-NEXT:  .Lpcsection34:
1206 ; O1-NEXT:    lock subb $42, (%rdi)
1207 ; O1-NEXT:    movq $1, foo(%rip)
1208 ; O1-NEXT:    retq
1210 ; O2-LABEL: atomic8_sub_release:
1211 ; O2:       # %bb.0: # %entry
1212 ; O2-NEXT:    movq foo(%rip), %rax
1213 ; O2-NEXT:  .Lpcsection34:
1214 ; O2-NEXT:    lock subb $42, (%rdi)
1215 ; O2-NEXT:    movq $1, foo(%rip)
1216 ; O2-NEXT:    retq
1218 ; O3-LABEL: atomic8_sub_release:
1219 ; O3:       # %bb.0: # %entry
1220 ; O3-NEXT:    movq foo(%rip), %rax
1221 ; O3-NEXT:  .Lpcsection34:
1222 ; O3-NEXT:    lock subb $42, (%rdi)
1223 ; O3-NEXT:    movq $1, foo(%rip)
1224 ; O3-NEXT:    retq
1225 entry:
1226   load volatile i64, ptr @foo, align 8
1227   %x = atomicrmw sub ptr %a, i8 42 release, align 1, !pcsections !0
1228   store volatile i64 1, ptr @foo, align 8
1229   ret void
1232 define void @atomic8_and_release(ptr %a) {
1233 ; O0-LABEL: atomic8_and_release:
1234 ; O0:       # %bb.0: # %entry
1235 ; O0-NEXT:    movq foo(%rip), %rax
1236 ; O0-NEXT:  .Lpcsection39:
1237 ; O0-NEXT:    lock andb $42, (%rdi)
1238 ; O0-NEXT:    movq $1, foo
1239 ; O0-NEXT:    retq
1241 ; O1-LABEL: atomic8_and_release:
1242 ; O1:       # %bb.0: # %entry
1243 ; O1-NEXT:    movq foo(%rip), %rax
1244 ; O1-NEXT:  .Lpcsection35:
1245 ; O1-NEXT:    lock andb $42, (%rdi)
1246 ; O1-NEXT:    movq $1, foo(%rip)
1247 ; O1-NEXT:    retq
1249 ; O2-LABEL: atomic8_and_release:
1250 ; O2:       # %bb.0: # %entry
1251 ; O2-NEXT:    movq foo(%rip), %rax
1252 ; O2-NEXT:  .Lpcsection35:
1253 ; O2-NEXT:    lock andb $42, (%rdi)
1254 ; O2-NEXT:    movq $1, foo(%rip)
1255 ; O2-NEXT:    retq
1257 ; O3-LABEL: atomic8_and_release:
1258 ; O3:       # %bb.0: # %entry
1259 ; O3-NEXT:    movq foo(%rip), %rax
1260 ; O3-NEXT:  .Lpcsection35:
1261 ; O3-NEXT:    lock andb $42, (%rdi)
1262 ; O3-NEXT:    movq $1, foo(%rip)
1263 ; O3-NEXT:    retq
1264 entry:
1265   load volatile i64, ptr @foo, align 8
1266   %x = atomicrmw and ptr %a, i8 42 release, align 1, !pcsections !0
1267   store volatile i64 1, ptr @foo, align 8
1268   ret void
1271 define void @atomic8_or_release(ptr %a) {
1272 ; O0-LABEL: atomic8_or_release:
1273 ; O0:       # %bb.0: # %entry
1274 ; O0-NEXT:    movq foo(%rip), %rax
1275 ; O0-NEXT:  .Lpcsection40:
1276 ; O0-NEXT:    lock orb $42, (%rdi)
1277 ; O0-NEXT:    movq $1, foo
1278 ; O0-NEXT:    retq
1280 ; O1-LABEL: atomic8_or_release:
1281 ; O1:       # %bb.0: # %entry
1282 ; O1-NEXT:    movq foo(%rip), %rax
1283 ; O1-NEXT:  .Lpcsection36:
1284 ; O1-NEXT:    lock orb $42, (%rdi)
1285 ; O1-NEXT:    movq $1, foo(%rip)
1286 ; O1-NEXT:    retq
1288 ; O2-LABEL: atomic8_or_release:
1289 ; O2:       # %bb.0: # %entry
1290 ; O2-NEXT:    movq foo(%rip), %rax
1291 ; O2-NEXT:  .Lpcsection36:
1292 ; O2-NEXT:    lock orb $42, (%rdi)
1293 ; O2-NEXT:    movq $1, foo(%rip)
1294 ; O2-NEXT:    retq
1296 ; O3-LABEL: atomic8_or_release:
1297 ; O3:       # %bb.0: # %entry
1298 ; O3-NEXT:    movq foo(%rip), %rax
1299 ; O3-NEXT:  .Lpcsection36:
1300 ; O3-NEXT:    lock orb $42, (%rdi)
1301 ; O3-NEXT:    movq $1, foo(%rip)
1302 ; O3-NEXT:    retq
1303 entry:
1304   load volatile i64, ptr @foo, align 8
1305   %x = atomicrmw or ptr %a, i8 42 release, align 1, !pcsections !0
1306   store volatile i64 1, ptr @foo, align 8
1307   ret void
1310 define void @atomic8_xor_release(ptr %a) {
1311 ; O0-LABEL: atomic8_xor_release:
1312 ; O0:       # %bb.0: # %entry
1313 ; O0-NEXT:    movq foo(%rip), %rax
1314 ; O0-NEXT:  .Lpcsection41:
1315 ; O0-NEXT:    lock xorb $42, (%rdi)
1316 ; O0-NEXT:    movq $1, foo
1317 ; O0-NEXT:    retq
1319 ; O1-LABEL: atomic8_xor_release:
1320 ; O1:       # %bb.0: # %entry
1321 ; O1-NEXT:    movq foo(%rip), %rax
1322 ; O1-NEXT:  .Lpcsection37:
1323 ; O1-NEXT:    lock xorb $42, (%rdi)
1324 ; O1-NEXT:    movq $1, foo(%rip)
1325 ; O1-NEXT:    retq
1327 ; O2-LABEL: atomic8_xor_release:
1328 ; O2:       # %bb.0: # %entry
1329 ; O2-NEXT:    movq foo(%rip), %rax
1330 ; O2-NEXT:  .Lpcsection37:
1331 ; O2-NEXT:    lock xorb $42, (%rdi)
1332 ; O2-NEXT:    movq $1, foo(%rip)
1333 ; O2-NEXT:    retq
1335 ; O3-LABEL: atomic8_xor_release:
1336 ; O3:       # %bb.0: # %entry
1337 ; O3-NEXT:    movq foo(%rip), %rax
1338 ; O3-NEXT:  .Lpcsection37:
1339 ; O3-NEXT:    lock xorb $42, (%rdi)
1340 ; O3-NEXT:    movq $1, foo(%rip)
1341 ; O3-NEXT:    retq
1342 entry:
1343   load volatile i64, ptr @foo, align 8
1344   %x = atomicrmw xor ptr %a, i8 42 release, align 1, !pcsections !0
1345   store volatile i64 1, ptr @foo, align 8
1346   ret void
1349 define void @atomic8_nand_release(ptr %a) {
1350 ; O0-LABEL: atomic8_nand_release:
1351 ; O0:       # %bb.0: # %entry
1352 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
1353 ; O0-NEXT:    movq foo, %rax
1354 ; O0-NEXT:  .Lpcsection42:
1355 ; O0-NEXT:    movb (%rdi), %al
1356 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
1357 ; O0-NEXT:  .LBB30_1: # %atomicrmw.start
1358 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
1359 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
1360 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
1361 ; O0-NEXT:    movb %al, %dl
1362 ; O0-NEXT:  .Lpcsection43:
1363 ; O0-NEXT:    notb %dl
1364 ; O0-NEXT:  .Lpcsection44:
1365 ; O0-NEXT:    orb $-43, %dl
1366 ; O0-NEXT:  .Lpcsection45:
1367 ; O0-NEXT:    lock cmpxchgb %dl, (%rcx)
1368 ; O0-NEXT:  .Lpcsection46:
1369 ; O0-NEXT:    sete %cl
1370 ; O0-NEXT:  .Lpcsection47:
1371 ; O0-NEXT:    testb $1, %cl
1372 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
1373 ; O0-NEXT:  .Lpcsection48:
1374 ; O0-NEXT:    jne .LBB30_2
1375 ; O0-NEXT:    jmp .LBB30_1
1376 ; O0-NEXT:  .LBB30_2: # %atomicrmw.end
1377 ; O0-NEXT:    movq $1, foo
1378 ; O0-NEXT:    retq
1380 ; O1-LABEL: atomic8_nand_release:
1381 ; O1:       # %bb.0: # %entry
1382 ; O1-NEXT:    movq foo(%rip), %rax
1383 ; O1-NEXT:  .Lpcsection38:
1384 ; O1-NEXT:    movzbl (%rdi), %eax
1385 ; O1-NEXT:    .p2align 4, 0x90
1386 ; O1-NEXT:  .LBB30_1: # %atomicrmw.start
1387 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1388 ; O1-NEXT:    movl %eax, %ecx
1389 ; O1-NEXT:  .Lpcsection39:
1390 ; O1-NEXT:    notb %cl
1391 ; O1-NEXT:  .Lpcsection40:
1392 ; O1-NEXT:    orb $-43, %cl
1393 ; O1-NEXT:  .Lpcsection41:
1394 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
1395 ; O1-NEXT:  .Lpcsection42:
1396 ; O1-NEXT:    jne .LBB30_1
1397 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
1398 ; O1-NEXT:    movq $1, foo(%rip)
1399 ; O1-NEXT:    retq
1401 ; O2-LABEL: atomic8_nand_release:
1402 ; O2:       # %bb.0: # %entry
1403 ; O2-NEXT:    movq foo(%rip), %rax
1404 ; O2-NEXT:  .Lpcsection38:
1405 ; O2-NEXT:    movzbl (%rdi), %eax
1406 ; O2-NEXT:    .p2align 4, 0x90
1407 ; O2-NEXT:  .LBB30_1: # %atomicrmw.start
1408 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1409 ; O2-NEXT:    movl %eax, %ecx
1410 ; O2-NEXT:  .Lpcsection39:
1411 ; O2-NEXT:    notb %cl
1412 ; O2-NEXT:  .Lpcsection40:
1413 ; O2-NEXT:    orb $-43, %cl
1414 ; O2-NEXT:  .Lpcsection41:
1415 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
1416 ; O2-NEXT:  .Lpcsection42:
1417 ; O2-NEXT:    jne .LBB30_1
1418 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
1419 ; O2-NEXT:    movq $1, foo(%rip)
1420 ; O2-NEXT:    retq
1422 ; O3-LABEL: atomic8_nand_release:
1423 ; O3:       # %bb.0: # %entry
1424 ; O3-NEXT:    movq foo(%rip), %rax
1425 ; O3-NEXT:  .Lpcsection38:
1426 ; O3-NEXT:    movzbl (%rdi), %eax
1427 ; O3-NEXT:    .p2align 4, 0x90
1428 ; O3-NEXT:  .LBB30_1: # %atomicrmw.start
1429 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1430 ; O3-NEXT:    movl %eax, %ecx
1431 ; O3-NEXT:  .Lpcsection39:
1432 ; O3-NEXT:    notb %cl
1433 ; O3-NEXT:  .Lpcsection40:
1434 ; O3-NEXT:    orb $-43, %cl
1435 ; O3-NEXT:  .Lpcsection41:
1436 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
1437 ; O3-NEXT:  .Lpcsection42:
1438 ; O3-NEXT:    jne .LBB30_1
1439 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
1440 ; O3-NEXT:    movq $1, foo(%rip)
1441 ; O3-NEXT:    retq
1442 entry:
1443   load volatile i64, ptr @foo, align 8
1444   %x = atomicrmw nand ptr %a, i8 42 release, align 1, !pcsections !0
1445   store volatile i64 1, ptr @foo, align 8
1446   ret void
1449 define void @atomic8_xchg_acq_rel(ptr %a) {
1450 ; O0-LABEL: atomic8_xchg_acq_rel:
1451 ; O0:       # %bb.0: # %entry
1452 ; O0-NEXT:    movq foo(%rip), %rax
1453 ; O0-NEXT:    movb $42, %al
1454 ; O0-NEXT:  .Lpcsection49:
1455 ; O0-NEXT:    xchgb %al, (%rdi)
1456 ; O0-NEXT:    movq $1, foo
1457 ; O0-NEXT:    retq
1459 ; O1-LABEL: atomic8_xchg_acq_rel:
1460 ; O1:       # %bb.0: # %entry
1461 ; O1-NEXT:    movq foo(%rip), %rax
1462 ; O1-NEXT:    movb $42, %al
1463 ; O1-NEXT:  .Lpcsection43:
1464 ; O1-NEXT:    xchgb %al, (%rdi)
1465 ; O1-NEXT:    movq $1, foo(%rip)
1466 ; O1-NEXT:    retq
1468 ; O2-LABEL: atomic8_xchg_acq_rel:
1469 ; O2:       # %bb.0: # %entry
1470 ; O2-NEXT:    movq foo(%rip), %rax
1471 ; O2-NEXT:    movb $42, %al
1472 ; O2-NEXT:  .Lpcsection43:
1473 ; O2-NEXT:    xchgb %al, (%rdi)
1474 ; O2-NEXT:    movq $1, foo(%rip)
1475 ; O2-NEXT:    retq
1477 ; O3-LABEL: atomic8_xchg_acq_rel:
1478 ; O3:       # %bb.0: # %entry
1479 ; O3-NEXT:    movq foo(%rip), %rax
1480 ; O3-NEXT:    movb $42, %al
1481 ; O3-NEXT:  .Lpcsection43:
1482 ; O3-NEXT:    xchgb %al, (%rdi)
1483 ; O3-NEXT:    movq $1, foo(%rip)
1484 ; O3-NEXT:    retq
1485 entry:
1486   load volatile i64, ptr @foo, align 8
1487   %x = atomicrmw xchg ptr %a, i8 42 acq_rel, align 1, !pcsections !0
1488   store volatile i64 1, ptr @foo, align 8
1489   ret void
1492 define void @atomic8_add_acq_rel(ptr %a) {
1493 ; O0-LABEL: atomic8_add_acq_rel:
1494 ; O0:       # %bb.0: # %entry
1495 ; O0-NEXT:    movq foo(%rip), %rax
1496 ; O0-NEXT:  .Lpcsection50:
1497 ; O0-NEXT:    lock addb $42, (%rdi)
1498 ; O0-NEXT:    movq $1, foo
1499 ; O0-NEXT:    retq
1501 ; O1-LABEL: atomic8_add_acq_rel:
1502 ; O1:       # %bb.0: # %entry
1503 ; O1-NEXT:    movq foo(%rip), %rax
1504 ; O1-NEXT:  .Lpcsection44:
1505 ; O1-NEXT:    lock addb $42, (%rdi)
1506 ; O1-NEXT:    movq $1, foo(%rip)
1507 ; O1-NEXT:    retq
1509 ; O2-LABEL: atomic8_add_acq_rel:
1510 ; O2:       # %bb.0: # %entry
1511 ; O2-NEXT:    movq foo(%rip), %rax
1512 ; O2-NEXT:  .Lpcsection44:
1513 ; O2-NEXT:    lock addb $42, (%rdi)
1514 ; O2-NEXT:    movq $1, foo(%rip)
1515 ; O2-NEXT:    retq
1517 ; O3-LABEL: atomic8_add_acq_rel:
1518 ; O3:       # %bb.0: # %entry
1519 ; O3-NEXT:    movq foo(%rip), %rax
1520 ; O3-NEXT:  .Lpcsection44:
1521 ; O3-NEXT:    lock addb $42, (%rdi)
1522 ; O3-NEXT:    movq $1, foo(%rip)
1523 ; O3-NEXT:    retq
1524 entry:
1525   load volatile i64, ptr @foo, align 8
1526   %x = atomicrmw add ptr %a, i8 42 acq_rel, align 1, !pcsections !0
1527   store volatile i64 1, ptr @foo, align 8
1528   ret void
1531 define void @atomic8_sub_acq_rel(ptr %a) {
1532 ; O0-LABEL: atomic8_sub_acq_rel:
1533 ; O0:       # %bb.0: # %entry
1534 ; O0-NEXT:    movq foo(%rip), %rax
1535 ; O0-NEXT:  .Lpcsection51:
1536 ; O0-NEXT:    lock subb $42, (%rdi)
1537 ; O0-NEXT:    movq $1, foo
1538 ; O0-NEXT:    retq
1540 ; O1-LABEL: atomic8_sub_acq_rel:
1541 ; O1:       # %bb.0: # %entry
1542 ; O1-NEXT:    movq foo(%rip), %rax
1543 ; O1-NEXT:  .Lpcsection45:
1544 ; O1-NEXT:    lock subb $42, (%rdi)
1545 ; O1-NEXT:    movq $1, foo(%rip)
1546 ; O1-NEXT:    retq
1548 ; O2-LABEL: atomic8_sub_acq_rel:
1549 ; O2:       # %bb.0: # %entry
1550 ; O2-NEXT:    movq foo(%rip), %rax
1551 ; O2-NEXT:  .Lpcsection45:
1552 ; O2-NEXT:    lock subb $42, (%rdi)
1553 ; O2-NEXT:    movq $1, foo(%rip)
1554 ; O2-NEXT:    retq
1556 ; O3-LABEL: atomic8_sub_acq_rel:
1557 ; O3:       # %bb.0: # %entry
1558 ; O3-NEXT:    movq foo(%rip), %rax
1559 ; O3-NEXT:  .Lpcsection45:
1560 ; O3-NEXT:    lock subb $42, (%rdi)
1561 ; O3-NEXT:    movq $1, foo(%rip)
1562 ; O3-NEXT:    retq
1563 entry:
1564   load volatile i64, ptr @foo, align 8
1565   %x = atomicrmw sub ptr %a, i8 42 acq_rel, align 1, !pcsections !0
1566   store volatile i64 1, ptr @foo, align 8
1567   ret void
1570 define void @atomic8_and_acq_rel(ptr %a) {
1571 ; O0-LABEL: atomic8_and_acq_rel:
1572 ; O0:       # %bb.0: # %entry
1573 ; O0-NEXT:    movq foo(%rip), %rax
1574 ; O0-NEXT:  .Lpcsection52:
1575 ; O0-NEXT:    lock andb $42, (%rdi)
1576 ; O0-NEXT:    movq $1, foo
1577 ; O0-NEXT:    retq
1579 ; O1-LABEL: atomic8_and_acq_rel:
1580 ; O1:       # %bb.0: # %entry
1581 ; O1-NEXT:    movq foo(%rip), %rax
1582 ; O1-NEXT:  .Lpcsection46:
1583 ; O1-NEXT:    lock andb $42, (%rdi)
1584 ; O1-NEXT:    movq $1, foo(%rip)
1585 ; O1-NEXT:    retq
1587 ; O2-LABEL: atomic8_and_acq_rel:
1588 ; O2:       # %bb.0: # %entry
1589 ; O2-NEXT:    movq foo(%rip), %rax
1590 ; O2-NEXT:  .Lpcsection46:
1591 ; O2-NEXT:    lock andb $42, (%rdi)
1592 ; O2-NEXT:    movq $1, foo(%rip)
1593 ; O2-NEXT:    retq
1595 ; O3-LABEL: atomic8_and_acq_rel:
1596 ; O3:       # %bb.0: # %entry
1597 ; O3-NEXT:    movq foo(%rip), %rax
1598 ; O3-NEXT:  .Lpcsection46:
1599 ; O3-NEXT:    lock andb $42, (%rdi)
1600 ; O3-NEXT:    movq $1, foo(%rip)
1601 ; O3-NEXT:    retq
1602 entry:
1603   load volatile i64, ptr @foo, align 8
1604   %x = atomicrmw and ptr %a, i8 42 acq_rel, align 1, !pcsections !0
1605   store volatile i64 1, ptr @foo, align 8
1606   ret void
1609 define void @atomic8_or_acq_rel(ptr %a) {
1610 ; O0-LABEL: atomic8_or_acq_rel:
1611 ; O0:       # %bb.0: # %entry
1612 ; O0-NEXT:    movq foo(%rip), %rax
1613 ; O0-NEXT:  .Lpcsection53:
1614 ; O0-NEXT:    lock orb $42, (%rdi)
1615 ; O0-NEXT:    movq $1, foo
1616 ; O0-NEXT:    retq
1618 ; O1-LABEL: atomic8_or_acq_rel:
1619 ; O1:       # %bb.0: # %entry
1620 ; O1-NEXT:    movq foo(%rip), %rax
1621 ; O1-NEXT:  .Lpcsection47:
1622 ; O1-NEXT:    lock orb $42, (%rdi)
1623 ; O1-NEXT:    movq $1, foo(%rip)
1624 ; O1-NEXT:    retq
1626 ; O2-LABEL: atomic8_or_acq_rel:
1627 ; O2:       # %bb.0: # %entry
1628 ; O2-NEXT:    movq foo(%rip), %rax
1629 ; O2-NEXT:  .Lpcsection47:
1630 ; O2-NEXT:    lock orb $42, (%rdi)
1631 ; O2-NEXT:    movq $1, foo(%rip)
1632 ; O2-NEXT:    retq
1634 ; O3-LABEL: atomic8_or_acq_rel:
1635 ; O3:       # %bb.0: # %entry
1636 ; O3-NEXT:    movq foo(%rip), %rax
1637 ; O3-NEXT:  .Lpcsection47:
1638 ; O3-NEXT:    lock orb $42, (%rdi)
1639 ; O3-NEXT:    movq $1, foo(%rip)
1640 ; O3-NEXT:    retq
1641 entry:
1642   load volatile i64, ptr @foo, align 8
1643   %x = atomicrmw or ptr %a, i8 42 acq_rel, align 1, !pcsections !0
1644   store volatile i64 1, ptr @foo, align 8
1645   ret void
1648 define void @atomic8_xor_acq_rel(ptr %a) {
1649 ; O0-LABEL: atomic8_xor_acq_rel:
1650 ; O0:       # %bb.0: # %entry
1651 ; O0-NEXT:    movq foo(%rip), %rax
1652 ; O0-NEXT:  .Lpcsection54:
1653 ; O0-NEXT:    lock xorb $42, (%rdi)
1654 ; O0-NEXT:    movq $1, foo
1655 ; O0-NEXT:    retq
1657 ; O1-LABEL: atomic8_xor_acq_rel:
1658 ; O1:       # %bb.0: # %entry
1659 ; O1-NEXT:    movq foo(%rip), %rax
1660 ; O1-NEXT:  .Lpcsection48:
1661 ; O1-NEXT:    lock xorb $42, (%rdi)
1662 ; O1-NEXT:    movq $1, foo(%rip)
1663 ; O1-NEXT:    retq
1665 ; O2-LABEL: atomic8_xor_acq_rel:
1666 ; O2:       # %bb.0: # %entry
1667 ; O2-NEXT:    movq foo(%rip), %rax
1668 ; O2-NEXT:  .Lpcsection48:
1669 ; O2-NEXT:    lock xorb $42, (%rdi)
1670 ; O2-NEXT:    movq $1, foo(%rip)
1671 ; O2-NEXT:    retq
1673 ; O3-LABEL: atomic8_xor_acq_rel:
1674 ; O3:       # %bb.0: # %entry
1675 ; O3-NEXT:    movq foo(%rip), %rax
1676 ; O3-NEXT:  .Lpcsection48:
1677 ; O3-NEXT:    lock xorb $42, (%rdi)
1678 ; O3-NEXT:    movq $1, foo(%rip)
1679 ; O3-NEXT:    retq
1680 entry:
1681   load volatile i64, ptr @foo, align 8
1682   %x = atomicrmw xor ptr %a, i8 42 acq_rel, align 1, !pcsections !0
1683   store volatile i64 1, ptr @foo, align 8
1684   ret void
1687 define void @atomic8_nand_acq_rel(ptr %a) {
1688 ; O0-LABEL: atomic8_nand_acq_rel:
1689 ; O0:       # %bb.0: # %entry
1690 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
1691 ; O0-NEXT:    movq foo, %rax
1692 ; O0-NEXT:  .Lpcsection55:
1693 ; O0-NEXT:    movb (%rdi), %al
1694 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
1695 ; O0-NEXT:  .LBB37_1: # %atomicrmw.start
1696 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
1697 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
1698 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
1699 ; O0-NEXT:    movb %al, %dl
1700 ; O0-NEXT:  .Lpcsection56:
1701 ; O0-NEXT:    notb %dl
1702 ; O0-NEXT:  .Lpcsection57:
1703 ; O0-NEXT:    orb $-43, %dl
1704 ; O0-NEXT:  .Lpcsection58:
1705 ; O0-NEXT:    lock cmpxchgb %dl, (%rcx)
1706 ; O0-NEXT:  .Lpcsection59:
1707 ; O0-NEXT:    sete %cl
1708 ; O0-NEXT:  .Lpcsection60:
1709 ; O0-NEXT:    testb $1, %cl
1710 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
1711 ; O0-NEXT:  .Lpcsection61:
1712 ; O0-NEXT:    jne .LBB37_2
1713 ; O0-NEXT:    jmp .LBB37_1
1714 ; O0-NEXT:  .LBB37_2: # %atomicrmw.end
1715 ; O0-NEXT:    movq $1, foo
1716 ; O0-NEXT:    retq
1718 ; O1-LABEL: atomic8_nand_acq_rel:
1719 ; O1:       # %bb.0: # %entry
1720 ; O1-NEXT:    movq foo(%rip), %rax
1721 ; O1-NEXT:  .Lpcsection49:
1722 ; O1-NEXT:    movzbl (%rdi), %eax
1723 ; O1-NEXT:    .p2align 4, 0x90
1724 ; O1-NEXT:  .LBB37_1: # %atomicrmw.start
1725 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
1726 ; O1-NEXT:    movl %eax, %ecx
1727 ; O1-NEXT:  .Lpcsection50:
1728 ; O1-NEXT:    notb %cl
1729 ; O1-NEXT:  .Lpcsection51:
1730 ; O1-NEXT:    orb $-43, %cl
1731 ; O1-NEXT:  .Lpcsection52:
1732 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
1733 ; O1-NEXT:  .Lpcsection53:
1734 ; O1-NEXT:    jne .LBB37_1
1735 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
1736 ; O1-NEXT:    movq $1, foo(%rip)
1737 ; O1-NEXT:    retq
1739 ; O2-LABEL: atomic8_nand_acq_rel:
1740 ; O2:       # %bb.0: # %entry
1741 ; O2-NEXT:    movq foo(%rip), %rax
1742 ; O2-NEXT:  .Lpcsection49:
1743 ; O2-NEXT:    movzbl (%rdi), %eax
1744 ; O2-NEXT:    .p2align 4, 0x90
1745 ; O2-NEXT:  .LBB37_1: # %atomicrmw.start
1746 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
1747 ; O2-NEXT:    movl %eax, %ecx
1748 ; O2-NEXT:  .Lpcsection50:
1749 ; O2-NEXT:    notb %cl
1750 ; O2-NEXT:  .Lpcsection51:
1751 ; O2-NEXT:    orb $-43, %cl
1752 ; O2-NEXT:  .Lpcsection52:
1753 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
1754 ; O2-NEXT:  .Lpcsection53:
1755 ; O2-NEXT:    jne .LBB37_1
1756 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
1757 ; O2-NEXT:    movq $1, foo(%rip)
1758 ; O2-NEXT:    retq
1760 ; O3-LABEL: atomic8_nand_acq_rel:
1761 ; O3:       # %bb.0: # %entry
1762 ; O3-NEXT:    movq foo(%rip), %rax
1763 ; O3-NEXT:  .Lpcsection49:
1764 ; O3-NEXT:    movzbl (%rdi), %eax
1765 ; O3-NEXT:    .p2align 4, 0x90
1766 ; O3-NEXT:  .LBB37_1: # %atomicrmw.start
1767 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
1768 ; O3-NEXT:    movl %eax, %ecx
1769 ; O3-NEXT:  .Lpcsection50:
1770 ; O3-NEXT:    notb %cl
1771 ; O3-NEXT:  .Lpcsection51:
1772 ; O3-NEXT:    orb $-43, %cl
1773 ; O3-NEXT:  .Lpcsection52:
1774 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
1775 ; O3-NEXT:  .Lpcsection53:
1776 ; O3-NEXT:    jne .LBB37_1
1777 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
1778 ; O3-NEXT:    movq $1, foo(%rip)
1779 ; O3-NEXT:    retq
1780 entry:
1781   load volatile i64, ptr @foo, align 8
1782   %x = atomicrmw nand ptr %a, i8 42 acq_rel, align 1, !pcsections !0
1783   store volatile i64 1, ptr @foo, align 8
1784   ret void
1787 define void @atomic8_xchg_seq_cst(ptr %a) {
1788 ; O0-LABEL: atomic8_xchg_seq_cst:
1789 ; O0:       # %bb.0: # %entry
1790 ; O0-NEXT:    movq foo(%rip), %rax
1791 ; O0-NEXT:    movb $42, %al
1792 ; O0-NEXT:  .Lpcsection62:
1793 ; O0-NEXT:    xchgb %al, (%rdi)
1794 ; O0-NEXT:    movq $1, foo
1795 ; O0-NEXT:    retq
1797 ; O1-LABEL: atomic8_xchg_seq_cst:
1798 ; O1:       # %bb.0: # %entry
1799 ; O1-NEXT:    movq foo(%rip), %rax
1800 ; O1-NEXT:    movb $42, %al
1801 ; O1-NEXT:  .Lpcsection54:
1802 ; O1-NEXT:    xchgb %al, (%rdi)
1803 ; O1-NEXT:    movq $1, foo(%rip)
1804 ; O1-NEXT:    retq
1806 ; O2-LABEL: atomic8_xchg_seq_cst:
1807 ; O2:       # %bb.0: # %entry
1808 ; O2-NEXT:    movq foo(%rip), %rax
1809 ; O2-NEXT:    movb $42, %al
1810 ; O2-NEXT:  .Lpcsection54:
1811 ; O2-NEXT:    xchgb %al, (%rdi)
1812 ; O2-NEXT:    movq $1, foo(%rip)
1813 ; O2-NEXT:    retq
1815 ; O3-LABEL: atomic8_xchg_seq_cst:
1816 ; O3:       # %bb.0: # %entry
1817 ; O3-NEXT:    movq foo(%rip), %rax
1818 ; O3-NEXT:    movb $42, %al
1819 ; O3-NEXT:  .Lpcsection54:
1820 ; O3-NEXT:    xchgb %al, (%rdi)
1821 ; O3-NEXT:    movq $1, foo(%rip)
1822 ; O3-NEXT:    retq
1823 entry:
1824   load volatile i64, ptr @foo, align 8
1825   %x = atomicrmw xchg ptr %a, i8 42 seq_cst, align 1, !pcsections !0
1826   store volatile i64 1, ptr @foo, align 8
1827   ret void
1830 define void @atomic8_add_seq_cst(ptr %a) {
1831 ; O0-LABEL: atomic8_add_seq_cst:
1832 ; O0:       # %bb.0: # %entry
1833 ; O0-NEXT:    movq foo(%rip), %rax
1834 ; O0-NEXT:  .Lpcsection63:
1835 ; O0-NEXT:    lock addb $42, (%rdi)
1836 ; O0-NEXT:    movq $1, foo
1837 ; O0-NEXT:    retq
1839 ; O1-LABEL: atomic8_add_seq_cst:
1840 ; O1:       # %bb.0: # %entry
1841 ; O1-NEXT:    movq foo(%rip), %rax
1842 ; O1-NEXT:  .Lpcsection55:
1843 ; O1-NEXT:    lock addb $42, (%rdi)
1844 ; O1-NEXT:    movq $1, foo(%rip)
1845 ; O1-NEXT:    retq
1847 ; O2-LABEL: atomic8_add_seq_cst:
1848 ; O2:       # %bb.0: # %entry
1849 ; O2-NEXT:    movq foo(%rip), %rax
1850 ; O2-NEXT:  .Lpcsection55:
1851 ; O2-NEXT:    lock addb $42, (%rdi)
1852 ; O2-NEXT:    movq $1, foo(%rip)
1853 ; O2-NEXT:    retq
1855 ; O3-LABEL: atomic8_add_seq_cst:
1856 ; O3:       # %bb.0: # %entry
1857 ; O3-NEXT:    movq foo(%rip), %rax
1858 ; O3-NEXT:  .Lpcsection55:
1859 ; O3-NEXT:    lock addb $42, (%rdi)
1860 ; O3-NEXT:    movq $1, foo(%rip)
1861 ; O3-NEXT:    retq
1862 entry:
1863   load volatile i64, ptr @foo, align 8
1864   %x = atomicrmw add ptr %a, i8 42 seq_cst, align 1, !pcsections !0
1865   store volatile i64 1, ptr @foo, align 8
1866   ret void
1869 define void @atomic8_sub_seq_cst(ptr %a) {
1870 ; O0-LABEL: atomic8_sub_seq_cst:
1871 ; O0:       # %bb.0: # %entry
1872 ; O0-NEXT:    movq foo(%rip), %rax
1873 ; O0-NEXT:  .Lpcsection64:
1874 ; O0-NEXT:    lock subb $42, (%rdi)
1875 ; O0-NEXT:    movq $1, foo
1876 ; O0-NEXT:    retq
1878 ; O1-LABEL: atomic8_sub_seq_cst:
1879 ; O1:       # %bb.0: # %entry
1880 ; O1-NEXT:    movq foo(%rip), %rax
1881 ; O1-NEXT:  .Lpcsection56:
1882 ; O1-NEXT:    lock subb $42, (%rdi)
1883 ; O1-NEXT:    movq $1, foo(%rip)
1884 ; O1-NEXT:    retq
1886 ; O2-LABEL: atomic8_sub_seq_cst:
1887 ; O2:       # %bb.0: # %entry
1888 ; O2-NEXT:    movq foo(%rip), %rax
1889 ; O2-NEXT:  .Lpcsection56:
1890 ; O2-NEXT:    lock subb $42, (%rdi)
1891 ; O2-NEXT:    movq $1, foo(%rip)
1892 ; O2-NEXT:    retq
1894 ; O3-LABEL: atomic8_sub_seq_cst:
1895 ; O3:       # %bb.0: # %entry
1896 ; O3-NEXT:    movq foo(%rip), %rax
1897 ; O3-NEXT:  .Lpcsection56:
1898 ; O3-NEXT:    lock subb $42, (%rdi)
1899 ; O3-NEXT:    movq $1, foo(%rip)
1900 ; O3-NEXT:    retq
1901 entry:
1902   load volatile i64, ptr @foo, align 8
1903   %x = atomicrmw sub ptr %a, i8 42 seq_cst, align 1, !pcsections !0
1904   store volatile i64 1, ptr @foo, align 8
1905   ret void
1908 define void @atomic8_and_seq_cst(ptr %a) {
1909 ; O0-LABEL: atomic8_and_seq_cst:
1910 ; O0:       # %bb.0: # %entry
1911 ; O0-NEXT:    movq foo(%rip), %rax
1912 ; O0-NEXT:  .Lpcsection65:
1913 ; O0-NEXT:    lock andb $42, (%rdi)
1914 ; O0-NEXT:    movq $1, foo
1915 ; O0-NEXT:    retq
1917 ; O1-LABEL: atomic8_and_seq_cst:
1918 ; O1:       # %bb.0: # %entry
1919 ; O1-NEXT:    movq foo(%rip), %rax
1920 ; O1-NEXT:  .Lpcsection57:
1921 ; O1-NEXT:    lock andb $42, (%rdi)
1922 ; O1-NEXT:    movq $1, foo(%rip)
1923 ; O1-NEXT:    retq
1925 ; O2-LABEL: atomic8_and_seq_cst:
1926 ; O2:       # %bb.0: # %entry
1927 ; O2-NEXT:    movq foo(%rip), %rax
1928 ; O2-NEXT:  .Lpcsection57:
1929 ; O2-NEXT:    lock andb $42, (%rdi)
1930 ; O2-NEXT:    movq $1, foo(%rip)
1931 ; O2-NEXT:    retq
1933 ; O3-LABEL: atomic8_and_seq_cst:
1934 ; O3:       # %bb.0: # %entry
1935 ; O3-NEXT:    movq foo(%rip), %rax
1936 ; O3-NEXT:  .Lpcsection57:
1937 ; O3-NEXT:    lock andb $42, (%rdi)
1938 ; O3-NEXT:    movq $1, foo(%rip)
1939 ; O3-NEXT:    retq
1940 entry:
1941   load volatile i64, ptr @foo, align 8
1942   %x = atomicrmw and ptr %a, i8 42 seq_cst, align 1, !pcsections !0
1943   store volatile i64 1, ptr @foo, align 8
1944   ret void
1947 define void @atomic8_or_seq_cst(ptr %a) {
1948 ; O0-LABEL: atomic8_or_seq_cst:
1949 ; O0:       # %bb.0: # %entry
1950 ; O0-NEXT:    movq foo(%rip), %rax
1951 ; O0-NEXT:  .Lpcsection66:
1952 ; O0-NEXT:    lock orb $42, (%rdi)
1953 ; O0-NEXT:    movq $1, foo
1954 ; O0-NEXT:    retq
1956 ; O1-LABEL: atomic8_or_seq_cst:
1957 ; O1:       # %bb.0: # %entry
1958 ; O1-NEXT:    movq foo(%rip), %rax
1959 ; O1-NEXT:  .Lpcsection58:
1960 ; O1-NEXT:    lock orb $42, (%rdi)
1961 ; O1-NEXT:    movq $1, foo(%rip)
1962 ; O1-NEXT:    retq
1964 ; O2-LABEL: atomic8_or_seq_cst:
1965 ; O2:       # %bb.0: # %entry
1966 ; O2-NEXT:    movq foo(%rip), %rax
1967 ; O2-NEXT:  .Lpcsection58:
1968 ; O2-NEXT:    lock orb $42, (%rdi)
1969 ; O2-NEXT:    movq $1, foo(%rip)
1970 ; O2-NEXT:    retq
1972 ; O3-LABEL: atomic8_or_seq_cst:
1973 ; O3:       # %bb.0: # %entry
1974 ; O3-NEXT:    movq foo(%rip), %rax
1975 ; O3-NEXT:  .Lpcsection58:
1976 ; O3-NEXT:    lock orb $42, (%rdi)
1977 ; O3-NEXT:    movq $1, foo(%rip)
1978 ; O3-NEXT:    retq
1979 entry:
1980   load volatile i64, ptr @foo, align 8
1981   %x = atomicrmw or ptr %a, i8 42 seq_cst, align 1, !pcsections !0
1982   store volatile i64 1, ptr @foo, align 8
1983   ret void
1986 define void @atomic8_xor_seq_cst(ptr %a) {
1987 ; O0-LABEL: atomic8_xor_seq_cst:
1988 ; O0:       # %bb.0: # %entry
1989 ; O0-NEXT:    movq foo(%rip), %rax
1990 ; O0-NEXT:  .Lpcsection67:
1991 ; O0-NEXT:    lock xorb $42, (%rdi)
1992 ; O0-NEXT:    movq $1, foo
1993 ; O0-NEXT:    retq
1995 ; O1-LABEL: atomic8_xor_seq_cst:
1996 ; O1:       # %bb.0: # %entry
1997 ; O1-NEXT:    movq foo(%rip), %rax
1998 ; O1-NEXT:  .Lpcsection59:
1999 ; O1-NEXT:    lock xorb $42, (%rdi)
2000 ; O1-NEXT:    movq $1, foo(%rip)
2001 ; O1-NEXT:    retq
2003 ; O2-LABEL: atomic8_xor_seq_cst:
2004 ; O2:       # %bb.0: # %entry
2005 ; O2-NEXT:    movq foo(%rip), %rax
2006 ; O2-NEXT:  .Lpcsection59:
2007 ; O2-NEXT:    lock xorb $42, (%rdi)
2008 ; O2-NEXT:    movq $1, foo(%rip)
2009 ; O2-NEXT:    retq
2011 ; O3-LABEL: atomic8_xor_seq_cst:
2012 ; O3:       # %bb.0: # %entry
2013 ; O3-NEXT:    movq foo(%rip), %rax
2014 ; O3-NEXT:  .Lpcsection59:
2015 ; O3-NEXT:    lock xorb $42, (%rdi)
2016 ; O3-NEXT:    movq $1, foo(%rip)
2017 ; O3-NEXT:    retq
2018 entry:
2019   load volatile i64, ptr @foo, align 8
2020   %x = atomicrmw xor ptr %a, i8 42 seq_cst, align 1, !pcsections !0
2021   store volatile i64 1, ptr @foo, align 8
2022   ret void
2025 define void @atomic8_nand_seq_cst(ptr %a) {
2026 ; O0-LABEL: atomic8_nand_seq_cst:
2027 ; O0:       # %bb.0: # %entry
2028 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
2029 ; O0-NEXT:    movq foo, %rax
2030 ; O0-NEXT:  .Lpcsection68:
2031 ; O0-NEXT:    movb (%rdi), %al
2032 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
2033 ; O0-NEXT:  .LBB44_1: # %atomicrmw.start
2034 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
2035 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2036 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
2037 ; O0-NEXT:    movb %al, %dl
2038 ; O0-NEXT:  .Lpcsection69:
2039 ; O0-NEXT:    notb %dl
2040 ; O0-NEXT:  .Lpcsection70:
2041 ; O0-NEXT:    orb $-43, %dl
2042 ; O0-NEXT:  .Lpcsection71:
2043 ; O0-NEXT:    lock cmpxchgb %dl, (%rcx)
2044 ; O0-NEXT:  .Lpcsection72:
2045 ; O0-NEXT:    sete %cl
2046 ; O0-NEXT:  .Lpcsection73:
2047 ; O0-NEXT:    testb $1, %cl
2048 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
2049 ; O0-NEXT:  .Lpcsection74:
2050 ; O0-NEXT:    jne .LBB44_2
2051 ; O0-NEXT:    jmp .LBB44_1
2052 ; O0-NEXT:  .LBB44_2: # %atomicrmw.end
2053 ; O0-NEXT:    movq $1, foo
2054 ; O0-NEXT:    retq
2056 ; O1-LABEL: atomic8_nand_seq_cst:
2057 ; O1:       # %bb.0: # %entry
2058 ; O1-NEXT:    movq foo(%rip), %rax
2059 ; O1-NEXT:  .Lpcsection60:
2060 ; O1-NEXT:    movzbl (%rdi), %eax
2061 ; O1-NEXT:    .p2align 4, 0x90
2062 ; O1-NEXT:  .LBB44_1: # %atomicrmw.start
2063 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
2064 ; O1-NEXT:    movl %eax, %ecx
2065 ; O1-NEXT:  .Lpcsection61:
2066 ; O1-NEXT:    notb %cl
2067 ; O1-NEXT:  .Lpcsection62:
2068 ; O1-NEXT:    orb $-43, %cl
2069 ; O1-NEXT:  .Lpcsection63:
2070 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2071 ; O1-NEXT:  .Lpcsection64:
2072 ; O1-NEXT:    jne .LBB44_1
2073 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
2074 ; O1-NEXT:    movq $1, foo(%rip)
2075 ; O1-NEXT:    retq
2077 ; O2-LABEL: atomic8_nand_seq_cst:
2078 ; O2:       # %bb.0: # %entry
2079 ; O2-NEXT:    movq foo(%rip), %rax
2080 ; O2-NEXT:  .Lpcsection60:
2081 ; O2-NEXT:    movzbl (%rdi), %eax
2082 ; O2-NEXT:    .p2align 4, 0x90
2083 ; O2-NEXT:  .LBB44_1: # %atomicrmw.start
2084 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
2085 ; O2-NEXT:    movl %eax, %ecx
2086 ; O2-NEXT:  .Lpcsection61:
2087 ; O2-NEXT:    notb %cl
2088 ; O2-NEXT:  .Lpcsection62:
2089 ; O2-NEXT:    orb $-43, %cl
2090 ; O2-NEXT:  .Lpcsection63:
2091 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2092 ; O2-NEXT:  .Lpcsection64:
2093 ; O2-NEXT:    jne .LBB44_1
2094 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
2095 ; O2-NEXT:    movq $1, foo(%rip)
2096 ; O2-NEXT:    retq
2098 ; O3-LABEL: atomic8_nand_seq_cst:
2099 ; O3:       # %bb.0: # %entry
2100 ; O3-NEXT:    movq foo(%rip), %rax
2101 ; O3-NEXT:  .Lpcsection60:
2102 ; O3-NEXT:    movzbl (%rdi), %eax
2103 ; O3-NEXT:    .p2align 4, 0x90
2104 ; O3-NEXT:  .LBB44_1: # %atomicrmw.start
2105 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
2106 ; O3-NEXT:    movl %eax, %ecx
2107 ; O3-NEXT:  .Lpcsection61:
2108 ; O3-NEXT:    notb %cl
2109 ; O3-NEXT:  .Lpcsection62:
2110 ; O3-NEXT:    orb $-43, %cl
2111 ; O3-NEXT:  .Lpcsection63:
2112 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2113 ; O3-NEXT:  .Lpcsection64:
2114 ; O3-NEXT:    jne .LBB44_1
2115 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
2116 ; O3-NEXT:    movq $1, foo(%rip)
2117 ; O3-NEXT:    retq
2118 entry:
2119   load volatile i64, ptr @foo, align 8
2120   %x = atomicrmw nand ptr %a, i8 42 seq_cst, align 1, !pcsections !0
2121   store volatile i64 1, ptr @foo, align 8
2122   ret void
2125 define void @atomic8_cas_monotonic(ptr %a) {
2126 ; O0-LABEL: atomic8_cas_monotonic:
2127 ; O0:       # %bb.0: # %entry
2128 ; O0-NEXT:    movq foo(%rip), %rax
2129 ; O0-NEXT:    movb $42, %al
2130 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
2131 ; O0-NEXT:    movb $1, %cl
2132 ; O0-NEXT:  .Lpcsection75:
2133 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2134 ; O0-NEXT:  .Lpcsection76:
2135 ; O0-NEXT:    # kill: def $dl killed $al
2136 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2137 ; O0-NEXT:  .Lpcsection77:
2138 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2139 ; O0-NEXT:  .Lpcsection78:
2140 ; O0-NEXT:    # kill: def $dl killed $al
2141 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2142 ; O0-NEXT:  .Lpcsection79:
2143 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2144 ; O0-NEXT:    movq $1, foo
2145 ; O0-NEXT:    retq
2147 ; O1-LABEL: atomic8_cas_monotonic:
2148 ; O1:       # %bb.0: # %entry
2149 ; O1-NEXT:    movq foo(%rip), %rax
2150 ; O1-NEXT:    movb $1, %cl
2151 ; O1-NEXT:  .Lpcsection65:
2152 ; O1-NEXT:    movb $42, %al
2153 ; O1-NEXT:  .Lpcsection66:
2154 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2155 ; O1-NEXT:  .Lpcsection67:
2156 ; O1-NEXT:    movb $42, %al
2157 ; O1-NEXT:  .Lpcsection68:
2158 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2159 ; O1-NEXT:  .Lpcsection69:
2160 ; O1-NEXT:    movb $42, %al
2161 ; O1-NEXT:  .Lpcsection70:
2162 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2163 ; O1-NEXT:    movq $1, foo(%rip)
2164 ; O1-NEXT:    retq
2166 ; O2-LABEL: atomic8_cas_monotonic:
2167 ; O2:       # %bb.0: # %entry
2168 ; O2-NEXT:    movq foo(%rip), %rax
2169 ; O2-NEXT:    movb $1, %cl
2170 ; O2-NEXT:  .Lpcsection65:
2171 ; O2-NEXT:    movb $42, %al
2172 ; O2-NEXT:  .Lpcsection66:
2173 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2174 ; O2-NEXT:  .Lpcsection67:
2175 ; O2-NEXT:    movb $42, %al
2176 ; O2-NEXT:  .Lpcsection68:
2177 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2178 ; O2-NEXT:  .Lpcsection69:
2179 ; O2-NEXT:    movb $42, %al
2180 ; O2-NEXT:  .Lpcsection70:
2181 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2182 ; O2-NEXT:    movq $1, foo(%rip)
2183 ; O2-NEXT:    retq
2185 ; O3-LABEL: atomic8_cas_monotonic:
2186 ; O3:       # %bb.0: # %entry
2187 ; O3-NEXT:    movq foo(%rip), %rax
2188 ; O3-NEXT:    movb $1, %cl
2189 ; O3-NEXT:  .Lpcsection65:
2190 ; O3-NEXT:    movb $42, %al
2191 ; O3-NEXT:  .Lpcsection66:
2192 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2193 ; O3-NEXT:  .Lpcsection67:
2194 ; O3-NEXT:    movb $42, %al
2195 ; O3-NEXT:  .Lpcsection68:
2196 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2197 ; O3-NEXT:  .Lpcsection69:
2198 ; O3-NEXT:    movb $42, %al
2199 ; O3-NEXT:  .Lpcsection70:
2200 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2201 ; O3-NEXT:    movq $1, foo(%rip)
2202 ; O3-NEXT:    retq
2203 entry:
2204   load volatile i64, ptr @foo, align 8
2205   %x = cmpxchg ptr %a, i8 42, i8 1 monotonic monotonic, align 1, !pcsections !0
2206   %y = cmpxchg ptr %a, i8 42, i8 1 monotonic acquire, align 1, !pcsections !0
2207   %z = cmpxchg ptr %a, i8 42, i8 1 monotonic seq_cst, align 1, !pcsections !0
2208   store volatile i64 1, ptr @foo, align 8
2209   ret void
2212 define void @atomic8_cas_acquire(ptr %a) {
2213 ; O0-LABEL: atomic8_cas_acquire:
2214 ; O0:       # %bb.0: # %entry
2215 ; O0-NEXT:    movq foo(%rip), %rax
2216 ; O0-NEXT:    movb $42, %al
2217 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
2218 ; O0-NEXT:    movb $1, %cl
2219 ; O0-NEXT:  .Lpcsection80:
2220 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2221 ; O0-NEXT:  .Lpcsection81:
2222 ; O0-NEXT:    # kill: def $dl killed $al
2223 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2224 ; O0-NEXT:  .Lpcsection82:
2225 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2226 ; O0-NEXT:  .Lpcsection83:
2227 ; O0-NEXT:    # kill: def $dl killed $al
2228 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2229 ; O0-NEXT:  .Lpcsection84:
2230 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2231 ; O0-NEXT:    movq $1, foo
2232 ; O0-NEXT:    retq
2234 ; O1-LABEL: atomic8_cas_acquire:
2235 ; O1:       # %bb.0: # %entry
2236 ; O1-NEXT:    movq foo(%rip), %rax
2237 ; O1-NEXT:    movb $1, %cl
2238 ; O1-NEXT:  .Lpcsection71:
2239 ; O1-NEXT:    movb $42, %al
2240 ; O1-NEXT:  .Lpcsection72:
2241 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2242 ; O1-NEXT:  .Lpcsection73:
2243 ; O1-NEXT:    movb $42, %al
2244 ; O1-NEXT:  .Lpcsection74:
2245 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2246 ; O1-NEXT:  .Lpcsection75:
2247 ; O1-NEXT:    movb $42, %al
2248 ; O1-NEXT:  .Lpcsection76:
2249 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2250 ; O1-NEXT:    movq $1, foo(%rip)
2251 ; O1-NEXT:    retq
2253 ; O2-LABEL: atomic8_cas_acquire:
2254 ; O2:       # %bb.0: # %entry
2255 ; O2-NEXT:    movq foo(%rip), %rax
2256 ; O2-NEXT:    movb $1, %cl
2257 ; O2-NEXT:  .Lpcsection71:
2258 ; O2-NEXT:    movb $42, %al
2259 ; O2-NEXT:  .Lpcsection72:
2260 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2261 ; O2-NEXT:  .Lpcsection73:
2262 ; O2-NEXT:    movb $42, %al
2263 ; O2-NEXT:  .Lpcsection74:
2264 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2265 ; O2-NEXT:  .Lpcsection75:
2266 ; O2-NEXT:    movb $42, %al
2267 ; O2-NEXT:  .Lpcsection76:
2268 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2269 ; O2-NEXT:    movq $1, foo(%rip)
2270 ; O2-NEXT:    retq
2272 ; O3-LABEL: atomic8_cas_acquire:
2273 ; O3:       # %bb.0: # %entry
2274 ; O3-NEXT:    movq foo(%rip), %rax
2275 ; O3-NEXT:    movb $1, %cl
2276 ; O3-NEXT:  .Lpcsection71:
2277 ; O3-NEXT:    movb $42, %al
2278 ; O3-NEXT:  .Lpcsection72:
2279 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2280 ; O3-NEXT:  .Lpcsection73:
2281 ; O3-NEXT:    movb $42, %al
2282 ; O3-NEXT:  .Lpcsection74:
2283 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2284 ; O3-NEXT:  .Lpcsection75:
2285 ; O3-NEXT:    movb $42, %al
2286 ; O3-NEXT:  .Lpcsection76:
2287 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2288 ; O3-NEXT:    movq $1, foo(%rip)
2289 ; O3-NEXT:    retq
2290 entry:
2291   load volatile i64, ptr @foo, align 8
2292   %x = cmpxchg ptr %a, i8 42, i8 1 acquire monotonic, align 1, !pcsections !0
2293   %y = cmpxchg ptr %a, i8 42, i8 1 acquire acquire, align 1, !pcsections !0
2294   %z = cmpxchg ptr %a, i8 42, i8 1 acquire seq_cst, align 1, !pcsections !0
2295   store volatile i64 1, ptr @foo, align 8
2296   ret void
2299 define void @atomic8_cas_release(ptr %a) {
2300 ; O0-LABEL: atomic8_cas_release:
2301 ; O0:       # %bb.0: # %entry
2302 ; O0-NEXT:    movq foo(%rip), %rax
2303 ; O0-NEXT:    movb $42, %al
2304 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
2305 ; O0-NEXT:    movb $1, %cl
2306 ; O0-NEXT:  .Lpcsection85:
2307 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2308 ; O0-NEXT:  .Lpcsection86:
2309 ; O0-NEXT:    # kill: def $dl killed $al
2310 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2311 ; O0-NEXT:  .Lpcsection87:
2312 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2313 ; O0-NEXT:  .Lpcsection88:
2314 ; O0-NEXT:    # kill: def $dl killed $al
2315 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2316 ; O0-NEXT:  .Lpcsection89:
2317 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2318 ; O0-NEXT:    movq $1, foo
2319 ; O0-NEXT:    retq
2321 ; O1-LABEL: atomic8_cas_release:
2322 ; O1:       # %bb.0: # %entry
2323 ; O1-NEXT:    movq foo(%rip), %rax
2324 ; O1-NEXT:    movb $1, %cl
2325 ; O1-NEXT:  .Lpcsection77:
2326 ; O1-NEXT:    movb $42, %al
2327 ; O1-NEXT:  .Lpcsection78:
2328 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2329 ; O1-NEXT:  .Lpcsection79:
2330 ; O1-NEXT:    movb $42, %al
2331 ; O1-NEXT:  .Lpcsection80:
2332 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2333 ; O1-NEXT:  .Lpcsection81:
2334 ; O1-NEXT:    movb $42, %al
2335 ; O1-NEXT:  .Lpcsection82:
2336 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2337 ; O1-NEXT:    movq $1, foo(%rip)
2338 ; O1-NEXT:    retq
2340 ; O2-LABEL: atomic8_cas_release:
2341 ; O2:       # %bb.0: # %entry
2342 ; O2-NEXT:    movq foo(%rip), %rax
2343 ; O2-NEXT:    movb $1, %cl
2344 ; O2-NEXT:  .Lpcsection77:
2345 ; O2-NEXT:    movb $42, %al
2346 ; O2-NEXT:  .Lpcsection78:
2347 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2348 ; O2-NEXT:  .Lpcsection79:
2349 ; O2-NEXT:    movb $42, %al
2350 ; O2-NEXT:  .Lpcsection80:
2351 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2352 ; O2-NEXT:  .Lpcsection81:
2353 ; O2-NEXT:    movb $42, %al
2354 ; O2-NEXT:  .Lpcsection82:
2355 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2356 ; O2-NEXT:    movq $1, foo(%rip)
2357 ; O2-NEXT:    retq
2359 ; O3-LABEL: atomic8_cas_release:
2360 ; O3:       # %bb.0: # %entry
2361 ; O3-NEXT:    movq foo(%rip), %rax
2362 ; O3-NEXT:    movb $1, %cl
2363 ; O3-NEXT:  .Lpcsection77:
2364 ; O3-NEXT:    movb $42, %al
2365 ; O3-NEXT:  .Lpcsection78:
2366 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2367 ; O3-NEXT:  .Lpcsection79:
2368 ; O3-NEXT:    movb $42, %al
2369 ; O3-NEXT:  .Lpcsection80:
2370 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2371 ; O3-NEXT:  .Lpcsection81:
2372 ; O3-NEXT:    movb $42, %al
2373 ; O3-NEXT:  .Lpcsection82:
2374 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2375 ; O3-NEXT:    movq $1, foo(%rip)
2376 ; O3-NEXT:    retq
2377 entry:
2378   load volatile i64, ptr @foo, align 8
2379   %x = cmpxchg ptr %a, i8 42, i8 1 release monotonic, align 1, !pcsections !0
2380   %y = cmpxchg ptr %a, i8 42, i8 1 release acquire, align 1, !pcsections !0
2381   %z = cmpxchg ptr %a, i8 42, i8 1 release seq_cst, align 1, !pcsections !0
2382   store volatile i64 1, ptr @foo, align 8
2383   ret void
2386 define void @atomic8_cas_acq_rel(ptr %a) {
2387 ; O0-LABEL: atomic8_cas_acq_rel:
2388 ; O0:       # %bb.0: # %entry
2389 ; O0-NEXT:    movq foo(%rip), %rax
2390 ; O0-NEXT:    movb $42, %al
2391 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
2392 ; O0-NEXT:    movb $1, %cl
2393 ; O0-NEXT:  .Lpcsection90:
2394 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2395 ; O0-NEXT:  .Lpcsection91:
2396 ; O0-NEXT:    # kill: def $dl killed $al
2397 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2398 ; O0-NEXT:  .Lpcsection92:
2399 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2400 ; O0-NEXT:  .Lpcsection93:
2401 ; O0-NEXT:    # kill: def $dl killed $al
2402 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2403 ; O0-NEXT:  .Lpcsection94:
2404 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2405 ; O0-NEXT:    movq $1, foo
2406 ; O0-NEXT:    retq
2408 ; O1-LABEL: atomic8_cas_acq_rel:
2409 ; O1:       # %bb.0: # %entry
2410 ; O1-NEXT:    movq foo(%rip), %rax
2411 ; O1-NEXT:    movb $1, %cl
2412 ; O1-NEXT:  .Lpcsection83:
2413 ; O1-NEXT:    movb $42, %al
2414 ; O1-NEXT:  .Lpcsection84:
2415 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2416 ; O1-NEXT:  .Lpcsection85:
2417 ; O1-NEXT:    movb $42, %al
2418 ; O1-NEXT:  .Lpcsection86:
2419 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2420 ; O1-NEXT:  .Lpcsection87:
2421 ; O1-NEXT:    movb $42, %al
2422 ; O1-NEXT:  .Lpcsection88:
2423 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2424 ; O1-NEXT:    movq $1, foo(%rip)
2425 ; O1-NEXT:    retq
2427 ; O2-LABEL: atomic8_cas_acq_rel:
2428 ; O2:       # %bb.0: # %entry
2429 ; O2-NEXT:    movq foo(%rip), %rax
2430 ; O2-NEXT:    movb $1, %cl
2431 ; O2-NEXT:  .Lpcsection83:
2432 ; O2-NEXT:    movb $42, %al
2433 ; O2-NEXT:  .Lpcsection84:
2434 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2435 ; O2-NEXT:  .Lpcsection85:
2436 ; O2-NEXT:    movb $42, %al
2437 ; O2-NEXT:  .Lpcsection86:
2438 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2439 ; O2-NEXT:  .Lpcsection87:
2440 ; O2-NEXT:    movb $42, %al
2441 ; O2-NEXT:  .Lpcsection88:
2442 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2443 ; O2-NEXT:    movq $1, foo(%rip)
2444 ; O2-NEXT:    retq
2446 ; O3-LABEL: atomic8_cas_acq_rel:
2447 ; O3:       # %bb.0: # %entry
2448 ; O3-NEXT:    movq foo(%rip), %rax
2449 ; O3-NEXT:    movb $1, %cl
2450 ; O3-NEXT:  .Lpcsection83:
2451 ; O3-NEXT:    movb $42, %al
2452 ; O3-NEXT:  .Lpcsection84:
2453 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2454 ; O3-NEXT:  .Lpcsection85:
2455 ; O3-NEXT:    movb $42, %al
2456 ; O3-NEXT:  .Lpcsection86:
2457 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2458 ; O3-NEXT:  .Lpcsection87:
2459 ; O3-NEXT:    movb $42, %al
2460 ; O3-NEXT:  .Lpcsection88:
2461 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2462 ; O3-NEXT:    movq $1, foo(%rip)
2463 ; O3-NEXT:    retq
2464 entry:
2465   load volatile i64, ptr @foo, align 8
2466   %x = cmpxchg ptr %a, i8 42, i8 1 acq_rel monotonic, align 1, !pcsections !0
2467   %y = cmpxchg ptr %a, i8 42, i8 1 acq_rel acquire, align 1, !pcsections !0
2468   %z = cmpxchg ptr %a, i8 42, i8 1 acq_rel seq_cst, align 1, !pcsections !0
2469   store volatile i64 1, ptr @foo, align 8
2470   ret void
2473 define void @atomic8_cas_seq_cst(ptr %a) {
2474 ; O0-LABEL: atomic8_cas_seq_cst:
2475 ; O0:       # %bb.0: # %entry
2476 ; O0-NEXT:    movq foo(%rip), %rax
2477 ; O0-NEXT:    movb $42, %al
2478 ; O0-NEXT:    movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
2479 ; O0-NEXT:    movb $1, %cl
2480 ; O0-NEXT:  .Lpcsection95:
2481 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2482 ; O0-NEXT:  .Lpcsection96:
2483 ; O0-NEXT:    # kill: def $dl killed $al
2484 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2485 ; O0-NEXT:  .Lpcsection97:
2486 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2487 ; O0-NEXT:  .Lpcsection98:
2488 ; O0-NEXT:    # kill: def $dl killed $al
2489 ; O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload
2490 ; O0-NEXT:  .Lpcsection99:
2491 ; O0-NEXT:    lock cmpxchgb %cl, (%rdi)
2492 ; O0-NEXT:    movq $1, foo
2493 ; O0-NEXT:    retq
2495 ; O1-LABEL: atomic8_cas_seq_cst:
2496 ; O1:       # %bb.0: # %entry
2497 ; O1-NEXT:    movq foo(%rip), %rax
2498 ; O1-NEXT:    movb $1, %cl
2499 ; O1-NEXT:  .Lpcsection89:
2500 ; O1-NEXT:    movb $42, %al
2501 ; O1-NEXT:  .Lpcsection90:
2502 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2503 ; O1-NEXT:  .Lpcsection91:
2504 ; O1-NEXT:    movb $42, %al
2505 ; O1-NEXT:  .Lpcsection92:
2506 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2507 ; O1-NEXT:  .Lpcsection93:
2508 ; O1-NEXT:    movb $42, %al
2509 ; O1-NEXT:  .Lpcsection94:
2510 ; O1-NEXT:    lock cmpxchgb %cl, (%rdi)
2511 ; O1-NEXT:    movq $1, foo(%rip)
2512 ; O1-NEXT:    retq
2514 ; O2-LABEL: atomic8_cas_seq_cst:
2515 ; O2:       # %bb.0: # %entry
2516 ; O2-NEXT:    movq foo(%rip), %rax
2517 ; O2-NEXT:    movb $1, %cl
2518 ; O2-NEXT:  .Lpcsection89:
2519 ; O2-NEXT:    movb $42, %al
2520 ; O2-NEXT:  .Lpcsection90:
2521 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2522 ; O2-NEXT:  .Lpcsection91:
2523 ; O2-NEXT:    movb $42, %al
2524 ; O2-NEXT:  .Lpcsection92:
2525 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2526 ; O2-NEXT:  .Lpcsection93:
2527 ; O2-NEXT:    movb $42, %al
2528 ; O2-NEXT:  .Lpcsection94:
2529 ; O2-NEXT:    lock cmpxchgb %cl, (%rdi)
2530 ; O2-NEXT:    movq $1, foo(%rip)
2531 ; O2-NEXT:    retq
2533 ; O3-LABEL: atomic8_cas_seq_cst:
2534 ; O3:       # %bb.0: # %entry
2535 ; O3-NEXT:    movq foo(%rip), %rax
2536 ; O3-NEXT:    movb $1, %cl
2537 ; O3-NEXT:  .Lpcsection89:
2538 ; O3-NEXT:    movb $42, %al
2539 ; O3-NEXT:  .Lpcsection90:
2540 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2541 ; O3-NEXT:  .Lpcsection91:
2542 ; O3-NEXT:    movb $42, %al
2543 ; O3-NEXT:  .Lpcsection92:
2544 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2545 ; O3-NEXT:  .Lpcsection93:
2546 ; O3-NEXT:    movb $42, %al
2547 ; O3-NEXT:  .Lpcsection94:
2548 ; O3-NEXT:    lock cmpxchgb %cl, (%rdi)
2549 ; O3-NEXT:    movq $1, foo(%rip)
2550 ; O3-NEXT:    retq
2551 entry:
2552   load volatile i64, ptr @foo, align 8
2553   %x = cmpxchg ptr %a, i8 42, i8 1 seq_cst monotonic, align 1, !pcsections !0
2554   %y = cmpxchg ptr %a, i8 42, i8 1 seq_cst acquire, align 1, !pcsections !0
2555   %z = cmpxchg ptr %a, i8 42, i8 1 seq_cst seq_cst, align 1, !pcsections !0
2556   store volatile i64 1, ptr @foo, align 8
2557   ret void
2560 define i16 @atomic16_load_unordered(ptr %a) {
2561 ; O0-LABEL: atomic16_load_unordered:
2562 ; O0:       # %bb.0: # %entry
2563 ; O0-NEXT:    movq foo(%rip), %rax
2564 ; O0-NEXT:  .Lpcsection100:
2565 ; O0-NEXT:    movw (%rdi), %ax
2566 ; O0-NEXT:    movq $1, foo
2567 ; O0-NEXT:    retq
2569 ; O1-LABEL: atomic16_load_unordered:
2570 ; O1:       # %bb.0: # %entry
2571 ; O1-NEXT:    movq foo(%rip), %rax
2572 ; O1-NEXT:  .Lpcsection95:
2573 ; O1-NEXT:    movzwl (%rdi), %eax
2574 ; O1-NEXT:    movq $1, foo(%rip)
2575 ; O1-NEXT:    retq
2577 ; O2-LABEL: atomic16_load_unordered:
2578 ; O2:       # %bb.0: # %entry
2579 ; O2-NEXT:    movq foo(%rip), %rax
2580 ; O2-NEXT:  .Lpcsection95:
2581 ; O2-NEXT:    movzwl (%rdi), %eax
2582 ; O2-NEXT:    movq $1, foo(%rip)
2583 ; O2-NEXT:    retq
2585 ; O3-LABEL: atomic16_load_unordered:
2586 ; O3:       # %bb.0: # %entry
2587 ; O3-NEXT:    movq foo(%rip), %rax
2588 ; O3-NEXT:  .Lpcsection95:
2589 ; O3-NEXT:    movzwl (%rdi), %eax
2590 ; O3-NEXT:    movq $1, foo(%rip)
2591 ; O3-NEXT:    retq
2592 entry:
2593   load volatile i64, ptr @foo, align 8
2594   %x = load atomic i16, ptr %a unordered, align 2, !pcsections !0
2595   store volatile i64 1, ptr @foo, align 8
2596   ret i16 %x
2599 define i16 @atomic16_load_monotonic(ptr %a) {
2600 ; O0-LABEL: atomic16_load_monotonic:
2601 ; O0:       # %bb.0: # %entry
2602 ; O0-NEXT:    movq foo(%rip), %rax
2603 ; O0-NEXT:  .Lpcsection101:
2604 ; O0-NEXT:    movw (%rdi), %ax
2605 ; O0-NEXT:    movq $1, foo
2606 ; O0-NEXT:    retq
2608 ; O1-LABEL: atomic16_load_monotonic:
2609 ; O1:       # %bb.0: # %entry
2610 ; O1-NEXT:    movq foo(%rip), %rax
2611 ; O1-NEXT:  .Lpcsection96:
2612 ; O1-NEXT:    movzwl (%rdi), %eax
2613 ; O1-NEXT:    movq $1, foo(%rip)
2614 ; O1-NEXT:    retq
2616 ; O2-LABEL: atomic16_load_monotonic:
2617 ; O2:       # %bb.0: # %entry
2618 ; O2-NEXT:    movq foo(%rip), %rax
2619 ; O2-NEXT:  .Lpcsection96:
2620 ; O2-NEXT:    movzwl (%rdi), %eax
2621 ; O2-NEXT:    movq $1, foo(%rip)
2622 ; O2-NEXT:    retq
2624 ; O3-LABEL: atomic16_load_monotonic:
2625 ; O3:       # %bb.0: # %entry
2626 ; O3-NEXT:    movq foo(%rip), %rax
2627 ; O3-NEXT:  .Lpcsection96:
2628 ; O3-NEXT:    movzwl (%rdi), %eax
2629 ; O3-NEXT:    movq $1, foo(%rip)
2630 ; O3-NEXT:    retq
2631 entry:
2632   load volatile i64, ptr @foo, align 8
2633   %x = load atomic i16, ptr %a monotonic, align 2, !pcsections !0
2634   store volatile i64 1, ptr @foo, align 8
2635   ret i16 %x
2638 define i16 @atomic16_load_acquire(ptr %a) {
2639 ; O0-LABEL: atomic16_load_acquire:
2640 ; O0:       # %bb.0: # %entry
2641 ; O0-NEXT:    movq foo(%rip), %rax
2642 ; O0-NEXT:  .Lpcsection102:
2643 ; O0-NEXT:    movw (%rdi), %ax
2644 ; O0-NEXT:    movq $1, foo
2645 ; O0-NEXT:    retq
2647 ; O1-LABEL: atomic16_load_acquire:
2648 ; O1:       # %bb.0: # %entry
2649 ; O1-NEXT:    movq foo(%rip), %rax
2650 ; O1-NEXT:  .Lpcsection97:
2651 ; O1-NEXT:    movzwl (%rdi), %eax
2652 ; O1-NEXT:    movq $1, foo(%rip)
2653 ; O1-NEXT:    retq
2655 ; O2-LABEL: atomic16_load_acquire:
2656 ; O2:       # %bb.0: # %entry
2657 ; O2-NEXT:    movq foo(%rip), %rax
2658 ; O2-NEXT:  .Lpcsection97:
2659 ; O2-NEXT:    movzwl (%rdi), %eax
2660 ; O2-NEXT:    movq $1, foo(%rip)
2661 ; O2-NEXT:    retq
2663 ; O3-LABEL: atomic16_load_acquire:
2664 ; O3:       # %bb.0: # %entry
2665 ; O3-NEXT:    movq foo(%rip), %rax
2666 ; O3-NEXT:  .Lpcsection97:
2667 ; O3-NEXT:    movzwl (%rdi), %eax
2668 ; O3-NEXT:    movq $1, foo(%rip)
2669 ; O3-NEXT:    retq
2670 entry:
2671   load volatile i64, ptr @foo, align 8
2672   %x = load atomic i16, ptr %a acquire, align 2, !pcsections !0
2673   store volatile i64 1, ptr @foo, align 8
2674   ret i16 %x
2677 define i16 @atomic16_load_seq_cst(ptr %a) {
2678 ; O0-LABEL: atomic16_load_seq_cst:
2679 ; O0:       # %bb.0: # %entry
2680 ; O0-NEXT:    movq foo(%rip), %rax
2681 ; O0-NEXT:  .Lpcsection103:
2682 ; O0-NEXT:    movw (%rdi), %ax
2683 ; O0-NEXT:    movq $1, foo
2684 ; O0-NEXT:    retq
2686 ; O1-LABEL: atomic16_load_seq_cst:
2687 ; O1:       # %bb.0: # %entry
2688 ; O1-NEXT:    movq foo(%rip), %rax
2689 ; O1-NEXT:  .Lpcsection98:
2690 ; O1-NEXT:    movzwl (%rdi), %eax
2691 ; O1-NEXT:    movq $1, foo(%rip)
2692 ; O1-NEXT:    retq
2694 ; O2-LABEL: atomic16_load_seq_cst:
2695 ; O2:       # %bb.0: # %entry
2696 ; O2-NEXT:    movq foo(%rip), %rax
2697 ; O2-NEXT:  .Lpcsection98:
2698 ; O2-NEXT:    movzwl (%rdi), %eax
2699 ; O2-NEXT:    movq $1, foo(%rip)
2700 ; O2-NEXT:    retq
2702 ; O3-LABEL: atomic16_load_seq_cst:
2703 ; O3:       # %bb.0: # %entry
2704 ; O3-NEXT:    movq foo(%rip), %rax
2705 ; O3-NEXT:  .Lpcsection98:
2706 ; O3-NEXT:    movzwl (%rdi), %eax
2707 ; O3-NEXT:    movq $1, foo(%rip)
2708 ; O3-NEXT:    retq
2709 entry:
2710   load volatile i64, ptr @foo, align 8
2711   %x = load atomic i16, ptr %a seq_cst, align 2, !pcsections !0
2712   store volatile i64 1, ptr @foo, align 8
2713   ret i16 %x
2716 define void @atomic16_store_unordered(ptr %a) {
2717 ; O0-LABEL: atomic16_store_unordered:
2718 ; O0:       # %bb.0: # %entry
2719 ; O0-NEXT:    movq foo(%rip), %rax
2720 ; O0-NEXT:  .Lpcsection104:
2721 ; O0-NEXT:    movw $42, (%rdi)
2722 ; O0-NEXT:    movq $1, foo
2723 ; O0-NEXT:    retq
2725 ; O1-LABEL: atomic16_store_unordered:
2726 ; O1:       # %bb.0: # %entry
2727 ; O1-NEXT:    movq foo(%rip), %rax
2728 ; O1-NEXT:  .Lpcsection99:
2729 ; O1-NEXT:    movw $42, (%rdi)
2730 ; O1-NEXT:    movq $1, foo(%rip)
2731 ; O1-NEXT:    retq
2733 ; O2-LABEL: atomic16_store_unordered:
2734 ; O2:       # %bb.0: # %entry
2735 ; O2-NEXT:    movq foo(%rip), %rax
2736 ; O2-NEXT:  .Lpcsection99:
2737 ; O2-NEXT:    movw $42, (%rdi)
2738 ; O2-NEXT:    movq $1, foo(%rip)
2739 ; O2-NEXT:    retq
2741 ; O3-LABEL: atomic16_store_unordered:
2742 ; O3:       # %bb.0: # %entry
2743 ; O3-NEXT:    movq foo(%rip), %rax
2744 ; O3-NEXT:  .Lpcsection99:
2745 ; O3-NEXT:    movw $42, (%rdi)
2746 ; O3-NEXT:    movq $1, foo(%rip)
2747 ; O3-NEXT:    retq
2748 entry:
2749   load volatile i64, ptr @foo, align 8
2750   store atomic i16 42, ptr %a unordered, align 2, !pcsections !0
2751   store volatile i64 1, ptr @foo, align 8
2752   ret void
2755 define void @atomic16_store_monotonic(ptr %a) {
2756 ; O0-LABEL: atomic16_store_monotonic:
2757 ; O0:       # %bb.0: # %entry
2758 ; O0-NEXT:    movq foo(%rip), %rax
2759 ; O0-NEXT:  .Lpcsection105:
2760 ; O0-NEXT:    movw $42, (%rdi)
2761 ; O0-NEXT:    movq $1, foo
2762 ; O0-NEXT:    retq
2764 ; O1-LABEL: atomic16_store_monotonic:
2765 ; O1:       # %bb.0: # %entry
2766 ; O1-NEXT:    movq foo(%rip), %rax
2767 ; O1-NEXT:  .Lpcsection100:
2768 ; O1-NEXT:    movw $42, (%rdi)
2769 ; O1-NEXT:    movq $1, foo(%rip)
2770 ; O1-NEXT:    retq
2772 ; O2-LABEL: atomic16_store_monotonic:
2773 ; O2:       # %bb.0: # %entry
2774 ; O2-NEXT:    movq foo(%rip), %rax
2775 ; O2-NEXT:  .Lpcsection100:
2776 ; O2-NEXT:    movw $42, (%rdi)
2777 ; O2-NEXT:    movq $1, foo(%rip)
2778 ; O2-NEXT:    retq
2780 ; O3-LABEL: atomic16_store_monotonic:
2781 ; O3:       # %bb.0: # %entry
2782 ; O3-NEXT:    movq foo(%rip), %rax
2783 ; O3-NEXT:  .Lpcsection100:
2784 ; O3-NEXT:    movw $42, (%rdi)
2785 ; O3-NEXT:    movq $1, foo(%rip)
2786 ; O3-NEXT:    retq
2787 entry:
2788   load volatile i64, ptr @foo, align 8
2789   store atomic i16 42, ptr %a monotonic, align 2, !pcsections !0
2790   store volatile i64 1, ptr @foo, align 8
2791   ret void
2794 define void @atomic16_store_release(ptr %a) {
2795 ; O0-LABEL: atomic16_store_release:
2796 ; O0:       # %bb.0: # %entry
2797 ; O0-NEXT:    movq foo(%rip), %rax
2798 ; O0-NEXT:  .Lpcsection106:
2799 ; O0-NEXT:    movw $42, (%rdi)
2800 ; O0-NEXT:    movq $1, foo
2801 ; O0-NEXT:    retq
2803 ; O1-LABEL: atomic16_store_release:
2804 ; O1:       # %bb.0: # %entry
2805 ; O1-NEXT:    movq foo(%rip), %rax
2806 ; O1-NEXT:  .Lpcsection101:
2807 ; O1-NEXT:    movw $42, (%rdi)
2808 ; O1-NEXT:    movq $1, foo(%rip)
2809 ; O1-NEXT:    retq
2811 ; O2-LABEL: atomic16_store_release:
2812 ; O2:       # %bb.0: # %entry
2813 ; O2-NEXT:    movq foo(%rip), %rax
2814 ; O2-NEXT:  .Lpcsection101:
2815 ; O2-NEXT:    movw $42, (%rdi)
2816 ; O2-NEXT:    movq $1, foo(%rip)
2817 ; O2-NEXT:    retq
2819 ; O3-LABEL: atomic16_store_release:
2820 ; O3:       # %bb.0: # %entry
2821 ; O3-NEXT:    movq foo(%rip), %rax
2822 ; O3-NEXT:  .Lpcsection101:
2823 ; O3-NEXT:    movw $42, (%rdi)
2824 ; O3-NEXT:    movq $1, foo(%rip)
2825 ; O3-NEXT:    retq
2826 entry:
2827   load volatile i64, ptr @foo, align 8
2828   store atomic i16 42, ptr %a release, align 2, !pcsections !0
2829   store volatile i64 1, ptr @foo, align 8
2830   ret void
2833 define void @atomic16_store_seq_cst(ptr %a) {
2834 ; O0-LABEL: atomic16_store_seq_cst:
2835 ; O0:       # %bb.0: # %entry
2836 ; O0-NEXT:    movq foo(%rip), %rax
2837 ; O0-NEXT:    movw $42, %ax
2838 ; O0-NEXT:  .Lpcsection107:
2839 ; O0-NEXT:    xchgw %ax, (%rdi)
2840 ; O0-NEXT:    movq $1, foo
2841 ; O0-NEXT:    retq
2843 ; O1-LABEL: atomic16_store_seq_cst:
2844 ; O1:       # %bb.0: # %entry
2845 ; O1-NEXT:    movq foo(%rip), %rax
2846 ; O1-NEXT:    movw $42, %ax
2847 ; O1-NEXT:  .Lpcsection102:
2848 ; O1-NEXT:    xchgw %ax, (%rdi)
2849 ; O1-NEXT:    movq $1, foo(%rip)
2850 ; O1-NEXT:    retq
2852 ; O2-LABEL: atomic16_store_seq_cst:
2853 ; O2:       # %bb.0: # %entry
2854 ; O2-NEXT:    movq foo(%rip), %rax
2855 ; O2-NEXT:    movw $42, %ax
2856 ; O2-NEXT:  .Lpcsection102:
2857 ; O2-NEXT:    xchgw %ax, (%rdi)
2858 ; O2-NEXT:    movq $1, foo(%rip)
2859 ; O2-NEXT:    retq
2861 ; O3-LABEL: atomic16_store_seq_cst:
2862 ; O3:       # %bb.0: # %entry
2863 ; O3-NEXT:    movq foo(%rip), %rax
2864 ; O3-NEXT:    movw $42, %ax
2865 ; O3-NEXT:  .Lpcsection102:
2866 ; O3-NEXT:    xchgw %ax, (%rdi)
2867 ; O3-NEXT:    movq $1, foo(%rip)
2868 ; O3-NEXT:    retq
2869 entry:
2870   load volatile i64, ptr @foo, align 8
2871   store atomic i16 42, ptr %a seq_cst, align 2, !pcsections !0
2872   store volatile i64 1, ptr @foo, align 8
2873   ret void
2876 define void @atomic16_xchg_monotonic(ptr %a) {
2877 ; O0-LABEL: atomic16_xchg_monotonic:
2878 ; O0:       # %bb.0: # %entry
2879 ; O0-NEXT:    movq foo(%rip), %rax
2880 ; O0-NEXT:    movw $42, %ax
2881 ; O0-NEXT:  .Lpcsection108:
2882 ; O0-NEXT:    xchgw %ax, (%rdi)
2883 ; O0-NEXT:    movq $1, foo
2884 ; O0-NEXT:    retq
2886 ; O1-LABEL: atomic16_xchg_monotonic:
2887 ; O1:       # %bb.0: # %entry
2888 ; O1-NEXT:    movq foo(%rip), %rax
2889 ; O1-NEXT:    movw $42, %ax
2890 ; O1-NEXT:  .Lpcsection103:
2891 ; O1-NEXT:    xchgw %ax, (%rdi)
2892 ; O1-NEXT:    movq $1, foo(%rip)
2893 ; O1-NEXT:    retq
2895 ; O2-LABEL: atomic16_xchg_monotonic:
2896 ; O2:       # %bb.0: # %entry
2897 ; O2-NEXT:    movq foo(%rip), %rax
2898 ; O2-NEXT:    movw $42, %ax
2899 ; O2-NEXT:  .Lpcsection103:
2900 ; O2-NEXT:    xchgw %ax, (%rdi)
2901 ; O2-NEXT:    movq $1, foo(%rip)
2902 ; O2-NEXT:    retq
2904 ; O3-LABEL: atomic16_xchg_monotonic:
2905 ; O3:       # %bb.0: # %entry
2906 ; O3-NEXT:    movq foo(%rip), %rax
2907 ; O3-NEXT:    movw $42, %ax
2908 ; O3-NEXT:  .Lpcsection103:
2909 ; O3-NEXT:    xchgw %ax, (%rdi)
2910 ; O3-NEXT:    movq $1, foo(%rip)
2911 ; O3-NEXT:    retq
2912 entry:
2913   load volatile i64, ptr @foo, align 8
2914   %x = atomicrmw xchg ptr %a, i16 42 monotonic, align 2, !pcsections !0
2915   store volatile i64 1, ptr @foo, align 8
2916   ret void
2919 define void @atomic16_add_monotonic(ptr %a) {
2920 ; O0-LABEL: atomic16_add_monotonic:
2921 ; O0:       # %bb.0: # %entry
2922 ; O0-NEXT:    movq foo(%rip), %rax
2923 ; O0-NEXT:  .Lpcsection109:
2924 ; O0-NEXT:    lock addw $42, (%rdi)
2925 ; O0-NEXT:    movq $1, foo
2926 ; O0-NEXT:    retq
2928 ; O1-LABEL: atomic16_add_monotonic:
2929 ; O1:       # %bb.0: # %entry
2930 ; O1-NEXT:    movq foo(%rip), %rax
2931 ; O1-NEXT:  .Lpcsection104:
2932 ; O1-NEXT:    lock addw $42, (%rdi)
2933 ; O1-NEXT:    movq $1, foo(%rip)
2934 ; O1-NEXT:    retq
2936 ; O2-LABEL: atomic16_add_monotonic:
2937 ; O2:       # %bb.0: # %entry
2938 ; O2-NEXT:    movq foo(%rip), %rax
2939 ; O2-NEXT:  .Lpcsection104:
2940 ; O2-NEXT:    lock addw $42, (%rdi)
2941 ; O2-NEXT:    movq $1, foo(%rip)
2942 ; O2-NEXT:    retq
2944 ; O3-LABEL: atomic16_add_monotonic:
2945 ; O3:       # %bb.0: # %entry
2946 ; O3-NEXT:    movq foo(%rip), %rax
2947 ; O3-NEXT:  .Lpcsection104:
2948 ; O3-NEXT:    lock addw $42, (%rdi)
2949 ; O3-NEXT:    movq $1, foo(%rip)
2950 ; O3-NEXT:    retq
2951 entry:
2952   load volatile i64, ptr @foo, align 8
2953   %x = atomicrmw add ptr %a, i16 42 monotonic, align 2, !pcsections !0
2954   store volatile i64 1, ptr @foo, align 8
2955   ret void
2958 define void @atomic16_sub_monotonic(ptr %a) {
2959 ; O0-LABEL: atomic16_sub_monotonic:
2960 ; O0:       # %bb.0: # %entry
2961 ; O0-NEXT:    movq foo(%rip), %rax
2962 ; O0-NEXT:  .Lpcsection110:
2963 ; O0-NEXT:    lock subw $42, (%rdi)
2964 ; O0-NEXT:    movq $1, foo
2965 ; O0-NEXT:    retq
2967 ; O1-LABEL: atomic16_sub_monotonic:
2968 ; O1:       # %bb.0: # %entry
2969 ; O1-NEXT:    movq foo(%rip), %rax
2970 ; O1-NEXT:  .Lpcsection105:
2971 ; O1-NEXT:    lock subw $42, (%rdi)
2972 ; O1-NEXT:    movq $1, foo(%rip)
2973 ; O1-NEXT:    retq
2975 ; O2-LABEL: atomic16_sub_monotonic:
2976 ; O2:       # %bb.0: # %entry
2977 ; O2-NEXT:    movq foo(%rip), %rax
2978 ; O2-NEXT:  .Lpcsection105:
2979 ; O2-NEXT:    lock subw $42, (%rdi)
2980 ; O2-NEXT:    movq $1, foo(%rip)
2981 ; O2-NEXT:    retq
2983 ; O3-LABEL: atomic16_sub_monotonic:
2984 ; O3:       # %bb.0: # %entry
2985 ; O3-NEXT:    movq foo(%rip), %rax
2986 ; O3-NEXT:  .Lpcsection105:
2987 ; O3-NEXT:    lock subw $42, (%rdi)
2988 ; O3-NEXT:    movq $1, foo(%rip)
2989 ; O3-NEXT:    retq
2990 entry:
2991   load volatile i64, ptr @foo, align 8
2992   %x = atomicrmw sub ptr %a, i16 42 monotonic, align 2, !pcsections !0
2993   store volatile i64 1, ptr @foo, align 8
2994   ret void
2997 define void @atomic16_and_monotonic(ptr %a) {
2998 ; O0-LABEL: atomic16_and_monotonic:
2999 ; O0:       # %bb.0: # %entry
3000 ; O0-NEXT:    movq foo(%rip), %rax
3001 ; O0-NEXT:  .Lpcsection111:
3002 ; O0-NEXT:    lock andw $42, (%rdi)
3003 ; O0-NEXT:    movq $1, foo
3004 ; O0-NEXT:    retq
3006 ; O1-LABEL: atomic16_and_monotonic:
3007 ; O1:       # %bb.0: # %entry
3008 ; O1-NEXT:    movq foo(%rip), %rax
3009 ; O1-NEXT:  .Lpcsection106:
3010 ; O1-NEXT:    lock andw $42, (%rdi)
3011 ; O1-NEXT:    movq $1, foo(%rip)
3012 ; O1-NEXT:    retq
3014 ; O2-LABEL: atomic16_and_monotonic:
3015 ; O2:       # %bb.0: # %entry
3016 ; O2-NEXT:    movq foo(%rip), %rax
3017 ; O2-NEXT:  .Lpcsection106:
3018 ; O2-NEXT:    lock andw $42, (%rdi)
3019 ; O2-NEXT:    movq $1, foo(%rip)
3020 ; O2-NEXT:    retq
3022 ; O3-LABEL: atomic16_and_monotonic:
3023 ; O3:       # %bb.0: # %entry
3024 ; O3-NEXT:    movq foo(%rip), %rax
3025 ; O3-NEXT:  .Lpcsection106:
3026 ; O3-NEXT:    lock andw $42, (%rdi)
3027 ; O3-NEXT:    movq $1, foo(%rip)
3028 ; O3-NEXT:    retq
3029 entry:
3030   load volatile i64, ptr @foo, align 8
3031   %x = atomicrmw and ptr %a, i16 42 monotonic, align 2, !pcsections !0
3032   store volatile i64 1, ptr @foo, align 8
3033   ret void
3036 define void @atomic16_or_monotonic(ptr %a) {
3037 ; O0-LABEL: atomic16_or_monotonic:
3038 ; O0:       # %bb.0: # %entry
3039 ; O0-NEXT:    movq foo(%rip), %rax
3040 ; O0-NEXT:  .Lpcsection112:
3041 ; O0-NEXT:    lock orw $42, (%rdi)
3042 ; O0-NEXT:    movq $1, foo
3043 ; O0-NEXT:    retq
3045 ; O1-LABEL: atomic16_or_monotonic:
3046 ; O1:       # %bb.0: # %entry
3047 ; O1-NEXT:    movq foo(%rip), %rax
3048 ; O1-NEXT:  .Lpcsection107:
3049 ; O1-NEXT:    lock orw $42, (%rdi)
3050 ; O1-NEXT:    movq $1, foo(%rip)
3051 ; O1-NEXT:    retq
3053 ; O2-LABEL: atomic16_or_monotonic:
3054 ; O2:       # %bb.0: # %entry
3055 ; O2-NEXT:    movq foo(%rip), %rax
3056 ; O2-NEXT:  .Lpcsection107:
3057 ; O2-NEXT:    lock orw $42, (%rdi)
3058 ; O2-NEXT:    movq $1, foo(%rip)
3059 ; O2-NEXT:    retq
3061 ; O3-LABEL: atomic16_or_monotonic:
3062 ; O3:       # %bb.0: # %entry
3063 ; O3-NEXT:    movq foo(%rip), %rax
3064 ; O3-NEXT:  .Lpcsection107:
3065 ; O3-NEXT:    lock orw $42, (%rdi)
3066 ; O3-NEXT:    movq $1, foo(%rip)
3067 ; O3-NEXT:    retq
3068 entry:
3069   load volatile i64, ptr @foo, align 8
3070   %x = atomicrmw or ptr %a, i16 42 monotonic, align 2, !pcsections !0
3071   store volatile i64 1, ptr @foo, align 8
3072   ret void
3075 define void @atomic16_xor_monotonic(ptr %a) {
3076 ; O0-LABEL: atomic16_xor_monotonic:
3077 ; O0:       # %bb.0: # %entry
3078 ; O0-NEXT:    movq foo(%rip), %rax
3079 ; O0-NEXT:  .Lpcsection113:
3080 ; O0-NEXT:    lock xorw $42, (%rdi)
3081 ; O0-NEXT:    movq $1, foo
3082 ; O0-NEXT:    retq
3084 ; O1-LABEL: atomic16_xor_monotonic:
3085 ; O1:       # %bb.0: # %entry
3086 ; O1-NEXT:    movq foo(%rip), %rax
3087 ; O1-NEXT:  .Lpcsection108:
3088 ; O1-NEXT:    lock xorw $42, (%rdi)
3089 ; O1-NEXT:    movq $1, foo(%rip)
3090 ; O1-NEXT:    retq
3092 ; O2-LABEL: atomic16_xor_monotonic:
3093 ; O2:       # %bb.0: # %entry
3094 ; O2-NEXT:    movq foo(%rip), %rax
3095 ; O2-NEXT:  .Lpcsection108:
3096 ; O2-NEXT:    lock xorw $42, (%rdi)
3097 ; O2-NEXT:    movq $1, foo(%rip)
3098 ; O2-NEXT:    retq
3100 ; O3-LABEL: atomic16_xor_monotonic:
3101 ; O3:       # %bb.0: # %entry
3102 ; O3-NEXT:    movq foo(%rip), %rax
3103 ; O3-NEXT:  .Lpcsection108:
3104 ; O3-NEXT:    lock xorw $42, (%rdi)
3105 ; O3-NEXT:    movq $1, foo(%rip)
3106 ; O3-NEXT:    retq
3107 entry:
3108   load volatile i64, ptr @foo, align 8
3109   %x = atomicrmw xor ptr %a, i16 42 monotonic, align 2, !pcsections !0
3110   store volatile i64 1, ptr @foo, align 8
3111   ret void
3114 define void @atomic16_nand_monotonic(ptr %a) {
3115 ; O0-LABEL: atomic16_nand_monotonic:
3116 ; O0:       # %bb.0: # %entry
3117 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
3118 ; O0-NEXT:    movq foo, %rax
3119 ; O0-NEXT:  .Lpcsection114:
3120 ; O0-NEXT:    movw (%rdi), %ax
3121 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
3122 ; O0-NEXT:  .LBB64_1: # %atomicrmw.start
3123 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
3124 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
3125 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
3126 ; O0-NEXT:  .Lpcsection115:
3127 ; O0-NEXT:    # implicit-def: $edx
3128 ; O0-NEXT:    movw %ax, %dx
3129 ; O0-NEXT:  .Lpcsection116:
3130 ; O0-NEXT:    notl %edx
3131 ; O0-NEXT:  .Lpcsection117:
3132 ; O0-NEXT:    orl $65493, %edx # imm = 0xFFD5
3133 ; O0-NEXT:  .Lpcsection118:
3134 ; O0-NEXT:    # kill: def $dx killed $dx killed $edx
3135 ; O0-NEXT:  .Lpcsection119:
3136 ; O0-NEXT:    lock cmpxchgw %dx, (%rcx)
3137 ; O0-NEXT:  .Lpcsection120:
3138 ; O0-NEXT:    sete %cl
3139 ; O0-NEXT:  .Lpcsection121:
3140 ; O0-NEXT:    testb $1, %cl
3141 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
3142 ; O0-NEXT:  .Lpcsection122:
3143 ; O0-NEXT:    jne .LBB64_2
3144 ; O0-NEXT:    jmp .LBB64_1
3145 ; O0-NEXT:  .LBB64_2: # %atomicrmw.end
3146 ; O0-NEXT:    movq $1, foo
3147 ; O0-NEXT:    retq
3149 ; O1-LABEL: atomic16_nand_monotonic:
3150 ; O1:       # %bb.0: # %entry
3151 ; O1-NEXT:    movq foo(%rip), %rax
3152 ; O1-NEXT:  .Lpcsection109:
3153 ; O1-NEXT:    movzwl (%rdi), %eax
3154 ; O1-NEXT:    .p2align 4, 0x90
3155 ; O1-NEXT:  .LBB64_1: # %atomicrmw.start
3156 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3157 ; O1-NEXT:    movl %eax, %ecx
3158 ; O1-NEXT:  .Lpcsection110:
3159 ; O1-NEXT:    notl %ecx
3160 ; O1-NEXT:  .Lpcsection111:
3161 ; O1-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3162 ; O1-NEXT:  .Lpcsection112:
3163 ; O1-NEXT:    # kill: def $ax killed $ax killed $eax
3164 ; O1-NEXT:  .Lpcsection113:
3165 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
3166 ; O1-NEXT:  .Lpcsection114:
3167 ; O1-NEXT:    # kill: def $ax killed $ax def $eax
3168 ; O1-NEXT:  .Lpcsection115:
3169 ; O1-NEXT:    jne .LBB64_1
3170 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
3171 ; O1-NEXT:    movq $1, foo(%rip)
3172 ; O1-NEXT:    retq
3174 ; O2-LABEL: atomic16_nand_monotonic:
3175 ; O2:       # %bb.0: # %entry
3176 ; O2-NEXT:    movq foo(%rip), %rax
3177 ; O2-NEXT:  .Lpcsection109:
3178 ; O2-NEXT:    movzwl (%rdi), %eax
3179 ; O2-NEXT:    .p2align 4, 0x90
3180 ; O2-NEXT:  .LBB64_1: # %atomicrmw.start
3181 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3182 ; O2-NEXT:    movl %eax, %ecx
3183 ; O2-NEXT:  .Lpcsection110:
3184 ; O2-NEXT:    notl %ecx
3185 ; O2-NEXT:  .Lpcsection111:
3186 ; O2-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3187 ; O2-NEXT:  .Lpcsection112:
3188 ; O2-NEXT:    # kill: def $ax killed $ax killed $eax
3189 ; O2-NEXT:  .Lpcsection113:
3190 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
3191 ; O2-NEXT:  .Lpcsection114:
3192 ; O2-NEXT:    # kill: def $ax killed $ax def $eax
3193 ; O2-NEXT:  .Lpcsection115:
3194 ; O2-NEXT:    jne .LBB64_1
3195 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
3196 ; O2-NEXT:    movq $1, foo(%rip)
3197 ; O2-NEXT:    retq
3199 ; O3-LABEL: atomic16_nand_monotonic:
3200 ; O3:       # %bb.0: # %entry
3201 ; O3-NEXT:    movq foo(%rip), %rax
3202 ; O3-NEXT:  .Lpcsection109:
3203 ; O3-NEXT:    movzwl (%rdi), %eax
3204 ; O3-NEXT:    .p2align 4, 0x90
3205 ; O3-NEXT:  .LBB64_1: # %atomicrmw.start
3206 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3207 ; O3-NEXT:    movl %eax, %ecx
3208 ; O3-NEXT:  .Lpcsection110:
3209 ; O3-NEXT:    notl %ecx
3210 ; O3-NEXT:  .Lpcsection111:
3211 ; O3-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3212 ; O3-NEXT:  .Lpcsection112:
3213 ; O3-NEXT:    # kill: def $ax killed $ax killed $eax
3214 ; O3-NEXT:  .Lpcsection113:
3215 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
3216 ; O3-NEXT:  .Lpcsection114:
3217 ; O3-NEXT:    # kill: def $ax killed $ax def $eax
3218 ; O3-NEXT:  .Lpcsection115:
3219 ; O3-NEXT:    jne .LBB64_1
3220 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
3221 ; O3-NEXT:    movq $1, foo(%rip)
3222 ; O3-NEXT:    retq
3223 entry:
3224   load volatile i64, ptr @foo, align 8
3225   %x = atomicrmw nand ptr %a, i16 42 monotonic, align 2, !pcsections !0
3226   store volatile i64 1, ptr @foo, align 8
3227   ret void
3230 define void @atomic16_xchg_acquire(ptr %a) {
3231 ; O0-LABEL: atomic16_xchg_acquire:
3232 ; O0:       # %bb.0: # %entry
3233 ; O0-NEXT:    movq foo(%rip), %rax
3234 ; O0-NEXT:    movw $42, %ax
3235 ; O0-NEXT:  .Lpcsection123:
3236 ; O0-NEXT:    xchgw %ax, (%rdi)
3237 ; O0-NEXT:    movq $1, foo
3238 ; O0-NEXT:    retq
3240 ; O1-LABEL: atomic16_xchg_acquire:
3241 ; O1:       # %bb.0: # %entry
3242 ; O1-NEXT:    movq foo(%rip), %rax
3243 ; O1-NEXT:    movw $42, %ax
3244 ; O1-NEXT:  .Lpcsection116:
3245 ; O1-NEXT:    xchgw %ax, (%rdi)
3246 ; O1-NEXT:    movq $1, foo(%rip)
3247 ; O1-NEXT:    retq
3249 ; O2-LABEL: atomic16_xchg_acquire:
3250 ; O2:       # %bb.0: # %entry
3251 ; O2-NEXT:    movq foo(%rip), %rax
3252 ; O2-NEXT:    movw $42, %ax
3253 ; O2-NEXT:  .Lpcsection116:
3254 ; O2-NEXT:    xchgw %ax, (%rdi)
3255 ; O2-NEXT:    movq $1, foo(%rip)
3256 ; O2-NEXT:    retq
3258 ; O3-LABEL: atomic16_xchg_acquire:
3259 ; O3:       # %bb.0: # %entry
3260 ; O3-NEXT:    movq foo(%rip), %rax
3261 ; O3-NEXT:    movw $42, %ax
3262 ; O3-NEXT:  .Lpcsection116:
3263 ; O3-NEXT:    xchgw %ax, (%rdi)
3264 ; O3-NEXT:    movq $1, foo(%rip)
3265 ; O3-NEXT:    retq
3266 entry:
3267   load volatile i64, ptr @foo, align 8
3268   %x = atomicrmw xchg ptr %a, i16 42 acquire, align 2, !pcsections !0
3269   store volatile i64 1, ptr @foo, align 8
3270   ret void
3273 define void @atomic16_add_acquire(ptr %a) {
3274 ; O0-LABEL: atomic16_add_acquire:
3275 ; O0:       # %bb.0: # %entry
3276 ; O0-NEXT:    movq foo(%rip), %rax
3277 ; O0-NEXT:  .Lpcsection124:
3278 ; O0-NEXT:    lock addw $42, (%rdi)
3279 ; O0-NEXT:    movq $1, foo
3280 ; O0-NEXT:    retq
3282 ; O1-LABEL: atomic16_add_acquire:
3283 ; O1:       # %bb.0: # %entry
3284 ; O1-NEXT:    movq foo(%rip), %rax
3285 ; O1-NEXT:  .Lpcsection117:
3286 ; O1-NEXT:    lock addw $42, (%rdi)
3287 ; O1-NEXT:    movq $1, foo(%rip)
3288 ; O1-NEXT:    retq
3290 ; O2-LABEL: atomic16_add_acquire:
3291 ; O2:       # %bb.0: # %entry
3292 ; O2-NEXT:    movq foo(%rip), %rax
3293 ; O2-NEXT:  .Lpcsection117:
3294 ; O2-NEXT:    lock addw $42, (%rdi)
3295 ; O2-NEXT:    movq $1, foo(%rip)
3296 ; O2-NEXT:    retq
3298 ; O3-LABEL: atomic16_add_acquire:
3299 ; O3:       # %bb.0: # %entry
3300 ; O3-NEXT:    movq foo(%rip), %rax
3301 ; O3-NEXT:  .Lpcsection117:
3302 ; O3-NEXT:    lock addw $42, (%rdi)
3303 ; O3-NEXT:    movq $1, foo(%rip)
3304 ; O3-NEXT:    retq
3305 entry:
3306   load volatile i64, ptr @foo, align 8
3307   %x = atomicrmw add ptr %a, i16 42 acquire, align 2, !pcsections !0
3308   store volatile i64 1, ptr @foo, align 8
3309   ret void
3312 define void @atomic16_sub_acquire(ptr %a) {
3313 ; O0-LABEL: atomic16_sub_acquire:
3314 ; O0:       # %bb.0: # %entry
3315 ; O0-NEXT:    movq foo(%rip), %rax
3316 ; O0-NEXT:  .Lpcsection125:
3317 ; O0-NEXT:    lock subw $42, (%rdi)
3318 ; O0-NEXT:    movq $1, foo
3319 ; O0-NEXT:    retq
3321 ; O1-LABEL: atomic16_sub_acquire:
3322 ; O1:       # %bb.0: # %entry
3323 ; O1-NEXT:    movq foo(%rip), %rax
3324 ; O1-NEXT:  .Lpcsection118:
3325 ; O1-NEXT:    lock subw $42, (%rdi)
3326 ; O1-NEXT:    movq $1, foo(%rip)
3327 ; O1-NEXT:    retq
3329 ; O2-LABEL: atomic16_sub_acquire:
3330 ; O2:       # %bb.0: # %entry
3331 ; O2-NEXT:    movq foo(%rip), %rax
3332 ; O2-NEXT:  .Lpcsection118:
3333 ; O2-NEXT:    lock subw $42, (%rdi)
3334 ; O2-NEXT:    movq $1, foo(%rip)
3335 ; O2-NEXT:    retq
3337 ; O3-LABEL: atomic16_sub_acquire:
3338 ; O3:       # %bb.0: # %entry
3339 ; O3-NEXT:    movq foo(%rip), %rax
3340 ; O3-NEXT:  .Lpcsection118:
3341 ; O3-NEXT:    lock subw $42, (%rdi)
3342 ; O3-NEXT:    movq $1, foo(%rip)
3343 ; O3-NEXT:    retq
3344 entry:
3345   load volatile i64, ptr @foo, align 8
3346   %x = atomicrmw sub ptr %a, i16 42 acquire, align 2, !pcsections !0
3347   store volatile i64 1, ptr @foo, align 8
3348   ret void
3351 define void @atomic16_and_acquire(ptr %a) {
3352 ; O0-LABEL: atomic16_and_acquire:
3353 ; O0:       # %bb.0: # %entry
3354 ; O0-NEXT:    movq foo(%rip), %rax
3355 ; O0-NEXT:  .Lpcsection126:
3356 ; O0-NEXT:    lock andw $42, (%rdi)
3357 ; O0-NEXT:    movq $1, foo
3358 ; O0-NEXT:    retq
3360 ; O1-LABEL: atomic16_and_acquire:
3361 ; O1:       # %bb.0: # %entry
3362 ; O1-NEXT:    movq foo(%rip), %rax
3363 ; O1-NEXT:  .Lpcsection119:
3364 ; O1-NEXT:    lock andw $42, (%rdi)
3365 ; O1-NEXT:    movq $1, foo(%rip)
3366 ; O1-NEXT:    retq
3368 ; O2-LABEL: atomic16_and_acquire:
3369 ; O2:       # %bb.0: # %entry
3370 ; O2-NEXT:    movq foo(%rip), %rax
3371 ; O2-NEXT:  .Lpcsection119:
3372 ; O2-NEXT:    lock andw $42, (%rdi)
3373 ; O2-NEXT:    movq $1, foo(%rip)
3374 ; O2-NEXT:    retq
3376 ; O3-LABEL: atomic16_and_acquire:
3377 ; O3:       # %bb.0: # %entry
3378 ; O3-NEXT:    movq foo(%rip), %rax
3379 ; O3-NEXT:  .Lpcsection119:
3380 ; O3-NEXT:    lock andw $42, (%rdi)
3381 ; O3-NEXT:    movq $1, foo(%rip)
3382 ; O3-NEXT:    retq
3383 entry:
3384   load volatile i64, ptr @foo, align 8
3385   %x = atomicrmw and ptr %a, i16 42 acquire, align 2, !pcsections !0
3386   store volatile i64 1, ptr @foo, align 8
3387   ret void
3390 define void @atomic16_or_acquire(ptr %a) {
3391 ; O0-LABEL: atomic16_or_acquire:
3392 ; O0:       # %bb.0: # %entry
3393 ; O0-NEXT:    movq foo(%rip), %rax
3394 ; O0-NEXT:  .Lpcsection127:
3395 ; O0-NEXT:    lock orw $42, (%rdi)
3396 ; O0-NEXT:    movq $1, foo
3397 ; O0-NEXT:    retq
3399 ; O1-LABEL: atomic16_or_acquire:
3400 ; O1:       # %bb.0: # %entry
3401 ; O1-NEXT:    movq foo(%rip), %rax
3402 ; O1-NEXT:  .Lpcsection120:
3403 ; O1-NEXT:    lock orw $42, (%rdi)
3404 ; O1-NEXT:    movq $1, foo(%rip)
3405 ; O1-NEXT:    retq
3407 ; O2-LABEL: atomic16_or_acquire:
3408 ; O2:       # %bb.0: # %entry
3409 ; O2-NEXT:    movq foo(%rip), %rax
3410 ; O2-NEXT:  .Lpcsection120:
3411 ; O2-NEXT:    lock orw $42, (%rdi)
3412 ; O2-NEXT:    movq $1, foo(%rip)
3413 ; O2-NEXT:    retq
3415 ; O3-LABEL: atomic16_or_acquire:
3416 ; O3:       # %bb.0: # %entry
3417 ; O3-NEXT:    movq foo(%rip), %rax
3418 ; O3-NEXT:  .Lpcsection120:
3419 ; O3-NEXT:    lock orw $42, (%rdi)
3420 ; O3-NEXT:    movq $1, foo(%rip)
3421 ; O3-NEXT:    retq
3422 entry:
3423   load volatile i64, ptr @foo, align 8
3424   %x = atomicrmw or ptr %a, i16 42 acquire, align 2, !pcsections !0
3425   store volatile i64 1, ptr @foo, align 8
3426   ret void
3429 define void @atomic16_xor_acquire(ptr %a) {
3430 ; O0-LABEL: atomic16_xor_acquire:
3431 ; O0:       # %bb.0: # %entry
3432 ; O0-NEXT:    movq foo(%rip), %rax
3433 ; O0-NEXT:  .Lpcsection128:
3434 ; O0-NEXT:    lock xorw $42, (%rdi)
3435 ; O0-NEXT:    movq $1, foo
3436 ; O0-NEXT:    retq
3438 ; O1-LABEL: atomic16_xor_acquire:
3439 ; O1:       # %bb.0: # %entry
3440 ; O1-NEXT:    movq foo(%rip), %rax
3441 ; O1-NEXT:  .Lpcsection121:
3442 ; O1-NEXT:    lock xorw $42, (%rdi)
3443 ; O1-NEXT:    movq $1, foo(%rip)
3444 ; O1-NEXT:    retq
3446 ; O2-LABEL: atomic16_xor_acquire:
3447 ; O2:       # %bb.0: # %entry
3448 ; O2-NEXT:    movq foo(%rip), %rax
3449 ; O2-NEXT:  .Lpcsection121:
3450 ; O2-NEXT:    lock xorw $42, (%rdi)
3451 ; O2-NEXT:    movq $1, foo(%rip)
3452 ; O2-NEXT:    retq
3454 ; O3-LABEL: atomic16_xor_acquire:
3455 ; O3:       # %bb.0: # %entry
3456 ; O3-NEXT:    movq foo(%rip), %rax
3457 ; O3-NEXT:  .Lpcsection121:
3458 ; O3-NEXT:    lock xorw $42, (%rdi)
3459 ; O3-NEXT:    movq $1, foo(%rip)
3460 ; O3-NEXT:    retq
3461 entry:
3462   load volatile i64, ptr @foo, align 8
3463   %x = atomicrmw xor ptr %a, i16 42 acquire, align 2, !pcsections !0
3464   store volatile i64 1, ptr @foo, align 8
3465   ret void
3468 define void @atomic16_nand_acquire(ptr %a) {
3469 ; O0-LABEL: atomic16_nand_acquire:
3470 ; O0:       # %bb.0: # %entry
3471 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
3472 ; O0-NEXT:    movq foo, %rax
3473 ; O0-NEXT:  .Lpcsection129:
3474 ; O0-NEXT:    movw (%rdi), %ax
3475 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
3476 ; O0-NEXT:  .LBB71_1: # %atomicrmw.start
3477 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
3478 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
3479 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
3480 ; O0-NEXT:  .Lpcsection130:
3481 ; O0-NEXT:    # implicit-def: $edx
3482 ; O0-NEXT:    movw %ax, %dx
3483 ; O0-NEXT:  .Lpcsection131:
3484 ; O0-NEXT:    notl %edx
3485 ; O0-NEXT:  .Lpcsection132:
3486 ; O0-NEXT:    orl $65493, %edx # imm = 0xFFD5
3487 ; O0-NEXT:  .Lpcsection133:
3488 ; O0-NEXT:    # kill: def $dx killed $dx killed $edx
3489 ; O0-NEXT:  .Lpcsection134:
3490 ; O0-NEXT:    lock cmpxchgw %dx, (%rcx)
3491 ; O0-NEXT:  .Lpcsection135:
3492 ; O0-NEXT:    sete %cl
3493 ; O0-NEXT:  .Lpcsection136:
3494 ; O0-NEXT:    testb $1, %cl
3495 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
3496 ; O0-NEXT:  .Lpcsection137:
3497 ; O0-NEXT:    jne .LBB71_2
3498 ; O0-NEXT:    jmp .LBB71_1
3499 ; O0-NEXT:  .LBB71_2: # %atomicrmw.end
3500 ; O0-NEXT:    movq $1, foo
3501 ; O0-NEXT:    retq
3503 ; O1-LABEL: atomic16_nand_acquire:
3504 ; O1:       # %bb.0: # %entry
3505 ; O1-NEXT:    movq foo(%rip), %rax
3506 ; O1-NEXT:  .Lpcsection122:
3507 ; O1-NEXT:    movzwl (%rdi), %eax
3508 ; O1-NEXT:    .p2align 4, 0x90
3509 ; O1-NEXT:  .LBB71_1: # %atomicrmw.start
3510 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3511 ; O1-NEXT:    movl %eax, %ecx
3512 ; O1-NEXT:  .Lpcsection123:
3513 ; O1-NEXT:    notl %ecx
3514 ; O1-NEXT:  .Lpcsection124:
3515 ; O1-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3516 ; O1-NEXT:  .Lpcsection125:
3517 ; O1-NEXT:    # kill: def $ax killed $ax killed $eax
3518 ; O1-NEXT:  .Lpcsection126:
3519 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
3520 ; O1-NEXT:  .Lpcsection127:
3521 ; O1-NEXT:    # kill: def $ax killed $ax def $eax
3522 ; O1-NEXT:  .Lpcsection128:
3523 ; O1-NEXT:    jne .LBB71_1
3524 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
3525 ; O1-NEXT:    movq $1, foo(%rip)
3526 ; O1-NEXT:    retq
3528 ; O2-LABEL: atomic16_nand_acquire:
3529 ; O2:       # %bb.0: # %entry
3530 ; O2-NEXT:    movq foo(%rip), %rax
3531 ; O2-NEXT:  .Lpcsection122:
3532 ; O2-NEXT:    movzwl (%rdi), %eax
3533 ; O2-NEXT:    .p2align 4, 0x90
3534 ; O2-NEXT:  .LBB71_1: # %atomicrmw.start
3535 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3536 ; O2-NEXT:    movl %eax, %ecx
3537 ; O2-NEXT:  .Lpcsection123:
3538 ; O2-NEXT:    notl %ecx
3539 ; O2-NEXT:  .Lpcsection124:
3540 ; O2-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3541 ; O2-NEXT:  .Lpcsection125:
3542 ; O2-NEXT:    # kill: def $ax killed $ax killed $eax
3543 ; O2-NEXT:  .Lpcsection126:
3544 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
3545 ; O2-NEXT:  .Lpcsection127:
3546 ; O2-NEXT:    # kill: def $ax killed $ax def $eax
3547 ; O2-NEXT:  .Lpcsection128:
3548 ; O2-NEXT:    jne .LBB71_1
3549 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
3550 ; O2-NEXT:    movq $1, foo(%rip)
3551 ; O2-NEXT:    retq
3553 ; O3-LABEL: atomic16_nand_acquire:
3554 ; O3:       # %bb.0: # %entry
3555 ; O3-NEXT:    movq foo(%rip), %rax
3556 ; O3-NEXT:  .Lpcsection122:
3557 ; O3-NEXT:    movzwl (%rdi), %eax
3558 ; O3-NEXT:    .p2align 4, 0x90
3559 ; O3-NEXT:  .LBB71_1: # %atomicrmw.start
3560 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3561 ; O3-NEXT:    movl %eax, %ecx
3562 ; O3-NEXT:  .Lpcsection123:
3563 ; O3-NEXT:    notl %ecx
3564 ; O3-NEXT:  .Lpcsection124:
3565 ; O3-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3566 ; O3-NEXT:  .Lpcsection125:
3567 ; O3-NEXT:    # kill: def $ax killed $ax killed $eax
3568 ; O3-NEXT:  .Lpcsection126:
3569 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
3570 ; O3-NEXT:  .Lpcsection127:
3571 ; O3-NEXT:    # kill: def $ax killed $ax def $eax
3572 ; O3-NEXT:  .Lpcsection128:
3573 ; O3-NEXT:    jne .LBB71_1
3574 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
3575 ; O3-NEXT:    movq $1, foo(%rip)
3576 ; O3-NEXT:    retq
3577 entry:
3578   load volatile i64, ptr @foo, align 8
3579   %x = atomicrmw nand ptr %a, i16 42 acquire, align 2, !pcsections !0
3580   store volatile i64 1, ptr @foo, align 8
3581   ret void
3584 define void @atomic16_xchg_release(ptr %a) {
3585 ; O0-LABEL: atomic16_xchg_release:
3586 ; O0:       # %bb.0: # %entry
3587 ; O0-NEXT:    movq foo(%rip), %rax
3588 ; O0-NEXT:    movw $42, %ax
3589 ; O0-NEXT:  .Lpcsection138:
3590 ; O0-NEXT:    xchgw %ax, (%rdi)
3591 ; O0-NEXT:    movq $1, foo
3592 ; O0-NEXT:    retq
3594 ; O1-LABEL: atomic16_xchg_release:
3595 ; O1:       # %bb.0: # %entry
3596 ; O1-NEXT:    movq foo(%rip), %rax
3597 ; O1-NEXT:    movw $42, %ax
3598 ; O1-NEXT:  .Lpcsection129:
3599 ; O1-NEXT:    xchgw %ax, (%rdi)
3600 ; O1-NEXT:    movq $1, foo(%rip)
3601 ; O1-NEXT:    retq
3603 ; O2-LABEL: atomic16_xchg_release:
3604 ; O2:       # %bb.0: # %entry
3605 ; O2-NEXT:    movq foo(%rip), %rax
3606 ; O2-NEXT:    movw $42, %ax
3607 ; O2-NEXT:  .Lpcsection129:
3608 ; O2-NEXT:    xchgw %ax, (%rdi)
3609 ; O2-NEXT:    movq $1, foo(%rip)
3610 ; O2-NEXT:    retq
3612 ; O3-LABEL: atomic16_xchg_release:
3613 ; O3:       # %bb.0: # %entry
3614 ; O3-NEXT:    movq foo(%rip), %rax
3615 ; O3-NEXT:    movw $42, %ax
3616 ; O3-NEXT:  .Lpcsection129:
3617 ; O3-NEXT:    xchgw %ax, (%rdi)
3618 ; O3-NEXT:    movq $1, foo(%rip)
3619 ; O3-NEXT:    retq
3620 entry:
3621   load volatile i64, ptr @foo, align 8
3622   %x = atomicrmw xchg ptr %a, i16 42 release, align 2, !pcsections !0
3623   store volatile i64 1, ptr @foo, align 8
3624   ret void
3627 define void @atomic16_add_release(ptr %a) {
3628 ; O0-LABEL: atomic16_add_release:
3629 ; O0:       # %bb.0: # %entry
3630 ; O0-NEXT:    movq foo(%rip), %rax
3631 ; O0-NEXT:  .Lpcsection139:
3632 ; O0-NEXT:    lock addw $42, (%rdi)
3633 ; O0-NEXT:    movq $1, foo
3634 ; O0-NEXT:    retq
3636 ; O1-LABEL: atomic16_add_release:
3637 ; O1:       # %bb.0: # %entry
3638 ; O1-NEXT:    movq foo(%rip), %rax
3639 ; O1-NEXT:  .Lpcsection130:
3640 ; O1-NEXT:    lock addw $42, (%rdi)
3641 ; O1-NEXT:    movq $1, foo(%rip)
3642 ; O1-NEXT:    retq
3644 ; O2-LABEL: atomic16_add_release:
3645 ; O2:       # %bb.0: # %entry
3646 ; O2-NEXT:    movq foo(%rip), %rax
3647 ; O2-NEXT:  .Lpcsection130:
3648 ; O2-NEXT:    lock addw $42, (%rdi)
3649 ; O2-NEXT:    movq $1, foo(%rip)
3650 ; O2-NEXT:    retq
3652 ; O3-LABEL: atomic16_add_release:
3653 ; O3:       # %bb.0: # %entry
3654 ; O3-NEXT:    movq foo(%rip), %rax
3655 ; O3-NEXT:  .Lpcsection130:
3656 ; O3-NEXT:    lock addw $42, (%rdi)
3657 ; O3-NEXT:    movq $1, foo(%rip)
3658 ; O3-NEXT:    retq
3659 entry:
3660   load volatile i64, ptr @foo, align 8
3661   %x = atomicrmw add ptr %a, i16 42 release, align 2, !pcsections !0
3662   store volatile i64 1, ptr @foo, align 8
3663   ret void
3666 define void @atomic16_sub_release(ptr %a) {
3667 ; O0-LABEL: atomic16_sub_release:
3668 ; O0:       # %bb.0: # %entry
3669 ; O0-NEXT:    movq foo(%rip), %rax
3670 ; O0-NEXT:  .Lpcsection140:
3671 ; O0-NEXT:    lock subw $42, (%rdi)
3672 ; O0-NEXT:    movq $1, foo
3673 ; O0-NEXT:    retq
3675 ; O1-LABEL: atomic16_sub_release:
3676 ; O1:       # %bb.0: # %entry
3677 ; O1-NEXT:    movq foo(%rip), %rax
3678 ; O1-NEXT:  .Lpcsection131:
3679 ; O1-NEXT:    lock subw $42, (%rdi)
3680 ; O1-NEXT:    movq $1, foo(%rip)
3681 ; O1-NEXT:    retq
3683 ; O2-LABEL: atomic16_sub_release:
3684 ; O2:       # %bb.0: # %entry
3685 ; O2-NEXT:    movq foo(%rip), %rax
3686 ; O2-NEXT:  .Lpcsection131:
3687 ; O2-NEXT:    lock subw $42, (%rdi)
3688 ; O2-NEXT:    movq $1, foo(%rip)
3689 ; O2-NEXT:    retq
3691 ; O3-LABEL: atomic16_sub_release:
3692 ; O3:       # %bb.0: # %entry
3693 ; O3-NEXT:    movq foo(%rip), %rax
3694 ; O3-NEXT:  .Lpcsection131:
3695 ; O3-NEXT:    lock subw $42, (%rdi)
3696 ; O3-NEXT:    movq $1, foo(%rip)
3697 ; O3-NEXT:    retq
3698 entry:
3699   load volatile i64, ptr @foo, align 8
3700   %x = atomicrmw sub ptr %a, i16 42 release, align 2, !pcsections !0
3701   store volatile i64 1, ptr @foo, align 8
3702   ret void
3705 define void @atomic16_and_release(ptr %a) {
3706 ; O0-LABEL: atomic16_and_release:
3707 ; O0:       # %bb.0: # %entry
3708 ; O0-NEXT:    movq foo(%rip), %rax
3709 ; O0-NEXT:  .Lpcsection141:
3710 ; O0-NEXT:    lock andw $42, (%rdi)
3711 ; O0-NEXT:    movq $1, foo
3712 ; O0-NEXT:    retq
3714 ; O1-LABEL: atomic16_and_release:
3715 ; O1:       # %bb.0: # %entry
3716 ; O1-NEXT:    movq foo(%rip), %rax
3717 ; O1-NEXT:  .Lpcsection132:
3718 ; O1-NEXT:    lock andw $42, (%rdi)
3719 ; O1-NEXT:    movq $1, foo(%rip)
3720 ; O1-NEXT:    retq
3722 ; O2-LABEL: atomic16_and_release:
3723 ; O2:       # %bb.0: # %entry
3724 ; O2-NEXT:    movq foo(%rip), %rax
3725 ; O2-NEXT:  .Lpcsection132:
3726 ; O2-NEXT:    lock andw $42, (%rdi)
3727 ; O2-NEXT:    movq $1, foo(%rip)
3728 ; O2-NEXT:    retq
3730 ; O3-LABEL: atomic16_and_release:
3731 ; O3:       # %bb.0: # %entry
3732 ; O3-NEXT:    movq foo(%rip), %rax
3733 ; O3-NEXT:  .Lpcsection132:
3734 ; O3-NEXT:    lock andw $42, (%rdi)
3735 ; O3-NEXT:    movq $1, foo(%rip)
3736 ; O3-NEXT:    retq
3737 entry:
3738   load volatile i64, ptr @foo, align 8
3739   %x = atomicrmw and ptr %a, i16 42 release, align 2, !pcsections !0
3740   store volatile i64 1, ptr @foo, align 8
3741   ret void
3744 define void @atomic16_or_release(ptr %a) {
3745 ; O0-LABEL: atomic16_or_release:
3746 ; O0:       # %bb.0: # %entry
3747 ; O0-NEXT:    movq foo(%rip), %rax
3748 ; O0-NEXT:  .Lpcsection142:
3749 ; O0-NEXT:    lock orw $42, (%rdi)
3750 ; O0-NEXT:    movq $1, foo
3751 ; O0-NEXT:    retq
3753 ; O1-LABEL: atomic16_or_release:
3754 ; O1:       # %bb.0: # %entry
3755 ; O1-NEXT:    movq foo(%rip), %rax
3756 ; O1-NEXT:  .Lpcsection133:
3757 ; O1-NEXT:    lock orw $42, (%rdi)
3758 ; O1-NEXT:    movq $1, foo(%rip)
3759 ; O1-NEXT:    retq
3761 ; O2-LABEL: atomic16_or_release:
3762 ; O2:       # %bb.0: # %entry
3763 ; O2-NEXT:    movq foo(%rip), %rax
3764 ; O2-NEXT:  .Lpcsection133:
3765 ; O2-NEXT:    lock orw $42, (%rdi)
3766 ; O2-NEXT:    movq $1, foo(%rip)
3767 ; O2-NEXT:    retq
3769 ; O3-LABEL: atomic16_or_release:
3770 ; O3:       # %bb.0: # %entry
3771 ; O3-NEXT:    movq foo(%rip), %rax
3772 ; O3-NEXT:  .Lpcsection133:
3773 ; O3-NEXT:    lock orw $42, (%rdi)
3774 ; O3-NEXT:    movq $1, foo(%rip)
3775 ; O3-NEXT:    retq
3776 entry:
3777   load volatile i64, ptr @foo, align 8
3778   %x = atomicrmw or ptr %a, i16 42 release, align 2, !pcsections !0
3779   store volatile i64 1, ptr @foo, align 8
3780   ret void
3783 define void @atomic16_xor_release(ptr %a) {
3784 ; O0-LABEL: atomic16_xor_release:
3785 ; O0:       # %bb.0: # %entry
3786 ; O0-NEXT:    movq foo(%rip), %rax
3787 ; O0-NEXT:  .Lpcsection143:
3788 ; O0-NEXT:    lock xorw $42, (%rdi)
3789 ; O0-NEXT:    movq $1, foo
3790 ; O0-NEXT:    retq
3792 ; O1-LABEL: atomic16_xor_release:
3793 ; O1:       # %bb.0: # %entry
3794 ; O1-NEXT:    movq foo(%rip), %rax
3795 ; O1-NEXT:  .Lpcsection134:
3796 ; O1-NEXT:    lock xorw $42, (%rdi)
3797 ; O1-NEXT:    movq $1, foo(%rip)
3798 ; O1-NEXT:    retq
3800 ; O2-LABEL: atomic16_xor_release:
3801 ; O2:       # %bb.0: # %entry
3802 ; O2-NEXT:    movq foo(%rip), %rax
3803 ; O2-NEXT:  .Lpcsection134:
3804 ; O2-NEXT:    lock xorw $42, (%rdi)
3805 ; O2-NEXT:    movq $1, foo(%rip)
3806 ; O2-NEXT:    retq
3808 ; O3-LABEL: atomic16_xor_release:
3809 ; O3:       # %bb.0: # %entry
3810 ; O3-NEXT:    movq foo(%rip), %rax
3811 ; O3-NEXT:  .Lpcsection134:
3812 ; O3-NEXT:    lock xorw $42, (%rdi)
3813 ; O3-NEXT:    movq $1, foo(%rip)
3814 ; O3-NEXT:    retq
3815 entry:
3816   load volatile i64, ptr @foo, align 8
3817   %x = atomicrmw xor ptr %a, i16 42 release, align 2, !pcsections !0
3818   store volatile i64 1, ptr @foo, align 8
3819   ret void
3822 define void @atomic16_nand_release(ptr %a) {
3823 ; O0-LABEL: atomic16_nand_release:
3824 ; O0:       # %bb.0: # %entry
3825 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
3826 ; O0-NEXT:    movq foo, %rax
3827 ; O0-NEXT:  .Lpcsection144:
3828 ; O0-NEXT:    movw (%rdi), %ax
3829 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
3830 ; O0-NEXT:  .LBB78_1: # %atomicrmw.start
3831 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
3832 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
3833 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
3834 ; O0-NEXT:  .Lpcsection145:
3835 ; O0-NEXT:    # implicit-def: $edx
3836 ; O0-NEXT:    movw %ax, %dx
3837 ; O0-NEXT:  .Lpcsection146:
3838 ; O0-NEXT:    notl %edx
3839 ; O0-NEXT:  .Lpcsection147:
3840 ; O0-NEXT:    orl $65493, %edx # imm = 0xFFD5
3841 ; O0-NEXT:  .Lpcsection148:
3842 ; O0-NEXT:    # kill: def $dx killed $dx killed $edx
3843 ; O0-NEXT:  .Lpcsection149:
3844 ; O0-NEXT:    lock cmpxchgw %dx, (%rcx)
3845 ; O0-NEXT:  .Lpcsection150:
3846 ; O0-NEXT:    sete %cl
3847 ; O0-NEXT:  .Lpcsection151:
3848 ; O0-NEXT:    testb $1, %cl
3849 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
3850 ; O0-NEXT:  .Lpcsection152:
3851 ; O0-NEXT:    jne .LBB78_2
3852 ; O0-NEXT:    jmp .LBB78_1
3853 ; O0-NEXT:  .LBB78_2: # %atomicrmw.end
3854 ; O0-NEXT:    movq $1, foo
3855 ; O0-NEXT:    retq
3857 ; O1-LABEL: atomic16_nand_release:
3858 ; O1:       # %bb.0: # %entry
3859 ; O1-NEXT:    movq foo(%rip), %rax
3860 ; O1-NEXT:  .Lpcsection135:
3861 ; O1-NEXT:    movzwl (%rdi), %eax
3862 ; O1-NEXT:    .p2align 4, 0x90
3863 ; O1-NEXT:  .LBB78_1: # %atomicrmw.start
3864 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
3865 ; O1-NEXT:    movl %eax, %ecx
3866 ; O1-NEXT:  .Lpcsection136:
3867 ; O1-NEXT:    notl %ecx
3868 ; O1-NEXT:  .Lpcsection137:
3869 ; O1-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3870 ; O1-NEXT:  .Lpcsection138:
3871 ; O1-NEXT:    # kill: def $ax killed $ax killed $eax
3872 ; O1-NEXT:  .Lpcsection139:
3873 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
3874 ; O1-NEXT:  .Lpcsection140:
3875 ; O1-NEXT:    # kill: def $ax killed $ax def $eax
3876 ; O1-NEXT:  .Lpcsection141:
3877 ; O1-NEXT:    jne .LBB78_1
3878 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
3879 ; O1-NEXT:    movq $1, foo(%rip)
3880 ; O1-NEXT:    retq
3882 ; O2-LABEL: atomic16_nand_release:
3883 ; O2:       # %bb.0: # %entry
3884 ; O2-NEXT:    movq foo(%rip), %rax
3885 ; O2-NEXT:  .Lpcsection135:
3886 ; O2-NEXT:    movzwl (%rdi), %eax
3887 ; O2-NEXT:    .p2align 4, 0x90
3888 ; O2-NEXT:  .LBB78_1: # %atomicrmw.start
3889 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
3890 ; O2-NEXT:    movl %eax, %ecx
3891 ; O2-NEXT:  .Lpcsection136:
3892 ; O2-NEXT:    notl %ecx
3893 ; O2-NEXT:  .Lpcsection137:
3894 ; O2-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3895 ; O2-NEXT:  .Lpcsection138:
3896 ; O2-NEXT:    # kill: def $ax killed $ax killed $eax
3897 ; O2-NEXT:  .Lpcsection139:
3898 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
3899 ; O2-NEXT:  .Lpcsection140:
3900 ; O2-NEXT:    # kill: def $ax killed $ax def $eax
3901 ; O2-NEXT:  .Lpcsection141:
3902 ; O2-NEXT:    jne .LBB78_1
3903 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
3904 ; O2-NEXT:    movq $1, foo(%rip)
3905 ; O2-NEXT:    retq
3907 ; O3-LABEL: atomic16_nand_release:
3908 ; O3:       # %bb.0: # %entry
3909 ; O3-NEXT:    movq foo(%rip), %rax
3910 ; O3-NEXT:  .Lpcsection135:
3911 ; O3-NEXT:    movzwl (%rdi), %eax
3912 ; O3-NEXT:    .p2align 4, 0x90
3913 ; O3-NEXT:  .LBB78_1: # %atomicrmw.start
3914 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
3915 ; O3-NEXT:    movl %eax, %ecx
3916 ; O3-NEXT:  .Lpcsection136:
3917 ; O3-NEXT:    notl %ecx
3918 ; O3-NEXT:  .Lpcsection137:
3919 ; O3-NEXT:    orl $65493, %ecx # imm = 0xFFD5
3920 ; O3-NEXT:  .Lpcsection138:
3921 ; O3-NEXT:    # kill: def $ax killed $ax killed $eax
3922 ; O3-NEXT:  .Lpcsection139:
3923 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
3924 ; O3-NEXT:  .Lpcsection140:
3925 ; O3-NEXT:    # kill: def $ax killed $ax def $eax
3926 ; O3-NEXT:  .Lpcsection141:
3927 ; O3-NEXT:    jne .LBB78_1
3928 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
3929 ; O3-NEXT:    movq $1, foo(%rip)
3930 ; O3-NEXT:    retq
3931 entry:
3932   load volatile i64, ptr @foo, align 8
3933   %x = atomicrmw nand ptr %a, i16 42 release, align 2, !pcsections !0
3934   store volatile i64 1, ptr @foo, align 8
3935   ret void
3938 define void @atomic16_xchg_acq_rel(ptr %a) {
3939 ; O0-LABEL: atomic16_xchg_acq_rel:
3940 ; O0:       # %bb.0: # %entry
3941 ; O0-NEXT:    movq foo(%rip), %rax
3942 ; O0-NEXT:    movw $42, %ax
3943 ; O0-NEXT:  .Lpcsection153:
3944 ; O0-NEXT:    xchgw %ax, (%rdi)
3945 ; O0-NEXT:    movq $1, foo
3946 ; O0-NEXT:    retq
3948 ; O1-LABEL: atomic16_xchg_acq_rel:
3949 ; O1:       # %bb.0: # %entry
3950 ; O1-NEXT:    movq foo(%rip), %rax
3951 ; O1-NEXT:    movw $42, %ax
3952 ; O1-NEXT:  .Lpcsection142:
3953 ; O1-NEXT:    xchgw %ax, (%rdi)
3954 ; O1-NEXT:    movq $1, foo(%rip)
3955 ; O1-NEXT:    retq
3957 ; O2-LABEL: atomic16_xchg_acq_rel:
3958 ; O2:       # %bb.0: # %entry
3959 ; O2-NEXT:    movq foo(%rip), %rax
3960 ; O2-NEXT:    movw $42, %ax
3961 ; O2-NEXT:  .Lpcsection142:
3962 ; O2-NEXT:    xchgw %ax, (%rdi)
3963 ; O2-NEXT:    movq $1, foo(%rip)
3964 ; O2-NEXT:    retq
3966 ; O3-LABEL: atomic16_xchg_acq_rel:
3967 ; O3:       # %bb.0: # %entry
3968 ; O3-NEXT:    movq foo(%rip), %rax
3969 ; O3-NEXT:    movw $42, %ax
3970 ; O3-NEXT:  .Lpcsection142:
3971 ; O3-NEXT:    xchgw %ax, (%rdi)
3972 ; O3-NEXT:    movq $1, foo(%rip)
3973 ; O3-NEXT:    retq
3974 entry:
3975   load volatile i64, ptr @foo, align 8
3976   %x = atomicrmw xchg ptr %a, i16 42 acq_rel, align 2, !pcsections !0
3977   store volatile i64 1, ptr @foo, align 8
3978   ret void
3981 define void @atomic16_add_acq_rel(ptr %a) {
3982 ; O0-LABEL: atomic16_add_acq_rel:
3983 ; O0:       # %bb.0: # %entry
3984 ; O0-NEXT:    movq foo(%rip), %rax
3985 ; O0-NEXT:  .Lpcsection154:
3986 ; O0-NEXT:    lock addw $42, (%rdi)
3987 ; O0-NEXT:    movq $1, foo
3988 ; O0-NEXT:    retq
3990 ; O1-LABEL: atomic16_add_acq_rel:
3991 ; O1:       # %bb.0: # %entry
3992 ; O1-NEXT:    movq foo(%rip), %rax
3993 ; O1-NEXT:  .Lpcsection143:
3994 ; O1-NEXT:    lock addw $42, (%rdi)
3995 ; O1-NEXT:    movq $1, foo(%rip)
3996 ; O1-NEXT:    retq
3998 ; O2-LABEL: atomic16_add_acq_rel:
3999 ; O2:       # %bb.0: # %entry
4000 ; O2-NEXT:    movq foo(%rip), %rax
4001 ; O2-NEXT:  .Lpcsection143:
4002 ; O2-NEXT:    lock addw $42, (%rdi)
4003 ; O2-NEXT:    movq $1, foo(%rip)
4004 ; O2-NEXT:    retq
4006 ; O3-LABEL: atomic16_add_acq_rel:
4007 ; O3:       # %bb.0: # %entry
4008 ; O3-NEXT:    movq foo(%rip), %rax
4009 ; O3-NEXT:  .Lpcsection143:
4010 ; O3-NEXT:    lock addw $42, (%rdi)
4011 ; O3-NEXT:    movq $1, foo(%rip)
4012 ; O3-NEXT:    retq
4013 entry:
4014   load volatile i64, ptr @foo, align 8
4015   %x = atomicrmw add ptr %a, i16 42 acq_rel, align 2, !pcsections !0
4016   store volatile i64 1, ptr @foo, align 8
4017   ret void
4020 define void @atomic16_sub_acq_rel(ptr %a) {
4021 ; O0-LABEL: atomic16_sub_acq_rel:
4022 ; O0:       # %bb.0: # %entry
4023 ; O0-NEXT:    movq foo(%rip), %rax
4024 ; O0-NEXT:  .Lpcsection155:
4025 ; O0-NEXT:    lock subw $42, (%rdi)
4026 ; O0-NEXT:    movq $1, foo
4027 ; O0-NEXT:    retq
4029 ; O1-LABEL: atomic16_sub_acq_rel:
4030 ; O1:       # %bb.0: # %entry
4031 ; O1-NEXT:    movq foo(%rip), %rax
4032 ; O1-NEXT:  .Lpcsection144:
4033 ; O1-NEXT:    lock subw $42, (%rdi)
4034 ; O1-NEXT:    movq $1, foo(%rip)
4035 ; O1-NEXT:    retq
4037 ; O2-LABEL: atomic16_sub_acq_rel:
4038 ; O2:       # %bb.0: # %entry
4039 ; O2-NEXT:    movq foo(%rip), %rax
4040 ; O2-NEXT:  .Lpcsection144:
4041 ; O2-NEXT:    lock subw $42, (%rdi)
4042 ; O2-NEXT:    movq $1, foo(%rip)
4043 ; O2-NEXT:    retq
4045 ; O3-LABEL: atomic16_sub_acq_rel:
4046 ; O3:       # %bb.0: # %entry
4047 ; O3-NEXT:    movq foo(%rip), %rax
4048 ; O3-NEXT:  .Lpcsection144:
4049 ; O3-NEXT:    lock subw $42, (%rdi)
4050 ; O3-NEXT:    movq $1, foo(%rip)
4051 ; O3-NEXT:    retq
4052 entry:
4053   load volatile i64, ptr @foo, align 8
4054   %x = atomicrmw sub ptr %a, i16 42 acq_rel, align 2, !pcsections !0
4055   store volatile i64 1, ptr @foo, align 8
4056   ret void
4059 define void @atomic16_and_acq_rel(ptr %a) {
4060 ; O0-LABEL: atomic16_and_acq_rel:
4061 ; O0:       # %bb.0: # %entry
4062 ; O0-NEXT:    movq foo(%rip), %rax
4063 ; O0-NEXT:  .Lpcsection156:
4064 ; O0-NEXT:    lock andw $42, (%rdi)
4065 ; O0-NEXT:    movq $1, foo
4066 ; O0-NEXT:    retq
4068 ; O1-LABEL: atomic16_and_acq_rel:
4069 ; O1:       # %bb.0: # %entry
4070 ; O1-NEXT:    movq foo(%rip), %rax
4071 ; O1-NEXT:  .Lpcsection145:
4072 ; O1-NEXT:    lock andw $42, (%rdi)
4073 ; O1-NEXT:    movq $1, foo(%rip)
4074 ; O1-NEXT:    retq
4076 ; O2-LABEL: atomic16_and_acq_rel:
4077 ; O2:       # %bb.0: # %entry
4078 ; O2-NEXT:    movq foo(%rip), %rax
4079 ; O2-NEXT:  .Lpcsection145:
4080 ; O2-NEXT:    lock andw $42, (%rdi)
4081 ; O2-NEXT:    movq $1, foo(%rip)
4082 ; O2-NEXT:    retq
4084 ; O3-LABEL: atomic16_and_acq_rel:
4085 ; O3:       # %bb.0: # %entry
4086 ; O3-NEXT:    movq foo(%rip), %rax
4087 ; O3-NEXT:  .Lpcsection145:
4088 ; O3-NEXT:    lock andw $42, (%rdi)
4089 ; O3-NEXT:    movq $1, foo(%rip)
4090 ; O3-NEXT:    retq
4091 entry:
4092   load volatile i64, ptr @foo, align 8
4093   %x = atomicrmw and ptr %a, i16 42 acq_rel, align 2, !pcsections !0
4094   store volatile i64 1, ptr @foo, align 8
4095   ret void
4098 define void @atomic16_or_acq_rel(ptr %a) {
4099 ; O0-LABEL: atomic16_or_acq_rel:
4100 ; O0:       # %bb.0: # %entry
4101 ; O0-NEXT:    movq foo(%rip), %rax
4102 ; O0-NEXT:  .Lpcsection157:
4103 ; O0-NEXT:    lock orw $42, (%rdi)
4104 ; O0-NEXT:    movq $1, foo
4105 ; O0-NEXT:    retq
4107 ; O1-LABEL: atomic16_or_acq_rel:
4108 ; O1:       # %bb.0: # %entry
4109 ; O1-NEXT:    movq foo(%rip), %rax
4110 ; O1-NEXT:  .Lpcsection146:
4111 ; O1-NEXT:    lock orw $42, (%rdi)
4112 ; O1-NEXT:    movq $1, foo(%rip)
4113 ; O1-NEXT:    retq
4115 ; O2-LABEL: atomic16_or_acq_rel:
4116 ; O2:       # %bb.0: # %entry
4117 ; O2-NEXT:    movq foo(%rip), %rax
4118 ; O2-NEXT:  .Lpcsection146:
4119 ; O2-NEXT:    lock orw $42, (%rdi)
4120 ; O2-NEXT:    movq $1, foo(%rip)
4121 ; O2-NEXT:    retq
4123 ; O3-LABEL: atomic16_or_acq_rel:
4124 ; O3:       # %bb.0: # %entry
4125 ; O3-NEXT:    movq foo(%rip), %rax
4126 ; O3-NEXT:  .Lpcsection146:
4127 ; O3-NEXT:    lock orw $42, (%rdi)
4128 ; O3-NEXT:    movq $1, foo(%rip)
4129 ; O3-NEXT:    retq
4130 entry:
4131   load volatile i64, ptr @foo, align 8
4132   %x = atomicrmw or ptr %a, i16 42 acq_rel, align 2, !pcsections !0
4133   store volatile i64 1, ptr @foo, align 8
4134   ret void
4137 define void @atomic16_xor_acq_rel(ptr %a) {
4138 ; O0-LABEL: atomic16_xor_acq_rel:
4139 ; O0:       # %bb.0: # %entry
4140 ; O0-NEXT:    movq foo(%rip), %rax
4141 ; O0-NEXT:  .Lpcsection158:
4142 ; O0-NEXT:    lock xorw $42, (%rdi)
4143 ; O0-NEXT:    movq $1, foo
4144 ; O0-NEXT:    retq
4146 ; O1-LABEL: atomic16_xor_acq_rel:
4147 ; O1:       # %bb.0: # %entry
4148 ; O1-NEXT:    movq foo(%rip), %rax
4149 ; O1-NEXT:  .Lpcsection147:
4150 ; O1-NEXT:    lock xorw $42, (%rdi)
4151 ; O1-NEXT:    movq $1, foo(%rip)
4152 ; O1-NEXT:    retq
4154 ; O2-LABEL: atomic16_xor_acq_rel:
4155 ; O2:       # %bb.0: # %entry
4156 ; O2-NEXT:    movq foo(%rip), %rax
4157 ; O2-NEXT:  .Lpcsection147:
4158 ; O2-NEXT:    lock xorw $42, (%rdi)
4159 ; O2-NEXT:    movq $1, foo(%rip)
4160 ; O2-NEXT:    retq
4162 ; O3-LABEL: atomic16_xor_acq_rel:
4163 ; O3:       # %bb.0: # %entry
4164 ; O3-NEXT:    movq foo(%rip), %rax
4165 ; O3-NEXT:  .Lpcsection147:
4166 ; O3-NEXT:    lock xorw $42, (%rdi)
4167 ; O3-NEXT:    movq $1, foo(%rip)
4168 ; O3-NEXT:    retq
4169 entry:
4170   load volatile i64, ptr @foo, align 8
4171   %x = atomicrmw xor ptr %a, i16 42 acq_rel, align 2, !pcsections !0
4172   store volatile i64 1, ptr @foo, align 8
4173   ret void
4176 define void @atomic16_nand_acq_rel(ptr %a) {
4177 ; O0-LABEL: atomic16_nand_acq_rel:
4178 ; O0:       # %bb.0: # %entry
4179 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
4180 ; O0-NEXT:    movq foo, %rax
4181 ; O0-NEXT:  .Lpcsection159:
4182 ; O0-NEXT:    movw (%rdi), %ax
4183 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4184 ; O0-NEXT:  .LBB85_1: # %atomicrmw.start
4185 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
4186 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4187 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
4188 ; O0-NEXT:  .Lpcsection160:
4189 ; O0-NEXT:    # implicit-def: $edx
4190 ; O0-NEXT:    movw %ax, %dx
4191 ; O0-NEXT:  .Lpcsection161:
4192 ; O0-NEXT:    notl %edx
4193 ; O0-NEXT:  .Lpcsection162:
4194 ; O0-NEXT:    orl $65493, %edx # imm = 0xFFD5
4195 ; O0-NEXT:  .Lpcsection163:
4196 ; O0-NEXT:    # kill: def $dx killed $dx killed $edx
4197 ; O0-NEXT:  .Lpcsection164:
4198 ; O0-NEXT:    lock cmpxchgw %dx, (%rcx)
4199 ; O0-NEXT:  .Lpcsection165:
4200 ; O0-NEXT:    sete %cl
4201 ; O0-NEXT:  .Lpcsection166:
4202 ; O0-NEXT:    testb $1, %cl
4203 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4204 ; O0-NEXT:  .Lpcsection167:
4205 ; O0-NEXT:    jne .LBB85_2
4206 ; O0-NEXT:    jmp .LBB85_1
4207 ; O0-NEXT:  .LBB85_2: # %atomicrmw.end
4208 ; O0-NEXT:    movq $1, foo
4209 ; O0-NEXT:    retq
4211 ; O1-LABEL: atomic16_nand_acq_rel:
4212 ; O1:       # %bb.0: # %entry
4213 ; O1-NEXT:    movq foo(%rip), %rax
4214 ; O1-NEXT:  .Lpcsection148:
4215 ; O1-NEXT:    movzwl (%rdi), %eax
4216 ; O1-NEXT:    .p2align 4, 0x90
4217 ; O1-NEXT:  .LBB85_1: # %atomicrmw.start
4218 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4219 ; O1-NEXT:    movl %eax, %ecx
4220 ; O1-NEXT:  .Lpcsection149:
4221 ; O1-NEXT:    notl %ecx
4222 ; O1-NEXT:  .Lpcsection150:
4223 ; O1-NEXT:    orl $65493, %ecx # imm = 0xFFD5
4224 ; O1-NEXT:  .Lpcsection151:
4225 ; O1-NEXT:    # kill: def $ax killed $ax killed $eax
4226 ; O1-NEXT:  .Lpcsection152:
4227 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4228 ; O1-NEXT:  .Lpcsection153:
4229 ; O1-NEXT:    # kill: def $ax killed $ax def $eax
4230 ; O1-NEXT:  .Lpcsection154:
4231 ; O1-NEXT:    jne .LBB85_1
4232 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
4233 ; O1-NEXT:    movq $1, foo(%rip)
4234 ; O1-NEXT:    retq
4236 ; O2-LABEL: atomic16_nand_acq_rel:
4237 ; O2:       # %bb.0: # %entry
4238 ; O2-NEXT:    movq foo(%rip), %rax
4239 ; O2-NEXT:  .Lpcsection148:
4240 ; O2-NEXT:    movzwl (%rdi), %eax
4241 ; O2-NEXT:    .p2align 4, 0x90
4242 ; O2-NEXT:  .LBB85_1: # %atomicrmw.start
4243 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4244 ; O2-NEXT:    movl %eax, %ecx
4245 ; O2-NEXT:  .Lpcsection149:
4246 ; O2-NEXT:    notl %ecx
4247 ; O2-NEXT:  .Lpcsection150:
4248 ; O2-NEXT:    orl $65493, %ecx # imm = 0xFFD5
4249 ; O2-NEXT:  .Lpcsection151:
4250 ; O2-NEXT:    # kill: def $ax killed $ax killed $eax
4251 ; O2-NEXT:  .Lpcsection152:
4252 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4253 ; O2-NEXT:  .Lpcsection153:
4254 ; O2-NEXT:    # kill: def $ax killed $ax def $eax
4255 ; O2-NEXT:  .Lpcsection154:
4256 ; O2-NEXT:    jne .LBB85_1
4257 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
4258 ; O2-NEXT:    movq $1, foo(%rip)
4259 ; O2-NEXT:    retq
4261 ; O3-LABEL: atomic16_nand_acq_rel:
4262 ; O3:       # %bb.0: # %entry
4263 ; O3-NEXT:    movq foo(%rip), %rax
4264 ; O3-NEXT:  .Lpcsection148:
4265 ; O3-NEXT:    movzwl (%rdi), %eax
4266 ; O3-NEXT:    .p2align 4, 0x90
4267 ; O3-NEXT:  .LBB85_1: # %atomicrmw.start
4268 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4269 ; O3-NEXT:    movl %eax, %ecx
4270 ; O3-NEXT:  .Lpcsection149:
4271 ; O3-NEXT:    notl %ecx
4272 ; O3-NEXT:  .Lpcsection150:
4273 ; O3-NEXT:    orl $65493, %ecx # imm = 0xFFD5
4274 ; O3-NEXT:  .Lpcsection151:
4275 ; O3-NEXT:    # kill: def $ax killed $ax killed $eax
4276 ; O3-NEXT:  .Lpcsection152:
4277 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4278 ; O3-NEXT:  .Lpcsection153:
4279 ; O3-NEXT:    # kill: def $ax killed $ax def $eax
4280 ; O3-NEXT:  .Lpcsection154:
4281 ; O3-NEXT:    jne .LBB85_1
4282 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
4283 ; O3-NEXT:    movq $1, foo(%rip)
4284 ; O3-NEXT:    retq
4285 entry:
4286   load volatile i64, ptr @foo, align 8
4287   %x = atomicrmw nand ptr %a, i16 42 acq_rel, align 2, !pcsections !0
4288   store volatile i64 1, ptr @foo, align 8
4289   ret void
4292 define void @atomic16_xchg_seq_cst(ptr %a) {
4293 ; O0-LABEL: atomic16_xchg_seq_cst:
4294 ; O0:       # %bb.0: # %entry
4295 ; O0-NEXT:    movq foo(%rip), %rax
4296 ; O0-NEXT:    movw $42, %ax
4297 ; O0-NEXT:  .Lpcsection168:
4298 ; O0-NEXT:    xchgw %ax, (%rdi)
4299 ; O0-NEXT:    movq $1, foo
4300 ; O0-NEXT:    retq
4302 ; O1-LABEL: atomic16_xchg_seq_cst:
4303 ; O1:       # %bb.0: # %entry
4304 ; O1-NEXT:    movq foo(%rip), %rax
4305 ; O1-NEXT:    movw $42, %ax
4306 ; O1-NEXT:  .Lpcsection155:
4307 ; O1-NEXT:    xchgw %ax, (%rdi)
4308 ; O1-NEXT:    movq $1, foo(%rip)
4309 ; O1-NEXT:    retq
4311 ; O2-LABEL: atomic16_xchg_seq_cst:
4312 ; O2:       # %bb.0: # %entry
4313 ; O2-NEXT:    movq foo(%rip), %rax
4314 ; O2-NEXT:    movw $42, %ax
4315 ; O2-NEXT:  .Lpcsection155:
4316 ; O2-NEXT:    xchgw %ax, (%rdi)
4317 ; O2-NEXT:    movq $1, foo(%rip)
4318 ; O2-NEXT:    retq
4320 ; O3-LABEL: atomic16_xchg_seq_cst:
4321 ; O3:       # %bb.0: # %entry
4322 ; O3-NEXT:    movq foo(%rip), %rax
4323 ; O3-NEXT:    movw $42, %ax
4324 ; O3-NEXT:  .Lpcsection155:
4325 ; O3-NEXT:    xchgw %ax, (%rdi)
4326 ; O3-NEXT:    movq $1, foo(%rip)
4327 ; O3-NEXT:    retq
4328 entry:
4329   load volatile i64, ptr @foo, align 8
4330   %x = atomicrmw xchg ptr %a, i16 42 seq_cst, align 2, !pcsections !0
4331   store volatile i64 1, ptr @foo, align 8
4332   ret void
4335 define void @atomic16_add_seq_cst(ptr %a) {
4336 ; O0-LABEL: atomic16_add_seq_cst:
4337 ; O0:       # %bb.0: # %entry
4338 ; O0-NEXT:    movq foo(%rip), %rax
4339 ; O0-NEXT:  .Lpcsection169:
4340 ; O0-NEXT:    lock addw $42, (%rdi)
4341 ; O0-NEXT:    movq $1, foo
4342 ; O0-NEXT:    retq
4344 ; O1-LABEL: atomic16_add_seq_cst:
4345 ; O1:       # %bb.0: # %entry
4346 ; O1-NEXT:    movq foo(%rip), %rax
4347 ; O1-NEXT:  .Lpcsection156:
4348 ; O1-NEXT:    lock addw $42, (%rdi)
4349 ; O1-NEXT:    movq $1, foo(%rip)
4350 ; O1-NEXT:    retq
4352 ; O2-LABEL: atomic16_add_seq_cst:
4353 ; O2:       # %bb.0: # %entry
4354 ; O2-NEXT:    movq foo(%rip), %rax
4355 ; O2-NEXT:  .Lpcsection156:
4356 ; O2-NEXT:    lock addw $42, (%rdi)
4357 ; O2-NEXT:    movq $1, foo(%rip)
4358 ; O2-NEXT:    retq
4360 ; O3-LABEL: atomic16_add_seq_cst:
4361 ; O3:       # %bb.0: # %entry
4362 ; O3-NEXT:    movq foo(%rip), %rax
4363 ; O3-NEXT:  .Lpcsection156:
4364 ; O3-NEXT:    lock addw $42, (%rdi)
4365 ; O3-NEXT:    movq $1, foo(%rip)
4366 ; O3-NEXT:    retq
4367 entry:
4368   load volatile i64, ptr @foo, align 8
4369   %x = atomicrmw add ptr %a, i16 42 seq_cst, align 2, !pcsections !0
4370   store volatile i64 1, ptr @foo, align 8
4371   ret void
4374 define void @atomic16_sub_seq_cst(ptr %a) {
4375 ; O0-LABEL: atomic16_sub_seq_cst:
4376 ; O0:       # %bb.0: # %entry
4377 ; O0-NEXT:    movq foo(%rip), %rax
4378 ; O0-NEXT:  .Lpcsection170:
4379 ; O0-NEXT:    lock subw $42, (%rdi)
4380 ; O0-NEXT:    movq $1, foo
4381 ; O0-NEXT:    retq
4383 ; O1-LABEL: atomic16_sub_seq_cst:
4384 ; O1:       # %bb.0: # %entry
4385 ; O1-NEXT:    movq foo(%rip), %rax
4386 ; O1-NEXT:  .Lpcsection157:
4387 ; O1-NEXT:    lock subw $42, (%rdi)
4388 ; O1-NEXT:    movq $1, foo(%rip)
4389 ; O1-NEXT:    retq
4391 ; O2-LABEL: atomic16_sub_seq_cst:
4392 ; O2:       # %bb.0: # %entry
4393 ; O2-NEXT:    movq foo(%rip), %rax
4394 ; O2-NEXT:  .Lpcsection157:
4395 ; O2-NEXT:    lock subw $42, (%rdi)
4396 ; O2-NEXT:    movq $1, foo(%rip)
4397 ; O2-NEXT:    retq
4399 ; O3-LABEL: atomic16_sub_seq_cst:
4400 ; O3:       # %bb.0: # %entry
4401 ; O3-NEXT:    movq foo(%rip), %rax
4402 ; O3-NEXT:  .Lpcsection157:
4403 ; O3-NEXT:    lock subw $42, (%rdi)
4404 ; O3-NEXT:    movq $1, foo(%rip)
4405 ; O3-NEXT:    retq
4406 entry:
4407   load volatile i64, ptr @foo, align 8
4408   %x = atomicrmw sub ptr %a, i16 42 seq_cst, align 2, !pcsections !0
4409   store volatile i64 1, ptr @foo, align 8
4410   ret void
4413 define void @atomic16_and_seq_cst(ptr %a) {
4414 ; O0-LABEL: atomic16_and_seq_cst:
4415 ; O0:       # %bb.0: # %entry
4416 ; O0-NEXT:    movq foo(%rip), %rax
4417 ; O0-NEXT:  .Lpcsection171:
4418 ; O0-NEXT:    lock andw $42, (%rdi)
4419 ; O0-NEXT:    movq $1, foo
4420 ; O0-NEXT:    retq
4422 ; O1-LABEL: atomic16_and_seq_cst:
4423 ; O1:       # %bb.0: # %entry
4424 ; O1-NEXT:    movq foo(%rip), %rax
4425 ; O1-NEXT:  .Lpcsection158:
4426 ; O1-NEXT:    lock andw $42, (%rdi)
4427 ; O1-NEXT:    movq $1, foo(%rip)
4428 ; O1-NEXT:    retq
4430 ; O2-LABEL: atomic16_and_seq_cst:
4431 ; O2:       # %bb.0: # %entry
4432 ; O2-NEXT:    movq foo(%rip), %rax
4433 ; O2-NEXT:  .Lpcsection158:
4434 ; O2-NEXT:    lock andw $42, (%rdi)
4435 ; O2-NEXT:    movq $1, foo(%rip)
4436 ; O2-NEXT:    retq
4438 ; O3-LABEL: atomic16_and_seq_cst:
4439 ; O3:       # %bb.0: # %entry
4440 ; O3-NEXT:    movq foo(%rip), %rax
4441 ; O3-NEXT:  .Lpcsection158:
4442 ; O3-NEXT:    lock andw $42, (%rdi)
4443 ; O3-NEXT:    movq $1, foo(%rip)
4444 ; O3-NEXT:    retq
4445 entry:
4446   load volatile i64, ptr @foo, align 8
4447   %x = atomicrmw and ptr %a, i16 42 seq_cst, align 2, !pcsections !0
4448   store volatile i64 1, ptr @foo, align 8
4449   ret void
4452 define void @atomic16_or_seq_cst(ptr %a) {
4453 ; O0-LABEL: atomic16_or_seq_cst:
4454 ; O0:       # %bb.0: # %entry
4455 ; O0-NEXT:    movq foo(%rip), %rax
4456 ; O0-NEXT:  .Lpcsection172:
4457 ; O0-NEXT:    lock orw $42, (%rdi)
4458 ; O0-NEXT:    movq $1, foo
4459 ; O0-NEXT:    retq
4461 ; O1-LABEL: atomic16_or_seq_cst:
4462 ; O1:       # %bb.0: # %entry
4463 ; O1-NEXT:    movq foo(%rip), %rax
4464 ; O1-NEXT:  .Lpcsection159:
4465 ; O1-NEXT:    lock orw $42, (%rdi)
4466 ; O1-NEXT:    movq $1, foo(%rip)
4467 ; O1-NEXT:    retq
4469 ; O2-LABEL: atomic16_or_seq_cst:
4470 ; O2:       # %bb.0: # %entry
4471 ; O2-NEXT:    movq foo(%rip), %rax
4472 ; O2-NEXT:  .Lpcsection159:
4473 ; O2-NEXT:    lock orw $42, (%rdi)
4474 ; O2-NEXT:    movq $1, foo(%rip)
4475 ; O2-NEXT:    retq
4477 ; O3-LABEL: atomic16_or_seq_cst:
4478 ; O3:       # %bb.0: # %entry
4479 ; O3-NEXT:    movq foo(%rip), %rax
4480 ; O3-NEXT:  .Lpcsection159:
4481 ; O3-NEXT:    lock orw $42, (%rdi)
4482 ; O3-NEXT:    movq $1, foo(%rip)
4483 ; O3-NEXT:    retq
4484 entry:
4485   load volatile i64, ptr @foo, align 8
4486   %x = atomicrmw or ptr %a, i16 42 seq_cst, align 2, !pcsections !0
4487   store volatile i64 1, ptr @foo, align 8
4488   ret void
4491 define void @atomic16_xor_seq_cst(ptr %a) {
4492 ; O0-LABEL: atomic16_xor_seq_cst:
4493 ; O0:       # %bb.0: # %entry
4494 ; O0-NEXT:    movq foo(%rip), %rax
4495 ; O0-NEXT:  .Lpcsection173:
4496 ; O0-NEXT:    lock xorw $42, (%rdi)
4497 ; O0-NEXT:    movq $1, foo
4498 ; O0-NEXT:    retq
4500 ; O1-LABEL: atomic16_xor_seq_cst:
4501 ; O1:       # %bb.0: # %entry
4502 ; O1-NEXT:    movq foo(%rip), %rax
4503 ; O1-NEXT:  .Lpcsection160:
4504 ; O1-NEXT:    lock xorw $42, (%rdi)
4505 ; O1-NEXT:    movq $1, foo(%rip)
4506 ; O1-NEXT:    retq
4508 ; O2-LABEL: atomic16_xor_seq_cst:
4509 ; O2:       # %bb.0: # %entry
4510 ; O2-NEXT:    movq foo(%rip), %rax
4511 ; O2-NEXT:  .Lpcsection160:
4512 ; O2-NEXT:    lock xorw $42, (%rdi)
4513 ; O2-NEXT:    movq $1, foo(%rip)
4514 ; O2-NEXT:    retq
4516 ; O3-LABEL: atomic16_xor_seq_cst:
4517 ; O3:       # %bb.0: # %entry
4518 ; O3-NEXT:    movq foo(%rip), %rax
4519 ; O3-NEXT:  .Lpcsection160:
4520 ; O3-NEXT:    lock xorw $42, (%rdi)
4521 ; O3-NEXT:    movq $1, foo(%rip)
4522 ; O3-NEXT:    retq
4523 entry:
4524   load volatile i64, ptr @foo, align 8
4525   %x = atomicrmw xor ptr %a, i16 42 seq_cst, align 2, !pcsections !0
4526   store volatile i64 1, ptr @foo, align 8
4527   ret void
4530 define void @atomic16_nand_seq_cst(ptr %a) {
4531 ; O0-LABEL: atomic16_nand_seq_cst:
4532 ; O0:       # %bb.0: # %entry
4533 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
4534 ; O0-NEXT:    movq foo, %rax
4535 ; O0-NEXT:  .Lpcsection174:
4536 ; O0-NEXT:    movw (%rdi), %ax
4537 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4538 ; O0-NEXT:  .LBB92_1: # %atomicrmw.start
4539 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
4540 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4541 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
4542 ; O0-NEXT:  .Lpcsection175:
4543 ; O0-NEXT:    # implicit-def: $edx
4544 ; O0-NEXT:    movw %ax, %dx
4545 ; O0-NEXT:  .Lpcsection176:
4546 ; O0-NEXT:    notl %edx
4547 ; O0-NEXT:  .Lpcsection177:
4548 ; O0-NEXT:    orl $65493, %edx # imm = 0xFFD5
4549 ; O0-NEXT:  .Lpcsection178:
4550 ; O0-NEXT:    # kill: def $dx killed $dx killed $edx
4551 ; O0-NEXT:  .Lpcsection179:
4552 ; O0-NEXT:    lock cmpxchgw %dx, (%rcx)
4553 ; O0-NEXT:  .Lpcsection180:
4554 ; O0-NEXT:    sete %cl
4555 ; O0-NEXT:  .Lpcsection181:
4556 ; O0-NEXT:    testb $1, %cl
4557 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4558 ; O0-NEXT:  .Lpcsection182:
4559 ; O0-NEXT:    jne .LBB92_2
4560 ; O0-NEXT:    jmp .LBB92_1
4561 ; O0-NEXT:  .LBB92_2: # %atomicrmw.end
4562 ; O0-NEXT:    movq $1, foo
4563 ; O0-NEXT:    retq
4565 ; O1-LABEL: atomic16_nand_seq_cst:
4566 ; O1:       # %bb.0: # %entry
4567 ; O1-NEXT:    movq foo(%rip), %rax
4568 ; O1-NEXT:  .Lpcsection161:
4569 ; O1-NEXT:    movzwl (%rdi), %eax
4570 ; O1-NEXT:    .p2align 4, 0x90
4571 ; O1-NEXT:  .LBB92_1: # %atomicrmw.start
4572 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
4573 ; O1-NEXT:    movl %eax, %ecx
4574 ; O1-NEXT:  .Lpcsection162:
4575 ; O1-NEXT:    notl %ecx
4576 ; O1-NEXT:  .Lpcsection163:
4577 ; O1-NEXT:    orl $65493, %ecx # imm = 0xFFD5
4578 ; O1-NEXT:  .Lpcsection164:
4579 ; O1-NEXT:    # kill: def $ax killed $ax killed $eax
4580 ; O1-NEXT:  .Lpcsection165:
4581 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4582 ; O1-NEXT:  .Lpcsection166:
4583 ; O1-NEXT:    # kill: def $ax killed $ax def $eax
4584 ; O1-NEXT:  .Lpcsection167:
4585 ; O1-NEXT:    jne .LBB92_1
4586 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
4587 ; O1-NEXT:    movq $1, foo(%rip)
4588 ; O1-NEXT:    retq
4590 ; O2-LABEL: atomic16_nand_seq_cst:
4591 ; O2:       # %bb.0: # %entry
4592 ; O2-NEXT:    movq foo(%rip), %rax
4593 ; O2-NEXT:  .Lpcsection161:
4594 ; O2-NEXT:    movzwl (%rdi), %eax
4595 ; O2-NEXT:    .p2align 4, 0x90
4596 ; O2-NEXT:  .LBB92_1: # %atomicrmw.start
4597 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
4598 ; O2-NEXT:    movl %eax, %ecx
4599 ; O2-NEXT:  .Lpcsection162:
4600 ; O2-NEXT:    notl %ecx
4601 ; O2-NEXT:  .Lpcsection163:
4602 ; O2-NEXT:    orl $65493, %ecx # imm = 0xFFD5
4603 ; O2-NEXT:  .Lpcsection164:
4604 ; O2-NEXT:    # kill: def $ax killed $ax killed $eax
4605 ; O2-NEXT:  .Lpcsection165:
4606 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4607 ; O2-NEXT:  .Lpcsection166:
4608 ; O2-NEXT:    # kill: def $ax killed $ax def $eax
4609 ; O2-NEXT:  .Lpcsection167:
4610 ; O2-NEXT:    jne .LBB92_1
4611 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
4612 ; O2-NEXT:    movq $1, foo(%rip)
4613 ; O2-NEXT:    retq
4615 ; O3-LABEL: atomic16_nand_seq_cst:
4616 ; O3:       # %bb.0: # %entry
4617 ; O3-NEXT:    movq foo(%rip), %rax
4618 ; O3-NEXT:  .Lpcsection161:
4619 ; O3-NEXT:    movzwl (%rdi), %eax
4620 ; O3-NEXT:    .p2align 4, 0x90
4621 ; O3-NEXT:  .LBB92_1: # %atomicrmw.start
4622 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
4623 ; O3-NEXT:    movl %eax, %ecx
4624 ; O3-NEXT:  .Lpcsection162:
4625 ; O3-NEXT:    notl %ecx
4626 ; O3-NEXT:  .Lpcsection163:
4627 ; O3-NEXT:    orl $65493, %ecx # imm = 0xFFD5
4628 ; O3-NEXT:  .Lpcsection164:
4629 ; O3-NEXT:    # kill: def $ax killed $ax killed $eax
4630 ; O3-NEXT:  .Lpcsection165:
4631 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4632 ; O3-NEXT:  .Lpcsection166:
4633 ; O3-NEXT:    # kill: def $ax killed $ax def $eax
4634 ; O3-NEXT:  .Lpcsection167:
4635 ; O3-NEXT:    jne .LBB92_1
4636 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
4637 ; O3-NEXT:    movq $1, foo(%rip)
4638 ; O3-NEXT:    retq
4639 entry:
4640   load volatile i64, ptr @foo, align 8
4641   %x = atomicrmw nand ptr %a, i16 42 seq_cst, align 2, !pcsections !0
4642   store volatile i64 1, ptr @foo, align 8
4643   ret void
4646 define void @atomic16_cas_monotonic(ptr %a) {
4647 ; O0-LABEL: atomic16_cas_monotonic:
4648 ; O0:       # %bb.0: # %entry
4649 ; O0-NEXT:    movq foo(%rip), %rax
4650 ; O0-NEXT:    movw $42, %ax
4651 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4652 ; O0-NEXT:    movw $1, %cx
4653 ; O0-NEXT:  .Lpcsection183:
4654 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4655 ; O0-NEXT:  .Lpcsection184:
4656 ; O0-NEXT:    # kill: def $dx killed $ax
4657 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4658 ; O0-NEXT:  .Lpcsection185:
4659 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4660 ; O0-NEXT:  .Lpcsection186:
4661 ; O0-NEXT:    # kill: def $dx killed $ax
4662 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4663 ; O0-NEXT:  .Lpcsection187:
4664 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4665 ; O0-NEXT:    movq $1, foo
4666 ; O0-NEXT:    retq
4668 ; O1-LABEL: atomic16_cas_monotonic:
4669 ; O1:       # %bb.0: # %entry
4670 ; O1-NEXT:    movq foo(%rip), %rax
4671 ; O1-NEXT:    movw $1, %cx
4672 ; O1-NEXT:    movw $42, %ax
4673 ; O1-NEXT:  .Lpcsection168:
4674 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4675 ; O1-NEXT:    movw $42, %ax
4676 ; O1-NEXT:  .Lpcsection169:
4677 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4678 ; O1-NEXT:    movw $42, %ax
4679 ; O1-NEXT:  .Lpcsection170:
4680 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4681 ; O1-NEXT:    movq $1, foo(%rip)
4682 ; O1-NEXT:    retq
4684 ; O2-LABEL: atomic16_cas_monotonic:
4685 ; O2:       # %bb.0: # %entry
4686 ; O2-NEXT:    movq foo(%rip), %rax
4687 ; O2-NEXT:    movw $1, %cx
4688 ; O2-NEXT:    movw $42, %ax
4689 ; O2-NEXT:  .Lpcsection168:
4690 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4691 ; O2-NEXT:    movw $42, %ax
4692 ; O2-NEXT:  .Lpcsection169:
4693 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4694 ; O2-NEXT:    movw $42, %ax
4695 ; O2-NEXT:  .Lpcsection170:
4696 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4697 ; O2-NEXT:    movq $1, foo(%rip)
4698 ; O2-NEXT:    retq
4700 ; O3-LABEL: atomic16_cas_monotonic:
4701 ; O3:       # %bb.0: # %entry
4702 ; O3-NEXT:    movq foo(%rip), %rax
4703 ; O3-NEXT:    movw $1, %cx
4704 ; O3-NEXT:    movw $42, %ax
4705 ; O3-NEXT:  .Lpcsection168:
4706 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4707 ; O3-NEXT:    movw $42, %ax
4708 ; O3-NEXT:  .Lpcsection169:
4709 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4710 ; O3-NEXT:    movw $42, %ax
4711 ; O3-NEXT:  .Lpcsection170:
4712 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4713 ; O3-NEXT:    movq $1, foo(%rip)
4714 ; O3-NEXT:    retq
4715 entry:
4716   load volatile i64, ptr @foo, align 8
4717   %x = cmpxchg ptr %a, i16 42, i16 1 monotonic monotonic, align 2, !pcsections !0
4718   %y = cmpxchg ptr %a, i16 42, i16 1 monotonic acquire, align 2, !pcsections !0
4719   %z = cmpxchg ptr %a, i16 42, i16 1 monotonic seq_cst, align 2, !pcsections !0
4720   store volatile i64 1, ptr @foo, align 8
4721   ret void
4724 define void @atomic16_cas_acquire(ptr %a) {
4725 ; O0-LABEL: atomic16_cas_acquire:
4726 ; O0:       # %bb.0: # %entry
4727 ; O0-NEXT:    movq foo(%rip), %rax
4728 ; O0-NEXT:    movw $42, %ax
4729 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4730 ; O0-NEXT:    movw $1, %cx
4731 ; O0-NEXT:  .Lpcsection188:
4732 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4733 ; O0-NEXT:  .Lpcsection189:
4734 ; O0-NEXT:    # kill: def $dx killed $ax
4735 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4736 ; O0-NEXT:  .Lpcsection190:
4737 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4738 ; O0-NEXT:  .Lpcsection191:
4739 ; O0-NEXT:    # kill: def $dx killed $ax
4740 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4741 ; O0-NEXT:  .Lpcsection192:
4742 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4743 ; O0-NEXT:    movq $1, foo
4744 ; O0-NEXT:    retq
4746 ; O1-LABEL: atomic16_cas_acquire:
4747 ; O1:       # %bb.0: # %entry
4748 ; O1-NEXT:    movq foo(%rip), %rax
4749 ; O1-NEXT:    movw $1, %cx
4750 ; O1-NEXT:    movw $42, %ax
4751 ; O1-NEXT:  .Lpcsection171:
4752 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4753 ; O1-NEXT:    movw $42, %ax
4754 ; O1-NEXT:  .Lpcsection172:
4755 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4756 ; O1-NEXT:    movw $42, %ax
4757 ; O1-NEXT:  .Lpcsection173:
4758 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4759 ; O1-NEXT:    movq $1, foo(%rip)
4760 ; O1-NEXT:    retq
4762 ; O2-LABEL: atomic16_cas_acquire:
4763 ; O2:       # %bb.0: # %entry
4764 ; O2-NEXT:    movq foo(%rip), %rax
4765 ; O2-NEXT:    movw $1, %cx
4766 ; O2-NEXT:    movw $42, %ax
4767 ; O2-NEXT:  .Lpcsection171:
4768 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4769 ; O2-NEXT:    movw $42, %ax
4770 ; O2-NEXT:  .Lpcsection172:
4771 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4772 ; O2-NEXT:    movw $42, %ax
4773 ; O2-NEXT:  .Lpcsection173:
4774 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4775 ; O2-NEXT:    movq $1, foo(%rip)
4776 ; O2-NEXT:    retq
4778 ; O3-LABEL: atomic16_cas_acquire:
4779 ; O3:       # %bb.0: # %entry
4780 ; O3-NEXT:    movq foo(%rip), %rax
4781 ; O3-NEXT:    movw $1, %cx
4782 ; O3-NEXT:    movw $42, %ax
4783 ; O3-NEXT:  .Lpcsection171:
4784 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4785 ; O3-NEXT:    movw $42, %ax
4786 ; O3-NEXT:  .Lpcsection172:
4787 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4788 ; O3-NEXT:    movw $42, %ax
4789 ; O3-NEXT:  .Lpcsection173:
4790 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4791 ; O3-NEXT:    movq $1, foo(%rip)
4792 ; O3-NEXT:    retq
4793 entry:
4794   load volatile i64, ptr @foo, align 8
4795   %x = cmpxchg ptr %a, i16 42, i16 1 acquire monotonic, align 2, !pcsections !0
4796   %y = cmpxchg ptr %a, i16 42, i16 1 acquire acquire, align 2, !pcsections !0
4797   %z = cmpxchg ptr %a, i16 42, i16 1 acquire seq_cst, align 2, !pcsections !0
4798   store volatile i64 1, ptr @foo, align 8
4799   ret void
4802 define void @atomic16_cas_release(ptr %a) {
4803 ; O0-LABEL: atomic16_cas_release:
4804 ; O0:       # %bb.0: # %entry
4805 ; O0-NEXT:    movq foo(%rip), %rax
4806 ; O0-NEXT:    movw $42, %ax
4807 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4808 ; O0-NEXT:    movw $1, %cx
4809 ; O0-NEXT:  .Lpcsection193:
4810 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4811 ; O0-NEXT:  .Lpcsection194:
4812 ; O0-NEXT:    # kill: def $dx killed $ax
4813 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4814 ; O0-NEXT:  .Lpcsection195:
4815 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4816 ; O0-NEXT:  .Lpcsection196:
4817 ; O0-NEXT:    # kill: def $dx killed $ax
4818 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4819 ; O0-NEXT:  .Lpcsection197:
4820 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4821 ; O0-NEXT:    movq $1, foo
4822 ; O0-NEXT:    retq
4824 ; O1-LABEL: atomic16_cas_release:
4825 ; O1:       # %bb.0: # %entry
4826 ; O1-NEXT:    movq foo(%rip), %rax
4827 ; O1-NEXT:    movw $1, %cx
4828 ; O1-NEXT:    movw $42, %ax
4829 ; O1-NEXT:  .Lpcsection174:
4830 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4831 ; O1-NEXT:    movw $42, %ax
4832 ; O1-NEXT:  .Lpcsection175:
4833 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4834 ; O1-NEXT:    movw $42, %ax
4835 ; O1-NEXT:  .Lpcsection176:
4836 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4837 ; O1-NEXT:    movq $1, foo(%rip)
4838 ; O1-NEXT:    retq
4840 ; O2-LABEL: atomic16_cas_release:
4841 ; O2:       # %bb.0: # %entry
4842 ; O2-NEXT:    movq foo(%rip), %rax
4843 ; O2-NEXT:    movw $1, %cx
4844 ; O2-NEXT:    movw $42, %ax
4845 ; O2-NEXT:  .Lpcsection174:
4846 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4847 ; O2-NEXT:    movw $42, %ax
4848 ; O2-NEXT:  .Lpcsection175:
4849 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4850 ; O2-NEXT:    movw $42, %ax
4851 ; O2-NEXT:  .Lpcsection176:
4852 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4853 ; O2-NEXT:    movq $1, foo(%rip)
4854 ; O2-NEXT:    retq
4856 ; O3-LABEL: atomic16_cas_release:
4857 ; O3:       # %bb.0: # %entry
4858 ; O3-NEXT:    movq foo(%rip), %rax
4859 ; O3-NEXT:    movw $1, %cx
4860 ; O3-NEXT:    movw $42, %ax
4861 ; O3-NEXT:  .Lpcsection174:
4862 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4863 ; O3-NEXT:    movw $42, %ax
4864 ; O3-NEXT:  .Lpcsection175:
4865 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4866 ; O3-NEXT:    movw $42, %ax
4867 ; O3-NEXT:  .Lpcsection176:
4868 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4869 ; O3-NEXT:    movq $1, foo(%rip)
4870 ; O3-NEXT:    retq
4871 entry:
4872   load volatile i64, ptr @foo, align 8
4873   %x = cmpxchg ptr %a, i16 42, i16 1 release monotonic, align 2, !pcsections !0
4874   %y = cmpxchg ptr %a, i16 42, i16 1 release acquire, align 2, !pcsections !0
4875   %z = cmpxchg ptr %a, i16 42, i16 1 release seq_cst, align 2, !pcsections !0
4876   store volatile i64 1, ptr @foo, align 8
4877   ret void
4880 define void @atomic16_cas_acq_rel(ptr %a) {
4881 ; O0-LABEL: atomic16_cas_acq_rel:
4882 ; O0:       # %bb.0: # %entry
4883 ; O0-NEXT:    movq foo(%rip), %rax
4884 ; O0-NEXT:    movw $42, %ax
4885 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4886 ; O0-NEXT:    movw $1, %cx
4887 ; O0-NEXT:  .Lpcsection198:
4888 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4889 ; O0-NEXT:  .Lpcsection199:
4890 ; O0-NEXT:    # kill: def $dx killed $ax
4891 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4892 ; O0-NEXT:  .Lpcsection200:
4893 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4894 ; O0-NEXT:  .Lpcsection201:
4895 ; O0-NEXT:    # kill: def $dx killed $ax
4896 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4897 ; O0-NEXT:  .Lpcsection202:
4898 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4899 ; O0-NEXT:    movq $1, foo
4900 ; O0-NEXT:    retq
4902 ; O1-LABEL: atomic16_cas_acq_rel:
4903 ; O1:       # %bb.0: # %entry
4904 ; O1-NEXT:    movq foo(%rip), %rax
4905 ; O1-NEXT:    movw $1, %cx
4906 ; O1-NEXT:    movw $42, %ax
4907 ; O1-NEXT:  .Lpcsection177:
4908 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4909 ; O1-NEXT:    movw $42, %ax
4910 ; O1-NEXT:  .Lpcsection178:
4911 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4912 ; O1-NEXT:    movw $42, %ax
4913 ; O1-NEXT:  .Lpcsection179:
4914 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4915 ; O1-NEXT:    movq $1, foo(%rip)
4916 ; O1-NEXT:    retq
4918 ; O2-LABEL: atomic16_cas_acq_rel:
4919 ; O2:       # %bb.0: # %entry
4920 ; O2-NEXT:    movq foo(%rip), %rax
4921 ; O2-NEXT:    movw $1, %cx
4922 ; O2-NEXT:    movw $42, %ax
4923 ; O2-NEXT:  .Lpcsection177:
4924 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4925 ; O2-NEXT:    movw $42, %ax
4926 ; O2-NEXT:  .Lpcsection178:
4927 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4928 ; O2-NEXT:    movw $42, %ax
4929 ; O2-NEXT:  .Lpcsection179:
4930 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
4931 ; O2-NEXT:    movq $1, foo(%rip)
4932 ; O2-NEXT:    retq
4934 ; O3-LABEL: atomic16_cas_acq_rel:
4935 ; O3:       # %bb.0: # %entry
4936 ; O3-NEXT:    movq foo(%rip), %rax
4937 ; O3-NEXT:    movw $1, %cx
4938 ; O3-NEXT:    movw $42, %ax
4939 ; O3-NEXT:  .Lpcsection177:
4940 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4941 ; O3-NEXT:    movw $42, %ax
4942 ; O3-NEXT:  .Lpcsection178:
4943 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4944 ; O3-NEXT:    movw $42, %ax
4945 ; O3-NEXT:  .Lpcsection179:
4946 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
4947 ; O3-NEXT:    movq $1, foo(%rip)
4948 ; O3-NEXT:    retq
4949 entry:
4950   load volatile i64, ptr @foo, align 8
4951   %x = cmpxchg ptr %a, i16 42, i16 1 acq_rel monotonic, align 2, !pcsections !0
4952   %y = cmpxchg ptr %a, i16 42, i16 1 acq_rel acquire, align 2, !pcsections !0
4953   %z = cmpxchg ptr %a, i16 42, i16 1 acq_rel seq_cst, align 2, !pcsections !0
4954   store volatile i64 1, ptr @foo, align 8
4955   ret void
4958 define void @atomic16_cas_seq_cst(ptr %a) {
4959 ; O0-LABEL: atomic16_cas_seq_cst:
4960 ; O0:       # %bb.0: # %entry
4961 ; O0-NEXT:    movq foo(%rip), %rax
4962 ; O0-NEXT:    movw $42, %ax
4963 ; O0-NEXT:    movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill
4964 ; O0-NEXT:    movw $1, %cx
4965 ; O0-NEXT:  .Lpcsection203:
4966 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4967 ; O0-NEXT:  .Lpcsection204:
4968 ; O0-NEXT:    # kill: def $dx killed $ax
4969 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4970 ; O0-NEXT:  .Lpcsection205:
4971 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4972 ; O0-NEXT:  .Lpcsection206:
4973 ; O0-NEXT:    # kill: def $dx killed $ax
4974 ; O0-NEXT:    movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload
4975 ; O0-NEXT:  .Lpcsection207:
4976 ; O0-NEXT:    lock cmpxchgw %cx, (%rdi)
4977 ; O0-NEXT:    movq $1, foo
4978 ; O0-NEXT:    retq
4980 ; O1-LABEL: atomic16_cas_seq_cst:
4981 ; O1:       # %bb.0: # %entry
4982 ; O1-NEXT:    movq foo(%rip), %rax
4983 ; O1-NEXT:    movw $1, %cx
4984 ; O1-NEXT:    movw $42, %ax
4985 ; O1-NEXT:  .Lpcsection180:
4986 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4987 ; O1-NEXT:    movw $42, %ax
4988 ; O1-NEXT:  .Lpcsection181:
4989 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4990 ; O1-NEXT:    movw $42, %ax
4991 ; O1-NEXT:  .Lpcsection182:
4992 ; O1-NEXT:    lock cmpxchgw %cx, (%rdi)
4993 ; O1-NEXT:    movq $1, foo(%rip)
4994 ; O1-NEXT:    retq
4996 ; O2-LABEL: atomic16_cas_seq_cst:
4997 ; O2:       # %bb.0: # %entry
4998 ; O2-NEXT:    movq foo(%rip), %rax
4999 ; O2-NEXT:    movw $1, %cx
5000 ; O2-NEXT:    movw $42, %ax
5001 ; O2-NEXT:  .Lpcsection180:
5002 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
5003 ; O2-NEXT:    movw $42, %ax
5004 ; O2-NEXT:  .Lpcsection181:
5005 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
5006 ; O2-NEXT:    movw $42, %ax
5007 ; O2-NEXT:  .Lpcsection182:
5008 ; O2-NEXT:    lock cmpxchgw %cx, (%rdi)
5009 ; O2-NEXT:    movq $1, foo(%rip)
5010 ; O2-NEXT:    retq
5012 ; O3-LABEL: atomic16_cas_seq_cst:
5013 ; O3:       # %bb.0: # %entry
5014 ; O3-NEXT:    movq foo(%rip), %rax
5015 ; O3-NEXT:    movw $1, %cx
5016 ; O3-NEXT:    movw $42, %ax
5017 ; O3-NEXT:  .Lpcsection180:
5018 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
5019 ; O3-NEXT:    movw $42, %ax
5020 ; O3-NEXT:  .Lpcsection181:
5021 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
5022 ; O3-NEXT:    movw $42, %ax
5023 ; O3-NEXT:  .Lpcsection182:
5024 ; O3-NEXT:    lock cmpxchgw %cx, (%rdi)
5025 ; O3-NEXT:    movq $1, foo(%rip)
5026 ; O3-NEXT:    retq
5027 entry:
5028   load volatile i64, ptr @foo, align 8
5029   %x = cmpxchg ptr %a, i16 42, i16 1 seq_cst monotonic, align 2, !pcsections !0
5030   %y = cmpxchg ptr %a, i16 42, i16 1 seq_cst acquire, align 2, !pcsections !0
5031   %z = cmpxchg ptr %a, i16 42, i16 1 seq_cst seq_cst, align 2, !pcsections !0
5032   store volatile i64 1, ptr @foo, align 8
5033   ret void
5036 define i32 @atomic32_load_unordered(ptr %a) {
5037 ; O0-LABEL: atomic32_load_unordered:
5038 ; O0:       # %bb.0: # %entry
5039 ; O0-NEXT:    movq foo(%rip), %rax
5040 ; O0-NEXT:  .Lpcsection208:
5041 ; O0-NEXT:    movl (%rdi), %eax
5042 ; O0-NEXT:    movq $1, foo
5043 ; O0-NEXT:    retq
5045 ; O1-LABEL: atomic32_load_unordered:
5046 ; O1:       # %bb.0: # %entry
5047 ; O1-NEXT:    movq foo(%rip), %rax
5048 ; O1-NEXT:  .Lpcsection183:
5049 ; O1-NEXT:    movl (%rdi), %eax
5050 ; O1-NEXT:    movq $1, foo(%rip)
5051 ; O1-NEXT:    retq
5053 ; O2-LABEL: atomic32_load_unordered:
5054 ; O2:       # %bb.0: # %entry
5055 ; O2-NEXT:    movq foo(%rip), %rax
5056 ; O2-NEXT:  .Lpcsection183:
5057 ; O2-NEXT:    movl (%rdi), %eax
5058 ; O2-NEXT:    movq $1, foo(%rip)
5059 ; O2-NEXT:    retq
5061 ; O3-LABEL: atomic32_load_unordered:
5062 ; O3:       # %bb.0: # %entry
5063 ; O3-NEXT:    movq foo(%rip), %rax
5064 ; O3-NEXT:  .Lpcsection183:
5065 ; O3-NEXT:    movl (%rdi), %eax
5066 ; O3-NEXT:    movq $1, foo(%rip)
5067 ; O3-NEXT:    retq
5068 entry:
5069   load volatile i64, ptr @foo, align 8
5070   %x = load atomic i32, ptr %a unordered, align 4, !pcsections !0
5071   store volatile i64 1, ptr @foo, align 8
5072   ret i32 %x
5075 define i32 @atomic32_load_monotonic(ptr %a) {
5076 ; O0-LABEL: atomic32_load_monotonic:
5077 ; O0:       # %bb.0: # %entry
5078 ; O0-NEXT:    movq foo(%rip), %rax
5079 ; O0-NEXT:  .Lpcsection209:
5080 ; O0-NEXT:    movl (%rdi), %eax
5081 ; O0-NEXT:    movq $1, foo
5082 ; O0-NEXT:    retq
5084 ; O1-LABEL: atomic32_load_monotonic:
5085 ; O1:       # %bb.0: # %entry
5086 ; O1-NEXT:    movq foo(%rip), %rax
5087 ; O1-NEXT:  .Lpcsection184:
5088 ; O1-NEXT:    movl (%rdi), %eax
5089 ; O1-NEXT:    movq $1, foo(%rip)
5090 ; O1-NEXT:    retq
5092 ; O2-LABEL: atomic32_load_monotonic:
5093 ; O2:       # %bb.0: # %entry
5094 ; O2-NEXT:    movq foo(%rip), %rax
5095 ; O2-NEXT:  .Lpcsection184:
5096 ; O2-NEXT:    movl (%rdi), %eax
5097 ; O2-NEXT:    movq $1, foo(%rip)
5098 ; O2-NEXT:    retq
5100 ; O3-LABEL: atomic32_load_monotonic:
5101 ; O3:       # %bb.0: # %entry
5102 ; O3-NEXT:    movq foo(%rip), %rax
5103 ; O3-NEXT:  .Lpcsection184:
5104 ; O3-NEXT:    movl (%rdi), %eax
5105 ; O3-NEXT:    movq $1, foo(%rip)
5106 ; O3-NEXT:    retq
5107 entry:
5108   load volatile i64, ptr @foo, align 8
5109   %x = load atomic i32, ptr %a monotonic, align 4, !pcsections !0
5110   store volatile i64 1, ptr @foo, align 8
5111   ret i32 %x
5114 define i32 @atomic32_load_acquire(ptr %a) {
5115 ; O0-LABEL: atomic32_load_acquire:
5116 ; O0:       # %bb.0: # %entry
5117 ; O0-NEXT:    movq foo(%rip), %rax
5118 ; O0-NEXT:  .Lpcsection210:
5119 ; O0-NEXT:    movl (%rdi), %eax
5120 ; O0-NEXT:    movq $1, foo
5121 ; O0-NEXT:    retq
5123 ; O1-LABEL: atomic32_load_acquire:
5124 ; O1:       # %bb.0: # %entry
5125 ; O1-NEXT:    movq foo(%rip), %rax
5126 ; O1-NEXT:  .Lpcsection185:
5127 ; O1-NEXT:    movl (%rdi), %eax
5128 ; O1-NEXT:    movq $1, foo(%rip)
5129 ; O1-NEXT:    retq
5131 ; O2-LABEL: atomic32_load_acquire:
5132 ; O2:       # %bb.0: # %entry
5133 ; O2-NEXT:    movq foo(%rip), %rax
5134 ; O2-NEXT:  .Lpcsection185:
5135 ; O2-NEXT:    movl (%rdi), %eax
5136 ; O2-NEXT:    movq $1, foo(%rip)
5137 ; O2-NEXT:    retq
5139 ; O3-LABEL: atomic32_load_acquire:
5140 ; O3:       # %bb.0: # %entry
5141 ; O3-NEXT:    movq foo(%rip), %rax
5142 ; O3-NEXT:  .Lpcsection185:
5143 ; O3-NEXT:    movl (%rdi), %eax
5144 ; O3-NEXT:    movq $1, foo(%rip)
5145 ; O3-NEXT:    retq
5146 entry:
5147   load volatile i64, ptr @foo, align 8
5148   %x = load atomic i32, ptr %a acquire, align 4, !pcsections !0
5149   store volatile i64 1, ptr @foo, align 8
5150   ret i32 %x
5153 define i32 @atomic32_load_seq_cst(ptr %a) {
5154 ; O0-LABEL: atomic32_load_seq_cst:
5155 ; O0:       # %bb.0: # %entry
5156 ; O0-NEXT:    movq foo(%rip), %rax
5157 ; O0-NEXT:  .Lpcsection211:
5158 ; O0-NEXT:    movl (%rdi), %eax
5159 ; O0-NEXT:    movq $1, foo
5160 ; O0-NEXT:    retq
5162 ; O1-LABEL: atomic32_load_seq_cst:
5163 ; O1:       # %bb.0: # %entry
5164 ; O1-NEXT:    movq foo(%rip), %rax
5165 ; O1-NEXT:  .Lpcsection186:
5166 ; O1-NEXT:    movl (%rdi), %eax
5167 ; O1-NEXT:    movq $1, foo(%rip)
5168 ; O1-NEXT:    retq
5170 ; O2-LABEL: atomic32_load_seq_cst:
5171 ; O2:       # %bb.0: # %entry
5172 ; O2-NEXT:    movq foo(%rip), %rax
5173 ; O2-NEXT:  .Lpcsection186:
5174 ; O2-NEXT:    movl (%rdi), %eax
5175 ; O2-NEXT:    movq $1, foo(%rip)
5176 ; O2-NEXT:    retq
5178 ; O3-LABEL: atomic32_load_seq_cst:
5179 ; O3:       # %bb.0: # %entry
5180 ; O3-NEXT:    movq foo(%rip), %rax
5181 ; O3-NEXT:  .Lpcsection186:
5182 ; O3-NEXT:    movl (%rdi), %eax
5183 ; O3-NEXT:    movq $1, foo(%rip)
5184 ; O3-NEXT:    retq
5185 entry:
5186   load volatile i64, ptr @foo, align 8
5187   %x = load atomic i32, ptr %a seq_cst, align 4, !pcsections !0
5188   store volatile i64 1, ptr @foo, align 8
5189   ret i32 %x
5192 define void @atomic32_store_unordered(ptr %a) {
5193 ; O0-LABEL: atomic32_store_unordered:
5194 ; O0:       # %bb.0: # %entry
5195 ; O0-NEXT:    movq foo(%rip), %rax
5196 ; O0-NEXT:  .Lpcsection212:
5197 ; O0-NEXT:    movl $42, (%rdi)
5198 ; O0-NEXT:    movq $1, foo
5199 ; O0-NEXT:    retq
5201 ; O1-LABEL: atomic32_store_unordered:
5202 ; O1:       # %bb.0: # %entry
5203 ; O1-NEXT:    movq foo(%rip), %rax
5204 ; O1-NEXT:  .Lpcsection187:
5205 ; O1-NEXT:    movl $42, (%rdi)
5206 ; O1-NEXT:    movq $1, foo(%rip)
5207 ; O1-NEXT:    retq
5209 ; O2-LABEL: atomic32_store_unordered:
5210 ; O2:       # %bb.0: # %entry
5211 ; O2-NEXT:    movq foo(%rip), %rax
5212 ; O2-NEXT:  .Lpcsection187:
5213 ; O2-NEXT:    movl $42, (%rdi)
5214 ; O2-NEXT:    movq $1, foo(%rip)
5215 ; O2-NEXT:    retq
5217 ; O3-LABEL: atomic32_store_unordered:
5218 ; O3:       # %bb.0: # %entry
5219 ; O3-NEXT:    movq foo(%rip), %rax
5220 ; O3-NEXT:  .Lpcsection187:
5221 ; O3-NEXT:    movl $42, (%rdi)
5222 ; O3-NEXT:    movq $1, foo(%rip)
5223 ; O3-NEXT:    retq
5224 entry:
5225   load volatile i64, ptr @foo, align 8
5226   store atomic i32 42, ptr %a unordered, align 4, !pcsections !0
5227   store volatile i64 1, ptr @foo, align 8
5228   ret void
5231 define void @atomic32_store_monotonic(ptr %a) {
5232 ; O0-LABEL: atomic32_store_monotonic:
5233 ; O0:       # %bb.0: # %entry
5234 ; O0-NEXT:    movq foo(%rip), %rax
5235 ; O0-NEXT:  .Lpcsection213:
5236 ; O0-NEXT:    movl $42, (%rdi)
5237 ; O0-NEXT:    movq $1, foo
5238 ; O0-NEXT:    retq
5240 ; O1-LABEL: atomic32_store_monotonic:
5241 ; O1:       # %bb.0: # %entry
5242 ; O1-NEXT:    movq foo(%rip), %rax
5243 ; O1-NEXT:  .Lpcsection188:
5244 ; O1-NEXT:    movl $42, (%rdi)
5245 ; O1-NEXT:    movq $1, foo(%rip)
5246 ; O1-NEXT:    retq
5248 ; O2-LABEL: atomic32_store_monotonic:
5249 ; O2:       # %bb.0: # %entry
5250 ; O2-NEXT:    movq foo(%rip), %rax
5251 ; O2-NEXT:  .Lpcsection188:
5252 ; O2-NEXT:    movl $42, (%rdi)
5253 ; O2-NEXT:    movq $1, foo(%rip)
5254 ; O2-NEXT:    retq
5256 ; O3-LABEL: atomic32_store_monotonic:
5257 ; O3:       # %bb.0: # %entry
5258 ; O3-NEXT:    movq foo(%rip), %rax
5259 ; O3-NEXT:  .Lpcsection188:
5260 ; O3-NEXT:    movl $42, (%rdi)
5261 ; O3-NEXT:    movq $1, foo(%rip)
5262 ; O3-NEXT:    retq
5263 entry:
5264   load volatile i64, ptr @foo, align 8
5265   store atomic i32 42, ptr %a monotonic, align 4, !pcsections !0
5266   store volatile i64 1, ptr @foo, align 8
5267   ret void
5270 define void @atomic32_store_release(ptr %a) {
5271 ; O0-LABEL: atomic32_store_release:
5272 ; O0:       # %bb.0: # %entry
5273 ; O0-NEXT:    movq foo(%rip), %rax
5274 ; O0-NEXT:  .Lpcsection214:
5275 ; O0-NEXT:    movl $42, (%rdi)
5276 ; O0-NEXT:    movq $1, foo
5277 ; O0-NEXT:    retq
5279 ; O1-LABEL: atomic32_store_release:
5280 ; O1:       # %bb.0: # %entry
5281 ; O1-NEXT:    movq foo(%rip), %rax
5282 ; O1-NEXT:  .Lpcsection189:
5283 ; O1-NEXT:    movl $42, (%rdi)
5284 ; O1-NEXT:    movq $1, foo(%rip)
5285 ; O1-NEXT:    retq
5287 ; O2-LABEL: atomic32_store_release:
5288 ; O2:       # %bb.0: # %entry
5289 ; O2-NEXT:    movq foo(%rip), %rax
5290 ; O2-NEXT:  .Lpcsection189:
5291 ; O2-NEXT:    movl $42, (%rdi)
5292 ; O2-NEXT:    movq $1, foo(%rip)
5293 ; O2-NEXT:    retq
5295 ; O3-LABEL: atomic32_store_release:
5296 ; O3:       # %bb.0: # %entry
5297 ; O3-NEXT:    movq foo(%rip), %rax
5298 ; O3-NEXT:  .Lpcsection189:
5299 ; O3-NEXT:    movl $42, (%rdi)
5300 ; O3-NEXT:    movq $1, foo(%rip)
5301 ; O3-NEXT:    retq
5302 entry:
5303   load volatile i64, ptr @foo, align 8
5304   store atomic i32 42, ptr %a release, align 4, !pcsections !0
5305   store volatile i64 1, ptr @foo, align 8
5306   ret void
5309 define void @atomic32_store_seq_cst(ptr %a) {
5310 ; O0-LABEL: atomic32_store_seq_cst:
5311 ; O0:       # %bb.0: # %entry
5312 ; O0-NEXT:    movq foo(%rip), %rax
5313 ; O0-NEXT:    movl $42, %eax
5314 ; O0-NEXT:  .Lpcsection215:
5315 ; O0-NEXT:    xchgl %eax, (%rdi)
5316 ; O0-NEXT:    movq $1, foo
5317 ; O0-NEXT:    retq
5319 ; O1-LABEL: atomic32_store_seq_cst:
5320 ; O1:       # %bb.0: # %entry
5321 ; O1-NEXT:    movq foo(%rip), %rax
5322 ; O1-NEXT:    movl $42, %eax
5323 ; O1-NEXT:  .Lpcsection190:
5324 ; O1-NEXT:    xchgl %eax, (%rdi)
5325 ; O1-NEXT:    movq $1, foo(%rip)
5326 ; O1-NEXT:    retq
5328 ; O2-LABEL: atomic32_store_seq_cst:
5329 ; O2:       # %bb.0: # %entry
5330 ; O2-NEXT:    movq foo(%rip), %rax
5331 ; O2-NEXT:    movl $42, %eax
5332 ; O2-NEXT:  .Lpcsection190:
5333 ; O2-NEXT:    xchgl %eax, (%rdi)
5334 ; O2-NEXT:    movq $1, foo(%rip)
5335 ; O2-NEXT:    retq
5337 ; O3-LABEL: atomic32_store_seq_cst:
5338 ; O3:       # %bb.0: # %entry
5339 ; O3-NEXT:    movq foo(%rip), %rax
5340 ; O3-NEXT:    movl $42, %eax
5341 ; O3-NEXT:  .Lpcsection190:
5342 ; O3-NEXT:    xchgl %eax, (%rdi)
5343 ; O3-NEXT:    movq $1, foo(%rip)
5344 ; O3-NEXT:    retq
5345 entry:
5346   load volatile i64, ptr @foo, align 8
5347   store atomic i32 42, ptr %a seq_cst, align 4, !pcsections !0
5348   store volatile i64 1, ptr @foo, align 8
5349   ret void
5352 define void @atomic32_xchg_monotonic(ptr %a) {
5353 ; O0-LABEL: atomic32_xchg_monotonic:
5354 ; O0:       # %bb.0: # %entry
5355 ; O0-NEXT:    movq foo(%rip), %rax
5356 ; O0-NEXT:    movl $42, %eax
5357 ; O0-NEXT:  .Lpcsection216:
5358 ; O0-NEXT:    xchgl %eax, (%rdi)
5359 ; O0-NEXT:    movq $1, foo
5360 ; O0-NEXT:    retq
5362 ; O1-LABEL: atomic32_xchg_monotonic:
5363 ; O1:       # %bb.0: # %entry
5364 ; O1-NEXT:    movq foo(%rip), %rax
5365 ; O1-NEXT:    movl $42, %eax
5366 ; O1-NEXT:  .Lpcsection191:
5367 ; O1-NEXT:    xchgl %eax, (%rdi)
5368 ; O1-NEXT:    movq $1, foo(%rip)
5369 ; O1-NEXT:    retq
5371 ; O2-LABEL: atomic32_xchg_monotonic:
5372 ; O2:       # %bb.0: # %entry
5373 ; O2-NEXT:    movq foo(%rip), %rax
5374 ; O2-NEXT:    movl $42, %eax
5375 ; O2-NEXT:  .Lpcsection191:
5376 ; O2-NEXT:    xchgl %eax, (%rdi)
5377 ; O2-NEXT:    movq $1, foo(%rip)
5378 ; O2-NEXT:    retq
5380 ; O3-LABEL: atomic32_xchg_monotonic:
5381 ; O3:       # %bb.0: # %entry
5382 ; O3-NEXT:    movq foo(%rip), %rax
5383 ; O3-NEXT:    movl $42, %eax
5384 ; O3-NEXT:  .Lpcsection191:
5385 ; O3-NEXT:    xchgl %eax, (%rdi)
5386 ; O3-NEXT:    movq $1, foo(%rip)
5387 ; O3-NEXT:    retq
5388 entry:
5389   load volatile i64, ptr @foo, align 8
5390   %x = atomicrmw xchg ptr %a, i32 42 monotonic, align 4, !pcsections !0
5391   store volatile i64 1, ptr @foo, align 8
5392   ret void
5395 define void @atomic32_add_monotonic(ptr %a) {
5396 ; O0-LABEL: atomic32_add_monotonic:
5397 ; O0:       # %bb.0: # %entry
5398 ; O0-NEXT:    movq foo(%rip), %rax
5399 ; O0-NEXT:  .Lpcsection217:
5400 ; O0-NEXT:    lock addl $42, (%rdi)
5401 ; O0-NEXT:    movq $1, foo
5402 ; O0-NEXT:    retq
5404 ; O1-LABEL: atomic32_add_monotonic:
5405 ; O1:       # %bb.0: # %entry
5406 ; O1-NEXT:    movq foo(%rip), %rax
5407 ; O1-NEXT:  .Lpcsection192:
5408 ; O1-NEXT:    lock addl $42, (%rdi)
5409 ; O1-NEXT:    movq $1, foo(%rip)
5410 ; O1-NEXT:    retq
5412 ; O2-LABEL: atomic32_add_monotonic:
5413 ; O2:       # %bb.0: # %entry
5414 ; O2-NEXT:    movq foo(%rip), %rax
5415 ; O2-NEXT:  .Lpcsection192:
5416 ; O2-NEXT:    lock addl $42, (%rdi)
5417 ; O2-NEXT:    movq $1, foo(%rip)
5418 ; O2-NEXT:    retq
5420 ; O3-LABEL: atomic32_add_monotonic:
5421 ; O3:       # %bb.0: # %entry
5422 ; O3-NEXT:    movq foo(%rip), %rax
5423 ; O3-NEXT:  .Lpcsection192:
5424 ; O3-NEXT:    lock addl $42, (%rdi)
5425 ; O3-NEXT:    movq $1, foo(%rip)
5426 ; O3-NEXT:    retq
5427 entry:
5428   load volatile i64, ptr @foo, align 8
5429   %x = atomicrmw add ptr %a, i32 42 monotonic, align 4, !pcsections !0
5430   store volatile i64 1, ptr @foo, align 8
5431   ret void
5434 define void @atomic32_sub_monotonic(ptr %a) {
5435 ; O0-LABEL: atomic32_sub_monotonic:
5436 ; O0:       # %bb.0: # %entry
5437 ; O0-NEXT:    movq foo(%rip), %rax
5438 ; O0-NEXT:  .Lpcsection218:
5439 ; O0-NEXT:    lock subl $42, (%rdi)
5440 ; O0-NEXT:    movq $1, foo
5441 ; O0-NEXT:    retq
5443 ; O1-LABEL: atomic32_sub_monotonic:
5444 ; O1:       # %bb.0: # %entry
5445 ; O1-NEXT:    movq foo(%rip), %rax
5446 ; O1-NEXT:  .Lpcsection193:
5447 ; O1-NEXT:    lock subl $42, (%rdi)
5448 ; O1-NEXT:    movq $1, foo(%rip)
5449 ; O1-NEXT:    retq
5451 ; O2-LABEL: atomic32_sub_monotonic:
5452 ; O2:       # %bb.0: # %entry
5453 ; O2-NEXT:    movq foo(%rip), %rax
5454 ; O2-NEXT:  .Lpcsection193:
5455 ; O2-NEXT:    lock subl $42, (%rdi)
5456 ; O2-NEXT:    movq $1, foo(%rip)
5457 ; O2-NEXT:    retq
5459 ; O3-LABEL: atomic32_sub_monotonic:
5460 ; O3:       # %bb.0: # %entry
5461 ; O3-NEXT:    movq foo(%rip), %rax
5462 ; O3-NEXT:  .Lpcsection193:
5463 ; O3-NEXT:    lock subl $42, (%rdi)
5464 ; O3-NEXT:    movq $1, foo(%rip)
5465 ; O3-NEXT:    retq
5466 entry:
5467   load volatile i64, ptr @foo, align 8
5468   %x = atomicrmw sub ptr %a, i32 42 monotonic, align 4, !pcsections !0
5469   store volatile i64 1, ptr @foo, align 8
5470   ret void
5473 define void @atomic32_and_monotonic(ptr %a) {
5474 ; O0-LABEL: atomic32_and_monotonic:
5475 ; O0:       # %bb.0: # %entry
5476 ; O0-NEXT:    movq foo(%rip), %rax
5477 ; O0-NEXT:  .Lpcsection219:
5478 ; O0-NEXT:    lock andl $42, (%rdi)
5479 ; O0-NEXT:    movq $1, foo
5480 ; O0-NEXT:    retq
5482 ; O1-LABEL: atomic32_and_monotonic:
5483 ; O1:       # %bb.0: # %entry
5484 ; O1-NEXT:    movq foo(%rip), %rax
5485 ; O1-NEXT:  .Lpcsection194:
5486 ; O1-NEXT:    lock andl $42, (%rdi)
5487 ; O1-NEXT:    movq $1, foo(%rip)
5488 ; O1-NEXT:    retq
5490 ; O2-LABEL: atomic32_and_monotonic:
5491 ; O2:       # %bb.0: # %entry
5492 ; O2-NEXT:    movq foo(%rip), %rax
5493 ; O2-NEXT:  .Lpcsection194:
5494 ; O2-NEXT:    lock andl $42, (%rdi)
5495 ; O2-NEXT:    movq $1, foo(%rip)
5496 ; O2-NEXT:    retq
5498 ; O3-LABEL: atomic32_and_monotonic:
5499 ; O3:       # %bb.0: # %entry
5500 ; O3-NEXT:    movq foo(%rip), %rax
5501 ; O3-NEXT:  .Lpcsection194:
5502 ; O3-NEXT:    lock andl $42, (%rdi)
5503 ; O3-NEXT:    movq $1, foo(%rip)
5504 ; O3-NEXT:    retq
5505 entry:
5506   load volatile i64, ptr @foo, align 8
5507   %x = atomicrmw and ptr %a, i32 42 monotonic, align 4, !pcsections !0
5508   store volatile i64 1, ptr @foo, align 8
5509   ret void
5512 define void @atomic32_or_monotonic(ptr %a) {
5513 ; O0-LABEL: atomic32_or_monotonic:
5514 ; O0:       # %bb.0: # %entry
5515 ; O0-NEXT:    movq foo(%rip), %rax
5516 ; O0-NEXT:  .Lpcsection220:
5517 ; O0-NEXT:    lock orl $42, (%rdi)
5518 ; O0-NEXT:    movq $1, foo
5519 ; O0-NEXT:    retq
5521 ; O1-LABEL: atomic32_or_monotonic:
5522 ; O1:       # %bb.0: # %entry
5523 ; O1-NEXT:    movq foo(%rip), %rax
5524 ; O1-NEXT:  .Lpcsection195:
5525 ; O1-NEXT:    lock orl $42, (%rdi)
5526 ; O1-NEXT:    movq $1, foo(%rip)
5527 ; O1-NEXT:    retq
5529 ; O2-LABEL: atomic32_or_monotonic:
5530 ; O2:       # %bb.0: # %entry
5531 ; O2-NEXT:    movq foo(%rip), %rax
5532 ; O2-NEXT:  .Lpcsection195:
5533 ; O2-NEXT:    lock orl $42, (%rdi)
5534 ; O2-NEXT:    movq $1, foo(%rip)
5535 ; O2-NEXT:    retq
5537 ; O3-LABEL: atomic32_or_monotonic:
5538 ; O3:       # %bb.0: # %entry
5539 ; O3-NEXT:    movq foo(%rip), %rax
5540 ; O3-NEXT:  .Lpcsection195:
5541 ; O3-NEXT:    lock orl $42, (%rdi)
5542 ; O3-NEXT:    movq $1, foo(%rip)
5543 ; O3-NEXT:    retq
5544 entry:
5545   load volatile i64, ptr @foo, align 8
5546   %x = atomicrmw or ptr %a, i32 42 monotonic, align 4, !pcsections !0
5547   store volatile i64 1, ptr @foo, align 8
5548   ret void
5551 define void @atomic32_xor_monotonic(ptr %a) {
5552 ; O0-LABEL: atomic32_xor_monotonic:
5553 ; O0:       # %bb.0: # %entry
5554 ; O0-NEXT:    movq foo(%rip), %rax
5555 ; O0-NEXT:  .Lpcsection221:
5556 ; O0-NEXT:    lock xorl $42, (%rdi)
5557 ; O0-NEXT:    movq $1, foo
5558 ; O0-NEXT:    retq
5560 ; O1-LABEL: atomic32_xor_monotonic:
5561 ; O1:       # %bb.0: # %entry
5562 ; O1-NEXT:    movq foo(%rip), %rax
5563 ; O1-NEXT:  .Lpcsection196:
5564 ; O1-NEXT:    lock xorl $42, (%rdi)
5565 ; O1-NEXT:    movq $1, foo(%rip)
5566 ; O1-NEXT:    retq
5568 ; O2-LABEL: atomic32_xor_monotonic:
5569 ; O2:       # %bb.0: # %entry
5570 ; O2-NEXT:    movq foo(%rip), %rax
5571 ; O2-NEXT:  .Lpcsection196:
5572 ; O2-NEXT:    lock xorl $42, (%rdi)
5573 ; O2-NEXT:    movq $1, foo(%rip)
5574 ; O2-NEXT:    retq
5576 ; O3-LABEL: atomic32_xor_monotonic:
5577 ; O3:       # %bb.0: # %entry
5578 ; O3-NEXT:    movq foo(%rip), %rax
5579 ; O3-NEXT:  .Lpcsection196:
5580 ; O3-NEXT:    lock xorl $42, (%rdi)
5581 ; O3-NEXT:    movq $1, foo(%rip)
5582 ; O3-NEXT:    retq
5583 entry:
5584   load volatile i64, ptr @foo, align 8
5585   %x = atomicrmw xor ptr %a, i32 42 monotonic, align 4, !pcsections !0
5586   store volatile i64 1, ptr @foo, align 8
5587   ret void
5590 define void @atomic32_nand_monotonic(ptr %a) {
5591 ; O0-LABEL: atomic32_nand_monotonic:
5592 ; O0:       # %bb.0: # %entry
5593 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
5594 ; O0-NEXT:    movq foo, %rax
5595 ; O0-NEXT:  .Lpcsection222:
5596 ; O0-NEXT:    movl (%rdi), %eax
5597 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
5598 ; O0-NEXT:  .LBB112_1: # %atomicrmw.start
5599 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
5600 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
5601 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
5602 ; O0-NEXT:    movl %eax, %edx
5603 ; O0-NEXT:  .Lpcsection223:
5604 ; O0-NEXT:    notl %edx
5605 ; O0-NEXT:  .Lpcsection224:
5606 ; O0-NEXT:    orl $-43, %edx
5607 ; O0-NEXT:  .Lpcsection225:
5608 ; O0-NEXT:    lock cmpxchgl %edx, (%rcx)
5609 ; O0-NEXT:  .Lpcsection226:
5610 ; O0-NEXT:    sete %cl
5611 ; O0-NEXT:  .Lpcsection227:
5612 ; O0-NEXT:    testb $1, %cl
5613 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
5614 ; O0-NEXT:  .Lpcsection228:
5615 ; O0-NEXT:    jne .LBB112_2
5616 ; O0-NEXT:    jmp .LBB112_1
5617 ; O0-NEXT:  .LBB112_2: # %atomicrmw.end
5618 ; O0-NEXT:    movq $1, foo
5619 ; O0-NEXT:    retq
5621 ; O1-LABEL: atomic32_nand_monotonic:
5622 ; O1:       # %bb.0: # %entry
5623 ; O1-NEXT:    movq foo(%rip), %rax
5624 ; O1-NEXT:  .Lpcsection197:
5625 ; O1-NEXT:    movl (%rdi), %eax
5626 ; O1-NEXT:    .p2align 4, 0x90
5627 ; O1-NEXT:  .LBB112_1: # %atomicrmw.start
5628 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5629 ; O1-NEXT:    movl %eax, %ecx
5630 ; O1-NEXT:  .Lpcsection198:
5631 ; O1-NEXT:    notl %ecx
5632 ; O1-NEXT:  .Lpcsection199:
5633 ; O1-NEXT:    orl $-43, %ecx
5634 ; O1-NEXT:  .Lpcsection200:
5635 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
5636 ; O1-NEXT:  .Lpcsection201:
5637 ; O1-NEXT:    jne .LBB112_1
5638 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
5639 ; O1-NEXT:    movq $1, foo(%rip)
5640 ; O1-NEXT:    retq
5642 ; O2-LABEL: atomic32_nand_monotonic:
5643 ; O2:       # %bb.0: # %entry
5644 ; O2-NEXT:    movq foo(%rip), %rax
5645 ; O2-NEXT:  .Lpcsection197:
5646 ; O2-NEXT:    movl (%rdi), %eax
5647 ; O2-NEXT:    .p2align 4, 0x90
5648 ; O2-NEXT:  .LBB112_1: # %atomicrmw.start
5649 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5650 ; O2-NEXT:    movl %eax, %ecx
5651 ; O2-NEXT:  .Lpcsection198:
5652 ; O2-NEXT:    notl %ecx
5653 ; O2-NEXT:  .Lpcsection199:
5654 ; O2-NEXT:    orl $-43, %ecx
5655 ; O2-NEXT:  .Lpcsection200:
5656 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
5657 ; O2-NEXT:  .Lpcsection201:
5658 ; O2-NEXT:    jne .LBB112_1
5659 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
5660 ; O2-NEXT:    movq $1, foo(%rip)
5661 ; O2-NEXT:    retq
5663 ; O3-LABEL: atomic32_nand_monotonic:
5664 ; O3:       # %bb.0: # %entry
5665 ; O3-NEXT:    movq foo(%rip), %rax
5666 ; O3-NEXT:  .Lpcsection197:
5667 ; O3-NEXT:    movl (%rdi), %eax
5668 ; O3-NEXT:    .p2align 4, 0x90
5669 ; O3-NEXT:  .LBB112_1: # %atomicrmw.start
5670 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
5671 ; O3-NEXT:    movl %eax, %ecx
5672 ; O3-NEXT:  .Lpcsection198:
5673 ; O3-NEXT:    notl %ecx
5674 ; O3-NEXT:  .Lpcsection199:
5675 ; O3-NEXT:    orl $-43, %ecx
5676 ; O3-NEXT:  .Lpcsection200:
5677 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
5678 ; O3-NEXT:  .Lpcsection201:
5679 ; O3-NEXT:    jne .LBB112_1
5680 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
5681 ; O3-NEXT:    movq $1, foo(%rip)
5682 ; O3-NEXT:    retq
5683 entry:
5684   load volatile i64, ptr @foo, align 8
5685   %x = atomicrmw nand ptr %a, i32 42 monotonic, align 4, !pcsections !0
5686   store volatile i64 1, ptr @foo, align 8
5687   ret void
5690 define void @atomic32_xchg_acquire(ptr %a) {
5691 ; O0-LABEL: atomic32_xchg_acquire:
5692 ; O0:       # %bb.0: # %entry
5693 ; O0-NEXT:    movq foo(%rip), %rax
5694 ; O0-NEXT:    movl $42, %eax
5695 ; O0-NEXT:  .Lpcsection229:
5696 ; O0-NEXT:    xchgl %eax, (%rdi)
5697 ; O0-NEXT:    movq $1, foo
5698 ; O0-NEXT:    retq
5700 ; O1-LABEL: atomic32_xchg_acquire:
5701 ; O1:       # %bb.0: # %entry
5702 ; O1-NEXT:    movq foo(%rip), %rax
5703 ; O1-NEXT:    movl $42, %eax
5704 ; O1-NEXT:  .Lpcsection202:
5705 ; O1-NEXT:    xchgl %eax, (%rdi)
5706 ; O1-NEXT:    movq $1, foo(%rip)
5707 ; O1-NEXT:    retq
5709 ; O2-LABEL: atomic32_xchg_acquire:
5710 ; O2:       # %bb.0: # %entry
5711 ; O2-NEXT:    movq foo(%rip), %rax
5712 ; O2-NEXT:    movl $42, %eax
5713 ; O2-NEXT:  .Lpcsection202:
5714 ; O2-NEXT:    xchgl %eax, (%rdi)
5715 ; O2-NEXT:    movq $1, foo(%rip)
5716 ; O2-NEXT:    retq
5718 ; O3-LABEL: atomic32_xchg_acquire:
5719 ; O3:       # %bb.0: # %entry
5720 ; O3-NEXT:    movq foo(%rip), %rax
5721 ; O3-NEXT:    movl $42, %eax
5722 ; O3-NEXT:  .Lpcsection202:
5723 ; O3-NEXT:    xchgl %eax, (%rdi)
5724 ; O3-NEXT:    movq $1, foo(%rip)
5725 ; O3-NEXT:    retq
5726 entry:
5727   load volatile i64, ptr @foo, align 8
5728   %x = atomicrmw xchg ptr %a, i32 42 acquire, align 4, !pcsections !0
5729   store volatile i64 1, ptr @foo, align 8
5730   ret void
5733 define void @atomic32_add_acquire(ptr %a) {
5734 ; O0-LABEL: atomic32_add_acquire:
5735 ; O0:       # %bb.0: # %entry
5736 ; O0-NEXT:    movq foo(%rip), %rax
5737 ; O0-NEXT:  .Lpcsection230:
5738 ; O0-NEXT:    lock addl $42, (%rdi)
5739 ; O0-NEXT:    movq $1, foo
5740 ; O0-NEXT:    retq
5742 ; O1-LABEL: atomic32_add_acquire:
5743 ; O1:       # %bb.0: # %entry
5744 ; O1-NEXT:    movq foo(%rip), %rax
5745 ; O1-NEXT:  .Lpcsection203:
5746 ; O1-NEXT:    lock addl $42, (%rdi)
5747 ; O1-NEXT:    movq $1, foo(%rip)
5748 ; O1-NEXT:    retq
5750 ; O2-LABEL: atomic32_add_acquire:
5751 ; O2:       # %bb.0: # %entry
5752 ; O2-NEXT:    movq foo(%rip), %rax
5753 ; O2-NEXT:  .Lpcsection203:
5754 ; O2-NEXT:    lock addl $42, (%rdi)
5755 ; O2-NEXT:    movq $1, foo(%rip)
5756 ; O2-NEXT:    retq
5758 ; O3-LABEL: atomic32_add_acquire:
5759 ; O3:       # %bb.0: # %entry
5760 ; O3-NEXT:    movq foo(%rip), %rax
5761 ; O3-NEXT:  .Lpcsection203:
5762 ; O3-NEXT:    lock addl $42, (%rdi)
5763 ; O3-NEXT:    movq $1, foo(%rip)
5764 ; O3-NEXT:    retq
5765 entry:
5766   load volatile i64, ptr @foo, align 8
5767   %x = atomicrmw add ptr %a, i32 42 acquire, align 4, !pcsections !0
5768   store volatile i64 1, ptr @foo, align 8
5769   ret void
5772 define void @atomic32_sub_acquire(ptr %a) {
5773 ; O0-LABEL: atomic32_sub_acquire:
5774 ; O0:       # %bb.0: # %entry
5775 ; O0-NEXT:    movq foo(%rip), %rax
5776 ; O0-NEXT:  .Lpcsection231:
5777 ; O0-NEXT:    lock subl $42, (%rdi)
5778 ; O0-NEXT:    movq $1, foo
5779 ; O0-NEXT:    retq
5781 ; O1-LABEL: atomic32_sub_acquire:
5782 ; O1:       # %bb.0: # %entry
5783 ; O1-NEXT:    movq foo(%rip), %rax
5784 ; O1-NEXT:  .Lpcsection204:
5785 ; O1-NEXT:    lock subl $42, (%rdi)
5786 ; O1-NEXT:    movq $1, foo(%rip)
5787 ; O1-NEXT:    retq
5789 ; O2-LABEL: atomic32_sub_acquire:
5790 ; O2:       # %bb.0: # %entry
5791 ; O2-NEXT:    movq foo(%rip), %rax
5792 ; O2-NEXT:  .Lpcsection204:
5793 ; O2-NEXT:    lock subl $42, (%rdi)
5794 ; O2-NEXT:    movq $1, foo(%rip)
5795 ; O2-NEXT:    retq
5797 ; O3-LABEL: atomic32_sub_acquire:
5798 ; O3:       # %bb.0: # %entry
5799 ; O3-NEXT:    movq foo(%rip), %rax
5800 ; O3-NEXT:  .Lpcsection204:
5801 ; O3-NEXT:    lock subl $42, (%rdi)
5802 ; O3-NEXT:    movq $1, foo(%rip)
5803 ; O3-NEXT:    retq
5804 entry:
5805   load volatile i64, ptr @foo, align 8
5806   %x = atomicrmw sub ptr %a, i32 42 acquire, align 4, !pcsections !0
5807   store volatile i64 1, ptr @foo, align 8
5808   ret void
5811 define void @atomic32_and_acquire(ptr %a) {
5812 ; O0-LABEL: atomic32_and_acquire:
5813 ; O0:       # %bb.0: # %entry
5814 ; O0-NEXT:    movq foo(%rip), %rax
5815 ; O0-NEXT:  .Lpcsection232:
5816 ; O0-NEXT:    lock andl $42, (%rdi)
5817 ; O0-NEXT:    movq $1, foo
5818 ; O0-NEXT:    retq
5820 ; O1-LABEL: atomic32_and_acquire:
5821 ; O1:       # %bb.0: # %entry
5822 ; O1-NEXT:    movq foo(%rip), %rax
5823 ; O1-NEXT:  .Lpcsection205:
5824 ; O1-NEXT:    lock andl $42, (%rdi)
5825 ; O1-NEXT:    movq $1, foo(%rip)
5826 ; O1-NEXT:    retq
5828 ; O2-LABEL: atomic32_and_acquire:
5829 ; O2:       # %bb.0: # %entry
5830 ; O2-NEXT:    movq foo(%rip), %rax
5831 ; O2-NEXT:  .Lpcsection205:
5832 ; O2-NEXT:    lock andl $42, (%rdi)
5833 ; O2-NEXT:    movq $1, foo(%rip)
5834 ; O2-NEXT:    retq
5836 ; O3-LABEL: atomic32_and_acquire:
5837 ; O3:       # %bb.0: # %entry
5838 ; O3-NEXT:    movq foo(%rip), %rax
5839 ; O3-NEXT:  .Lpcsection205:
5840 ; O3-NEXT:    lock andl $42, (%rdi)
5841 ; O3-NEXT:    movq $1, foo(%rip)
5842 ; O3-NEXT:    retq
5843 entry:
5844   load volatile i64, ptr @foo, align 8
5845   %x = atomicrmw and ptr %a, i32 42 acquire, align 4, !pcsections !0
5846   store volatile i64 1, ptr @foo, align 8
5847   ret void
5850 define void @atomic32_or_acquire(ptr %a) {
5851 ; O0-LABEL: atomic32_or_acquire:
5852 ; O0:       # %bb.0: # %entry
5853 ; O0-NEXT:    movq foo(%rip), %rax
5854 ; O0-NEXT:  .Lpcsection233:
5855 ; O0-NEXT:    lock orl $42, (%rdi)
5856 ; O0-NEXT:    movq $1, foo
5857 ; O0-NEXT:    retq
5859 ; O1-LABEL: atomic32_or_acquire:
5860 ; O1:       # %bb.0: # %entry
5861 ; O1-NEXT:    movq foo(%rip), %rax
5862 ; O1-NEXT:  .Lpcsection206:
5863 ; O1-NEXT:    lock orl $42, (%rdi)
5864 ; O1-NEXT:    movq $1, foo(%rip)
5865 ; O1-NEXT:    retq
5867 ; O2-LABEL: atomic32_or_acquire:
5868 ; O2:       # %bb.0: # %entry
5869 ; O2-NEXT:    movq foo(%rip), %rax
5870 ; O2-NEXT:  .Lpcsection206:
5871 ; O2-NEXT:    lock orl $42, (%rdi)
5872 ; O2-NEXT:    movq $1, foo(%rip)
5873 ; O2-NEXT:    retq
5875 ; O3-LABEL: atomic32_or_acquire:
5876 ; O3:       # %bb.0: # %entry
5877 ; O3-NEXT:    movq foo(%rip), %rax
5878 ; O3-NEXT:  .Lpcsection206:
5879 ; O3-NEXT:    lock orl $42, (%rdi)
5880 ; O3-NEXT:    movq $1, foo(%rip)
5881 ; O3-NEXT:    retq
5882 entry:
5883   load volatile i64, ptr @foo, align 8
5884   %x = atomicrmw or ptr %a, i32 42 acquire, align 4, !pcsections !0
5885   store volatile i64 1, ptr @foo, align 8
5886   ret void
5889 define void @atomic32_xor_acquire(ptr %a) {
5890 ; O0-LABEL: atomic32_xor_acquire:
5891 ; O0:       # %bb.0: # %entry
5892 ; O0-NEXT:    movq foo(%rip), %rax
5893 ; O0-NEXT:  .Lpcsection234:
5894 ; O0-NEXT:    lock xorl $42, (%rdi)
5895 ; O0-NEXT:    movq $1, foo
5896 ; O0-NEXT:    retq
5898 ; O1-LABEL: atomic32_xor_acquire:
5899 ; O1:       # %bb.0: # %entry
5900 ; O1-NEXT:    movq foo(%rip), %rax
5901 ; O1-NEXT:  .Lpcsection207:
5902 ; O1-NEXT:    lock xorl $42, (%rdi)
5903 ; O1-NEXT:    movq $1, foo(%rip)
5904 ; O1-NEXT:    retq
5906 ; O2-LABEL: atomic32_xor_acquire:
5907 ; O2:       # %bb.0: # %entry
5908 ; O2-NEXT:    movq foo(%rip), %rax
5909 ; O2-NEXT:  .Lpcsection207:
5910 ; O2-NEXT:    lock xorl $42, (%rdi)
5911 ; O2-NEXT:    movq $1, foo(%rip)
5912 ; O2-NEXT:    retq
5914 ; O3-LABEL: atomic32_xor_acquire:
5915 ; O3:       # %bb.0: # %entry
5916 ; O3-NEXT:    movq foo(%rip), %rax
5917 ; O3-NEXT:  .Lpcsection207:
5918 ; O3-NEXT:    lock xorl $42, (%rdi)
5919 ; O3-NEXT:    movq $1, foo(%rip)
5920 ; O3-NEXT:    retq
5921 entry:
5922   load volatile i64, ptr @foo, align 8
5923   %x = atomicrmw xor ptr %a, i32 42 acquire, align 4, !pcsections !0
5924   store volatile i64 1, ptr @foo, align 8
5925   ret void
5928 define void @atomic32_nand_acquire(ptr %a) {
5929 ; O0-LABEL: atomic32_nand_acquire:
5930 ; O0:       # %bb.0: # %entry
5931 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
5932 ; O0-NEXT:    movq foo, %rax
5933 ; O0-NEXT:  .Lpcsection235:
5934 ; O0-NEXT:    movl (%rdi), %eax
5935 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
5936 ; O0-NEXT:  .LBB119_1: # %atomicrmw.start
5937 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
5938 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
5939 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
5940 ; O0-NEXT:    movl %eax, %edx
5941 ; O0-NEXT:  .Lpcsection236:
5942 ; O0-NEXT:    notl %edx
5943 ; O0-NEXT:  .Lpcsection237:
5944 ; O0-NEXT:    orl $-43, %edx
5945 ; O0-NEXT:  .Lpcsection238:
5946 ; O0-NEXT:    lock cmpxchgl %edx, (%rcx)
5947 ; O0-NEXT:  .Lpcsection239:
5948 ; O0-NEXT:    sete %cl
5949 ; O0-NEXT:  .Lpcsection240:
5950 ; O0-NEXT:    testb $1, %cl
5951 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
5952 ; O0-NEXT:  .Lpcsection241:
5953 ; O0-NEXT:    jne .LBB119_2
5954 ; O0-NEXT:    jmp .LBB119_1
5955 ; O0-NEXT:  .LBB119_2: # %atomicrmw.end
5956 ; O0-NEXT:    movq $1, foo
5957 ; O0-NEXT:    retq
5959 ; O1-LABEL: atomic32_nand_acquire:
5960 ; O1:       # %bb.0: # %entry
5961 ; O1-NEXT:    movq foo(%rip), %rax
5962 ; O1-NEXT:  .Lpcsection208:
5963 ; O1-NEXT:    movl (%rdi), %eax
5964 ; O1-NEXT:    .p2align 4, 0x90
5965 ; O1-NEXT:  .LBB119_1: # %atomicrmw.start
5966 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
5967 ; O1-NEXT:    movl %eax, %ecx
5968 ; O1-NEXT:  .Lpcsection209:
5969 ; O1-NEXT:    notl %ecx
5970 ; O1-NEXT:  .Lpcsection210:
5971 ; O1-NEXT:    orl $-43, %ecx
5972 ; O1-NEXT:  .Lpcsection211:
5973 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
5974 ; O1-NEXT:  .Lpcsection212:
5975 ; O1-NEXT:    jne .LBB119_1
5976 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
5977 ; O1-NEXT:    movq $1, foo(%rip)
5978 ; O1-NEXT:    retq
5980 ; O2-LABEL: atomic32_nand_acquire:
5981 ; O2:       # %bb.0: # %entry
5982 ; O2-NEXT:    movq foo(%rip), %rax
5983 ; O2-NEXT:  .Lpcsection208:
5984 ; O2-NEXT:    movl (%rdi), %eax
5985 ; O2-NEXT:    .p2align 4, 0x90
5986 ; O2-NEXT:  .LBB119_1: # %atomicrmw.start
5987 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
5988 ; O2-NEXT:    movl %eax, %ecx
5989 ; O2-NEXT:  .Lpcsection209:
5990 ; O2-NEXT:    notl %ecx
5991 ; O2-NEXT:  .Lpcsection210:
5992 ; O2-NEXT:    orl $-43, %ecx
5993 ; O2-NEXT:  .Lpcsection211:
5994 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
5995 ; O2-NEXT:  .Lpcsection212:
5996 ; O2-NEXT:    jne .LBB119_1
5997 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
5998 ; O2-NEXT:    movq $1, foo(%rip)
5999 ; O2-NEXT:    retq
6001 ; O3-LABEL: atomic32_nand_acquire:
6002 ; O3:       # %bb.0: # %entry
6003 ; O3-NEXT:    movq foo(%rip), %rax
6004 ; O3-NEXT:  .Lpcsection208:
6005 ; O3-NEXT:    movl (%rdi), %eax
6006 ; O3-NEXT:    .p2align 4, 0x90
6007 ; O3-NEXT:  .LBB119_1: # %atomicrmw.start
6008 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6009 ; O3-NEXT:    movl %eax, %ecx
6010 ; O3-NEXT:  .Lpcsection209:
6011 ; O3-NEXT:    notl %ecx
6012 ; O3-NEXT:  .Lpcsection210:
6013 ; O3-NEXT:    orl $-43, %ecx
6014 ; O3-NEXT:  .Lpcsection211:
6015 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
6016 ; O3-NEXT:  .Lpcsection212:
6017 ; O3-NEXT:    jne .LBB119_1
6018 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
6019 ; O3-NEXT:    movq $1, foo(%rip)
6020 ; O3-NEXT:    retq
6021 entry:
6022   load volatile i64, ptr @foo, align 8
6023   %x = atomicrmw nand ptr %a, i32 42 acquire, align 4, !pcsections !0
6024   store volatile i64 1, ptr @foo, align 8
6025   ret void
6028 define void @atomic32_xchg_release(ptr %a) {
6029 ; O0-LABEL: atomic32_xchg_release:
6030 ; O0:       # %bb.0: # %entry
6031 ; O0-NEXT:    movq foo(%rip), %rax
6032 ; O0-NEXT:    movl $42, %eax
6033 ; O0-NEXT:  .Lpcsection242:
6034 ; O0-NEXT:    xchgl %eax, (%rdi)
6035 ; O0-NEXT:    movq $1, foo
6036 ; O0-NEXT:    retq
6038 ; O1-LABEL: atomic32_xchg_release:
6039 ; O1:       # %bb.0: # %entry
6040 ; O1-NEXT:    movq foo(%rip), %rax
6041 ; O1-NEXT:    movl $42, %eax
6042 ; O1-NEXT:  .Lpcsection213:
6043 ; O1-NEXT:    xchgl %eax, (%rdi)
6044 ; O1-NEXT:    movq $1, foo(%rip)
6045 ; O1-NEXT:    retq
6047 ; O2-LABEL: atomic32_xchg_release:
6048 ; O2:       # %bb.0: # %entry
6049 ; O2-NEXT:    movq foo(%rip), %rax
6050 ; O2-NEXT:    movl $42, %eax
6051 ; O2-NEXT:  .Lpcsection213:
6052 ; O2-NEXT:    xchgl %eax, (%rdi)
6053 ; O2-NEXT:    movq $1, foo(%rip)
6054 ; O2-NEXT:    retq
6056 ; O3-LABEL: atomic32_xchg_release:
6057 ; O3:       # %bb.0: # %entry
6058 ; O3-NEXT:    movq foo(%rip), %rax
6059 ; O3-NEXT:    movl $42, %eax
6060 ; O3-NEXT:  .Lpcsection213:
6061 ; O3-NEXT:    xchgl %eax, (%rdi)
6062 ; O3-NEXT:    movq $1, foo(%rip)
6063 ; O3-NEXT:    retq
6064 entry:
6065   load volatile i64, ptr @foo, align 8
6066   %x = atomicrmw xchg ptr %a, i32 42 release, align 4, !pcsections !0
6067   store volatile i64 1, ptr @foo, align 8
6068   ret void
6071 define void @atomic32_add_release(ptr %a) {
6072 ; O0-LABEL: atomic32_add_release:
6073 ; O0:       # %bb.0: # %entry
6074 ; O0-NEXT:    movq foo(%rip), %rax
6075 ; O0-NEXT:  .Lpcsection243:
6076 ; O0-NEXT:    lock addl $42, (%rdi)
6077 ; O0-NEXT:    movq $1, foo
6078 ; O0-NEXT:    retq
6080 ; O1-LABEL: atomic32_add_release:
6081 ; O1:       # %bb.0: # %entry
6082 ; O1-NEXT:    movq foo(%rip), %rax
6083 ; O1-NEXT:  .Lpcsection214:
6084 ; O1-NEXT:    lock addl $42, (%rdi)
6085 ; O1-NEXT:    movq $1, foo(%rip)
6086 ; O1-NEXT:    retq
6088 ; O2-LABEL: atomic32_add_release:
6089 ; O2:       # %bb.0: # %entry
6090 ; O2-NEXT:    movq foo(%rip), %rax
6091 ; O2-NEXT:  .Lpcsection214:
6092 ; O2-NEXT:    lock addl $42, (%rdi)
6093 ; O2-NEXT:    movq $1, foo(%rip)
6094 ; O2-NEXT:    retq
6096 ; O3-LABEL: atomic32_add_release:
6097 ; O3:       # %bb.0: # %entry
6098 ; O3-NEXT:    movq foo(%rip), %rax
6099 ; O3-NEXT:  .Lpcsection214:
6100 ; O3-NEXT:    lock addl $42, (%rdi)
6101 ; O3-NEXT:    movq $1, foo(%rip)
6102 ; O3-NEXT:    retq
6103 entry:
6104   load volatile i64, ptr @foo, align 8
6105   %x = atomicrmw add ptr %a, i32 42 release, align 4, !pcsections !0
6106   store volatile i64 1, ptr @foo, align 8
6107   ret void
6110 define void @atomic32_sub_release(ptr %a) {
6111 ; O0-LABEL: atomic32_sub_release:
6112 ; O0:       # %bb.0: # %entry
6113 ; O0-NEXT:    movq foo(%rip), %rax
6114 ; O0-NEXT:  .Lpcsection244:
6115 ; O0-NEXT:    lock subl $42, (%rdi)
6116 ; O0-NEXT:    movq $1, foo
6117 ; O0-NEXT:    retq
6119 ; O1-LABEL: atomic32_sub_release:
6120 ; O1:       # %bb.0: # %entry
6121 ; O1-NEXT:    movq foo(%rip), %rax
6122 ; O1-NEXT:  .Lpcsection215:
6123 ; O1-NEXT:    lock subl $42, (%rdi)
6124 ; O1-NEXT:    movq $1, foo(%rip)
6125 ; O1-NEXT:    retq
6127 ; O2-LABEL: atomic32_sub_release:
6128 ; O2:       # %bb.0: # %entry
6129 ; O2-NEXT:    movq foo(%rip), %rax
6130 ; O2-NEXT:  .Lpcsection215:
6131 ; O2-NEXT:    lock subl $42, (%rdi)
6132 ; O2-NEXT:    movq $1, foo(%rip)
6133 ; O2-NEXT:    retq
6135 ; O3-LABEL: atomic32_sub_release:
6136 ; O3:       # %bb.0: # %entry
6137 ; O3-NEXT:    movq foo(%rip), %rax
6138 ; O3-NEXT:  .Lpcsection215:
6139 ; O3-NEXT:    lock subl $42, (%rdi)
6140 ; O3-NEXT:    movq $1, foo(%rip)
6141 ; O3-NEXT:    retq
6142 entry:
6143   load volatile i64, ptr @foo, align 8
6144   %x = atomicrmw sub ptr %a, i32 42 release, align 4, !pcsections !0
6145   store volatile i64 1, ptr @foo, align 8
6146   ret void
6149 define void @atomic32_and_release(ptr %a) {
6150 ; O0-LABEL: atomic32_and_release:
6151 ; O0:       # %bb.0: # %entry
6152 ; O0-NEXT:    movq foo(%rip), %rax
6153 ; O0-NEXT:  .Lpcsection245:
6154 ; O0-NEXT:    lock andl $42, (%rdi)
6155 ; O0-NEXT:    movq $1, foo
6156 ; O0-NEXT:    retq
6158 ; O1-LABEL: atomic32_and_release:
6159 ; O1:       # %bb.0: # %entry
6160 ; O1-NEXT:    movq foo(%rip), %rax
6161 ; O1-NEXT:  .Lpcsection216:
6162 ; O1-NEXT:    lock andl $42, (%rdi)
6163 ; O1-NEXT:    movq $1, foo(%rip)
6164 ; O1-NEXT:    retq
6166 ; O2-LABEL: atomic32_and_release:
6167 ; O2:       # %bb.0: # %entry
6168 ; O2-NEXT:    movq foo(%rip), %rax
6169 ; O2-NEXT:  .Lpcsection216:
6170 ; O2-NEXT:    lock andl $42, (%rdi)
6171 ; O2-NEXT:    movq $1, foo(%rip)
6172 ; O2-NEXT:    retq
6174 ; O3-LABEL: atomic32_and_release:
6175 ; O3:       # %bb.0: # %entry
6176 ; O3-NEXT:    movq foo(%rip), %rax
6177 ; O3-NEXT:  .Lpcsection216:
6178 ; O3-NEXT:    lock andl $42, (%rdi)
6179 ; O3-NEXT:    movq $1, foo(%rip)
6180 ; O3-NEXT:    retq
6181 entry:
6182   load volatile i64, ptr @foo, align 8
6183   %x = atomicrmw and ptr %a, i32 42 release, align 4, !pcsections !0
6184   store volatile i64 1, ptr @foo, align 8
6185   ret void
6188 define void @atomic32_or_release(ptr %a) {
6189 ; O0-LABEL: atomic32_or_release:
6190 ; O0:       # %bb.0: # %entry
6191 ; O0-NEXT:    movq foo(%rip), %rax
6192 ; O0-NEXT:  .Lpcsection246:
6193 ; O0-NEXT:    lock orl $42, (%rdi)
6194 ; O0-NEXT:    movq $1, foo
6195 ; O0-NEXT:    retq
6197 ; O1-LABEL: atomic32_or_release:
6198 ; O1:       # %bb.0: # %entry
6199 ; O1-NEXT:    movq foo(%rip), %rax
6200 ; O1-NEXT:  .Lpcsection217:
6201 ; O1-NEXT:    lock orl $42, (%rdi)
6202 ; O1-NEXT:    movq $1, foo(%rip)
6203 ; O1-NEXT:    retq
6205 ; O2-LABEL: atomic32_or_release:
6206 ; O2:       # %bb.0: # %entry
6207 ; O2-NEXT:    movq foo(%rip), %rax
6208 ; O2-NEXT:  .Lpcsection217:
6209 ; O2-NEXT:    lock orl $42, (%rdi)
6210 ; O2-NEXT:    movq $1, foo(%rip)
6211 ; O2-NEXT:    retq
6213 ; O3-LABEL: atomic32_or_release:
6214 ; O3:       # %bb.0: # %entry
6215 ; O3-NEXT:    movq foo(%rip), %rax
6216 ; O3-NEXT:  .Lpcsection217:
6217 ; O3-NEXT:    lock orl $42, (%rdi)
6218 ; O3-NEXT:    movq $1, foo(%rip)
6219 ; O3-NEXT:    retq
6220 entry:
6221   load volatile i64, ptr @foo, align 8
6222   %x = atomicrmw or ptr %a, i32 42 release, align 4, !pcsections !0
6223   store volatile i64 1, ptr @foo, align 8
6224   ret void
6227 define void @atomic32_xor_release(ptr %a) {
6228 ; O0-LABEL: atomic32_xor_release:
6229 ; O0:       # %bb.0: # %entry
6230 ; O0-NEXT:    movq foo(%rip), %rax
6231 ; O0-NEXT:  .Lpcsection247:
6232 ; O0-NEXT:    lock xorl $42, (%rdi)
6233 ; O0-NEXT:    movq $1, foo
6234 ; O0-NEXT:    retq
6236 ; O1-LABEL: atomic32_xor_release:
6237 ; O1:       # %bb.0: # %entry
6238 ; O1-NEXT:    movq foo(%rip), %rax
6239 ; O1-NEXT:  .Lpcsection218:
6240 ; O1-NEXT:    lock xorl $42, (%rdi)
6241 ; O1-NEXT:    movq $1, foo(%rip)
6242 ; O1-NEXT:    retq
6244 ; O2-LABEL: atomic32_xor_release:
6245 ; O2:       # %bb.0: # %entry
6246 ; O2-NEXT:    movq foo(%rip), %rax
6247 ; O2-NEXT:  .Lpcsection218:
6248 ; O2-NEXT:    lock xorl $42, (%rdi)
6249 ; O2-NEXT:    movq $1, foo(%rip)
6250 ; O2-NEXT:    retq
6252 ; O3-LABEL: atomic32_xor_release:
6253 ; O3:       # %bb.0: # %entry
6254 ; O3-NEXT:    movq foo(%rip), %rax
6255 ; O3-NEXT:  .Lpcsection218:
6256 ; O3-NEXT:    lock xorl $42, (%rdi)
6257 ; O3-NEXT:    movq $1, foo(%rip)
6258 ; O3-NEXT:    retq
6259 entry:
6260   load volatile i64, ptr @foo, align 8
6261   %x = atomicrmw xor ptr %a, i32 42 release, align 4, !pcsections !0
6262   store volatile i64 1, ptr @foo, align 8
6263   ret void
6266 define void @atomic32_nand_release(ptr %a) {
6267 ; O0-LABEL: atomic32_nand_release:
6268 ; O0:       # %bb.0: # %entry
6269 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
6270 ; O0-NEXT:    movq foo, %rax
6271 ; O0-NEXT:  .Lpcsection248:
6272 ; O0-NEXT:    movl (%rdi), %eax
6273 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
6274 ; O0-NEXT:  .LBB126_1: # %atomicrmw.start
6275 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
6276 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
6277 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
6278 ; O0-NEXT:    movl %eax, %edx
6279 ; O0-NEXT:  .Lpcsection249:
6280 ; O0-NEXT:    notl %edx
6281 ; O0-NEXT:  .Lpcsection250:
6282 ; O0-NEXT:    orl $-43, %edx
6283 ; O0-NEXT:  .Lpcsection251:
6284 ; O0-NEXT:    lock cmpxchgl %edx, (%rcx)
6285 ; O0-NEXT:  .Lpcsection252:
6286 ; O0-NEXT:    sete %cl
6287 ; O0-NEXT:  .Lpcsection253:
6288 ; O0-NEXT:    testb $1, %cl
6289 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
6290 ; O0-NEXT:  .Lpcsection254:
6291 ; O0-NEXT:    jne .LBB126_2
6292 ; O0-NEXT:    jmp .LBB126_1
6293 ; O0-NEXT:  .LBB126_2: # %atomicrmw.end
6294 ; O0-NEXT:    movq $1, foo
6295 ; O0-NEXT:    retq
6297 ; O1-LABEL: atomic32_nand_release:
6298 ; O1:       # %bb.0: # %entry
6299 ; O1-NEXT:    movq foo(%rip), %rax
6300 ; O1-NEXT:  .Lpcsection219:
6301 ; O1-NEXT:    movl (%rdi), %eax
6302 ; O1-NEXT:    .p2align 4, 0x90
6303 ; O1-NEXT:  .LBB126_1: # %atomicrmw.start
6304 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6305 ; O1-NEXT:    movl %eax, %ecx
6306 ; O1-NEXT:  .Lpcsection220:
6307 ; O1-NEXT:    notl %ecx
6308 ; O1-NEXT:  .Lpcsection221:
6309 ; O1-NEXT:    orl $-43, %ecx
6310 ; O1-NEXT:  .Lpcsection222:
6311 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
6312 ; O1-NEXT:  .Lpcsection223:
6313 ; O1-NEXT:    jne .LBB126_1
6314 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
6315 ; O1-NEXT:    movq $1, foo(%rip)
6316 ; O1-NEXT:    retq
6318 ; O2-LABEL: atomic32_nand_release:
6319 ; O2:       # %bb.0: # %entry
6320 ; O2-NEXT:    movq foo(%rip), %rax
6321 ; O2-NEXT:  .Lpcsection219:
6322 ; O2-NEXT:    movl (%rdi), %eax
6323 ; O2-NEXT:    .p2align 4, 0x90
6324 ; O2-NEXT:  .LBB126_1: # %atomicrmw.start
6325 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
6326 ; O2-NEXT:    movl %eax, %ecx
6327 ; O2-NEXT:  .Lpcsection220:
6328 ; O2-NEXT:    notl %ecx
6329 ; O2-NEXT:  .Lpcsection221:
6330 ; O2-NEXT:    orl $-43, %ecx
6331 ; O2-NEXT:  .Lpcsection222:
6332 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
6333 ; O2-NEXT:  .Lpcsection223:
6334 ; O2-NEXT:    jne .LBB126_1
6335 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
6336 ; O2-NEXT:    movq $1, foo(%rip)
6337 ; O2-NEXT:    retq
6339 ; O3-LABEL: atomic32_nand_release:
6340 ; O3:       # %bb.0: # %entry
6341 ; O3-NEXT:    movq foo(%rip), %rax
6342 ; O3-NEXT:  .Lpcsection219:
6343 ; O3-NEXT:    movl (%rdi), %eax
6344 ; O3-NEXT:    .p2align 4, 0x90
6345 ; O3-NEXT:  .LBB126_1: # %atomicrmw.start
6346 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6347 ; O3-NEXT:    movl %eax, %ecx
6348 ; O3-NEXT:  .Lpcsection220:
6349 ; O3-NEXT:    notl %ecx
6350 ; O3-NEXT:  .Lpcsection221:
6351 ; O3-NEXT:    orl $-43, %ecx
6352 ; O3-NEXT:  .Lpcsection222:
6353 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
6354 ; O3-NEXT:  .Lpcsection223:
6355 ; O3-NEXT:    jne .LBB126_1
6356 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
6357 ; O3-NEXT:    movq $1, foo(%rip)
6358 ; O3-NEXT:    retq
6359 entry:
6360   load volatile i64, ptr @foo, align 8
6361   %x = atomicrmw nand ptr %a, i32 42 release, align 4, !pcsections !0
6362   store volatile i64 1, ptr @foo, align 8
6363   ret void
6366 define void @atomic32_xchg_acq_rel(ptr %a) {
6367 ; O0-LABEL: atomic32_xchg_acq_rel:
6368 ; O0:       # %bb.0: # %entry
6369 ; O0-NEXT:    movq foo(%rip), %rax
6370 ; O0-NEXT:    movl $42, %eax
6371 ; O0-NEXT:  .Lpcsection255:
6372 ; O0-NEXT:    xchgl %eax, (%rdi)
6373 ; O0-NEXT:    movq $1, foo
6374 ; O0-NEXT:    retq
6376 ; O1-LABEL: atomic32_xchg_acq_rel:
6377 ; O1:       # %bb.0: # %entry
6378 ; O1-NEXT:    movq foo(%rip), %rax
6379 ; O1-NEXT:    movl $42, %eax
6380 ; O1-NEXT:  .Lpcsection224:
6381 ; O1-NEXT:    xchgl %eax, (%rdi)
6382 ; O1-NEXT:    movq $1, foo(%rip)
6383 ; O1-NEXT:    retq
6385 ; O2-LABEL: atomic32_xchg_acq_rel:
6386 ; O2:       # %bb.0: # %entry
6387 ; O2-NEXT:    movq foo(%rip), %rax
6388 ; O2-NEXT:    movl $42, %eax
6389 ; O2-NEXT:  .Lpcsection224:
6390 ; O2-NEXT:    xchgl %eax, (%rdi)
6391 ; O2-NEXT:    movq $1, foo(%rip)
6392 ; O2-NEXT:    retq
6394 ; O3-LABEL: atomic32_xchg_acq_rel:
6395 ; O3:       # %bb.0: # %entry
6396 ; O3-NEXT:    movq foo(%rip), %rax
6397 ; O3-NEXT:    movl $42, %eax
6398 ; O3-NEXT:  .Lpcsection224:
6399 ; O3-NEXT:    xchgl %eax, (%rdi)
6400 ; O3-NEXT:    movq $1, foo(%rip)
6401 ; O3-NEXT:    retq
6402 entry:
6403   load volatile i64, ptr @foo, align 8
6404   %x = atomicrmw xchg ptr %a, i32 42 acq_rel, align 4, !pcsections !0
6405   store volatile i64 1, ptr @foo, align 8
6406   ret void
6409 define void @atomic32_add_acq_rel(ptr %a) {
6410 ; O0-LABEL: atomic32_add_acq_rel:
6411 ; O0:       # %bb.0: # %entry
6412 ; O0-NEXT:    movq foo(%rip), %rax
6413 ; O0-NEXT:  .Lpcsection256:
6414 ; O0-NEXT:    lock addl $42, (%rdi)
6415 ; O0-NEXT:    movq $1, foo
6416 ; O0-NEXT:    retq
6418 ; O1-LABEL: atomic32_add_acq_rel:
6419 ; O1:       # %bb.0: # %entry
6420 ; O1-NEXT:    movq foo(%rip), %rax
6421 ; O1-NEXT:  .Lpcsection225:
6422 ; O1-NEXT:    lock addl $42, (%rdi)
6423 ; O1-NEXT:    movq $1, foo(%rip)
6424 ; O1-NEXT:    retq
6426 ; O2-LABEL: atomic32_add_acq_rel:
6427 ; O2:       # %bb.0: # %entry
6428 ; O2-NEXT:    movq foo(%rip), %rax
6429 ; O2-NEXT:  .Lpcsection225:
6430 ; O2-NEXT:    lock addl $42, (%rdi)
6431 ; O2-NEXT:    movq $1, foo(%rip)
6432 ; O2-NEXT:    retq
6434 ; O3-LABEL: atomic32_add_acq_rel:
6435 ; O3:       # %bb.0: # %entry
6436 ; O3-NEXT:    movq foo(%rip), %rax
6437 ; O3-NEXT:  .Lpcsection225:
6438 ; O3-NEXT:    lock addl $42, (%rdi)
6439 ; O3-NEXT:    movq $1, foo(%rip)
6440 ; O3-NEXT:    retq
6441 entry:
6442   load volatile i64, ptr @foo, align 8
6443   %x = atomicrmw add ptr %a, i32 42 acq_rel, align 4, !pcsections !0
6444   store volatile i64 1, ptr @foo, align 8
6445   ret void
6448 define void @atomic32_sub_acq_rel(ptr %a) {
6449 ; O0-LABEL: atomic32_sub_acq_rel:
6450 ; O0:       # %bb.0: # %entry
6451 ; O0-NEXT:    movq foo(%rip), %rax
6452 ; O0-NEXT:  .Lpcsection257:
6453 ; O0-NEXT:    lock subl $42, (%rdi)
6454 ; O0-NEXT:    movq $1, foo
6455 ; O0-NEXT:    retq
6457 ; O1-LABEL: atomic32_sub_acq_rel:
6458 ; O1:       # %bb.0: # %entry
6459 ; O1-NEXT:    movq foo(%rip), %rax
6460 ; O1-NEXT:  .Lpcsection226:
6461 ; O1-NEXT:    lock subl $42, (%rdi)
6462 ; O1-NEXT:    movq $1, foo(%rip)
6463 ; O1-NEXT:    retq
6465 ; O2-LABEL: atomic32_sub_acq_rel:
6466 ; O2:       # %bb.0: # %entry
6467 ; O2-NEXT:    movq foo(%rip), %rax
6468 ; O2-NEXT:  .Lpcsection226:
6469 ; O2-NEXT:    lock subl $42, (%rdi)
6470 ; O2-NEXT:    movq $1, foo(%rip)
6471 ; O2-NEXT:    retq
6473 ; O3-LABEL: atomic32_sub_acq_rel:
6474 ; O3:       # %bb.0: # %entry
6475 ; O3-NEXT:    movq foo(%rip), %rax
6476 ; O3-NEXT:  .Lpcsection226:
6477 ; O3-NEXT:    lock subl $42, (%rdi)
6478 ; O3-NEXT:    movq $1, foo(%rip)
6479 ; O3-NEXT:    retq
6480 entry:
6481   load volatile i64, ptr @foo, align 8
6482   %x = atomicrmw sub ptr %a, i32 42 acq_rel, align 4, !pcsections !0
6483   store volatile i64 1, ptr @foo, align 8
6484   ret void
6487 define void @atomic32_and_acq_rel(ptr %a) {
6488 ; O0-LABEL: atomic32_and_acq_rel:
6489 ; O0:       # %bb.0: # %entry
6490 ; O0-NEXT:    movq foo(%rip), %rax
6491 ; O0-NEXT:  .Lpcsection258:
6492 ; O0-NEXT:    lock andl $42, (%rdi)
6493 ; O0-NEXT:    movq $1, foo
6494 ; O0-NEXT:    retq
6496 ; O1-LABEL: atomic32_and_acq_rel:
6497 ; O1:       # %bb.0: # %entry
6498 ; O1-NEXT:    movq foo(%rip), %rax
6499 ; O1-NEXT:  .Lpcsection227:
6500 ; O1-NEXT:    lock andl $42, (%rdi)
6501 ; O1-NEXT:    movq $1, foo(%rip)
6502 ; O1-NEXT:    retq
6504 ; O2-LABEL: atomic32_and_acq_rel:
6505 ; O2:       # %bb.0: # %entry
6506 ; O2-NEXT:    movq foo(%rip), %rax
6507 ; O2-NEXT:  .Lpcsection227:
6508 ; O2-NEXT:    lock andl $42, (%rdi)
6509 ; O2-NEXT:    movq $1, foo(%rip)
6510 ; O2-NEXT:    retq
6512 ; O3-LABEL: atomic32_and_acq_rel:
6513 ; O3:       # %bb.0: # %entry
6514 ; O3-NEXT:    movq foo(%rip), %rax
6515 ; O3-NEXT:  .Lpcsection227:
6516 ; O3-NEXT:    lock andl $42, (%rdi)
6517 ; O3-NEXT:    movq $1, foo(%rip)
6518 ; O3-NEXT:    retq
6519 entry:
6520   load volatile i64, ptr @foo, align 8
6521   %x = atomicrmw and ptr %a, i32 42 acq_rel, align 4, !pcsections !0
6522   store volatile i64 1, ptr @foo, align 8
6523   ret void
6526 define void @atomic32_or_acq_rel(ptr %a) {
6527 ; O0-LABEL: atomic32_or_acq_rel:
6528 ; O0:       # %bb.0: # %entry
6529 ; O0-NEXT:    movq foo(%rip), %rax
6530 ; O0-NEXT:  .Lpcsection259:
6531 ; O0-NEXT:    lock orl $42, (%rdi)
6532 ; O0-NEXT:    movq $1, foo
6533 ; O0-NEXT:    retq
6535 ; O1-LABEL: atomic32_or_acq_rel:
6536 ; O1:       # %bb.0: # %entry
6537 ; O1-NEXT:    movq foo(%rip), %rax
6538 ; O1-NEXT:  .Lpcsection228:
6539 ; O1-NEXT:    lock orl $42, (%rdi)
6540 ; O1-NEXT:    movq $1, foo(%rip)
6541 ; O1-NEXT:    retq
6543 ; O2-LABEL: atomic32_or_acq_rel:
6544 ; O2:       # %bb.0: # %entry
6545 ; O2-NEXT:    movq foo(%rip), %rax
6546 ; O2-NEXT:  .Lpcsection228:
6547 ; O2-NEXT:    lock orl $42, (%rdi)
6548 ; O2-NEXT:    movq $1, foo(%rip)
6549 ; O2-NEXT:    retq
6551 ; O3-LABEL: atomic32_or_acq_rel:
6552 ; O3:       # %bb.0: # %entry
6553 ; O3-NEXT:    movq foo(%rip), %rax
6554 ; O3-NEXT:  .Lpcsection228:
6555 ; O3-NEXT:    lock orl $42, (%rdi)
6556 ; O3-NEXT:    movq $1, foo(%rip)
6557 ; O3-NEXT:    retq
6558 entry:
6559   load volatile i64, ptr @foo, align 8
6560   %x = atomicrmw or ptr %a, i32 42 acq_rel, align 4, !pcsections !0
6561   store volatile i64 1, ptr @foo, align 8
6562   ret void
6565 define void @atomic32_xor_acq_rel(ptr %a) {
6566 ; O0-LABEL: atomic32_xor_acq_rel:
6567 ; O0:       # %bb.0: # %entry
6568 ; O0-NEXT:    movq foo(%rip), %rax
6569 ; O0-NEXT:  .Lpcsection260:
6570 ; O0-NEXT:    lock xorl $42, (%rdi)
6571 ; O0-NEXT:    movq $1, foo
6572 ; O0-NEXT:    retq
6574 ; O1-LABEL: atomic32_xor_acq_rel:
6575 ; O1:       # %bb.0: # %entry
6576 ; O1-NEXT:    movq foo(%rip), %rax
6577 ; O1-NEXT:  .Lpcsection229:
6578 ; O1-NEXT:    lock xorl $42, (%rdi)
6579 ; O1-NEXT:    movq $1, foo(%rip)
6580 ; O1-NEXT:    retq
6582 ; O2-LABEL: atomic32_xor_acq_rel:
6583 ; O2:       # %bb.0: # %entry
6584 ; O2-NEXT:    movq foo(%rip), %rax
6585 ; O2-NEXT:  .Lpcsection229:
6586 ; O2-NEXT:    lock xorl $42, (%rdi)
6587 ; O2-NEXT:    movq $1, foo(%rip)
6588 ; O2-NEXT:    retq
6590 ; O3-LABEL: atomic32_xor_acq_rel:
6591 ; O3:       # %bb.0: # %entry
6592 ; O3-NEXT:    movq foo(%rip), %rax
6593 ; O3-NEXT:  .Lpcsection229:
6594 ; O3-NEXT:    lock xorl $42, (%rdi)
6595 ; O3-NEXT:    movq $1, foo(%rip)
6596 ; O3-NEXT:    retq
6597 entry:
6598   load volatile i64, ptr @foo, align 8
6599   %x = atomicrmw xor ptr %a, i32 42 acq_rel, align 4, !pcsections !0
6600   store volatile i64 1, ptr @foo, align 8
6601   ret void
6604 define void @atomic32_nand_acq_rel(ptr %a) {
6605 ; O0-LABEL: atomic32_nand_acq_rel:
6606 ; O0:       # %bb.0: # %entry
6607 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
6608 ; O0-NEXT:    movq foo, %rax
6609 ; O0-NEXT:  .Lpcsection261:
6610 ; O0-NEXT:    movl (%rdi), %eax
6611 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
6612 ; O0-NEXT:  .LBB133_1: # %atomicrmw.start
6613 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
6614 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
6615 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
6616 ; O0-NEXT:    movl %eax, %edx
6617 ; O0-NEXT:  .Lpcsection262:
6618 ; O0-NEXT:    notl %edx
6619 ; O0-NEXT:  .Lpcsection263:
6620 ; O0-NEXT:    orl $-43, %edx
6621 ; O0-NEXT:  .Lpcsection264:
6622 ; O0-NEXT:    lock cmpxchgl %edx, (%rcx)
6623 ; O0-NEXT:  .Lpcsection265:
6624 ; O0-NEXT:    sete %cl
6625 ; O0-NEXT:  .Lpcsection266:
6626 ; O0-NEXT:    testb $1, %cl
6627 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
6628 ; O0-NEXT:  .Lpcsection267:
6629 ; O0-NEXT:    jne .LBB133_2
6630 ; O0-NEXT:    jmp .LBB133_1
6631 ; O0-NEXT:  .LBB133_2: # %atomicrmw.end
6632 ; O0-NEXT:    movq $1, foo
6633 ; O0-NEXT:    retq
6635 ; O1-LABEL: atomic32_nand_acq_rel:
6636 ; O1:       # %bb.0: # %entry
6637 ; O1-NEXT:    movq foo(%rip), %rax
6638 ; O1-NEXT:  .Lpcsection230:
6639 ; O1-NEXT:    movl (%rdi), %eax
6640 ; O1-NEXT:    .p2align 4, 0x90
6641 ; O1-NEXT:  .LBB133_1: # %atomicrmw.start
6642 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6643 ; O1-NEXT:    movl %eax, %ecx
6644 ; O1-NEXT:  .Lpcsection231:
6645 ; O1-NEXT:    notl %ecx
6646 ; O1-NEXT:  .Lpcsection232:
6647 ; O1-NEXT:    orl $-43, %ecx
6648 ; O1-NEXT:  .Lpcsection233:
6649 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
6650 ; O1-NEXT:  .Lpcsection234:
6651 ; O1-NEXT:    jne .LBB133_1
6652 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
6653 ; O1-NEXT:    movq $1, foo(%rip)
6654 ; O1-NEXT:    retq
6656 ; O2-LABEL: atomic32_nand_acq_rel:
6657 ; O2:       # %bb.0: # %entry
6658 ; O2-NEXT:    movq foo(%rip), %rax
6659 ; O2-NEXT:  .Lpcsection230:
6660 ; O2-NEXT:    movl (%rdi), %eax
6661 ; O2-NEXT:    .p2align 4, 0x90
6662 ; O2-NEXT:  .LBB133_1: # %atomicrmw.start
6663 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
6664 ; O2-NEXT:    movl %eax, %ecx
6665 ; O2-NEXT:  .Lpcsection231:
6666 ; O2-NEXT:    notl %ecx
6667 ; O2-NEXT:  .Lpcsection232:
6668 ; O2-NEXT:    orl $-43, %ecx
6669 ; O2-NEXT:  .Lpcsection233:
6670 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
6671 ; O2-NEXT:  .Lpcsection234:
6672 ; O2-NEXT:    jne .LBB133_1
6673 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
6674 ; O2-NEXT:    movq $1, foo(%rip)
6675 ; O2-NEXT:    retq
6677 ; O3-LABEL: atomic32_nand_acq_rel:
6678 ; O3:       # %bb.0: # %entry
6679 ; O3-NEXT:    movq foo(%rip), %rax
6680 ; O3-NEXT:  .Lpcsection230:
6681 ; O3-NEXT:    movl (%rdi), %eax
6682 ; O3-NEXT:    .p2align 4, 0x90
6683 ; O3-NEXT:  .LBB133_1: # %atomicrmw.start
6684 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
6685 ; O3-NEXT:    movl %eax, %ecx
6686 ; O3-NEXT:  .Lpcsection231:
6687 ; O3-NEXT:    notl %ecx
6688 ; O3-NEXT:  .Lpcsection232:
6689 ; O3-NEXT:    orl $-43, %ecx
6690 ; O3-NEXT:  .Lpcsection233:
6691 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
6692 ; O3-NEXT:  .Lpcsection234:
6693 ; O3-NEXT:    jne .LBB133_1
6694 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
6695 ; O3-NEXT:    movq $1, foo(%rip)
6696 ; O3-NEXT:    retq
6697 entry:
6698   load volatile i64, ptr @foo, align 8
6699   %x = atomicrmw nand ptr %a, i32 42 acq_rel, align 4, !pcsections !0
6700   store volatile i64 1, ptr @foo, align 8
6701   ret void
6704 define void @atomic32_xchg_seq_cst(ptr %a) {
6705 ; O0-LABEL: atomic32_xchg_seq_cst:
6706 ; O0:       # %bb.0: # %entry
6707 ; O0-NEXT:    movq foo(%rip), %rax
6708 ; O0-NEXT:    movl $42, %eax
6709 ; O0-NEXT:  .Lpcsection268:
6710 ; O0-NEXT:    xchgl %eax, (%rdi)
6711 ; O0-NEXT:    movq $1, foo
6712 ; O0-NEXT:    retq
6714 ; O1-LABEL: atomic32_xchg_seq_cst:
6715 ; O1:       # %bb.0: # %entry
6716 ; O1-NEXT:    movq foo(%rip), %rax
6717 ; O1-NEXT:    movl $42, %eax
6718 ; O1-NEXT:  .Lpcsection235:
6719 ; O1-NEXT:    xchgl %eax, (%rdi)
6720 ; O1-NEXT:    movq $1, foo(%rip)
6721 ; O1-NEXT:    retq
6723 ; O2-LABEL: atomic32_xchg_seq_cst:
6724 ; O2:       # %bb.0: # %entry
6725 ; O2-NEXT:    movq foo(%rip), %rax
6726 ; O2-NEXT:    movl $42, %eax
6727 ; O2-NEXT:  .Lpcsection235:
6728 ; O2-NEXT:    xchgl %eax, (%rdi)
6729 ; O2-NEXT:    movq $1, foo(%rip)
6730 ; O2-NEXT:    retq
6732 ; O3-LABEL: atomic32_xchg_seq_cst:
6733 ; O3:       # %bb.0: # %entry
6734 ; O3-NEXT:    movq foo(%rip), %rax
6735 ; O3-NEXT:    movl $42, %eax
6736 ; O3-NEXT:  .Lpcsection235:
6737 ; O3-NEXT:    xchgl %eax, (%rdi)
6738 ; O3-NEXT:    movq $1, foo(%rip)
6739 ; O3-NEXT:    retq
6740 entry:
6741   load volatile i64, ptr @foo, align 8
6742   %x = atomicrmw xchg ptr %a, i32 42 seq_cst, align 4, !pcsections !0
6743   store volatile i64 1, ptr @foo, align 8
6744   ret void
6747 define void @atomic32_add_seq_cst(ptr %a) {
6748 ; O0-LABEL: atomic32_add_seq_cst:
6749 ; O0:       # %bb.0: # %entry
6750 ; O0-NEXT:    movq foo(%rip), %rax
6751 ; O0-NEXT:  .Lpcsection269:
6752 ; O0-NEXT:    lock addl $42, (%rdi)
6753 ; O0-NEXT:    movq $1, foo
6754 ; O0-NEXT:    retq
6756 ; O1-LABEL: atomic32_add_seq_cst:
6757 ; O1:       # %bb.0: # %entry
6758 ; O1-NEXT:    movq foo(%rip), %rax
6759 ; O1-NEXT:  .Lpcsection236:
6760 ; O1-NEXT:    lock addl $42, (%rdi)
6761 ; O1-NEXT:    movq $1, foo(%rip)
6762 ; O1-NEXT:    retq
6764 ; O2-LABEL: atomic32_add_seq_cst:
6765 ; O2:       # %bb.0: # %entry
6766 ; O2-NEXT:    movq foo(%rip), %rax
6767 ; O2-NEXT:  .Lpcsection236:
6768 ; O2-NEXT:    lock addl $42, (%rdi)
6769 ; O2-NEXT:    movq $1, foo(%rip)
6770 ; O2-NEXT:    retq
6772 ; O3-LABEL: atomic32_add_seq_cst:
6773 ; O3:       # %bb.0: # %entry
6774 ; O3-NEXT:    movq foo(%rip), %rax
6775 ; O3-NEXT:  .Lpcsection236:
6776 ; O3-NEXT:    lock addl $42, (%rdi)
6777 ; O3-NEXT:    movq $1, foo(%rip)
6778 ; O3-NEXT:    retq
6779 entry:
6780   load volatile i64, ptr @foo, align 8
6781   %x = atomicrmw add ptr %a, i32 42 seq_cst, align 4, !pcsections !0
6782   store volatile i64 1, ptr @foo, align 8
6783   ret void
6786 define void @atomic32_sub_seq_cst(ptr %a) {
6787 ; O0-LABEL: atomic32_sub_seq_cst:
6788 ; O0:       # %bb.0: # %entry
6789 ; O0-NEXT:    movq foo(%rip), %rax
6790 ; O0-NEXT:  .Lpcsection270:
6791 ; O0-NEXT:    lock subl $42, (%rdi)
6792 ; O0-NEXT:    movq $1, foo
6793 ; O0-NEXT:    retq
6795 ; O1-LABEL: atomic32_sub_seq_cst:
6796 ; O1:       # %bb.0: # %entry
6797 ; O1-NEXT:    movq foo(%rip), %rax
6798 ; O1-NEXT:  .Lpcsection237:
6799 ; O1-NEXT:    lock subl $42, (%rdi)
6800 ; O1-NEXT:    movq $1, foo(%rip)
6801 ; O1-NEXT:    retq
6803 ; O2-LABEL: atomic32_sub_seq_cst:
6804 ; O2:       # %bb.0: # %entry
6805 ; O2-NEXT:    movq foo(%rip), %rax
6806 ; O2-NEXT:  .Lpcsection237:
6807 ; O2-NEXT:    lock subl $42, (%rdi)
6808 ; O2-NEXT:    movq $1, foo(%rip)
6809 ; O2-NEXT:    retq
6811 ; O3-LABEL: atomic32_sub_seq_cst:
6812 ; O3:       # %bb.0: # %entry
6813 ; O3-NEXT:    movq foo(%rip), %rax
6814 ; O3-NEXT:  .Lpcsection237:
6815 ; O3-NEXT:    lock subl $42, (%rdi)
6816 ; O3-NEXT:    movq $1, foo(%rip)
6817 ; O3-NEXT:    retq
6818 entry:
6819   load volatile i64, ptr @foo, align 8
6820   %x = atomicrmw sub ptr %a, i32 42 seq_cst, align 4, !pcsections !0
6821   store volatile i64 1, ptr @foo, align 8
6822   ret void
6825 define void @atomic32_and_seq_cst(ptr %a) {
6826 ; O0-LABEL: atomic32_and_seq_cst:
6827 ; O0:       # %bb.0: # %entry
6828 ; O0-NEXT:    movq foo(%rip), %rax
6829 ; O0-NEXT:  .Lpcsection271:
6830 ; O0-NEXT:    lock andl $42, (%rdi)
6831 ; O0-NEXT:    movq $1, foo
6832 ; O0-NEXT:    retq
6834 ; O1-LABEL: atomic32_and_seq_cst:
6835 ; O1:       # %bb.0: # %entry
6836 ; O1-NEXT:    movq foo(%rip), %rax
6837 ; O1-NEXT:  .Lpcsection238:
6838 ; O1-NEXT:    lock andl $42, (%rdi)
6839 ; O1-NEXT:    movq $1, foo(%rip)
6840 ; O1-NEXT:    retq
6842 ; O2-LABEL: atomic32_and_seq_cst:
6843 ; O2:       # %bb.0: # %entry
6844 ; O2-NEXT:    movq foo(%rip), %rax
6845 ; O2-NEXT:  .Lpcsection238:
6846 ; O2-NEXT:    lock andl $42, (%rdi)
6847 ; O2-NEXT:    movq $1, foo(%rip)
6848 ; O2-NEXT:    retq
6850 ; O3-LABEL: atomic32_and_seq_cst:
6851 ; O3:       # %bb.0: # %entry
6852 ; O3-NEXT:    movq foo(%rip), %rax
6853 ; O3-NEXT:  .Lpcsection238:
6854 ; O3-NEXT:    lock andl $42, (%rdi)
6855 ; O3-NEXT:    movq $1, foo(%rip)
6856 ; O3-NEXT:    retq
6857 entry:
6858   load volatile i64, ptr @foo, align 8
6859   %x = atomicrmw and ptr %a, i32 42 seq_cst, align 4, !pcsections !0
6860   store volatile i64 1, ptr @foo, align 8
6861   ret void
6864 define void @atomic32_or_seq_cst(ptr %a) {
6865 ; O0-LABEL: atomic32_or_seq_cst:
6866 ; O0:       # %bb.0: # %entry
6867 ; O0-NEXT:    movq foo(%rip), %rax
6868 ; O0-NEXT:  .Lpcsection272:
6869 ; O0-NEXT:    lock orl $42, (%rdi)
6870 ; O0-NEXT:    movq $1, foo
6871 ; O0-NEXT:    retq
6873 ; O1-LABEL: atomic32_or_seq_cst:
6874 ; O1:       # %bb.0: # %entry
6875 ; O1-NEXT:    movq foo(%rip), %rax
6876 ; O1-NEXT:  .Lpcsection239:
6877 ; O1-NEXT:    lock orl $42, (%rdi)
6878 ; O1-NEXT:    movq $1, foo(%rip)
6879 ; O1-NEXT:    retq
6881 ; O2-LABEL: atomic32_or_seq_cst:
6882 ; O2:       # %bb.0: # %entry
6883 ; O2-NEXT:    movq foo(%rip), %rax
6884 ; O2-NEXT:  .Lpcsection239:
6885 ; O2-NEXT:    lock orl $42, (%rdi)
6886 ; O2-NEXT:    movq $1, foo(%rip)
6887 ; O2-NEXT:    retq
6889 ; O3-LABEL: atomic32_or_seq_cst:
6890 ; O3:       # %bb.0: # %entry
6891 ; O3-NEXT:    movq foo(%rip), %rax
6892 ; O3-NEXT:  .Lpcsection239:
6893 ; O3-NEXT:    lock orl $42, (%rdi)
6894 ; O3-NEXT:    movq $1, foo(%rip)
6895 ; O3-NEXT:    retq
6896 entry:
6897   load volatile i64, ptr @foo, align 8
6898   %x = atomicrmw or ptr %a, i32 42 seq_cst, align 4, !pcsections !0
6899   store volatile i64 1, ptr @foo, align 8
6900   ret void
6903 define void @atomic32_xor_seq_cst(ptr %a) {
6904 ; O0-LABEL: atomic32_xor_seq_cst:
6905 ; O0:       # %bb.0: # %entry
6906 ; O0-NEXT:    movq foo(%rip), %rax
6907 ; O0-NEXT:  .Lpcsection273:
6908 ; O0-NEXT:    lock xorl $42, (%rdi)
6909 ; O0-NEXT:    movq $1, foo
6910 ; O0-NEXT:    retq
6912 ; O1-LABEL: atomic32_xor_seq_cst:
6913 ; O1:       # %bb.0: # %entry
6914 ; O1-NEXT:    movq foo(%rip), %rax
6915 ; O1-NEXT:  .Lpcsection240:
6916 ; O1-NEXT:    lock xorl $42, (%rdi)
6917 ; O1-NEXT:    movq $1, foo(%rip)
6918 ; O1-NEXT:    retq
6920 ; O2-LABEL: atomic32_xor_seq_cst:
6921 ; O2:       # %bb.0: # %entry
6922 ; O2-NEXT:    movq foo(%rip), %rax
6923 ; O2-NEXT:  .Lpcsection240:
6924 ; O2-NEXT:    lock xorl $42, (%rdi)
6925 ; O2-NEXT:    movq $1, foo(%rip)
6926 ; O2-NEXT:    retq
6928 ; O3-LABEL: atomic32_xor_seq_cst:
6929 ; O3:       # %bb.0: # %entry
6930 ; O3-NEXT:    movq foo(%rip), %rax
6931 ; O3-NEXT:  .Lpcsection240:
6932 ; O3-NEXT:    lock xorl $42, (%rdi)
6933 ; O3-NEXT:    movq $1, foo(%rip)
6934 ; O3-NEXT:    retq
6935 entry:
6936   load volatile i64, ptr @foo, align 8
6937   %x = atomicrmw xor ptr %a, i32 42 seq_cst, align 4, !pcsections !0
6938   store volatile i64 1, ptr @foo, align 8
6939   ret void
6942 define void @atomic32_nand_seq_cst(ptr %a) {
6943 ; O0-LABEL: atomic32_nand_seq_cst:
6944 ; O0:       # %bb.0: # %entry
6945 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
6946 ; O0-NEXT:    movq foo, %rax
6947 ; O0-NEXT:  .Lpcsection274:
6948 ; O0-NEXT:    movl (%rdi), %eax
6949 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
6950 ; O0-NEXT:  .LBB140_1: # %atomicrmw.start
6951 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
6952 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
6953 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
6954 ; O0-NEXT:    movl %eax, %edx
6955 ; O0-NEXT:  .Lpcsection275:
6956 ; O0-NEXT:    notl %edx
6957 ; O0-NEXT:  .Lpcsection276:
6958 ; O0-NEXT:    orl $-43, %edx
6959 ; O0-NEXT:  .Lpcsection277:
6960 ; O0-NEXT:    lock cmpxchgl %edx, (%rcx)
6961 ; O0-NEXT:  .Lpcsection278:
6962 ; O0-NEXT:    sete %cl
6963 ; O0-NEXT:  .Lpcsection279:
6964 ; O0-NEXT:    testb $1, %cl
6965 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
6966 ; O0-NEXT:  .Lpcsection280:
6967 ; O0-NEXT:    jne .LBB140_2
6968 ; O0-NEXT:    jmp .LBB140_1
6969 ; O0-NEXT:  .LBB140_2: # %atomicrmw.end
6970 ; O0-NEXT:    movq $1, foo
6971 ; O0-NEXT:    retq
6973 ; O1-LABEL: atomic32_nand_seq_cst:
6974 ; O1:       # %bb.0: # %entry
6975 ; O1-NEXT:    movq foo(%rip), %rax
6976 ; O1-NEXT:  .Lpcsection241:
6977 ; O1-NEXT:    movl (%rdi), %eax
6978 ; O1-NEXT:    .p2align 4, 0x90
6979 ; O1-NEXT:  .LBB140_1: # %atomicrmw.start
6980 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
6981 ; O1-NEXT:    movl %eax, %ecx
6982 ; O1-NEXT:  .Lpcsection242:
6983 ; O1-NEXT:    notl %ecx
6984 ; O1-NEXT:  .Lpcsection243:
6985 ; O1-NEXT:    orl $-43, %ecx
6986 ; O1-NEXT:  .Lpcsection244:
6987 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
6988 ; O1-NEXT:  .Lpcsection245:
6989 ; O1-NEXT:    jne .LBB140_1
6990 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
6991 ; O1-NEXT:    movq $1, foo(%rip)
6992 ; O1-NEXT:    retq
6994 ; O2-LABEL: atomic32_nand_seq_cst:
6995 ; O2:       # %bb.0: # %entry
6996 ; O2-NEXT:    movq foo(%rip), %rax
6997 ; O2-NEXT:  .Lpcsection241:
6998 ; O2-NEXT:    movl (%rdi), %eax
6999 ; O2-NEXT:    .p2align 4, 0x90
7000 ; O2-NEXT:  .LBB140_1: # %atomicrmw.start
7001 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
7002 ; O2-NEXT:    movl %eax, %ecx
7003 ; O2-NEXT:  .Lpcsection242:
7004 ; O2-NEXT:    notl %ecx
7005 ; O2-NEXT:  .Lpcsection243:
7006 ; O2-NEXT:    orl $-43, %ecx
7007 ; O2-NEXT:  .Lpcsection244:
7008 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7009 ; O2-NEXT:  .Lpcsection245:
7010 ; O2-NEXT:    jne .LBB140_1
7011 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
7012 ; O2-NEXT:    movq $1, foo(%rip)
7013 ; O2-NEXT:    retq
7015 ; O3-LABEL: atomic32_nand_seq_cst:
7016 ; O3:       # %bb.0: # %entry
7017 ; O3-NEXT:    movq foo(%rip), %rax
7018 ; O3-NEXT:  .Lpcsection241:
7019 ; O3-NEXT:    movl (%rdi), %eax
7020 ; O3-NEXT:    .p2align 4, 0x90
7021 ; O3-NEXT:  .LBB140_1: # %atomicrmw.start
7022 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
7023 ; O3-NEXT:    movl %eax, %ecx
7024 ; O3-NEXT:  .Lpcsection242:
7025 ; O3-NEXT:    notl %ecx
7026 ; O3-NEXT:  .Lpcsection243:
7027 ; O3-NEXT:    orl $-43, %ecx
7028 ; O3-NEXT:  .Lpcsection244:
7029 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7030 ; O3-NEXT:  .Lpcsection245:
7031 ; O3-NEXT:    jne .LBB140_1
7032 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
7033 ; O3-NEXT:    movq $1, foo(%rip)
7034 ; O3-NEXT:    retq
7035 entry:
7036   load volatile i64, ptr @foo, align 8
7037   %x = atomicrmw nand ptr %a, i32 42 seq_cst, align 4, !pcsections !0
7038   store volatile i64 1, ptr @foo, align 8
7039   ret void
7042 define void @atomic32_cas_monotonic(ptr %a) {
7043 ; O0-LABEL: atomic32_cas_monotonic:
7044 ; O0:       # %bb.0: # %entry
7045 ; O0-NEXT:    movq foo(%rip), %rax
7046 ; O0-NEXT:    movl $42, %eax
7047 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
7048 ; O0-NEXT:    movl $1, %ecx
7049 ; O0-NEXT:  .Lpcsection281:
7050 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7051 ; O0-NEXT:  .Lpcsection282:
7052 ; O0-NEXT:    # kill: def $edx killed $eax
7053 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7054 ; O0-NEXT:  .Lpcsection283:
7055 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7056 ; O0-NEXT:  .Lpcsection284:
7057 ; O0-NEXT:    # kill: def $edx killed $eax
7058 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7059 ; O0-NEXT:  .Lpcsection285:
7060 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7061 ; O0-NEXT:    movq $1, foo
7062 ; O0-NEXT:    retq
7064 ; O1-LABEL: atomic32_cas_monotonic:
7065 ; O1:       # %bb.0: # %entry
7066 ; O1-NEXT:    movq foo(%rip), %rax
7067 ; O1-NEXT:    movl $1, %ecx
7068 ; O1-NEXT:  .Lpcsection246:
7069 ; O1-NEXT:    movl $42, %eax
7070 ; O1-NEXT:  .Lpcsection247:
7071 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7072 ; O1-NEXT:  .Lpcsection248:
7073 ; O1-NEXT:    movl $42, %eax
7074 ; O1-NEXT:  .Lpcsection249:
7075 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7076 ; O1-NEXT:  .Lpcsection250:
7077 ; O1-NEXT:    movl $42, %eax
7078 ; O1-NEXT:  .Lpcsection251:
7079 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7080 ; O1-NEXT:    movq $1, foo(%rip)
7081 ; O1-NEXT:    retq
7083 ; O2-LABEL: atomic32_cas_monotonic:
7084 ; O2:       # %bb.0: # %entry
7085 ; O2-NEXT:    movq foo(%rip), %rax
7086 ; O2-NEXT:    movl $1, %ecx
7087 ; O2-NEXT:  .Lpcsection246:
7088 ; O2-NEXT:    movl $42, %eax
7089 ; O2-NEXT:  .Lpcsection247:
7090 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7091 ; O2-NEXT:  .Lpcsection248:
7092 ; O2-NEXT:    movl $42, %eax
7093 ; O2-NEXT:  .Lpcsection249:
7094 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7095 ; O2-NEXT:  .Lpcsection250:
7096 ; O2-NEXT:    movl $42, %eax
7097 ; O2-NEXT:  .Lpcsection251:
7098 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7099 ; O2-NEXT:    movq $1, foo(%rip)
7100 ; O2-NEXT:    retq
7102 ; O3-LABEL: atomic32_cas_monotonic:
7103 ; O3:       # %bb.0: # %entry
7104 ; O3-NEXT:    movq foo(%rip), %rax
7105 ; O3-NEXT:    movl $1, %ecx
7106 ; O3-NEXT:  .Lpcsection246:
7107 ; O3-NEXT:    movl $42, %eax
7108 ; O3-NEXT:  .Lpcsection247:
7109 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7110 ; O3-NEXT:  .Lpcsection248:
7111 ; O3-NEXT:    movl $42, %eax
7112 ; O3-NEXT:  .Lpcsection249:
7113 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7114 ; O3-NEXT:  .Lpcsection250:
7115 ; O3-NEXT:    movl $42, %eax
7116 ; O3-NEXT:  .Lpcsection251:
7117 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7118 ; O3-NEXT:    movq $1, foo(%rip)
7119 ; O3-NEXT:    retq
7120 entry:
7121   load volatile i64, ptr @foo, align 8
7122   %x = cmpxchg ptr %a, i32 42, i32 1 monotonic monotonic, align 4, !pcsections !0
7123   %y = cmpxchg ptr %a, i32 42, i32 1 monotonic acquire, align 4, !pcsections !0
7124   %z = cmpxchg ptr %a, i32 42, i32 1 monotonic seq_cst, align 4, !pcsections !0
7125   store volatile i64 1, ptr @foo, align 8
7126   ret void
7129 define void @atomic32_cas_acquire(ptr %a) {
7130 ; O0-LABEL: atomic32_cas_acquire:
7131 ; O0:       # %bb.0: # %entry
7132 ; O0-NEXT:    movq foo(%rip), %rax
7133 ; O0-NEXT:    movl $42, %eax
7134 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
7135 ; O0-NEXT:    movl $1, %ecx
7136 ; O0-NEXT:  .Lpcsection286:
7137 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7138 ; O0-NEXT:  .Lpcsection287:
7139 ; O0-NEXT:    # kill: def $edx killed $eax
7140 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7141 ; O0-NEXT:  .Lpcsection288:
7142 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7143 ; O0-NEXT:  .Lpcsection289:
7144 ; O0-NEXT:    # kill: def $edx killed $eax
7145 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7146 ; O0-NEXT:  .Lpcsection290:
7147 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7148 ; O0-NEXT:    movq $1, foo
7149 ; O0-NEXT:    retq
7151 ; O1-LABEL: atomic32_cas_acquire:
7152 ; O1:       # %bb.0: # %entry
7153 ; O1-NEXT:    movq foo(%rip), %rax
7154 ; O1-NEXT:    movl $1, %ecx
7155 ; O1-NEXT:  .Lpcsection252:
7156 ; O1-NEXT:    movl $42, %eax
7157 ; O1-NEXT:  .Lpcsection253:
7158 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7159 ; O1-NEXT:  .Lpcsection254:
7160 ; O1-NEXT:    movl $42, %eax
7161 ; O1-NEXT:  .Lpcsection255:
7162 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7163 ; O1-NEXT:  .Lpcsection256:
7164 ; O1-NEXT:    movl $42, %eax
7165 ; O1-NEXT:  .Lpcsection257:
7166 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7167 ; O1-NEXT:    movq $1, foo(%rip)
7168 ; O1-NEXT:    retq
7170 ; O2-LABEL: atomic32_cas_acquire:
7171 ; O2:       # %bb.0: # %entry
7172 ; O2-NEXT:    movq foo(%rip), %rax
7173 ; O2-NEXT:    movl $1, %ecx
7174 ; O2-NEXT:  .Lpcsection252:
7175 ; O2-NEXT:    movl $42, %eax
7176 ; O2-NEXT:  .Lpcsection253:
7177 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7178 ; O2-NEXT:  .Lpcsection254:
7179 ; O2-NEXT:    movl $42, %eax
7180 ; O2-NEXT:  .Lpcsection255:
7181 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7182 ; O2-NEXT:  .Lpcsection256:
7183 ; O2-NEXT:    movl $42, %eax
7184 ; O2-NEXT:  .Lpcsection257:
7185 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7186 ; O2-NEXT:    movq $1, foo(%rip)
7187 ; O2-NEXT:    retq
7189 ; O3-LABEL: atomic32_cas_acquire:
7190 ; O3:       # %bb.0: # %entry
7191 ; O3-NEXT:    movq foo(%rip), %rax
7192 ; O3-NEXT:    movl $1, %ecx
7193 ; O3-NEXT:  .Lpcsection252:
7194 ; O3-NEXT:    movl $42, %eax
7195 ; O3-NEXT:  .Lpcsection253:
7196 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7197 ; O3-NEXT:  .Lpcsection254:
7198 ; O3-NEXT:    movl $42, %eax
7199 ; O3-NEXT:  .Lpcsection255:
7200 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7201 ; O3-NEXT:  .Lpcsection256:
7202 ; O3-NEXT:    movl $42, %eax
7203 ; O3-NEXT:  .Lpcsection257:
7204 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7205 ; O3-NEXT:    movq $1, foo(%rip)
7206 ; O3-NEXT:    retq
7207 entry:
7208   load volatile i64, ptr @foo, align 8
7209   %x = cmpxchg ptr %a, i32 42, i32 1 acquire monotonic, align 4, !pcsections !0
7210   %y = cmpxchg ptr %a, i32 42, i32 1 acquire acquire, align 4, !pcsections !0
7211   %z = cmpxchg ptr %a, i32 42, i32 1 acquire seq_cst, align 4, !pcsections !0
7212   store volatile i64 1, ptr @foo, align 8
7213   ret void
7216 define void @atomic32_cas_release(ptr %a) {
7217 ; O0-LABEL: atomic32_cas_release:
7218 ; O0:       # %bb.0: # %entry
7219 ; O0-NEXT:    movq foo(%rip), %rax
7220 ; O0-NEXT:    movl $42, %eax
7221 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
7222 ; O0-NEXT:    movl $1, %ecx
7223 ; O0-NEXT:  .Lpcsection291:
7224 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7225 ; O0-NEXT:  .Lpcsection292:
7226 ; O0-NEXT:    # kill: def $edx killed $eax
7227 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7228 ; O0-NEXT:  .Lpcsection293:
7229 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7230 ; O0-NEXT:  .Lpcsection294:
7231 ; O0-NEXT:    # kill: def $edx killed $eax
7232 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7233 ; O0-NEXT:  .Lpcsection295:
7234 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7235 ; O0-NEXT:    movq $1, foo
7236 ; O0-NEXT:    retq
7238 ; O1-LABEL: atomic32_cas_release:
7239 ; O1:       # %bb.0: # %entry
7240 ; O1-NEXT:    movq foo(%rip), %rax
7241 ; O1-NEXT:    movl $1, %ecx
7242 ; O1-NEXT:  .Lpcsection258:
7243 ; O1-NEXT:    movl $42, %eax
7244 ; O1-NEXT:  .Lpcsection259:
7245 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7246 ; O1-NEXT:  .Lpcsection260:
7247 ; O1-NEXT:    movl $42, %eax
7248 ; O1-NEXT:  .Lpcsection261:
7249 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7250 ; O1-NEXT:  .Lpcsection262:
7251 ; O1-NEXT:    movl $42, %eax
7252 ; O1-NEXT:  .Lpcsection263:
7253 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7254 ; O1-NEXT:    movq $1, foo(%rip)
7255 ; O1-NEXT:    retq
7257 ; O2-LABEL: atomic32_cas_release:
7258 ; O2:       # %bb.0: # %entry
7259 ; O2-NEXT:    movq foo(%rip), %rax
7260 ; O2-NEXT:    movl $1, %ecx
7261 ; O2-NEXT:  .Lpcsection258:
7262 ; O2-NEXT:    movl $42, %eax
7263 ; O2-NEXT:  .Lpcsection259:
7264 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7265 ; O2-NEXT:  .Lpcsection260:
7266 ; O2-NEXT:    movl $42, %eax
7267 ; O2-NEXT:  .Lpcsection261:
7268 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7269 ; O2-NEXT:  .Lpcsection262:
7270 ; O2-NEXT:    movl $42, %eax
7271 ; O2-NEXT:  .Lpcsection263:
7272 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7273 ; O2-NEXT:    movq $1, foo(%rip)
7274 ; O2-NEXT:    retq
7276 ; O3-LABEL: atomic32_cas_release:
7277 ; O3:       # %bb.0: # %entry
7278 ; O3-NEXT:    movq foo(%rip), %rax
7279 ; O3-NEXT:    movl $1, %ecx
7280 ; O3-NEXT:  .Lpcsection258:
7281 ; O3-NEXT:    movl $42, %eax
7282 ; O3-NEXT:  .Lpcsection259:
7283 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7284 ; O3-NEXT:  .Lpcsection260:
7285 ; O3-NEXT:    movl $42, %eax
7286 ; O3-NEXT:  .Lpcsection261:
7287 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7288 ; O3-NEXT:  .Lpcsection262:
7289 ; O3-NEXT:    movl $42, %eax
7290 ; O3-NEXT:  .Lpcsection263:
7291 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7292 ; O3-NEXT:    movq $1, foo(%rip)
7293 ; O3-NEXT:    retq
7294 entry:
7295   load volatile i64, ptr @foo, align 8
7296   %x = cmpxchg ptr %a, i32 42, i32 1 release monotonic, align 4, !pcsections !0
7297   %y = cmpxchg ptr %a, i32 42, i32 1 release acquire, align 4, !pcsections !0
7298   %z = cmpxchg ptr %a, i32 42, i32 1 release seq_cst, align 4, !pcsections !0
7299   store volatile i64 1, ptr @foo, align 8
7300   ret void
7303 define void @atomic32_cas_acq_rel(ptr %a) {
7304 ; O0-LABEL: atomic32_cas_acq_rel:
7305 ; O0:       # %bb.0: # %entry
7306 ; O0-NEXT:    movq foo(%rip), %rax
7307 ; O0-NEXT:    movl $42, %eax
7308 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
7309 ; O0-NEXT:    movl $1, %ecx
7310 ; O0-NEXT:  .Lpcsection296:
7311 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7312 ; O0-NEXT:  .Lpcsection297:
7313 ; O0-NEXT:    # kill: def $edx killed $eax
7314 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7315 ; O0-NEXT:  .Lpcsection298:
7316 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7317 ; O0-NEXT:  .Lpcsection299:
7318 ; O0-NEXT:    # kill: def $edx killed $eax
7319 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7320 ; O0-NEXT:  .Lpcsection300:
7321 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7322 ; O0-NEXT:    movq $1, foo
7323 ; O0-NEXT:    retq
7325 ; O1-LABEL: atomic32_cas_acq_rel:
7326 ; O1:       # %bb.0: # %entry
7327 ; O1-NEXT:    movq foo(%rip), %rax
7328 ; O1-NEXT:    movl $1, %ecx
7329 ; O1-NEXT:  .Lpcsection264:
7330 ; O1-NEXT:    movl $42, %eax
7331 ; O1-NEXT:  .Lpcsection265:
7332 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7333 ; O1-NEXT:  .Lpcsection266:
7334 ; O1-NEXT:    movl $42, %eax
7335 ; O1-NEXT:  .Lpcsection267:
7336 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7337 ; O1-NEXT:  .Lpcsection268:
7338 ; O1-NEXT:    movl $42, %eax
7339 ; O1-NEXT:  .Lpcsection269:
7340 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7341 ; O1-NEXT:    movq $1, foo(%rip)
7342 ; O1-NEXT:    retq
7344 ; O2-LABEL: atomic32_cas_acq_rel:
7345 ; O2:       # %bb.0: # %entry
7346 ; O2-NEXT:    movq foo(%rip), %rax
7347 ; O2-NEXT:    movl $1, %ecx
7348 ; O2-NEXT:  .Lpcsection264:
7349 ; O2-NEXT:    movl $42, %eax
7350 ; O2-NEXT:  .Lpcsection265:
7351 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7352 ; O2-NEXT:  .Lpcsection266:
7353 ; O2-NEXT:    movl $42, %eax
7354 ; O2-NEXT:  .Lpcsection267:
7355 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7356 ; O2-NEXT:  .Lpcsection268:
7357 ; O2-NEXT:    movl $42, %eax
7358 ; O2-NEXT:  .Lpcsection269:
7359 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7360 ; O2-NEXT:    movq $1, foo(%rip)
7361 ; O2-NEXT:    retq
7363 ; O3-LABEL: atomic32_cas_acq_rel:
7364 ; O3:       # %bb.0: # %entry
7365 ; O3-NEXT:    movq foo(%rip), %rax
7366 ; O3-NEXT:    movl $1, %ecx
7367 ; O3-NEXT:  .Lpcsection264:
7368 ; O3-NEXT:    movl $42, %eax
7369 ; O3-NEXT:  .Lpcsection265:
7370 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7371 ; O3-NEXT:  .Lpcsection266:
7372 ; O3-NEXT:    movl $42, %eax
7373 ; O3-NEXT:  .Lpcsection267:
7374 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7375 ; O3-NEXT:  .Lpcsection268:
7376 ; O3-NEXT:    movl $42, %eax
7377 ; O3-NEXT:  .Lpcsection269:
7378 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7379 ; O3-NEXT:    movq $1, foo(%rip)
7380 ; O3-NEXT:    retq
7381 entry:
7382   load volatile i64, ptr @foo, align 8
7383   %x = cmpxchg ptr %a, i32 42, i32 1 acq_rel monotonic, align 4, !pcsections !0
7384   %y = cmpxchg ptr %a, i32 42, i32 1 acq_rel acquire, align 4, !pcsections !0
7385   %z = cmpxchg ptr %a, i32 42, i32 1 acq_rel seq_cst, align 4, !pcsections !0
7386   store volatile i64 1, ptr @foo, align 8
7387   ret void
7390 define void @atomic32_cas_seq_cst(ptr %a) {
7391 ; O0-LABEL: atomic32_cas_seq_cst:
7392 ; O0:       # %bb.0: # %entry
7393 ; O0-NEXT:    movq foo(%rip), %rax
7394 ; O0-NEXT:    movl $42, %eax
7395 ; O0-NEXT:    movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
7396 ; O0-NEXT:    movl $1, %ecx
7397 ; O0-NEXT:  .Lpcsection301:
7398 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7399 ; O0-NEXT:  .Lpcsection302:
7400 ; O0-NEXT:    # kill: def $edx killed $eax
7401 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7402 ; O0-NEXT:  .Lpcsection303:
7403 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7404 ; O0-NEXT:  .Lpcsection304:
7405 ; O0-NEXT:    # kill: def $edx killed $eax
7406 ; O0-NEXT:    movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload
7407 ; O0-NEXT:  .Lpcsection305:
7408 ; O0-NEXT:    lock cmpxchgl %ecx, (%rdi)
7409 ; O0-NEXT:    movq $1, foo
7410 ; O0-NEXT:    retq
7412 ; O1-LABEL: atomic32_cas_seq_cst:
7413 ; O1:       # %bb.0: # %entry
7414 ; O1-NEXT:    movq foo(%rip), %rax
7415 ; O1-NEXT:    movl $1, %ecx
7416 ; O1-NEXT:  .Lpcsection270:
7417 ; O1-NEXT:    movl $42, %eax
7418 ; O1-NEXT:  .Lpcsection271:
7419 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7420 ; O1-NEXT:  .Lpcsection272:
7421 ; O1-NEXT:    movl $42, %eax
7422 ; O1-NEXT:  .Lpcsection273:
7423 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7424 ; O1-NEXT:  .Lpcsection274:
7425 ; O1-NEXT:    movl $42, %eax
7426 ; O1-NEXT:  .Lpcsection275:
7427 ; O1-NEXT:    lock cmpxchgl %ecx, (%rdi)
7428 ; O1-NEXT:    movq $1, foo(%rip)
7429 ; O1-NEXT:    retq
7431 ; O2-LABEL: atomic32_cas_seq_cst:
7432 ; O2:       # %bb.0: # %entry
7433 ; O2-NEXT:    movq foo(%rip), %rax
7434 ; O2-NEXT:    movl $1, %ecx
7435 ; O2-NEXT:  .Lpcsection270:
7436 ; O2-NEXT:    movl $42, %eax
7437 ; O2-NEXT:  .Lpcsection271:
7438 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7439 ; O2-NEXT:  .Lpcsection272:
7440 ; O2-NEXT:    movl $42, %eax
7441 ; O2-NEXT:  .Lpcsection273:
7442 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7443 ; O2-NEXT:  .Lpcsection274:
7444 ; O2-NEXT:    movl $42, %eax
7445 ; O2-NEXT:  .Lpcsection275:
7446 ; O2-NEXT:    lock cmpxchgl %ecx, (%rdi)
7447 ; O2-NEXT:    movq $1, foo(%rip)
7448 ; O2-NEXT:    retq
7450 ; O3-LABEL: atomic32_cas_seq_cst:
7451 ; O3:       # %bb.0: # %entry
7452 ; O3-NEXT:    movq foo(%rip), %rax
7453 ; O3-NEXT:    movl $1, %ecx
7454 ; O3-NEXT:  .Lpcsection270:
7455 ; O3-NEXT:    movl $42, %eax
7456 ; O3-NEXT:  .Lpcsection271:
7457 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7458 ; O3-NEXT:  .Lpcsection272:
7459 ; O3-NEXT:    movl $42, %eax
7460 ; O3-NEXT:  .Lpcsection273:
7461 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7462 ; O3-NEXT:  .Lpcsection274:
7463 ; O3-NEXT:    movl $42, %eax
7464 ; O3-NEXT:  .Lpcsection275:
7465 ; O3-NEXT:    lock cmpxchgl %ecx, (%rdi)
7466 ; O3-NEXT:    movq $1, foo(%rip)
7467 ; O3-NEXT:    retq
7468 entry:
7469   load volatile i64, ptr @foo, align 8
7470   %x = cmpxchg ptr %a, i32 42, i32 1 seq_cst monotonic, align 4, !pcsections !0
7471   %y = cmpxchg ptr %a, i32 42, i32 1 seq_cst acquire, align 4, !pcsections !0
7472   %z = cmpxchg ptr %a, i32 42, i32 1 seq_cst seq_cst, align 4, !pcsections !0
7473   store volatile i64 1, ptr @foo, align 8
7474   ret void
7477 define i64 @atomic64_load_unordered(ptr %a) {
7478 ; O0-LABEL: atomic64_load_unordered:
7479 ; O0:       # %bb.0: # %entry
7480 ; O0-NEXT:    movq foo(%rip), %rax
7481 ; O0-NEXT:  .Lpcsection306:
7482 ; O0-NEXT:    movq (%rdi), %rax
7483 ; O0-NEXT:    movq $1, foo
7484 ; O0-NEXT:    retq
7486 ; O1-LABEL: atomic64_load_unordered:
7487 ; O1:       # %bb.0: # %entry
7488 ; O1-NEXT:    movq foo(%rip), %rax
7489 ; O1-NEXT:  .Lpcsection276:
7490 ; O1-NEXT:    movq (%rdi), %rax
7491 ; O1-NEXT:    movq $1, foo(%rip)
7492 ; O1-NEXT:    retq
7494 ; O2-LABEL: atomic64_load_unordered:
7495 ; O2:       # %bb.0: # %entry
7496 ; O2-NEXT:    movq foo(%rip), %rax
7497 ; O2-NEXT:  .Lpcsection276:
7498 ; O2-NEXT:    movq (%rdi), %rax
7499 ; O2-NEXT:    movq $1, foo(%rip)
7500 ; O2-NEXT:    retq
7502 ; O3-LABEL: atomic64_load_unordered:
7503 ; O3:       # %bb.0: # %entry
7504 ; O3-NEXT:    movq foo(%rip), %rax
7505 ; O3-NEXT:  .Lpcsection276:
7506 ; O3-NEXT:    movq (%rdi), %rax
7507 ; O3-NEXT:    movq $1, foo(%rip)
7508 ; O3-NEXT:    retq
7509 entry:
7510   load volatile i64, ptr @foo, align 8
7511   %x = load atomic i64, ptr %a unordered, align 8, !pcsections !0
7512   store volatile i64 1, ptr @foo, align 8
7513   ret i64 %x
7516 define i64 @atomic64_load_monotonic(ptr %a) {
7517 ; O0-LABEL: atomic64_load_monotonic:
7518 ; O0:       # %bb.0: # %entry
7519 ; O0-NEXT:    movq foo(%rip), %rax
7520 ; O0-NEXT:  .Lpcsection307:
7521 ; O0-NEXT:    movq (%rdi), %rax
7522 ; O0-NEXT:    movq $1, foo
7523 ; O0-NEXT:    retq
7525 ; O1-LABEL: atomic64_load_monotonic:
7526 ; O1:       # %bb.0: # %entry
7527 ; O1-NEXT:    movq foo(%rip), %rax
7528 ; O1-NEXT:  .Lpcsection277:
7529 ; O1-NEXT:    movq (%rdi), %rax
7530 ; O1-NEXT:    movq $1, foo(%rip)
7531 ; O1-NEXT:    retq
7533 ; O2-LABEL: atomic64_load_monotonic:
7534 ; O2:       # %bb.0: # %entry
7535 ; O2-NEXT:    movq foo(%rip), %rax
7536 ; O2-NEXT:  .Lpcsection277:
7537 ; O2-NEXT:    movq (%rdi), %rax
7538 ; O2-NEXT:    movq $1, foo(%rip)
7539 ; O2-NEXT:    retq
7541 ; O3-LABEL: atomic64_load_monotonic:
7542 ; O3:       # %bb.0: # %entry
7543 ; O3-NEXT:    movq foo(%rip), %rax
7544 ; O3-NEXT:  .Lpcsection277:
7545 ; O3-NEXT:    movq (%rdi), %rax
7546 ; O3-NEXT:    movq $1, foo(%rip)
7547 ; O3-NEXT:    retq
7548 entry:
7549   load volatile i64, ptr @foo, align 8
7550   %x = load atomic i64, ptr %a monotonic, align 8, !pcsections !0
7551   store volatile i64 1, ptr @foo, align 8
7552   ret i64 %x
7555 define i64 @atomic64_load_acquire(ptr %a) {
7556 ; O0-LABEL: atomic64_load_acquire:
7557 ; O0:       # %bb.0: # %entry
7558 ; O0-NEXT:    movq foo(%rip), %rax
7559 ; O0-NEXT:  .Lpcsection308:
7560 ; O0-NEXT:    movq (%rdi), %rax
7561 ; O0-NEXT:    movq $1, foo
7562 ; O0-NEXT:    retq
7564 ; O1-LABEL: atomic64_load_acquire:
7565 ; O1:       # %bb.0: # %entry
7566 ; O1-NEXT:    movq foo(%rip), %rax
7567 ; O1-NEXT:  .Lpcsection278:
7568 ; O1-NEXT:    movq (%rdi), %rax
7569 ; O1-NEXT:    movq $1, foo(%rip)
7570 ; O1-NEXT:    retq
7572 ; O2-LABEL: atomic64_load_acquire:
7573 ; O2:       # %bb.0: # %entry
7574 ; O2-NEXT:    movq foo(%rip), %rax
7575 ; O2-NEXT:  .Lpcsection278:
7576 ; O2-NEXT:    movq (%rdi), %rax
7577 ; O2-NEXT:    movq $1, foo(%rip)
7578 ; O2-NEXT:    retq
7580 ; O3-LABEL: atomic64_load_acquire:
7581 ; O3:       # %bb.0: # %entry
7582 ; O3-NEXT:    movq foo(%rip), %rax
7583 ; O3-NEXT:  .Lpcsection278:
7584 ; O3-NEXT:    movq (%rdi), %rax
7585 ; O3-NEXT:    movq $1, foo(%rip)
7586 ; O3-NEXT:    retq
7587 entry:
7588   load volatile i64, ptr @foo, align 8
7589   %x = load atomic i64, ptr %a acquire, align 8, !pcsections !0
7590   store volatile i64 1, ptr @foo, align 8
7591   ret i64 %x
7594 define i64 @atomic64_load_seq_cst(ptr %a) {
7595 ; O0-LABEL: atomic64_load_seq_cst:
7596 ; O0:       # %bb.0: # %entry
7597 ; O0-NEXT:    movq foo(%rip), %rax
7598 ; O0-NEXT:  .Lpcsection309:
7599 ; O0-NEXT:    movq (%rdi), %rax
7600 ; O0-NEXT:    movq $1, foo
7601 ; O0-NEXT:    retq
7603 ; O1-LABEL: atomic64_load_seq_cst:
7604 ; O1:       # %bb.0: # %entry
7605 ; O1-NEXT:    movq foo(%rip), %rax
7606 ; O1-NEXT:  .Lpcsection279:
7607 ; O1-NEXT:    movq (%rdi), %rax
7608 ; O1-NEXT:    movq $1, foo(%rip)
7609 ; O1-NEXT:    retq
7611 ; O2-LABEL: atomic64_load_seq_cst:
7612 ; O2:       # %bb.0: # %entry
7613 ; O2-NEXT:    movq foo(%rip), %rax
7614 ; O2-NEXT:  .Lpcsection279:
7615 ; O2-NEXT:    movq (%rdi), %rax
7616 ; O2-NEXT:    movq $1, foo(%rip)
7617 ; O2-NEXT:    retq
7619 ; O3-LABEL: atomic64_load_seq_cst:
7620 ; O3:       # %bb.0: # %entry
7621 ; O3-NEXT:    movq foo(%rip), %rax
7622 ; O3-NEXT:  .Lpcsection279:
7623 ; O3-NEXT:    movq (%rdi), %rax
7624 ; O3-NEXT:    movq $1, foo(%rip)
7625 ; O3-NEXT:    retq
7626 entry:
7627   load volatile i64, ptr @foo, align 8
7628   %x = load atomic i64, ptr %a seq_cst, align 8, !pcsections !0
7629   store volatile i64 1, ptr @foo, align 8
7630   ret i64 %x
7633 define ptr @atomic64_load_seq_cst_ptr_ty(ptr %a) {
7634 ; O0-LABEL: atomic64_load_seq_cst_ptr_ty:
7635 ; O0:       # %bb.0: # %entry
7636 ; O0-NEXT:    movq foo(%rip), %rax
7637 ; O0-NEXT:  .Lpcsection310:
7638 ; O0-NEXT:    movq (%rdi), %rax
7639 ; O0-NEXT:    movq $1, foo
7640 ; O0-NEXT:    retq
7642 ; O1-LABEL: atomic64_load_seq_cst_ptr_ty:
7643 ; O1:       # %bb.0: # %entry
7644 ; O1-NEXT:    movq foo(%rip), %rax
7645 ; O1-NEXT:  .Lpcsection280:
7646 ; O1-NEXT:    movq (%rdi), %rax
7647 ; O1-NEXT:    movq $1, foo(%rip)
7648 ; O1-NEXT:    retq
7650 ; O2-LABEL: atomic64_load_seq_cst_ptr_ty:
7651 ; O2:       # %bb.0: # %entry
7652 ; O2-NEXT:    movq foo(%rip), %rax
7653 ; O2-NEXT:  .Lpcsection280:
7654 ; O2-NEXT:    movq (%rdi), %rax
7655 ; O2-NEXT:    movq $1, foo(%rip)
7656 ; O2-NEXT:    retq
7658 ; O3-LABEL: atomic64_load_seq_cst_ptr_ty:
7659 ; O3:       # %bb.0: # %entry
7660 ; O3-NEXT:    movq foo(%rip), %rax
7661 ; O3-NEXT:  .Lpcsection280:
7662 ; O3-NEXT:    movq (%rdi), %rax
7663 ; O3-NEXT:    movq $1, foo(%rip)
7664 ; O3-NEXT:    retq
7665 entry:
7666   load volatile i64, ptr @foo, align 8
7667   %x = load atomic ptr, ptr %a seq_cst, align 8, !pcsections !0
7668   store volatile i64 1, ptr @foo, align 8
7669   ret ptr %x
7672 define void @atomic64_store_unordered(ptr %a) {
7673 ; O0-LABEL: atomic64_store_unordered:
7674 ; O0:       # %bb.0: # %entry
7675 ; O0-NEXT:    movq foo(%rip), %rax
7676 ; O0-NEXT:  .Lpcsection311:
7677 ; O0-NEXT:    movq $42, (%rdi)
7678 ; O0-NEXT:    movq $1, foo
7679 ; O0-NEXT:    retq
7681 ; O1-LABEL: atomic64_store_unordered:
7682 ; O1:       # %bb.0: # %entry
7683 ; O1-NEXT:    movq foo(%rip), %rax
7684 ; O1-NEXT:  .Lpcsection281:
7685 ; O1-NEXT:    movq $42, (%rdi)
7686 ; O1-NEXT:    movq $1, foo(%rip)
7687 ; O1-NEXT:    retq
7689 ; O2-LABEL: atomic64_store_unordered:
7690 ; O2:       # %bb.0: # %entry
7691 ; O2-NEXT:    movq foo(%rip), %rax
7692 ; O2-NEXT:  .Lpcsection281:
7693 ; O2-NEXT:    movq $42, (%rdi)
7694 ; O2-NEXT:    movq $1, foo(%rip)
7695 ; O2-NEXT:    retq
7697 ; O3-LABEL: atomic64_store_unordered:
7698 ; O3:       # %bb.0: # %entry
7699 ; O3-NEXT:    movq foo(%rip), %rax
7700 ; O3-NEXT:  .Lpcsection281:
7701 ; O3-NEXT:    movq $42, (%rdi)
7702 ; O3-NEXT:    movq $1, foo(%rip)
7703 ; O3-NEXT:    retq
7704 entry:
7705   load volatile i64, ptr @foo, align 8
7706   store atomic i64 42, ptr %a unordered, align 8, !pcsections !0
7707   store volatile i64 1, ptr @foo, align 8
7708   ret void
7711 define void @atomic64_store_monotonic(ptr %a) {
7712 ; O0-LABEL: atomic64_store_monotonic:
7713 ; O0:       # %bb.0: # %entry
7714 ; O0-NEXT:    movq foo(%rip), %rax
7715 ; O0-NEXT:  .Lpcsection312:
7716 ; O0-NEXT:    movq $42, (%rdi)
7717 ; O0-NEXT:    movq $1, foo
7718 ; O0-NEXT:    retq
7720 ; O1-LABEL: atomic64_store_monotonic:
7721 ; O1:       # %bb.0: # %entry
7722 ; O1-NEXT:    movq foo(%rip), %rax
7723 ; O1-NEXT:  .Lpcsection282:
7724 ; O1-NEXT:    movq $42, (%rdi)
7725 ; O1-NEXT:    movq $1, foo(%rip)
7726 ; O1-NEXT:    retq
7728 ; O2-LABEL: atomic64_store_monotonic:
7729 ; O2:       # %bb.0: # %entry
7730 ; O2-NEXT:    movq foo(%rip), %rax
7731 ; O2-NEXT:  .Lpcsection282:
7732 ; O2-NEXT:    movq $42, (%rdi)
7733 ; O2-NEXT:    movq $1, foo(%rip)
7734 ; O2-NEXT:    retq
7736 ; O3-LABEL: atomic64_store_monotonic:
7737 ; O3:       # %bb.0: # %entry
7738 ; O3-NEXT:    movq foo(%rip), %rax
7739 ; O3-NEXT:  .Lpcsection282:
7740 ; O3-NEXT:    movq $42, (%rdi)
7741 ; O3-NEXT:    movq $1, foo(%rip)
7742 ; O3-NEXT:    retq
7743 entry:
7744   load volatile i64, ptr @foo, align 8
7745   store atomic i64 42, ptr %a monotonic, align 8, !pcsections !0
7746   store volatile i64 1, ptr @foo, align 8
7747   ret void
7750 define void @atomic64_store_release(ptr %a) {
7751 ; O0-LABEL: atomic64_store_release:
7752 ; O0:       # %bb.0: # %entry
7753 ; O0-NEXT:    movq foo(%rip), %rax
7754 ; O0-NEXT:  .Lpcsection313:
7755 ; O0-NEXT:    movq $42, (%rdi)
7756 ; O0-NEXT:    movq $1, foo
7757 ; O0-NEXT:    retq
7759 ; O1-LABEL: atomic64_store_release:
7760 ; O1:       # %bb.0: # %entry
7761 ; O1-NEXT:    movq foo(%rip), %rax
7762 ; O1-NEXT:  .Lpcsection283:
7763 ; O1-NEXT:    movq $42, (%rdi)
7764 ; O1-NEXT:    movq $1, foo(%rip)
7765 ; O1-NEXT:    retq
7767 ; O2-LABEL: atomic64_store_release:
7768 ; O2:       # %bb.0: # %entry
7769 ; O2-NEXT:    movq foo(%rip), %rax
7770 ; O2-NEXT:  .Lpcsection283:
7771 ; O2-NEXT:    movq $42, (%rdi)
7772 ; O2-NEXT:    movq $1, foo(%rip)
7773 ; O2-NEXT:    retq
7775 ; O3-LABEL: atomic64_store_release:
7776 ; O3:       # %bb.0: # %entry
7777 ; O3-NEXT:    movq foo(%rip), %rax
7778 ; O3-NEXT:  .Lpcsection283:
7779 ; O3-NEXT:    movq $42, (%rdi)
7780 ; O3-NEXT:    movq $1, foo(%rip)
7781 ; O3-NEXT:    retq
7782 entry:
7783   load volatile i64, ptr @foo, align 8
7784   store atomic i64 42, ptr %a release, align 8, !pcsections !0
7785   store volatile i64 1, ptr @foo, align 8
7786   ret void
7789 define void @atomic64_store_seq_cst(ptr %a) {
7790 ; O0-LABEL: atomic64_store_seq_cst:
7791 ; O0:       # %bb.0: # %entry
7792 ; O0-NEXT:    movq foo(%rip), %rax
7793 ; O0-NEXT:    movl $42, %eax
7794 ; O0-NEXT:  .Lpcsection314:
7795 ; O0-NEXT:    xchgq %rax, (%rdi)
7796 ; O0-NEXT:    movq $1, foo
7797 ; O0-NEXT:    retq
7799 ; O1-LABEL: atomic64_store_seq_cst:
7800 ; O1:       # %bb.0: # %entry
7801 ; O1-NEXT:    movq foo(%rip), %rax
7802 ; O1-NEXT:    movl $42, %eax
7803 ; O1-NEXT:  .Lpcsection284:
7804 ; O1-NEXT:    xchgq %rax, (%rdi)
7805 ; O1-NEXT:    movq $1, foo(%rip)
7806 ; O1-NEXT:    retq
7808 ; O2-LABEL: atomic64_store_seq_cst:
7809 ; O2:       # %bb.0: # %entry
7810 ; O2-NEXT:    movq foo(%rip), %rax
7811 ; O2-NEXT:    movl $42, %eax
7812 ; O2-NEXT:  .Lpcsection284:
7813 ; O2-NEXT:    xchgq %rax, (%rdi)
7814 ; O2-NEXT:    movq $1, foo(%rip)
7815 ; O2-NEXT:    retq
7817 ; O3-LABEL: atomic64_store_seq_cst:
7818 ; O3:       # %bb.0: # %entry
7819 ; O3-NEXT:    movq foo(%rip), %rax
7820 ; O3-NEXT:    movl $42, %eax
7821 ; O3-NEXT:  .Lpcsection284:
7822 ; O3-NEXT:    xchgq %rax, (%rdi)
7823 ; O3-NEXT:    movq $1, foo(%rip)
7824 ; O3-NEXT:    retq
7825 entry:
7826   load volatile i64, ptr @foo, align 8
7827   store atomic i64 42, ptr %a seq_cst, align 8, !pcsections !0
7828   store volatile i64 1, ptr @foo, align 8
7829   ret void
7832 define void @atomic64_store_seq_cst_ptr_ty(ptr %a, ptr %v) {
7833 ; O0-LABEL: atomic64_store_seq_cst_ptr_ty:
7834 ; O0:       # %bb.0: # %entry
7835 ; O0-NEXT:    movq foo(%rip), %rax
7836 ; O0-NEXT:  .Lpcsection315:
7837 ; O0-NEXT:    xchgq %rsi, (%rdi)
7838 ; O0-NEXT:    movq $1, foo
7839 ; O0-NEXT:    retq
7841 ; O1-LABEL: atomic64_store_seq_cst_ptr_ty:
7842 ; O1:       # %bb.0: # %entry
7843 ; O1-NEXT:    movq foo(%rip), %rax
7844 ; O1-NEXT:  .Lpcsection285:
7845 ; O1-NEXT:    xchgq %rsi, (%rdi)
7846 ; O1-NEXT:    movq $1, foo(%rip)
7847 ; O1-NEXT:    retq
7849 ; O2-LABEL: atomic64_store_seq_cst_ptr_ty:
7850 ; O2:       # %bb.0: # %entry
7851 ; O2-NEXT:    movq foo(%rip), %rax
7852 ; O2-NEXT:  .Lpcsection285:
7853 ; O2-NEXT:    xchgq %rsi, (%rdi)
7854 ; O2-NEXT:    movq $1, foo(%rip)
7855 ; O2-NEXT:    retq
7857 ; O3-LABEL: atomic64_store_seq_cst_ptr_ty:
7858 ; O3:       # %bb.0: # %entry
7859 ; O3-NEXT:    movq foo(%rip), %rax
7860 ; O3-NEXT:  .Lpcsection285:
7861 ; O3-NEXT:    xchgq %rsi, (%rdi)
7862 ; O3-NEXT:    movq $1, foo(%rip)
7863 ; O3-NEXT:    retq
7864 entry:
7865   load volatile i64, ptr @foo, align 8
7866   store atomic ptr %v, ptr %a seq_cst, align 8, !pcsections !0
7867   store volatile i64 1, ptr @foo, align 8
7868   ret void
7871 define void @atomic64_xchg_monotonic(ptr %a) {
7872 ; O0-LABEL: atomic64_xchg_monotonic:
7873 ; O0:       # %bb.0: # %entry
7874 ; O0-NEXT:    movq foo(%rip), %rax
7875 ; O0-NEXT:    movl $42, %eax
7876 ; O0-NEXT:  .Lpcsection316:
7877 ; O0-NEXT:    xchgq %rax, (%rdi)
7878 ; O0-NEXT:    movq $1, foo
7879 ; O0-NEXT:    retq
7881 ; O1-LABEL: atomic64_xchg_monotonic:
7882 ; O1:       # %bb.0: # %entry
7883 ; O1-NEXT:    movq foo(%rip), %rax
7884 ; O1-NEXT:    movl $42, %eax
7885 ; O1-NEXT:  .Lpcsection286:
7886 ; O1-NEXT:    xchgq %rax, (%rdi)
7887 ; O1-NEXT:    movq $1, foo(%rip)
7888 ; O1-NEXT:    retq
7890 ; O2-LABEL: atomic64_xchg_monotonic:
7891 ; O2:       # %bb.0: # %entry
7892 ; O2-NEXT:    movq foo(%rip), %rax
7893 ; O2-NEXT:    movl $42, %eax
7894 ; O2-NEXT:  .Lpcsection286:
7895 ; O2-NEXT:    xchgq %rax, (%rdi)
7896 ; O2-NEXT:    movq $1, foo(%rip)
7897 ; O2-NEXT:    retq
7899 ; O3-LABEL: atomic64_xchg_monotonic:
7900 ; O3:       # %bb.0: # %entry
7901 ; O3-NEXT:    movq foo(%rip), %rax
7902 ; O3-NEXT:    movl $42, %eax
7903 ; O3-NEXT:  .Lpcsection286:
7904 ; O3-NEXT:    xchgq %rax, (%rdi)
7905 ; O3-NEXT:    movq $1, foo(%rip)
7906 ; O3-NEXT:    retq
7907 entry:
7908   load volatile i64, ptr @foo, align 8
7909   %x = atomicrmw xchg ptr %a, i64 42 monotonic, align 8, !pcsections !0
7910   store volatile i64 1, ptr @foo, align 8
7911   ret void
7914 define void @atomic64_add_monotonic(ptr %a) {
7915 ; O0-LABEL: atomic64_add_monotonic:
7916 ; O0:       # %bb.0: # %entry
7917 ; O0-NEXT:    movq foo(%rip), %rax
7918 ; O0-NEXT:  .Lpcsection317:
7919 ; O0-NEXT:    lock addq $42, (%rdi)
7920 ; O0-NEXT:    movq $1, foo
7921 ; O0-NEXT:    retq
7923 ; O1-LABEL: atomic64_add_monotonic:
7924 ; O1:       # %bb.0: # %entry
7925 ; O1-NEXT:    movq foo(%rip), %rax
7926 ; O1-NEXT:  .Lpcsection287:
7927 ; O1-NEXT:    lock addq $42, (%rdi)
7928 ; O1-NEXT:    movq $1, foo(%rip)
7929 ; O1-NEXT:    retq
7931 ; O2-LABEL: atomic64_add_monotonic:
7932 ; O2:       # %bb.0: # %entry
7933 ; O2-NEXT:    movq foo(%rip), %rax
7934 ; O2-NEXT:  .Lpcsection287:
7935 ; O2-NEXT:    lock addq $42, (%rdi)
7936 ; O2-NEXT:    movq $1, foo(%rip)
7937 ; O2-NEXT:    retq
7939 ; O3-LABEL: atomic64_add_monotonic:
7940 ; O3:       # %bb.0: # %entry
7941 ; O3-NEXT:    movq foo(%rip), %rax
7942 ; O3-NEXT:  .Lpcsection287:
7943 ; O3-NEXT:    lock addq $42, (%rdi)
7944 ; O3-NEXT:    movq $1, foo(%rip)
7945 ; O3-NEXT:    retq
7946 entry:
7947   load volatile i64, ptr @foo, align 8
7948   %x = atomicrmw add ptr %a, i64 42 monotonic, align 8, !pcsections !0
7949   store volatile i64 1, ptr @foo, align 8
7950   ret void
7953 define void @atomic64_sub_monotonic(ptr %a) {
7954 ; O0-LABEL: atomic64_sub_monotonic:
7955 ; O0:       # %bb.0: # %entry
7956 ; O0-NEXT:    movq foo(%rip), %rax
7957 ; O0-NEXT:  .Lpcsection318:
7958 ; O0-NEXT:    lock subq $42, (%rdi)
7959 ; O0-NEXT:    movq $1, foo
7960 ; O0-NEXT:    retq
7962 ; O1-LABEL: atomic64_sub_monotonic:
7963 ; O1:       # %bb.0: # %entry
7964 ; O1-NEXT:    movq foo(%rip), %rax
7965 ; O1-NEXT:  .Lpcsection288:
7966 ; O1-NEXT:    lock subq $42, (%rdi)
7967 ; O1-NEXT:    movq $1, foo(%rip)
7968 ; O1-NEXT:    retq
7970 ; O2-LABEL: atomic64_sub_monotonic:
7971 ; O2:       # %bb.0: # %entry
7972 ; O2-NEXT:    movq foo(%rip), %rax
7973 ; O2-NEXT:  .Lpcsection288:
7974 ; O2-NEXT:    lock subq $42, (%rdi)
7975 ; O2-NEXT:    movq $1, foo(%rip)
7976 ; O2-NEXT:    retq
7978 ; O3-LABEL: atomic64_sub_monotonic:
7979 ; O3:       # %bb.0: # %entry
7980 ; O3-NEXT:    movq foo(%rip), %rax
7981 ; O3-NEXT:  .Lpcsection288:
7982 ; O3-NEXT:    lock subq $42, (%rdi)
7983 ; O3-NEXT:    movq $1, foo(%rip)
7984 ; O3-NEXT:    retq
7985 entry:
7986   load volatile i64, ptr @foo, align 8
7987   %x = atomicrmw sub ptr %a, i64 42 monotonic, align 8, !pcsections !0
7988   store volatile i64 1, ptr @foo, align 8
7989   ret void
7992 define void @atomic64_and_monotonic(ptr %a) {
7993 ; O0-LABEL: atomic64_and_monotonic:
7994 ; O0:       # %bb.0: # %entry
7995 ; O0-NEXT:    movq foo(%rip), %rax
7996 ; O0-NEXT:  .Lpcsection319:
7997 ; O0-NEXT:    lock andq $42, (%rdi)
7998 ; O0-NEXT:    movq $1, foo
7999 ; O0-NEXT:    retq
8001 ; O1-LABEL: atomic64_and_monotonic:
8002 ; O1:       # %bb.0: # %entry
8003 ; O1-NEXT:    movq foo(%rip), %rax
8004 ; O1-NEXT:  .Lpcsection289:
8005 ; O1-NEXT:    lock andq $42, (%rdi)
8006 ; O1-NEXT:    movq $1, foo(%rip)
8007 ; O1-NEXT:    retq
8009 ; O2-LABEL: atomic64_and_monotonic:
8010 ; O2:       # %bb.0: # %entry
8011 ; O2-NEXT:    movq foo(%rip), %rax
8012 ; O2-NEXT:  .Lpcsection289:
8013 ; O2-NEXT:    lock andq $42, (%rdi)
8014 ; O2-NEXT:    movq $1, foo(%rip)
8015 ; O2-NEXT:    retq
8017 ; O3-LABEL: atomic64_and_monotonic:
8018 ; O3:       # %bb.0: # %entry
8019 ; O3-NEXT:    movq foo(%rip), %rax
8020 ; O3-NEXT:  .Lpcsection289:
8021 ; O3-NEXT:    lock andq $42, (%rdi)
8022 ; O3-NEXT:    movq $1, foo(%rip)
8023 ; O3-NEXT:    retq
8024 entry:
8025   load volatile i64, ptr @foo, align 8
8026   %x = atomicrmw and ptr %a, i64 42 monotonic, align 8, !pcsections !0
8027   store volatile i64 1, ptr @foo, align 8
8028   ret void
8031 define void @atomic64_or_monotonic(ptr %a) {
8032 ; O0-LABEL: atomic64_or_monotonic:
8033 ; O0:       # %bb.0: # %entry
8034 ; O0-NEXT:    movq foo(%rip), %rax
8035 ; O0-NEXT:  .Lpcsection320:
8036 ; O0-NEXT:    lock orq $42, (%rdi)
8037 ; O0-NEXT:    movq $1, foo
8038 ; O0-NEXT:    retq
8040 ; O1-LABEL: atomic64_or_monotonic:
8041 ; O1:       # %bb.0: # %entry
8042 ; O1-NEXT:    movq foo(%rip), %rax
8043 ; O1-NEXT:  .Lpcsection290:
8044 ; O1-NEXT:    lock orq $42, (%rdi)
8045 ; O1-NEXT:    movq $1, foo(%rip)
8046 ; O1-NEXT:    retq
8048 ; O2-LABEL: atomic64_or_monotonic:
8049 ; O2:       # %bb.0: # %entry
8050 ; O2-NEXT:    movq foo(%rip), %rax
8051 ; O2-NEXT:  .Lpcsection290:
8052 ; O2-NEXT:    lock orq $42, (%rdi)
8053 ; O2-NEXT:    movq $1, foo(%rip)
8054 ; O2-NEXT:    retq
8056 ; O3-LABEL: atomic64_or_monotonic:
8057 ; O3:       # %bb.0: # %entry
8058 ; O3-NEXT:    movq foo(%rip), %rax
8059 ; O3-NEXT:  .Lpcsection290:
8060 ; O3-NEXT:    lock orq $42, (%rdi)
8061 ; O3-NEXT:    movq $1, foo(%rip)
8062 ; O3-NEXT:    retq
8063 entry:
8064   load volatile i64, ptr @foo, align 8
8065   %x = atomicrmw or ptr %a, i64 42 monotonic, align 8, !pcsections !0
8066   store volatile i64 1, ptr @foo, align 8
8067   ret void
8070 define void @atomic64_xor_monotonic(ptr %a) {
8071 ; O0-LABEL: atomic64_xor_monotonic:
8072 ; O0:       # %bb.0: # %entry
8073 ; O0-NEXT:    movq foo(%rip), %rax
8074 ; O0-NEXT:  .Lpcsection321:
8075 ; O0-NEXT:    lock xorq $42, (%rdi)
8076 ; O0-NEXT:    movq $1, foo
8077 ; O0-NEXT:    retq
8079 ; O1-LABEL: atomic64_xor_monotonic:
8080 ; O1:       # %bb.0: # %entry
8081 ; O1-NEXT:    movq foo(%rip), %rax
8082 ; O1-NEXT:  .Lpcsection291:
8083 ; O1-NEXT:    lock xorq $42, (%rdi)
8084 ; O1-NEXT:    movq $1, foo(%rip)
8085 ; O1-NEXT:    retq
8087 ; O2-LABEL: atomic64_xor_monotonic:
8088 ; O2:       # %bb.0: # %entry
8089 ; O2-NEXT:    movq foo(%rip), %rax
8090 ; O2-NEXT:  .Lpcsection291:
8091 ; O2-NEXT:    lock xorq $42, (%rdi)
8092 ; O2-NEXT:    movq $1, foo(%rip)
8093 ; O2-NEXT:    retq
8095 ; O3-LABEL: atomic64_xor_monotonic:
8096 ; O3:       # %bb.0: # %entry
8097 ; O3-NEXT:    movq foo(%rip), %rax
8098 ; O3-NEXT:  .Lpcsection291:
8099 ; O3-NEXT:    lock xorq $42, (%rdi)
8100 ; O3-NEXT:    movq $1, foo(%rip)
8101 ; O3-NEXT:    retq
8102 entry:
8103   load volatile i64, ptr @foo, align 8
8104   %x = atomicrmw xor ptr %a, i64 42 monotonic, align 8, !pcsections !0
8105   store volatile i64 1, ptr @foo, align 8
8106   ret void
8109 define void @atomic64_nand_monotonic(ptr %a) {
8110 ; O0-LABEL: atomic64_nand_monotonic:
8111 ; O0:       # %bb.0: # %entry
8112 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8113 ; O0-NEXT:    movq foo, %rax
8114 ; O0-NEXT:  .Lpcsection322:
8115 ; O0-NEXT:    movq (%rdi), %rax
8116 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8117 ; O0-NEXT:  .LBB162_1: # %atomicrmw.start
8118 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
8119 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
8120 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
8121 ; O0-NEXT:    movl %eax, %esi
8122 ; O0-NEXT:  .Lpcsection323:
8123 ; O0-NEXT:    notl %esi
8124 ; O0-NEXT:  .Lpcsection324:
8125 ; O0-NEXT:    # implicit-def: $rdx
8126 ; O0-NEXT:    movl %esi, %edx
8127 ; O0-NEXT:  .Lpcsection325:
8128 ; O0-NEXT:    orq $-43, %rdx
8129 ; O0-NEXT:  .Lpcsection326:
8130 ; O0-NEXT:    lock cmpxchgq %rdx, (%rcx)
8131 ; O0-NEXT:  .Lpcsection327:
8132 ; O0-NEXT:    sete %cl
8133 ; O0-NEXT:  .Lpcsection328:
8134 ; O0-NEXT:    testb $1, %cl
8135 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8136 ; O0-NEXT:  .Lpcsection329:
8137 ; O0-NEXT:    jne .LBB162_2
8138 ; O0-NEXT:    jmp .LBB162_1
8139 ; O0-NEXT:  .LBB162_2: # %atomicrmw.end
8140 ; O0-NEXT:    movq $1, foo
8141 ; O0-NEXT:    retq
8143 ; O1-LABEL: atomic64_nand_monotonic:
8144 ; O1:       # %bb.0: # %entry
8145 ; O1-NEXT:    movq foo(%rip), %rax
8146 ; O1-NEXT:  .Lpcsection292:
8147 ; O1-NEXT:    movq (%rdi), %rax
8148 ; O1-NEXT:    .p2align 4, 0x90
8149 ; O1-NEXT:  .LBB162_1: # %atomicrmw.start
8150 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
8151 ; O1-NEXT:    movl %eax, %ecx
8152 ; O1-NEXT:  .Lpcsection293:
8153 ; O1-NEXT:    notl %ecx
8154 ; O1-NEXT:  .Lpcsection294:
8155 ; O1-NEXT:    orq $-43, %rcx
8156 ; O1-NEXT:  .Lpcsection295:
8157 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
8158 ; O1-NEXT:  .Lpcsection296:
8159 ; O1-NEXT:    jne .LBB162_1
8160 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
8161 ; O1-NEXT:    movq $1, foo(%rip)
8162 ; O1-NEXT:    retq
8164 ; O2-LABEL: atomic64_nand_monotonic:
8165 ; O2:       # %bb.0: # %entry
8166 ; O2-NEXT:    movq foo(%rip), %rax
8167 ; O2-NEXT:  .Lpcsection292:
8168 ; O2-NEXT:    movq (%rdi), %rax
8169 ; O2-NEXT:    .p2align 4, 0x90
8170 ; O2-NEXT:  .LBB162_1: # %atomicrmw.start
8171 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
8172 ; O2-NEXT:    movl %eax, %ecx
8173 ; O2-NEXT:  .Lpcsection293:
8174 ; O2-NEXT:    notl %ecx
8175 ; O2-NEXT:  .Lpcsection294:
8176 ; O2-NEXT:    orq $-43, %rcx
8177 ; O2-NEXT:  .Lpcsection295:
8178 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
8179 ; O2-NEXT:  .Lpcsection296:
8180 ; O2-NEXT:    jne .LBB162_1
8181 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
8182 ; O2-NEXT:    movq $1, foo(%rip)
8183 ; O2-NEXT:    retq
8185 ; O3-LABEL: atomic64_nand_monotonic:
8186 ; O3:       # %bb.0: # %entry
8187 ; O3-NEXT:    movq foo(%rip), %rax
8188 ; O3-NEXT:  .Lpcsection292:
8189 ; O3-NEXT:    movq (%rdi), %rax
8190 ; O3-NEXT:    .p2align 4, 0x90
8191 ; O3-NEXT:  .LBB162_1: # %atomicrmw.start
8192 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
8193 ; O3-NEXT:    movl %eax, %ecx
8194 ; O3-NEXT:  .Lpcsection293:
8195 ; O3-NEXT:    notl %ecx
8196 ; O3-NEXT:  .Lpcsection294:
8197 ; O3-NEXT:    orq $-43, %rcx
8198 ; O3-NEXT:  .Lpcsection295:
8199 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
8200 ; O3-NEXT:  .Lpcsection296:
8201 ; O3-NEXT:    jne .LBB162_1
8202 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
8203 ; O3-NEXT:    movq $1, foo(%rip)
8204 ; O3-NEXT:    retq
8205 entry:
8206   load volatile i64, ptr @foo, align 8
8207   %x = atomicrmw nand ptr %a, i64 42 monotonic, align 8, !pcsections !0
8208   store volatile i64 1, ptr @foo, align 8
8209   ret void
8212 define void @atomic64_xchg_acquire(ptr %a) {
8213 ; O0-LABEL: atomic64_xchg_acquire:
8214 ; O0:       # %bb.0: # %entry
8215 ; O0-NEXT:    movq foo(%rip), %rax
8216 ; O0-NEXT:    movl $42, %eax
8217 ; O0-NEXT:  .Lpcsection330:
8218 ; O0-NEXT:    xchgq %rax, (%rdi)
8219 ; O0-NEXT:    movq $1, foo
8220 ; O0-NEXT:    retq
8222 ; O1-LABEL: atomic64_xchg_acquire:
8223 ; O1:       # %bb.0: # %entry
8224 ; O1-NEXT:    movq foo(%rip), %rax
8225 ; O1-NEXT:    movl $42, %eax
8226 ; O1-NEXT:  .Lpcsection297:
8227 ; O1-NEXT:    xchgq %rax, (%rdi)
8228 ; O1-NEXT:    movq $1, foo(%rip)
8229 ; O1-NEXT:    retq
8231 ; O2-LABEL: atomic64_xchg_acquire:
8232 ; O2:       # %bb.0: # %entry
8233 ; O2-NEXT:    movq foo(%rip), %rax
8234 ; O2-NEXT:    movl $42, %eax
8235 ; O2-NEXT:  .Lpcsection297:
8236 ; O2-NEXT:    xchgq %rax, (%rdi)
8237 ; O2-NEXT:    movq $1, foo(%rip)
8238 ; O2-NEXT:    retq
8240 ; O3-LABEL: atomic64_xchg_acquire:
8241 ; O3:       # %bb.0: # %entry
8242 ; O3-NEXT:    movq foo(%rip), %rax
8243 ; O3-NEXT:    movl $42, %eax
8244 ; O3-NEXT:  .Lpcsection297:
8245 ; O3-NEXT:    xchgq %rax, (%rdi)
8246 ; O3-NEXT:    movq $1, foo(%rip)
8247 ; O3-NEXT:    retq
8248 entry:
8249   load volatile i64, ptr @foo, align 8
8250   %x = atomicrmw xchg ptr %a, i64 42 acquire, align 8, !pcsections !0
8251   store volatile i64 1, ptr @foo, align 8
8252   ret void
8255 define void @atomic64_add_acquire(ptr %a) {
8256 ; O0-LABEL: atomic64_add_acquire:
8257 ; O0:       # %bb.0: # %entry
8258 ; O0-NEXT:    movq foo(%rip), %rax
8259 ; O0-NEXT:  .Lpcsection331:
8260 ; O0-NEXT:    lock addq $42, (%rdi)
8261 ; O0-NEXT:    movq $1, foo
8262 ; O0-NEXT:    retq
8264 ; O1-LABEL: atomic64_add_acquire:
8265 ; O1:       # %bb.0: # %entry
8266 ; O1-NEXT:    movq foo(%rip), %rax
8267 ; O1-NEXT:  .Lpcsection298:
8268 ; O1-NEXT:    lock addq $42, (%rdi)
8269 ; O1-NEXT:    movq $1, foo(%rip)
8270 ; O1-NEXT:    retq
8272 ; O2-LABEL: atomic64_add_acquire:
8273 ; O2:       # %bb.0: # %entry
8274 ; O2-NEXT:    movq foo(%rip), %rax
8275 ; O2-NEXT:  .Lpcsection298:
8276 ; O2-NEXT:    lock addq $42, (%rdi)
8277 ; O2-NEXT:    movq $1, foo(%rip)
8278 ; O2-NEXT:    retq
8280 ; O3-LABEL: atomic64_add_acquire:
8281 ; O3:       # %bb.0: # %entry
8282 ; O3-NEXT:    movq foo(%rip), %rax
8283 ; O3-NEXT:  .Lpcsection298:
8284 ; O3-NEXT:    lock addq $42, (%rdi)
8285 ; O3-NEXT:    movq $1, foo(%rip)
8286 ; O3-NEXT:    retq
8287 entry:
8288   load volatile i64, ptr @foo, align 8
8289   %x = atomicrmw add ptr %a, i64 42 acquire, align 8, !pcsections !0
8290   store volatile i64 1, ptr @foo, align 8
8291   ret void
8294 define void @atomic64_sub_acquire(ptr %a) {
8295 ; O0-LABEL: atomic64_sub_acquire:
8296 ; O0:       # %bb.0: # %entry
8297 ; O0-NEXT:    movq foo(%rip), %rax
8298 ; O0-NEXT:  .Lpcsection332:
8299 ; O0-NEXT:    lock subq $42, (%rdi)
8300 ; O0-NEXT:    movq $1, foo
8301 ; O0-NEXT:    retq
8303 ; O1-LABEL: atomic64_sub_acquire:
8304 ; O1:       # %bb.0: # %entry
8305 ; O1-NEXT:    movq foo(%rip), %rax
8306 ; O1-NEXT:  .Lpcsection299:
8307 ; O1-NEXT:    lock subq $42, (%rdi)
8308 ; O1-NEXT:    movq $1, foo(%rip)
8309 ; O1-NEXT:    retq
8311 ; O2-LABEL: atomic64_sub_acquire:
8312 ; O2:       # %bb.0: # %entry
8313 ; O2-NEXT:    movq foo(%rip), %rax
8314 ; O2-NEXT:  .Lpcsection299:
8315 ; O2-NEXT:    lock subq $42, (%rdi)
8316 ; O2-NEXT:    movq $1, foo(%rip)
8317 ; O2-NEXT:    retq
8319 ; O3-LABEL: atomic64_sub_acquire:
8320 ; O3:       # %bb.0: # %entry
8321 ; O3-NEXT:    movq foo(%rip), %rax
8322 ; O3-NEXT:  .Lpcsection299:
8323 ; O3-NEXT:    lock subq $42, (%rdi)
8324 ; O3-NEXT:    movq $1, foo(%rip)
8325 ; O3-NEXT:    retq
8326 entry:
8327   load volatile i64, ptr @foo, align 8
8328   %x = atomicrmw sub ptr %a, i64 42 acquire, align 8, !pcsections !0
8329   store volatile i64 1, ptr @foo, align 8
8330   ret void
8333 define void @atomic64_and_acquire(ptr %a) {
8334 ; O0-LABEL: atomic64_and_acquire:
8335 ; O0:       # %bb.0: # %entry
8336 ; O0-NEXT:    movq foo(%rip), %rax
8337 ; O0-NEXT:  .Lpcsection333:
8338 ; O0-NEXT:    lock andq $42, (%rdi)
8339 ; O0-NEXT:    movq $1, foo
8340 ; O0-NEXT:    retq
8342 ; O1-LABEL: atomic64_and_acquire:
8343 ; O1:       # %bb.0: # %entry
8344 ; O1-NEXT:    movq foo(%rip), %rax
8345 ; O1-NEXT:  .Lpcsection300:
8346 ; O1-NEXT:    lock andq $42, (%rdi)
8347 ; O1-NEXT:    movq $1, foo(%rip)
8348 ; O1-NEXT:    retq
8350 ; O2-LABEL: atomic64_and_acquire:
8351 ; O2:       # %bb.0: # %entry
8352 ; O2-NEXT:    movq foo(%rip), %rax
8353 ; O2-NEXT:  .Lpcsection300:
8354 ; O2-NEXT:    lock andq $42, (%rdi)
8355 ; O2-NEXT:    movq $1, foo(%rip)
8356 ; O2-NEXT:    retq
8358 ; O3-LABEL: atomic64_and_acquire:
8359 ; O3:       # %bb.0: # %entry
8360 ; O3-NEXT:    movq foo(%rip), %rax
8361 ; O3-NEXT:  .Lpcsection300:
8362 ; O3-NEXT:    lock andq $42, (%rdi)
8363 ; O3-NEXT:    movq $1, foo(%rip)
8364 ; O3-NEXT:    retq
8365 entry:
8366   load volatile i64, ptr @foo, align 8
8367   %x = atomicrmw and ptr %a, i64 42 acquire, align 8, !pcsections !0
8368   store volatile i64 1, ptr @foo, align 8
8369   ret void
8372 define void @atomic64_or_acquire(ptr %a) {
8373 ; O0-LABEL: atomic64_or_acquire:
8374 ; O0:       # %bb.0: # %entry
8375 ; O0-NEXT:    movq foo(%rip), %rax
8376 ; O0-NEXT:  .Lpcsection334:
8377 ; O0-NEXT:    lock orq $42, (%rdi)
8378 ; O0-NEXT:    movq $1, foo
8379 ; O0-NEXT:    retq
8381 ; O1-LABEL: atomic64_or_acquire:
8382 ; O1:       # %bb.0: # %entry
8383 ; O1-NEXT:    movq foo(%rip), %rax
8384 ; O1-NEXT:  .Lpcsection301:
8385 ; O1-NEXT:    lock orq $42, (%rdi)
8386 ; O1-NEXT:    movq $1, foo(%rip)
8387 ; O1-NEXT:    retq
8389 ; O2-LABEL: atomic64_or_acquire:
8390 ; O2:       # %bb.0: # %entry
8391 ; O2-NEXT:    movq foo(%rip), %rax
8392 ; O2-NEXT:  .Lpcsection301:
8393 ; O2-NEXT:    lock orq $42, (%rdi)
8394 ; O2-NEXT:    movq $1, foo(%rip)
8395 ; O2-NEXT:    retq
8397 ; O3-LABEL: atomic64_or_acquire:
8398 ; O3:       # %bb.0: # %entry
8399 ; O3-NEXT:    movq foo(%rip), %rax
8400 ; O3-NEXT:  .Lpcsection301:
8401 ; O3-NEXT:    lock orq $42, (%rdi)
8402 ; O3-NEXT:    movq $1, foo(%rip)
8403 ; O3-NEXT:    retq
8404 entry:
8405   load volatile i64, ptr @foo, align 8
8406   %x = atomicrmw or ptr %a, i64 42 acquire, align 8, !pcsections !0
8407   store volatile i64 1, ptr @foo, align 8
8408   ret void
8411 define void @atomic64_xor_acquire(ptr %a) {
8412 ; O0-LABEL: atomic64_xor_acquire:
8413 ; O0:       # %bb.0: # %entry
8414 ; O0-NEXT:    movq foo(%rip), %rax
8415 ; O0-NEXT:  .Lpcsection335:
8416 ; O0-NEXT:    lock xorq $42, (%rdi)
8417 ; O0-NEXT:    movq $1, foo
8418 ; O0-NEXT:    retq
8420 ; O1-LABEL: atomic64_xor_acquire:
8421 ; O1:       # %bb.0: # %entry
8422 ; O1-NEXT:    movq foo(%rip), %rax
8423 ; O1-NEXT:  .Lpcsection302:
8424 ; O1-NEXT:    lock xorq $42, (%rdi)
8425 ; O1-NEXT:    movq $1, foo(%rip)
8426 ; O1-NEXT:    retq
8428 ; O2-LABEL: atomic64_xor_acquire:
8429 ; O2:       # %bb.0: # %entry
8430 ; O2-NEXT:    movq foo(%rip), %rax
8431 ; O2-NEXT:  .Lpcsection302:
8432 ; O2-NEXT:    lock xorq $42, (%rdi)
8433 ; O2-NEXT:    movq $1, foo(%rip)
8434 ; O2-NEXT:    retq
8436 ; O3-LABEL: atomic64_xor_acquire:
8437 ; O3:       # %bb.0: # %entry
8438 ; O3-NEXT:    movq foo(%rip), %rax
8439 ; O3-NEXT:  .Lpcsection302:
8440 ; O3-NEXT:    lock xorq $42, (%rdi)
8441 ; O3-NEXT:    movq $1, foo(%rip)
8442 ; O3-NEXT:    retq
8443 entry:
8444   load volatile i64, ptr @foo, align 8
8445   %x = atomicrmw xor ptr %a, i64 42 acquire, align 8, !pcsections !0
8446   store volatile i64 1, ptr @foo, align 8
8447   ret void
8450 define void @atomic64_nand_acquire(ptr %a) {
8451 ; O0-LABEL: atomic64_nand_acquire:
8452 ; O0:       # %bb.0: # %entry
8453 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8454 ; O0-NEXT:    movq foo, %rax
8455 ; O0-NEXT:  .Lpcsection336:
8456 ; O0-NEXT:    movq (%rdi), %rax
8457 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8458 ; O0-NEXT:  .LBB169_1: # %atomicrmw.start
8459 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
8460 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
8461 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
8462 ; O0-NEXT:    movl %eax, %esi
8463 ; O0-NEXT:  .Lpcsection337:
8464 ; O0-NEXT:    notl %esi
8465 ; O0-NEXT:  .Lpcsection338:
8466 ; O0-NEXT:    # implicit-def: $rdx
8467 ; O0-NEXT:    movl %esi, %edx
8468 ; O0-NEXT:  .Lpcsection339:
8469 ; O0-NEXT:    orq $-43, %rdx
8470 ; O0-NEXT:  .Lpcsection340:
8471 ; O0-NEXT:    lock cmpxchgq %rdx, (%rcx)
8472 ; O0-NEXT:  .Lpcsection341:
8473 ; O0-NEXT:    sete %cl
8474 ; O0-NEXT:  .Lpcsection342:
8475 ; O0-NEXT:    testb $1, %cl
8476 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8477 ; O0-NEXT:  .Lpcsection343:
8478 ; O0-NEXT:    jne .LBB169_2
8479 ; O0-NEXT:    jmp .LBB169_1
8480 ; O0-NEXT:  .LBB169_2: # %atomicrmw.end
8481 ; O0-NEXT:    movq $1, foo
8482 ; O0-NEXT:    retq
8484 ; O1-LABEL: atomic64_nand_acquire:
8485 ; O1:       # %bb.0: # %entry
8486 ; O1-NEXT:    movq foo(%rip), %rax
8487 ; O1-NEXT:  .Lpcsection303:
8488 ; O1-NEXT:    movq (%rdi), %rax
8489 ; O1-NEXT:    .p2align 4, 0x90
8490 ; O1-NEXT:  .LBB169_1: # %atomicrmw.start
8491 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
8492 ; O1-NEXT:    movl %eax, %ecx
8493 ; O1-NEXT:  .Lpcsection304:
8494 ; O1-NEXT:    notl %ecx
8495 ; O1-NEXT:  .Lpcsection305:
8496 ; O1-NEXT:    orq $-43, %rcx
8497 ; O1-NEXT:  .Lpcsection306:
8498 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
8499 ; O1-NEXT:  .Lpcsection307:
8500 ; O1-NEXT:    jne .LBB169_1
8501 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
8502 ; O1-NEXT:    movq $1, foo(%rip)
8503 ; O1-NEXT:    retq
8505 ; O2-LABEL: atomic64_nand_acquire:
8506 ; O2:       # %bb.0: # %entry
8507 ; O2-NEXT:    movq foo(%rip), %rax
8508 ; O2-NEXT:  .Lpcsection303:
8509 ; O2-NEXT:    movq (%rdi), %rax
8510 ; O2-NEXT:    .p2align 4, 0x90
8511 ; O2-NEXT:  .LBB169_1: # %atomicrmw.start
8512 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
8513 ; O2-NEXT:    movl %eax, %ecx
8514 ; O2-NEXT:  .Lpcsection304:
8515 ; O2-NEXT:    notl %ecx
8516 ; O2-NEXT:  .Lpcsection305:
8517 ; O2-NEXT:    orq $-43, %rcx
8518 ; O2-NEXT:  .Lpcsection306:
8519 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
8520 ; O2-NEXT:  .Lpcsection307:
8521 ; O2-NEXT:    jne .LBB169_1
8522 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
8523 ; O2-NEXT:    movq $1, foo(%rip)
8524 ; O2-NEXT:    retq
8526 ; O3-LABEL: atomic64_nand_acquire:
8527 ; O3:       # %bb.0: # %entry
8528 ; O3-NEXT:    movq foo(%rip), %rax
8529 ; O3-NEXT:  .Lpcsection303:
8530 ; O3-NEXT:    movq (%rdi), %rax
8531 ; O3-NEXT:    .p2align 4, 0x90
8532 ; O3-NEXT:  .LBB169_1: # %atomicrmw.start
8533 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
8534 ; O3-NEXT:    movl %eax, %ecx
8535 ; O3-NEXT:  .Lpcsection304:
8536 ; O3-NEXT:    notl %ecx
8537 ; O3-NEXT:  .Lpcsection305:
8538 ; O3-NEXT:    orq $-43, %rcx
8539 ; O3-NEXT:  .Lpcsection306:
8540 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
8541 ; O3-NEXT:  .Lpcsection307:
8542 ; O3-NEXT:    jne .LBB169_1
8543 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
8544 ; O3-NEXT:    movq $1, foo(%rip)
8545 ; O3-NEXT:    retq
8546 entry:
8547   load volatile i64, ptr @foo, align 8
8548   %x = atomicrmw nand ptr %a, i64 42 acquire, align 8, !pcsections !0
8549   store volatile i64 1, ptr @foo, align 8
8550   ret void
8553 define void @atomic64_xchg_release(ptr %a) {
8554 ; O0-LABEL: atomic64_xchg_release:
8555 ; O0:       # %bb.0: # %entry
8556 ; O0-NEXT:    movq foo(%rip), %rax
8557 ; O0-NEXT:    movl $42, %eax
8558 ; O0-NEXT:  .Lpcsection344:
8559 ; O0-NEXT:    xchgq %rax, (%rdi)
8560 ; O0-NEXT:    movq $1, foo
8561 ; O0-NEXT:    retq
8563 ; O1-LABEL: atomic64_xchg_release:
8564 ; O1:       # %bb.0: # %entry
8565 ; O1-NEXT:    movq foo(%rip), %rax
8566 ; O1-NEXT:    movl $42, %eax
8567 ; O1-NEXT:  .Lpcsection308:
8568 ; O1-NEXT:    xchgq %rax, (%rdi)
8569 ; O1-NEXT:    movq $1, foo(%rip)
8570 ; O1-NEXT:    retq
8572 ; O2-LABEL: atomic64_xchg_release:
8573 ; O2:       # %bb.0: # %entry
8574 ; O2-NEXT:    movq foo(%rip), %rax
8575 ; O2-NEXT:    movl $42, %eax
8576 ; O2-NEXT:  .Lpcsection308:
8577 ; O2-NEXT:    xchgq %rax, (%rdi)
8578 ; O2-NEXT:    movq $1, foo(%rip)
8579 ; O2-NEXT:    retq
8581 ; O3-LABEL: atomic64_xchg_release:
8582 ; O3:       # %bb.0: # %entry
8583 ; O3-NEXT:    movq foo(%rip), %rax
8584 ; O3-NEXT:    movl $42, %eax
8585 ; O3-NEXT:  .Lpcsection308:
8586 ; O3-NEXT:    xchgq %rax, (%rdi)
8587 ; O3-NEXT:    movq $1, foo(%rip)
8588 ; O3-NEXT:    retq
8589 entry:
8590   load volatile i64, ptr @foo, align 8
8591   %x = atomicrmw xchg ptr %a, i64 42 release, align 8, !pcsections !0
8592   store volatile i64 1, ptr @foo, align 8
8593   ret void
8596 define void @atomic64_add_release(ptr %a) {
8597 ; O0-LABEL: atomic64_add_release:
8598 ; O0:       # %bb.0: # %entry
8599 ; O0-NEXT:    movq foo(%rip), %rax
8600 ; O0-NEXT:  .Lpcsection345:
8601 ; O0-NEXT:    lock addq $42, (%rdi)
8602 ; O0-NEXT:    movq $1, foo
8603 ; O0-NEXT:    retq
8605 ; O1-LABEL: atomic64_add_release:
8606 ; O1:       # %bb.0: # %entry
8607 ; O1-NEXT:    movq foo(%rip), %rax
8608 ; O1-NEXT:  .Lpcsection309:
8609 ; O1-NEXT:    lock addq $42, (%rdi)
8610 ; O1-NEXT:    movq $1, foo(%rip)
8611 ; O1-NEXT:    retq
8613 ; O2-LABEL: atomic64_add_release:
8614 ; O2:       # %bb.0: # %entry
8615 ; O2-NEXT:    movq foo(%rip), %rax
8616 ; O2-NEXT:  .Lpcsection309:
8617 ; O2-NEXT:    lock addq $42, (%rdi)
8618 ; O2-NEXT:    movq $1, foo(%rip)
8619 ; O2-NEXT:    retq
8621 ; O3-LABEL: atomic64_add_release:
8622 ; O3:       # %bb.0: # %entry
8623 ; O3-NEXT:    movq foo(%rip), %rax
8624 ; O3-NEXT:  .Lpcsection309:
8625 ; O3-NEXT:    lock addq $42, (%rdi)
8626 ; O3-NEXT:    movq $1, foo(%rip)
8627 ; O3-NEXT:    retq
8628 entry:
8629   load volatile i64, ptr @foo, align 8
8630   %x = atomicrmw add ptr %a, i64 42 release, align 8, !pcsections !0
8631   store volatile i64 1, ptr @foo, align 8
8632   ret void
8635 define void @atomic64_sub_release(ptr %a) {
8636 ; O0-LABEL: atomic64_sub_release:
8637 ; O0:       # %bb.0: # %entry
8638 ; O0-NEXT:    movq foo(%rip), %rax
8639 ; O0-NEXT:  .Lpcsection346:
8640 ; O0-NEXT:    lock subq $42, (%rdi)
8641 ; O0-NEXT:    movq $1, foo
8642 ; O0-NEXT:    retq
8644 ; O1-LABEL: atomic64_sub_release:
8645 ; O1:       # %bb.0: # %entry
8646 ; O1-NEXT:    movq foo(%rip), %rax
8647 ; O1-NEXT:  .Lpcsection310:
8648 ; O1-NEXT:    lock subq $42, (%rdi)
8649 ; O1-NEXT:    movq $1, foo(%rip)
8650 ; O1-NEXT:    retq
8652 ; O2-LABEL: atomic64_sub_release:
8653 ; O2:       # %bb.0: # %entry
8654 ; O2-NEXT:    movq foo(%rip), %rax
8655 ; O2-NEXT:  .Lpcsection310:
8656 ; O2-NEXT:    lock subq $42, (%rdi)
8657 ; O2-NEXT:    movq $1, foo(%rip)
8658 ; O2-NEXT:    retq
8660 ; O3-LABEL: atomic64_sub_release:
8661 ; O3:       # %bb.0: # %entry
8662 ; O3-NEXT:    movq foo(%rip), %rax
8663 ; O3-NEXT:  .Lpcsection310:
8664 ; O3-NEXT:    lock subq $42, (%rdi)
8665 ; O3-NEXT:    movq $1, foo(%rip)
8666 ; O3-NEXT:    retq
8667 entry:
8668   load volatile i64, ptr @foo, align 8
8669   %x = atomicrmw sub ptr %a, i64 42 release, align 8, !pcsections !0
8670   store volatile i64 1, ptr @foo, align 8
8671   ret void
8674 define void @atomic64_and_release(ptr %a) {
8675 ; O0-LABEL: atomic64_and_release:
8676 ; O0:       # %bb.0: # %entry
8677 ; O0-NEXT:    movq foo(%rip), %rax
8678 ; O0-NEXT:  .Lpcsection347:
8679 ; O0-NEXT:    lock andq $42, (%rdi)
8680 ; O0-NEXT:    movq $1, foo
8681 ; O0-NEXT:    retq
8683 ; O1-LABEL: atomic64_and_release:
8684 ; O1:       # %bb.0: # %entry
8685 ; O1-NEXT:    movq foo(%rip), %rax
8686 ; O1-NEXT:  .Lpcsection311:
8687 ; O1-NEXT:    lock andq $42, (%rdi)
8688 ; O1-NEXT:    movq $1, foo(%rip)
8689 ; O1-NEXT:    retq
8691 ; O2-LABEL: atomic64_and_release:
8692 ; O2:       # %bb.0: # %entry
8693 ; O2-NEXT:    movq foo(%rip), %rax
8694 ; O2-NEXT:  .Lpcsection311:
8695 ; O2-NEXT:    lock andq $42, (%rdi)
8696 ; O2-NEXT:    movq $1, foo(%rip)
8697 ; O2-NEXT:    retq
8699 ; O3-LABEL: atomic64_and_release:
8700 ; O3:       # %bb.0: # %entry
8701 ; O3-NEXT:    movq foo(%rip), %rax
8702 ; O3-NEXT:  .Lpcsection311:
8703 ; O3-NEXT:    lock andq $42, (%rdi)
8704 ; O3-NEXT:    movq $1, foo(%rip)
8705 ; O3-NEXT:    retq
8706 entry:
8707   load volatile i64, ptr @foo, align 8
8708   %x = atomicrmw and ptr %a, i64 42 release, align 8, !pcsections !0
8709   store volatile i64 1, ptr @foo, align 8
8710   ret void
8713 define void @atomic64_or_release(ptr %a) {
8714 ; O0-LABEL: atomic64_or_release:
8715 ; O0:       # %bb.0: # %entry
8716 ; O0-NEXT:    movq foo(%rip), %rax
8717 ; O0-NEXT:  .Lpcsection348:
8718 ; O0-NEXT:    lock orq $42, (%rdi)
8719 ; O0-NEXT:    movq $1, foo
8720 ; O0-NEXT:    retq
8722 ; O1-LABEL: atomic64_or_release:
8723 ; O1:       # %bb.0: # %entry
8724 ; O1-NEXT:    movq foo(%rip), %rax
8725 ; O1-NEXT:  .Lpcsection312:
8726 ; O1-NEXT:    lock orq $42, (%rdi)
8727 ; O1-NEXT:    movq $1, foo(%rip)
8728 ; O1-NEXT:    retq
8730 ; O2-LABEL: atomic64_or_release:
8731 ; O2:       # %bb.0: # %entry
8732 ; O2-NEXT:    movq foo(%rip), %rax
8733 ; O2-NEXT:  .Lpcsection312:
8734 ; O2-NEXT:    lock orq $42, (%rdi)
8735 ; O2-NEXT:    movq $1, foo(%rip)
8736 ; O2-NEXT:    retq
8738 ; O3-LABEL: atomic64_or_release:
8739 ; O3:       # %bb.0: # %entry
8740 ; O3-NEXT:    movq foo(%rip), %rax
8741 ; O3-NEXT:  .Lpcsection312:
8742 ; O3-NEXT:    lock orq $42, (%rdi)
8743 ; O3-NEXT:    movq $1, foo(%rip)
8744 ; O3-NEXT:    retq
8745 entry:
8746   load volatile i64, ptr @foo, align 8
8747   %x = atomicrmw or ptr %a, i64 42 release, align 8, !pcsections !0
8748   store volatile i64 1, ptr @foo, align 8
8749   ret void
8752 define void @atomic64_xor_release(ptr %a) {
8753 ; O0-LABEL: atomic64_xor_release:
8754 ; O0:       # %bb.0: # %entry
8755 ; O0-NEXT:    movq foo(%rip), %rax
8756 ; O0-NEXT:  .Lpcsection349:
8757 ; O0-NEXT:    lock xorq $42, (%rdi)
8758 ; O0-NEXT:    movq $1, foo
8759 ; O0-NEXT:    retq
8761 ; O1-LABEL: atomic64_xor_release:
8762 ; O1:       # %bb.0: # %entry
8763 ; O1-NEXT:    movq foo(%rip), %rax
8764 ; O1-NEXT:  .Lpcsection313:
8765 ; O1-NEXT:    lock xorq $42, (%rdi)
8766 ; O1-NEXT:    movq $1, foo(%rip)
8767 ; O1-NEXT:    retq
8769 ; O2-LABEL: atomic64_xor_release:
8770 ; O2:       # %bb.0: # %entry
8771 ; O2-NEXT:    movq foo(%rip), %rax
8772 ; O2-NEXT:  .Lpcsection313:
8773 ; O2-NEXT:    lock xorq $42, (%rdi)
8774 ; O2-NEXT:    movq $1, foo(%rip)
8775 ; O2-NEXT:    retq
8777 ; O3-LABEL: atomic64_xor_release:
8778 ; O3:       # %bb.0: # %entry
8779 ; O3-NEXT:    movq foo(%rip), %rax
8780 ; O3-NEXT:  .Lpcsection313:
8781 ; O3-NEXT:    lock xorq $42, (%rdi)
8782 ; O3-NEXT:    movq $1, foo(%rip)
8783 ; O3-NEXT:    retq
8784 entry:
8785   load volatile i64, ptr @foo, align 8
8786   %x = atomicrmw xor ptr %a, i64 42 release, align 8, !pcsections !0
8787   store volatile i64 1, ptr @foo, align 8
8788   ret void
8791 define void @atomic64_nand_release(ptr %a) {
8792 ; O0-LABEL: atomic64_nand_release:
8793 ; O0:       # %bb.0: # %entry
8794 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8795 ; O0-NEXT:    movq foo, %rax
8796 ; O0-NEXT:  .Lpcsection350:
8797 ; O0-NEXT:    movq (%rdi), %rax
8798 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8799 ; O0-NEXT:  .LBB176_1: # %atomicrmw.start
8800 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
8801 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
8802 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
8803 ; O0-NEXT:    movl %eax, %esi
8804 ; O0-NEXT:  .Lpcsection351:
8805 ; O0-NEXT:    notl %esi
8806 ; O0-NEXT:  .Lpcsection352:
8807 ; O0-NEXT:    # implicit-def: $rdx
8808 ; O0-NEXT:    movl %esi, %edx
8809 ; O0-NEXT:  .Lpcsection353:
8810 ; O0-NEXT:    orq $-43, %rdx
8811 ; O0-NEXT:  .Lpcsection354:
8812 ; O0-NEXT:    lock cmpxchgq %rdx, (%rcx)
8813 ; O0-NEXT:  .Lpcsection355:
8814 ; O0-NEXT:    sete %cl
8815 ; O0-NEXT:  .Lpcsection356:
8816 ; O0-NEXT:    testb $1, %cl
8817 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
8818 ; O0-NEXT:  .Lpcsection357:
8819 ; O0-NEXT:    jne .LBB176_2
8820 ; O0-NEXT:    jmp .LBB176_1
8821 ; O0-NEXT:  .LBB176_2: # %atomicrmw.end
8822 ; O0-NEXT:    movq $1, foo
8823 ; O0-NEXT:    retq
8825 ; O1-LABEL: atomic64_nand_release:
8826 ; O1:       # %bb.0: # %entry
8827 ; O1-NEXT:    movq foo(%rip), %rax
8828 ; O1-NEXT:  .Lpcsection314:
8829 ; O1-NEXT:    movq (%rdi), %rax
8830 ; O1-NEXT:    .p2align 4, 0x90
8831 ; O1-NEXT:  .LBB176_1: # %atomicrmw.start
8832 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
8833 ; O1-NEXT:    movl %eax, %ecx
8834 ; O1-NEXT:  .Lpcsection315:
8835 ; O1-NEXT:    notl %ecx
8836 ; O1-NEXT:  .Lpcsection316:
8837 ; O1-NEXT:    orq $-43, %rcx
8838 ; O1-NEXT:  .Lpcsection317:
8839 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
8840 ; O1-NEXT:  .Lpcsection318:
8841 ; O1-NEXT:    jne .LBB176_1
8842 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
8843 ; O1-NEXT:    movq $1, foo(%rip)
8844 ; O1-NEXT:    retq
8846 ; O2-LABEL: atomic64_nand_release:
8847 ; O2:       # %bb.0: # %entry
8848 ; O2-NEXT:    movq foo(%rip), %rax
8849 ; O2-NEXT:  .Lpcsection314:
8850 ; O2-NEXT:    movq (%rdi), %rax
8851 ; O2-NEXT:    .p2align 4, 0x90
8852 ; O2-NEXT:  .LBB176_1: # %atomicrmw.start
8853 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
8854 ; O2-NEXT:    movl %eax, %ecx
8855 ; O2-NEXT:  .Lpcsection315:
8856 ; O2-NEXT:    notl %ecx
8857 ; O2-NEXT:  .Lpcsection316:
8858 ; O2-NEXT:    orq $-43, %rcx
8859 ; O2-NEXT:  .Lpcsection317:
8860 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
8861 ; O2-NEXT:  .Lpcsection318:
8862 ; O2-NEXT:    jne .LBB176_1
8863 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
8864 ; O2-NEXT:    movq $1, foo(%rip)
8865 ; O2-NEXT:    retq
8867 ; O3-LABEL: atomic64_nand_release:
8868 ; O3:       # %bb.0: # %entry
8869 ; O3-NEXT:    movq foo(%rip), %rax
8870 ; O3-NEXT:  .Lpcsection314:
8871 ; O3-NEXT:    movq (%rdi), %rax
8872 ; O3-NEXT:    .p2align 4, 0x90
8873 ; O3-NEXT:  .LBB176_1: # %atomicrmw.start
8874 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
8875 ; O3-NEXT:    movl %eax, %ecx
8876 ; O3-NEXT:  .Lpcsection315:
8877 ; O3-NEXT:    notl %ecx
8878 ; O3-NEXT:  .Lpcsection316:
8879 ; O3-NEXT:    orq $-43, %rcx
8880 ; O3-NEXT:  .Lpcsection317:
8881 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
8882 ; O3-NEXT:  .Lpcsection318:
8883 ; O3-NEXT:    jne .LBB176_1
8884 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
8885 ; O3-NEXT:    movq $1, foo(%rip)
8886 ; O3-NEXT:    retq
8887 entry:
8888   load volatile i64, ptr @foo, align 8
8889   %x = atomicrmw nand ptr %a, i64 42 release, align 8, !pcsections !0
8890   store volatile i64 1, ptr @foo, align 8
8891   ret void
8894 define void @atomic64_xchg_acq_rel(ptr %a) {
8895 ; O0-LABEL: atomic64_xchg_acq_rel:
8896 ; O0:       # %bb.0: # %entry
8897 ; O0-NEXT:    movq foo(%rip), %rax
8898 ; O0-NEXT:    movl $42, %eax
8899 ; O0-NEXT:  .Lpcsection358:
8900 ; O0-NEXT:    xchgq %rax, (%rdi)
8901 ; O0-NEXT:    movq $1, foo
8902 ; O0-NEXT:    retq
8904 ; O1-LABEL: atomic64_xchg_acq_rel:
8905 ; O1:       # %bb.0: # %entry
8906 ; O1-NEXT:    movq foo(%rip), %rax
8907 ; O1-NEXT:    movl $42, %eax
8908 ; O1-NEXT:  .Lpcsection319:
8909 ; O1-NEXT:    xchgq %rax, (%rdi)
8910 ; O1-NEXT:    movq $1, foo(%rip)
8911 ; O1-NEXT:    retq
8913 ; O2-LABEL: atomic64_xchg_acq_rel:
8914 ; O2:       # %bb.0: # %entry
8915 ; O2-NEXT:    movq foo(%rip), %rax
8916 ; O2-NEXT:    movl $42, %eax
8917 ; O2-NEXT:  .Lpcsection319:
8918 ; O2-NEXT:    xchgq %rax, (%rdi)
8919 ; O2-NEXT:    movq $1, foo(%rip)
8920 ; O2-NEXT:    retq
8922 ; O3-LABEL: atomic64_xchg_acq_rel:
8923 ; O3:       # %bb.0: # %entry
8924 ; O3-NEXT:    movq foo(%rip), %rax
8925 ; O3-NEXT:    movl $42, %eax
8926 ; O3-NEXT:  .Lpcsection319:
8927 ; O3-NEXT:    xchgq %rax, (%rdi)
8928 ; O3-NEXT:    movq $1, foo(%rip)
8929 ; O3-NEXT:    retq
8930 entry:
8931   load volatile i64, ptr @foo, align 8
8932   %x = atomicrmw xchg ptr %a, i64 42 acq_rel, align 8, !pcsections !0
8933   store volatile i64 1, ptr @foo, align 8
8934   ret void
8937 define void @atomic64_add_acq_rel(ptr %a) {
8938 ; O0-LABEL: atomic64_add_acq_rel:
8939 ; O0:       # %bb.0: # %entry
8940 ; O0-NEXT:    movq foo(%rip), %rax
8941 ; O0-NEXT:  .Lpcsection359:
8942 ; O0-NEXT:    lock addq $42, (%rdi)
8943 ; O0-NEXT:    movq $1, foo
8944 ; O0-NEXT:    retq
8946 ; O1-LABEL: atomic64_add_acq_rel:
8947 ; O1:       # %bb.0: # %entry
8948 ; O1-NEXT:    movq foo(%rip), %rax
8949 ; O1-NEXT:  .Lpcsection320:
8950 ; O1-NEXT:    lock addq $42, (%rdi)
8951 ; O1-NEXT:    movq $1, foo(%rip)
8952 ; O1-NEXT:    retq
8954 ; O2-LABEL: atomic64_add_acq_rel:
8955 ; O2:       # %bb.0: # %entry
8956 ; O2-NEXT:    movq foo(%rip), %rax
8957 ; O2-NEXT:  .Lpcsection320:
8958 ; O2-NEXT:    lock addq $42, (%rdi)
8959 ; O2-NEXT:    movq $1, foo(%rip)
8960 ; O2-NEXT:    retq
8962 ; O3-LABEL: atomic64_add_acq_rel:
8963 ; O3:       # %bb.0: # %entry
8964 ; O3-NEXT:    movq foo(%rip), %rax
8965 ; O3-NEXT:  .Lpcsection320:
8966 ; O3-NEXT:    lock addq $42, (%rdi)
8967 ; O3-NEXT:    movq $1, foo(%rip)
8968 ; O3-NEXT:    retq
8969 entry:
8970   load volatile i64, ptr @foo, align 8
8971   %x = atomicrmw add ptr %a, i64 42 acq_rel, align 8, !pcsections !0
8972   store volatile i64 1, ptr @foo, align 8
8973   ret void
8976 define void @atomic64_sub_acq_rel(ptr %a) {
8977 ; O0-LABEL: atomic64_sub_acq_rel:
8978 ; O0:       # %bb.0: # %entry
8979 ; O0-NEXT:    movq foo(%rip), %rax
8980 ; O0-NEXT:  .Lpcsection360:
8981 ; O0-NEXT:    lock subq $42, (%rdi)
8982 ; O0-NEXT:    movq $1, foo
8983 ; O0-NEXT:    retq
8985 ; O1-LABEL: atomic64_sub_acq_rel:
8986 ; O1:       # %bb.0: # %entry
8987 ; O1-NEXT:    movq foo(%rip), %rax
8988 ; O1-NEXT:  .Lpcsection321:
8989 ; O1-NEXT:    lock subq $42, (%rdi)
8990 ; O1-NEXT:    movq $1, foo(%rip)
8991 ; O1-NEXT:    retq
8993 ; O2-LABEL: atomic64_sub_acq_rel:
8994 ; O2:       # %bb.0: # %entry
8995 ; O2-NEXT:    movq foo(%rip), %rax
8996 ; O2-NEXT:  .Lpcsection321:
8997 ; O2-NEXT:    lock subq $42, (%rdi)
8998 ; O2-NEXT:    movq $1, foo(%rip)
8999 ; O2-NEXT:    retq
9001 ; O3-LABEL: atomic64_sub_acq_rel:
9002 ; O3:       # %bb.0: # %entry
9003 ; O3-NEXT:    movq foo(%rip), %rax
9004 ; O3-NEXT:  .Lpcsection321:
9005 ; O3-NEXT:    lock subq $42, (%rdi)
9006 ; O3-NEXT:    movq $1, foo(%rip)
9007 ; O3-NEXT:    retq
9008 entry:
9009   load volatile i64, ptr @foo, align 8
9010   %x = atomicrmw sub ptr %a, i64 42 acq_rel, align 8, !pcsections !0
9011   store volatile i64 1, ptr @foo, align 8
9012   ret void
9015 define void @atomic64_and_acq_rel(ptr %a) {
9016 ; O0-LABEL: atomic64_and_acq_rel:
9017 ; O0:       # %bb.0: # %entry
9018 ; O0-NEXT:    movq foo(%rip), %rax
9019 ; O0-NEXT:  .Lpcsection361:
9020 ; O0-NEXT:    lock andq $42, (%rdi)
9021 ; O0-NEXT:    movq $1, foo
9022 ; O0-NEXT:    retq
9024 ; O1-LABEL: atomic64_and_acq_rel:
9025 ; O1:       # %bb.0: # %entry
9026 ; O1-NEXT:    movq foo(%rip), %rax
9027 ; O1-NEXT:  .Lpcsection322:
9028 ; O1-NEXT:    lock andq $42, (%rdi)
9029 ; O1-NEXT:    movq $1, foo(%rip)
9030 ; O1-NEXT:    retq
9032 ; O2-LABEL: atomic64_and_acq_rel:
9033 ; O2:       # %bb.0: # %entry
9034 ; O2-NEXT:    movq foo(%rip), %rax
9035 ; O2-NEXT:  .Lpcsection322:
9036 ; O2-NEXT:    lock andq $42, (%rdi)
9037 ; O2-NEXT:    movq $1, foo(%rip)
9038 ; O2-NEXT:    retq
9040 ; O3-LABEL: atomic64_and_acq_rel:
9041 ; O3:       # %bb.0: # %entry
9042 ; O3-NEXT:    movq foo(%rip), %rax
9043 ; O3-NEXT:  .Lpcsection322:
9044 ; O3-NEXT:    lock andq $42, (%rdi)
9045 ; O3-NEXT:    movq $1, foo(%rip)
9046 ; O3-NEXT:    retq
9047 entry:
9048   load volatile i64, ptr @foo, align 8
9049   %x = atomicrmw and ptr %a, i64 42 acq_rel, align 8, !pcsections !0
9050   store volatile i64 1, ptr @foo, align 8
9051   ret void
9054 define void @atomic64_or_acq_rel(ptr %a) {
9055 ; O0-LABEL: atomic64_or_acq_rel:
9056 ; O0:       # %bb.0: # %entry
9057 ; O0-NEXT:    movq foo(%rip), %rax
9058 ; O0-NEXT:  .Lpcsection362:
9059 ; O0-NEXT:    lock orq $42, (%rdi)
9060 ; O0-NEXT:    movq $1, foo
9061 ; O0-NEXT:    retq
9063 ; O1-LABEL: atomic64_or_acq_rel:
9064 ; O1:       # %bb.0: # %entry
9065 ; O1-NEXT:    movq foo(%rip), %rax
9066 ; O1-NEXT:  .Lpcsection323:
9067 ; O1-NEXT:    lock orq $42, (%rdi)
9068 ; O1-NEXT:    movq $1, foo(%rip)
9069 ; O1-NEXT:    retq
9071 ; O2-LABEL: atomic64_or_acq_rel:
9072 ; O2:       # %bb.0: # %entry
9073 ; O2-NEXT:    movq foo(%rip), %rax
9074 ; O2-NEXT:  .Lpcsection323:
9075 ; O2-NEXT:    lock orq $42, (%rdi)
9076 ; O2-NEXT:    movq $1, foo(%rip)
9077 ; O2-NEXT:    retq
9079 ; O3-LABEL: atomic64_or_acq_rel:
9080 ; O3:       # %bb.0: # %entry
9081 ; O3-NEXT:    movq foo(%rip), %rax
9082 ; O3-NEXT:  .Lpcsection323:
9083 ; O3-NEXT:    lock orq $42, (%rdi)
9084 ; O3-NEXT:    movq $1, foo(%rip)
9085 ; O3-NEXT:    retq
9086 entry:
9087   load volatile i64, ptr @foo, align 8
9088   %x = atomicrmw or ptr %a, i64 42 acq_rel, align 8, !pcsections !0
9089   store volatile i64 1, ptr @foo, align 8
9090   ret void
9093 define void @atomic64_xor_acq_rel(ptr %a) {
9094 ; O0-LABEL: atomic64_xor_acq_rel:
9095 ; O0:       # %bb.0: # %entry
9096 ; O0-NEXT:    movq foo(%rip), %rax
9097 ; O0-NEXT:  .Lpcsection363:
9098 ; O0-NEXT:    lock xorq $42, (%rdi)
9099 ; O0-NEXT:    movq $1, foo
9100 ; O0-NEXT:    retq
9102 ; O1-LABEL: atomic64_xor_acq_rel:
9103 ; O1:       # %bb.0: # %entry
9104 ; O1-NEXT:    movq foo(%rip), %rax
9105 ; O1-NEXT:  .Lpcsection324:
9106 ; O1-NEXT:    lock xorq $42, (%rdi)
9107 ; O1-NEXT:    movq $1, foo(%rip)
9108 ; O1-NEXT:    retq
9110 ; O2-LABEL: atomic64_xor_acq_rel:
9111 ; O2:       # %bb.0: # %entry
9112 ; O2-NEXT:    movq foo(%rip), %rax
9113 ; O2-NEXT:  .Lpcsection324:
9114 ; O2-NEXT:    lock xorq $42, (%rdi)
9115 ; O2-NEXT:    movq $1, foo(%rip)
9116 ; O2-NEXT:    retq
9118 ; O3-LABEL: atomic64_xor_acq_rel:
9119 ; O3:       # %bb.0: # %entry
9120 ; O3-NEXT:    movq foo(%rip), %rax
9121 ; O3-NEXT:  .Lpcsection324:
9122 ; O3-NEXT:    lock xorq $42, (%rdi)
9123 ; O3-NEXT:    movq $1, foo(%rip)
9124 ; O3-NEXT:    retq
9125 entry:
9126   load volatile i64, ptr @foo, align 8
9127   %x = atomicrmw xor ptr %a, i64 42 acq_rel, align 8, !pcsections !0
9128   store volatile i64 1, ptr @foo, align 8
9129   ret void
9132 define void @atomic64_nand_acq_rel(ptr %a) {
9133 ; O0-LABEL: atomic64_nand_acq_rel:
9134 ; O0:       # %bb.0: # %entry
9135 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9136 ; O0-NEXT:    movq foo, %rax
9137 ; O0-NEXT:  .Lpcsection364:
9138 ; O0-NEXT:    movq (%rdi), %rax
9139 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9140 ; O0-NEXT:  .LBB183_1: # %atomicrmw.start
9141 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
9142 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9143 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
9144 ; O0-NEXT:    movl %eax, %esi
9145 ; O0-NEXT:  .Lpcsection365:
9146 ; O0-NEXT:    notl %esi
9147 ; O0-NEXT:  .Lpcsection366:
9148 ; O0-NEXT:    # implicit-def: $rdx
9149 ; O0-NEXT:    movl %esi, %edx
9150 ; O0-NEXT:  .Lpcsection367:
9151 ; O0-NEXT:    orq $-43, %rdx
9152 ; O0-NEXT:  .Lpcsection368:
9153 ; O0-NEXT:    lock cmpxchgq %rdx, (%rcx)
9154 ; O0-NEXT:  .Lpcsection369:
9155 ; O0-NEXT:    sete %cl
9156 ; O0-NEXT:  .Lpcsection370:
9157 ; O0-NEXT:    testb $1, %cl
9158 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9159 ; O0-NEXT:  .Lpcsection371:
9160 ; O0-NEXT:    jne .LBB183_2
9161 ; O0-NEXT:    jmp .LBB183_1
9162 ; O0-NEXT:  .LBB183_2: # %atomicrmw.end
9163 ; O0-NEXT:    movq $1, foo
9164 ; O0-NEXT:    retq
9166 ; O1-LABEL: atomic64_nand_acq_rel:
9167 ; O1:       # %bb.0: # %entry
9168 ; O1-NEXT:    movq foo(%rip), %rax
9169 ; O1-NEXT:  .Lpcsection325:
9170 ; O1-NEXT:    movq (%rdi), %rax
9171 ; O1-NEXT:    .p2align 4, 0x90
9172 ; O1-NEXT:  .LBB183_1: # %atomicrmw.start
9173 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
9174 ; O1-NEXT:    movl %eax, %ecx
9175 ; O1-NEXT:  .Lpcsection326:
9176 ; O1-NEXT:    notl %ecx
9177 ; O1-NEXT:  .Lpcsection327:
9178 ; O1-NEXT:    orq $-43, %rcx
9179 ; O1-NEXT:  .Lpcsection328:
9180 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9181 ; O1-NEXT:  .Lpcsection329:
9182 ; O1-NEXT:    jne .LBB183_1
9183 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
9184 ; O1-NEXT:    movq $1, foo(%rip)
9185 ; O1-NEXT:    retq
9187 ; O2-LABEL: atomic64_nand_acq_rel:
9188 ; O2:       # %bb.0: # %entry
9189 ; O2-NEXT:    movq foo(%rip), %rax
9190 ; O2-NEXT:  .Lpcsection325:
9191 ; O2-NEXT:    movq (%rdi), %rax
9192 ; O2-NEXT:    .p2align 4, 0x90
9193 ; O2-NEXT:  .LBB183_1: # %atomicrmw.start
9194 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
9195 ; O2-NEXT:    movl %eax, %ecx
9196 ; O2-NEXT:  .Lpcsection326:
9197 ; O2-NEXT:    notl %ecx
9198 ; O2-NEXT:  .Lpcsection327:
9199 ; O2-NEXT:    orq $-43, %rcx
9200 ; O2-NEXT:  .Lpcsection328:
9201 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9202 ; O2-NEXT:  .Lpcsection329:
9203 ; O2-NEXT:    jne .LBB183_1
9204 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
9205 ; O2-NEXT:    movq $1, foo(%rip)
9206 ; O2-NEXT:    retq
9208 ; O3-LABEL: atomic64_nand_acq_rel:
9209 ; O3:       # %bb.0: # %entry
9210 ; O3-NEXT:    movq foo(%rip), %rax
9211 ; O3-NEXT:  .Lpcsection325:
9212 ; O3-NEXT:    movq (%rdi), %rax
9213 ; O3-NEXT:    .p2align 4, 0x90
9214 ; O3-NEXT:  .LBB183_1: # %atomicrmw.start
9215 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
9216 ; O3-NEXT:    movl %eax, %ecx
9217 ; O3-NEXT:  .Lpcsection326:
9218 ; O3-NEXT:    notl %ecx
9219 ; O3-NEXT:  .Lpcsection327:
9220 ; O3-NEXT:    orq $-43, %rcx
9221 ; O3-NEXT:  .Lpcsection328:
9222 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9223 ; O3-NEXT:  .Lpcsection329:
9224 ; O3-NEXT:    jne .LBB183_1
9225 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
9226 ; O3-NEXT:    movq $1, foo(%rip)
9227 ; O3-NEXT:    retq
9228 entry:
9229   load volatile i64, ptr @foo, align 8
9230   %x = atomicrmw nand ptr %a, i64 42 acq_rel, align 8, !pcsections !0
9231   store volatile i64 1, ptr @foo, align 8
9232   ret void
9235 define void @atomic64_xchg_seq_cst(ptr %a) {
9236 ; O0-LABEL: atomic64_xchg_seq_cst:
9237 ; O0:       # %bb.0: # %entry
9238 ; O0-NEXT:    movq foo(%rip), %rax
9239 ; O0-NEXT:    movl $42, %eax
9240 ; O0-NEXT:  .Lpcsection372:
9241 ; O0-NEXT:    xchgq %rax, (%rdi)
9242 ; O0-NEXT:    movq $1, foo
9243 ; O0-NEXT:    retq
9245 ; O1-LABEL: atomic64_xchg_seq_cst:
9246 ; O1:       # %bb.0: # %entry
9247 ; O1-NEXT:    movq foo(%rip), %rax
9248 ; O1-NEXT:    movl $42, %eax
9249 ; O1-NEXT:  .Lpcsection330:
9250 ; O1-NEXT:    xchgq %rax, (%rdi)
9251 ; O1-NEXT:    movq $1, foo(%rip)
9252 ; O1-NEXT:    retq
9254 ; O2-LABEL: atomic64_xchg_seq_cst:
9255 ; O2:       # %bb.0: # %entry
9256 ; O2-NEXT:    movq foo(%rip), %rax
9257 ; O2-NEXT:    movl $42, %eax
9258 ; O2-NEXT:  .Lpcsection330:
9259 ; O2-NEXT:    xchgq %rax, (%rdi)
9260 ; O2-NEXT:    movq $1, foo(%rip)
9261 ; O2-NEXT:    retq
9263 ; O3-LABEL: atomic64_xchg_seq_cst:
9264 ; O3:       # %bb.0: # %entry
9265 ; O3-NEXT:    movq foo(%rip), %rax
9266 ; O3-NEXT:    movl $42, %eax
9267 ; O3-NEXT:  .Lpcsection330:
9268 ; O3-NEXT:    xchgq %rax, (%rdi)
9269 ; O3-NEXT:    movq $1, foo(%rip)
9270 ; O3-NEXT:    retq
9271 entry:
9272   load volatile i64, ptr @foo, align 8
9273   %x = atomicrmw xchg ptr %a, i64 42 seq_cst, align 8, !pcsections !0
9274   store volatile i64 1, ptr @foo, align 8
9275   ret void
9278 define void @atomic64_add_seq_cst(ptr %a) {
9279 ; O0-LABEL: atomic64_add_seq_cst:
9280 ; O0:       # %bb.0: # %entry
9281 ; O0-NEXT:    movq foo(%rip), %rax
9282 ; O0-NEXT:  .Lpcsection373:
9283 ; O0-NEXT:    lock addq $42, (%rdi)
9284 ; O0-NEXT:    movq $1, foo
9285 ; O0-NEXT:    retq
9287 ; O1-LABEL: atomic64_add_seq_cst:
9288 ; O1:       # %bb.0: # %entry
9289 ; O1-NEXT:    movq foo(%rip), %rax
9290 ; O1-NEXT:  .Lpcsection331:
9291 ; O1-NEXT:    lock addq $42, (%rdi)
9292 ; O1-NEXT:    movq $1, foo(%rip)
9293 ; O1-NEXT:    retq
9295 ; O2-LABEL: atomic64_add_seq_cst:
9296 ; O2:       # %bb.0: # %entry
9297 ; O2-NEXT:    movq foo(%rip), %rax
9298 ; O2-NEXT:  .Lpcsection331:
9299 ; O2-NEXT:    lock addq $42, (%rdi)
9300 ; O2-NEXT:    movq $1, foo(%rip)
9301 ; O2-NEXT:    retq
9303 ; O3-LABEL: atomic64_add_seq_cst:
9304 ; O3:       # %bb.0: # %entry
9305 ; O3-NEXT:    movq foo(%rip), %rax
9306 ; O3-NEXT:  .Lpcsection331:
9307 ; O3-NEXT:    lock addq $42, (%rdi)
9308 ; O3-NEXT:    movq $1, foo(%rip)
9309 ; O3-NEXT:    retq
9310 entry:
9311   load volatile i64, ptr @foo, align 8
9312   %x = atomicrmw add ptr %a, i64 42 seq_cst, align 8, !pcsections !0
9313   store volatile i64 1, ptr @foo, align 8
9314   ret void
9317 define void @atomic64_sub_seq_cst(ptr %a) {
9318 ; O0-LABEL: atomic64_sub_seq_cst:
9319 ; O0:       # %bb.0: # %entry
9320 ; O0-NEXT:    movq foo(%rip), %rax
9321 ; O0-NEXT:  .Lpcsection374:
9322 ; O0-NEXT:    lock subq $42, (%rdi)
9323 ; O0-NEXT:    movq $1, foo
9324 ; O0-NEXT:    retq
9326 ; O1-LABEL: atomic64_sub_seq_cst:
9327 ; O1:       # %bb.0: # %entry
9328 ; O1-NEXT:    movq foo(%rip), %rax
9329 ; O1-NEXT:  .Lpcsection332:
9330 ; O1-NEXT:    lock subq $42, (%rdi)
9331 ; O1-NEXT:    movq $1, foo(%rip)
9332 ; O1-NEXT:    retq
9334 ; O2-LABEL: atomic64_sub_seq_cst:
9335 ; O2:       # %bb.0: # %entry
9336 ; O2-NEXT:    movq foo(%rip), %rax
9337 ; O2-NEXT:  .Lpcsection332:
9338 ; O2-NEXT:    lock subq $42, (%rdi)
9339 ; O2-NEXT:    movq $1, foo(%rip)
9340 ; O2-NEXT:    retq
9342 ; O3-LABEL: atomic64_sub_seq_cst:
9343 ; O3:       # %bb.0: # %entry
9344 ; O3-NEXT:    movq foo(%rip), %rax
9345 ; O3-NEXT:  .Lpcsection332:
9346 ; O3-NEXT:    lock subq $42, (%rdi)
9347 ; O3-NEXT:    movq $1, foo(%rip)
9348 ; O3-NEXT:    retq
9349 entry:
9350   load volatile i64, ptr @foo, align 8
9351   %x = atomicrmw sub ptr %a, i64 42 seq_cst, align 8, !pcsections !0
9352   store volatile i64 1, ptr @foo, align 8
9353   ret void
9356 define void @atomic64_and_seq_cst(ptr %a) {
9357 ; O0-LABEL: atomic64_and_seq_cst:
9358 ; O0:       # %bb.0: # %entry
9359 ; O0-NEXT:    movq foo(%rip), %rax
9360 ; O0-NEXT:  .Lpcsection375:
9361 ; O0-NEXT:    lock andq $42, (%rdi)
9362 ; O0-NEXT:    movq $1, foo
9363 ; O0-NEXT:    retq
9365 ; O1-LABEL: atomic64_and_seq_cst:
9366 ; O1:       # %bb.0: # %entry
9367 ; O1-NEXT:    movq foo(%rip), %rax
9368 ; O1-NEXT:  .Lpcsection333:
9369 ; O1-NEXT:    lock andq $42, (%rdi)
9370 ; O1-NEXT:    movq $1, foo(%rip)
9371 ; O1-NEXT:    retq
9373 ; O2-LABEL: atomic64_and_seq_cst:
9374 ; O2:       # %bb.0: # %entry
9375 ; O2-NEXT:    movq foo(%rip), %rax
9376 ; O2-NEXT:  .Lpcsection333:
9377 ; O2-NEXT:    lock andq $42, (%rdi)
9378 ; O2-NEXT:    movq $1, foo(%rip)
9379 ; O2-NEXT:    retq
9381 ; O3-LABEL: atomic64_and_seq_cst:
9382 ; O3:       # %bb.0: # %entry
9383 ; O3-NEXT:    movq foo(%rip), %rax
9384 ; O3-NEXT:  .Lpcsection333:
9385 ; O3-NEXT:    lock andq $42, (%rdi)
9386 ; O3-NEXT:    movq $1, foo(%rip)
9387 ; O3-NEXT:    retq
9388 entry:
9389   load volatile i64, ptr @foo, align 8
9390   %x = atomicrmw and ptr %a, i64 42 seq_cst, align 8, !pcsections !0
9391   store volatile i64 1, ptr @foo, align 8
9392   ret void
9395 define void @atomic64_or_seq_cst(ptr %a) {
9396 ; O0-LABEL: atomic64_or_seq_cst:
9397 ; O0:       # %bb.0: # %entry
9398 ; O0-NEXT:    movq foo(%rip), %rax
9399 ; O0-NEXT:  .Lpcsection376:
9400 ; O0-NEXT:    lock orq $42, (%rdi)
9401 ; O0-NEXT:    movq $1, foo
9402 ; O0-NEXT:    retq
9404 ; O1-LABEL: atomic64_or_seq_cst:
9405 ; O1:       # %bb.0: # %entry
9406 ; O1-NEXT:    movq foo(%rip), %rax
9407 ; O1-NEXT:  .Lpcsection334:
9408 ; O1-NEXT:    lock orq $42, (%rdi)
9409 ; O1-NEXT:    movq $1, foo(%rip)
9410 ; O1-NEXT:    retq
9412 ; O2-LABEL: atomic64_or_seq_cst:
9413 ; O2:       # %bb.0: # %entry
9414 ; O2-NEXT:    movq foo(%rip), %rax
9415 ; O2-NEXT:  .Lpcsection334:
9416 ; O2-NEXT:    lock orq $42, (%rdi)
9417 ; O2-NEXT:    movq $1, foo(%rip)
9418 ; O2-NEXT:    retq
9420 ; O3-LABEL: atomic64_or_seq_cst:
9421 ; O3:       # %bb.0: # %entry
9422 ; O3-NEXT:    movq foo(%rip), %rax
9423 ; O3-NEXT:  .Lpcsection334:
9424 ; O3-NEXT:    lock orq $42, (%rdi)
9425 ; O3-NEXT:    movq $1, foo(%rip)
9426 ; O3-NEXT:    retq
9427 entry:
9428   load volatile i64, ptr @foo, align 8
9429   %x = atomicrmw or ptr %a, i64 42 seq_cst, align 8, !pcsections !0
9430   store volatile i64 1, ptr @foo, align 8
9431   ret void
9434 define void @atomic64_xor_seq_cst(ptr %a) {
9435 ; O0-LABEL: atomic64_xor_seq_cst:
9436 ; O0:       # %bb.0: # %entry
9437 ; O0-NEXT:    movq foo(%rip), %rax
9438 ; O0-NEXT:  .Lpcsection377:
9439 ; O0-NEXT:    lock xorq $42, (%rdi)
9440 ; O0-NEXT:    movq $1, foo
9441 ; O0-NEXT:    retq
9443 ; O1-LABEL: atomic64_xor_seq_cst:
9444 ; O1:       # %bb.0: # %entry
9445 ; O1-NEXT:    movq foo(%rip), %rax
9446 ; O1-NEXT:  .Lpcsection335:
9447 ; O1-NEXT:    lock xorq $42, (%rdi)
9448 ; O1-NEXT:    movq $1, foo(%rip)
9449 ; O1-NEXT:    retq
9451 ; O2-LABEL: atomic64_xor_seq_cst:
9452 ; O2:       # %bb.0: # %entry
9453 ; O2-NEXT:    movq foo(%rip), %rax
9454 ; O2-NEXT:  .Lpcsection335:
9455 ; O2-NEXT:    lock xorq $42, (%rdi)
9456 ; O2-NEXT:    movq $1, foo(%rip)
9457 ; O2-NEXT:    retq
9459 ; O3-LABEL: atomic64_xor_seq_cst:
9460 ; O3:       # %bb.0: # %entry
9461 ; O3-NEXT:    movq foo(%rip), %rax
9462 ; O3-NEXT:  .Lpcsection335:
9463 ; O3-NEXT:    lock xorq $42, (%rdi)
9464 ; O3-NEXT:    movq $1, foo(%rip)
9465 ; O3-NEXT:    retq
9466 entry:
9467   load volatile i64, ptr @foo, align 8
9468   %x = atomicrmw xor ptr %a, i64 42 seq_cst, align 8, !pcsections !0
9469   store volatile i64 1, ptr @foo, align 8
9470   ret void
9473 define void @atomic64_nand_seq_cst(ptr %a) {
9474 ; O0-LABEL: atomic64_nand_seq_cst:
9475 ; O0:       # %bb.0: # %entry
9476 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9477 ; O0-NEXT:    movq foo, %rax
9478 ; O0-NEXT:  .Lpcsection378:
9479 ; O0-NEXT:    movq (%rdi), %rax
9480 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9481 ; O0-NEXT:  .LBB190_1: # %atomicrmw.start
9482 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
9483 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9484 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
9485 ; O0-NEXT:    movl %eax, %esi
9486 ; O0-NEXT:  .Lpcsection379:
9487 ; O0-NEXT:    notl %esi
9488 ; O0-NEXT:  .Lpcsection380:
9489 ; O0-NEXT:    # implicit-def: $rdx
9490 ; O0-NEXT:    movl %esi, %edx
9491 ; O0-NEXT:  .Lpcsection381:
9492 ; O0-NEXT:    orq $-43, %rdx
9493 ; O0-NEXT:  .Lpcsection382:
9494 ; O0-NEXT:    lock cmpxchgq %rdx, (%rcx)
9495 ; O0-NEXT:  .Lpcsection383:
9496 ; O0-NEXT:    sete %cl
9497 ; O0-NEXT:  .Lpcsection384:
9498 ; O0-NEXT:    testb $1, %cl
9499 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9500 ; O0-NEXT:  .Lpcsection385:
9501 ; O0-NEXT:    jne .LBB190_2
9502 ; O0-NEXT:    jmp .LBB190_1
9503 ; O0-NEXT:  .LBB190_2: # %atomicrmw.end
9504 ; O0-NEXT:    movq $1, foo
9505 ; O0-NEXT:    retq
9507 ; O1-LABEL: atomic64_nand_seq_cst:
9508 ; O1:       # %bb.0: # %entry
9509 ; O1-NEXT:    movq foo(%rip), %rax
9510 ; O1-NEXT:  .Lpcsection336:
9511 ; O1-NEXT:    movq (%rdi), %rax
9512 ; O1-NEXT:    .p2align 4, 0x90
9513 ; O1-NEXT:  .LBB190_1: # %atomicrmw.start
9514 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
9515 ; O1-NEXT:    movl %eax, %ecx
9516 ; O1-NEXT:  .Lpcsection337:
9517 ; O1-NEXT:    notl %ecx
9518 ; O1-NEXT:  .Lpcsection338:
9519 ; O1-NEXT:    orq $-43, %rcx
9520 ; O1-NEXT:  .Lpcsection339:
9521 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9522 ; O1-NEXT:  .Lpcsection340:
9523 ; O1-NEXT:    jne .LBB190_1
9524 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
9525 ; O1-NEXT:    movq $1, foo(%rip)
9526 ; O1-NEXT:    retq
9528 ; O2-LABEL: atomic64_nand_seq_cst:
9529 ; O2:       # %bb.0: # %entry
9530 ; O2-NEXT:    movq foo(%rip), %rax
9531 ; O2-NEXT:  .Lpcsection336:
9532 ; O2-NEXT:    movq (%rdi), %rax
9533 ; O2-NEXT:    .p2align 4, 0x90
9534 ; O2-NEXT:  .LBB190_1: # %atomicrmw.start
9535 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
9536 ; O2-NEXT:    movl %eax, %ecx
9537 ; O2-NEXT:  .Lpcsection337:
9538 ; O2-NEXT:    notl %ecx
9539 ; O2-NEXT:  .Lpcsection338:
9540 ; O2-NEXT:    orq $-43, %rcx
9541 ; O2-NEXT:  .Lpcsection339:
9542 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9543 ; O2-NEXT:  .Lpcsection340:
9544 ; O2-NEXT:    jne .LBB190_1
9545 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
9546 ; O2-NEXT:    movq $1, foo(%rip)
9547 ; O2-NEXT:    retq
9549 ; O3-LABEL: atomic64_nand_seq_cst:
9550 ; O3:       # %bb.0: # %entry
9551 ; O3-NEXT:    movq foo(%rip), %rax
9552 ; O3-NEXT:  .Lpcsection336:
9553 ; O3-NEXT:    movq (%rdi), %rax
9554 ; O3-NEXT:    .p2align 4, 0x90
9555 ; O3-NEXT:  .LBB190_1: # %atomicrmw.start
9556 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
9557 ; O3-NEXT:    movl %eax, %ecx
9558 ; O3-NEXT:  .Lpcsection337:
9559 ; O3-NEXT:    notl %ecx
9560 ; O3-NEXT:  .Lpcsection338:
9561 ; O3-NEXT:    orq $-43, %rcx
9562 ; O3-NEXT:  .Lpcsection339:
9563 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9564 ; O3-NEXT:  .Lpcsection340:
9565 ; O3-NEXT:    jne .LBB190_1
9566 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
9567 ; O3-NEXT:    movq $1, foo(%rip)
9568 ; O3-NEXT:    retq
9569 entry:
9570   load volatile i64, ptr @foo, align 8
9571   %x = atomicrmw nand ptr %a, i64 42 seq_cst, align 8, !pcsections !0
9572   store volatile i64 1, ptr @foo, align 8
9573   ret void
9576 define void @atomic64_cas_monotonic(ptr %a) {
9577 ; O0-LABEL: atomic64_cas_monotonic:
9578 ; O0:       # %bb.0: # %entry
9579 ; O0-NEXT:    movq foo(%rip), %rax
9580 ; O0-NEXT:    movl $42, %eax
9581 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9582 ; O0-NEXT:    movl $1, %ecx
9583 ; O0-NEXT:  .Lpcsection386:
9584 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9585 ; O0-NEXT:  .Lpcsection387:
9586 ; O0-NEXT:    # kill: def $rdx killed $rax
9587 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9588 ; O0-NEXT:  .Lpcsection388:
9589 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9590 ; O0-NEXT:  .Lpcsection389:
9591 ; O0-NEXT:    # kill: def $rdx killed $rax
9592 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9593 ; O0-NEXT:  .Lpcsection390:
9594 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9595 ; O0-NEXT:    movq $1, foo
9596 ; O0-NEXT:    retq
9598 ; O1-LABEL: atomic64_cas_monotonic:
9599 ; O1:       # %bb.0: # %entry
9600 ; O1-NEXT:    movq foo(%rip), %rax
9601 ; O1-NEXT:    movl $1, %ecx
9602 ; O1-NEXT:  .Lpcsection341:
9603 ; O1-NEXT:    movl $42, %eax
9604 ; O1-NEXT:  .Lpcsection342:
9605 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9606 ; O1-NEXT:  .Lpcsection343:
9607 ; O1-NEXT:    movl $42, %eax
9608 ; O1-NEXT:  .Lpcsection344:
9609 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9610 ; O1-NEXT:  .Lpcsection345:
9611 ; O1-NEXT:    movl $42, %eax
9612 ; O1-NEXT:  .Lpcsection346:
9613 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9614 ; O1-NEXT:    movq $1, foo(%rip)
9615 ; O1-NEXT:    retq
9617 ; O2-LABEL: atomic64_cas_monotonic:
9618 ; O2:       # %bb.0: # %entry
9619 ; O2-NEXT:    movq foo(%rip), %rax
9620 ; O2-NEXT:    movl $1, %ecx
9621 ; O2-NEXT:  .Lpcsection341:
9622 ; O2-NEXT:    movl $42, %eax
9623 ; O2-NEXT:  .Lpcsection342:
9624 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9625 ; O2-NEXT:  .Lpcsection343:
9626 ; O2-NEXT:    movl $42, %eax
9627 ; O2-NEXT:  .Lpcsection344:
9628 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9629 ; O2-NEXT:  .Lpcsection345:
9630 ; O2-NEXT:    movl $42, %eax
9631 ; O2-NEXT:  .Lpcsection346:
9632 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9633 ; O2-NEXT:    movq $1, foo(%rip)
9634 ; O2-NEXT:    retq
9636 ; O3-LABEL: atomic64_cas_monotonic:
9637 ; O3:       # %bb.0: # %entry
9638 ; O3-NEXT:    movq foo(%rip), %rax
9639 ; O3-NEXT:    movl $1, %ecx
9640 ; O3-NEXT:  .Lpcsection341:
9641 ; O3-NEXT:    movl $42, %eax
9642 ; O3-NEXT:  .Lpcsection342:
9643 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9644 ; O3-NEXT:  .Lpcsection343:
9645 ; O3-NEXT:    movl $42, %eax
9646 ; O3-NEXT:  .Lpcsection344:
9647 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9648 ; O3-NEXT:  .Lpcsection345:
9649 ; O3-NEXT:    movl $42, %eax
9650 ; O3-NEXT:  .Lpcsection346:
9651 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9652 ; O3-NEXT:    movq $1, foo(%rip)
9653 ; O3-NEXT:    retq
9654 entry:
9655   load volatile i64, ptr @foo, align 8
9656   %x = cmpxchg ptr %a, i64 42, i64 1 monotonic monotonic, align 8, !pcsections !0
9657   %y = cmpxchg ptr %a, i64 42, i64 1 monotonic acquire, align 8, !pcsections !0
9658   %z = cmpxchg ptr %a, i64 42, i64 1 monotonic seq_cst, align 8, !pcsections !0
9659   store volatile i64 1, ptr @foo, align 8
9660   ret void
9663 define void @atomic64_cas_acquire(ptr %a) {
9664 ; O0-LABEL: atomic64_cas_acquire:
9665 ; O0:       # %bb.0: # %entry
9666 ; O0-NEXT:    movq foo(%rip), %rax
9667 ; O0-NEXT:    movl $42, %eax
9668 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9669 ; O0-NEXT:    movl $1, %ecx
9670 ; O0-NEXT:  .Lpcsection391:
9671 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9672 ; O0-NEXT:  .Lpcsection392:
9673 ; O0-NEXT:    # kill: def $rdx killed $rax
9674 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9675 ; O0-NEXT:  .Lpcsection393:
9676 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9677 ; O0-NEXT:  .Lpcsection394:
9678 ; O0-NEXT:    # kill: def $rdx killed $rax
9679 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9680 ; O0-NEXT:  .Lpcsection395:
9681 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9682 ; O0-NEXT:    movq $1, foo
9683 ; O0-NEXT:    retq
9685 ; O1-LABEL: atomic64_cas_acquire:
9686 ; O1:       # %bb.0: # %entry
9687 ; O1-NEXT:    movq foo(%rip), %rax
9688 ; O1-NEXT:    movl $1, %ecx
9689 ; O1-NEXT:  .Lpcsection347:
9690 ; O1-NEXT:    movl $42, %eax
9691 ; O1-NEXT:  .Lpcsection348:
9692 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9693 ; O1-NEXT:  .Lpcsection349:
9694 ; O1-NEXT:    movl $42, %eax
9695 ; O1-NEXT:  .Lpcsection350:
9696 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9697 ; O1-NEXT:  .Lpcsection351:
9698 ; O1-NEXT:    movl $42, %eax
9699 ; O1-NEXT:  .Lpcsection352:
9700 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9701 ; O1-NEXT:    movq $1, foo(%rip)
9702 ; O1-NEXT:    retq
9704 ; O2-LABEL: atomic64_cas_acquire:
9705 ; O2:       # %bb.0: # %entry
9706 ; O2-NEXT:    movq foo(%rip), %rax
9707 ; O2-NEXT:    movl $1, %ecx
9708 ; O2-NEXT:  .Lpcsection347:
9709 ; O2-NEXT:    movl $42, %eax
9710 ; O2-NEXT:  .Lpcsection348:
9711 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9712 ; O2-NEXT:  .Lpcsection349:
9713 ; O2-NEXT:    movl $42, %eax
9714 ; O2-NEXT:  .Lpcsection350:
9715 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9716 ; O2-NEXT:  .Lpcsection351:
9717 ; O2-NEXT:    movl $42, %eax
9718 ; O2-NEXT:  .Lpcsection352:
9719 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9720 ; O2-NEXT:    movq $1, foo(%rip)
9721 ; O2-NEXT:    retq
9723 ; O3-LABEL: atomic64_cas_acquire:
9724 ; O3:       # %bb.0: # %entry
9725 ; O3-NEXT:    movq foo(%rip), %rax
9726 ; O3-NEXT:    movl $1, %ecx
9727 ; O3-NEXT:  .Lpcsection347:
9728 ; O3-NEXT:    movl $42, %eax
9729 ; O3-NEXT:  .Lpcsection348:
9730 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9731 ; O3-NEXT:  .Lpcsection349:
9732 ; O3-NEXT:    movl $42, %eax
9733 ; O3-NEXT:  .Lpcsection350:
9734 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9735 ; O3-NEXT:  .Lpcsection351:
9736 ; O3-NEXT:    movl $42, %eax
9737 ; O3-NEXT:  .Lpcsection352:
9738 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9739 ; O3-NEXT:    movq $1, foo(%rip)
9740 ; O3-NEXT:    retq
9741 entry:
9742   load volatile i64, ptr @foo, align 8
9743   %x = cmpxchg ptr %a, i64 42, i64 1 acquire monotonic, align 8, !pcsections !0
9744   %y = cmpxchg ptr %a, i64 42, i64 1 acquire acquire, align 8, !pcsections !0
9745   %z = cmpxchg ptr %a, i64 42, i64 1 acquire seq_cst, align 8, !pcsections !0
9746   store volatile i64 1, ptr @foo, align 8
9747   ret void
9750 define void @atomic64_cas_release(ptr %a) {
9751 ; O0-LABEL: atomic64_cas_release:
9752 ; O0:       # %bb.0: # %entry
9753 ; O0-NEXT:    movq foo(%rip), %rax
9754 ; O0-NEXT:    movl $42, %eax
9755 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9756 ; O0-NEXT:    movl $1, %ecx
9757 ; O0-NEXT:  .Lpcsection396:
9758 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9759 ; O0-NEXT:  .Lpcsection397:
9760 ; O0-NEXT:    # kill: def $rdx killed $rax
9761 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9762 ; O0-NEXT:  .Lpcsection398:
9763 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9764 ; O0-NEXT:  .Lpcsection399:
9765 ; O0-NEXT:    # kill: def $rdx killed $rax
9766 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9767 ; O0-NEXT:  .Lpcsection400:
9768 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9769 ; O0-NEXT:    movq $1, foo
9770 ; O0-NEXT:    retq
9772 ; O1-LABEL: atomic64_cas_release:
9773 ; O1:       # %bb.0: # %entry
9774 ; O1-NEXT:    movq foo(%rip), %rax
9775 ; O1-NEXT:    movl $1, %ecx
9776 ; O1-NEXT:  .Lpcsection353:
9777 ; O1-NEXT:    movl $42, %eax
9778 ; O1-NEXT:  .Lpcsection354:
9779 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9780 ; O1-NEXT:  .Lpcsection355:
9781 ; O1-NEXT:    movl $42, %eax
9782 ; O1-NEXT:  .Lpcsection356:
9783 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9784 ; O1-NEXT:  .Lpcsection357:
9785 ; O1-NEXT:    movl $42, %eax
9786 ; O1-NEXT:  .Lpcsection358:
9787 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9788 ; O1-NEXT:    movq $1, foo(%rip)
9789 ; O1-NEXT:    retq
9791 ; O2-LABEL: atomic64_cas_release:
9792 ; O2:       # %bb.0: # %entry
9793 ; O2-NEXT:    movq foo(%rip), %rax
9794 ; O2-NEXT:    movl $1, %ecx
9795 ; O2-NEXT:  .Lpcsection353:
9796 ; O2-NEXT:    movl $42, %eax
9797 ; O2-NEXT:  .Lpcsection354:
9798 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9799 ; O2-NEXT:  .Lpcsection355:
9800 ; O2-NEXT:    movl $42, %eax
9801 ; O2-NEXT:  .Lpcsection356:
9802 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9803 ; O2-NEXT:  .Lpcsection357:
9804 ; O2-NEXT:    movl $42, %eax
9805 ; O2-NEXT:  .Lpcsection358:
9806 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9807 ; O2-NEXT:    movq $1, foo(%rip)
9808 ; O2-NEXT:    retq
9810 ; O3-LABEL: atomic64_cas_release:
9811 ; O3:       # %bb.0: # %entry
9812 ; O3-NEXT:    movq foo(%rip), %rax
9813 ; O3-NEXT:    movl $1, %ecx
9814 ; O3-NEXT:  .Lpcsection353:
9815 ; O3-NEXT:    movl $42, %eax
9816 ; O3-NEXT:  .Lpcsection354:
9817 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9818 ; O3-NEXT:  .Lpcsection355:
9819 ; O3-NEXT:    movl $42, %eax
9820 ; O3-NEXT:  .Lpcsection356:
9821 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9822 ; O3-NEXT:  .Lpcsection357:
9823 ; O3-NEXT:    movl $42, %eax
9824 ; O3-NEXT:  .Lpcsection358:
9825 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9826 ; O3-NEXT:    movq $1, foo(%rip)
9827 ; O3-NEXT:    retq
9828 entry:
9829   load volatile i64, ptr @foo, align 8
9830   %x = cmpxchg ptr %a, i64 42, i64 1 release monotonic, align 8, !pcsections !0
9831   %y = cmpxchg ptr %a, i64 42, i64 1 release acquire, align 8, !pcsections !0
9832   %z = cmpxchg ptr %a, i64 42, i64 1 release seq_cst, align 8, !pcsections !0
9833   store volatile i64 1, ptr @foo, align 8
9834   ret void
9837 define void @atomic64_cas_acq_rel(ptr %a) {
9838 ; O0-LABEL: atomic64_cas_acq_rel:
9839 ; O0:       # %bb.0: # %entry
9840 ; O0-NEXT:    movq foo(%rip), %rax
9841 ; O0-NEXT:    movl $42, %eax
9842 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9843 ; O0-NEXT:    movl $1, %ecx
9844 ; O0-NEXT:  .Lpcsection401:
9845 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9846 ; O0-NEXT:  .Lpcsection402:
9847 ; O0-NEXT:    # kill: def $rdx killed $rax
9848 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9849 ; O0-NEXT:  .Lpcsection403:
9850 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9851 ; O0-NEXT:  .Lpcsection404:
9852 ; O0-NEXT:    # kill: def $rdx killed $rax
9853 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9854 ; O0-NEXT:  .Lpcsection405:
9855 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9856 ; O0-NEXT:    movq $1, foo
9857 ; O0-NEXT:    retq
9859 ; O1-LABEL: atomic64_cas_acq_rel:
9860 ; O1:       # %bb.0: # %entry
9861 ; O1-NEXT:    movq foo(%rip), %rax
9862 ; O1-NEXT:    movl $1, %ecx
9863 ; O1-NEXT:  .Lpcsection359:
9864 ; O1-NEXT:    movl $42, %eax
9865 ; O1-NEXT:  .Lpcsection360:
9866 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9867 ; O1-NEXT:  .Lpcsection361:
9868 ; O1-NEXT:    movl $42, %eax
9869 ; O1-NEXT:  .Lpcsection362:
9870 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9871 ; O1-NEXT:  .Lpcsection363:
9872 ; O1-NEXT:    movl $42, %eax
9873 ; O1-NEXT:  .Lpcsection364:
9874 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9875 ; O1-NEXT:    movq $1, foo(%rip)
9876 ; O1-NEXT:    retq
9878 ; O2-LABEL: atomic64_cas_acq_rel:
9879 ; O2:       # %bb.0: # %entry
9880 ; O2-NEXT:    movq foo(%rip), %rax
9881 ; O2-NEXT:    movl $1, %ecx
9882 ; O2-NEXT:  .Lpcsection359:
9883 ; O2-NEXT:    movl $42, %eax
9884 ; O2-NEXT:  .Lpcsection360:
9885 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9886 ; O2-NEXT:  .Lpcsection361:
9887 ; O2-NEXT:    movl $42, %eax
9888 ; O2-NEXT:  .Lpcsection362:
9889 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9890 ; O2-NEXT:  .Lpcsection363:
9891 ; O2-NEXT:    movl $42, %eax
9892 ; O2-NEXT:  .Lpcsection364:
9893 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9894 ; O2-NEXT:    movq $1, foo(%rip)
9895 ; O2-NEXT:    retq
9897 ; O3-LABEL: atomic64_cas_acq_rel:
9898 ; O3:       # %bb.0: # %entry
9899 ; O3-NEXT:    movq foo(%rip), %rax
9900 ; O3-NEXT:    movl $1, %ecx
9901 ; O3-NEXT:  .Lpcsection359:
9902 ; O3-NEXT:    movl $42, %eax
9903 ; O3-NEXT:  .Lpcsection360:
9904 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9905 ; O3-NEXT:  .Lpcsection361:
9906 ; O3-NEXT:    movl $42, %eax
9907 ; O3-NEXT:  .Lpcsection362:
9908 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9909 ; O3-NEXT:  .Lpcsection363:
9910 ; O3-NEXT:    movl $42, %eax
9911 ; O3-NEXT:  .Lpcsection364:
9912 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9913 ; O3-NEXT:    movq $1, foo(%rip)
9914 ; O3-NEXT:    retq
9915 entry:
9916   load volatile i64, ptr @foo, align 8
9917   %x = cmpxchg ptr %a, i64 42, i64 1 acq_rel monotonic, align 8, !pcsections !0
9918   %y = cmpxchg ptr %a, i64 42, i64 1 acq_rel acquire, align 8, !pcsections !0
9919   %z = cmpxchg ptr %a, i64 42, i64 1 acq_rel seq_cst, align 8, !pcsections !0
9920   store volatile i64 1, ptr @foo, align 8
9921   ret void
9924 define void @atomic64_cas_seq_cst(ptr %a) {
9925 ; O0-LABEL: atomic64_cas_seq_cst:
9926 ; O0:       # %bb.0: # %entry
9927 ; O0-NEXT:    movq foo(%rip), %rax
9928 ; O0-NEXT:    movl $42, %eax
9929 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
9930 ; O0-NEXT:    movl $1, %ecx
9931 ; O0-NEXT:  .Lpcsection406:
9932 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9933 ; O0-NEXT:  .Lpcsection407:
9934 ; O0-NEXT:    # kill: def $rdx killed $rax
9935 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9936 ; O0-NEXT:  .Lpcsection408:
9937 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9938 ; O0-NEXT:  .Lpcsection409:
9939 ; O0-NEXT:    # kill: def $rdx killed $rax
9940 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
9941 ; O0-NEXT:  .Lpcsection410:
9942 ; O0-NEXT:    lock cmpxchgq %rcx, (%rdi)
9943 ; O0-NEXT:    movq $3, foo
9944 ; O0-NEXT:    retq
9946 ; O1-LABEL: atomic64_cas_seq_cst:
9947 ; O1:       # %bb.0: # %entry
9948 ; O1-NEXT:    movq foo(%rip), %rax
9949 ; O1-NEXT:    movl $1, %ecx
9950 ; O1-NEXT:  .Lpcsection365:
9951 ; O1-NEXT:    movl $42, %eax
9952 ; O1-NEXT:  .Lpcsection366:
9953 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9954 ; O1-NEXT:  .Lpcsection367:
9955 ; O1-NEXT:    movl $42, %eax
9956 ; O1-NEXT:  .Lpcsection368:
9957 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9958 ; O1-NEXT:  .Lpcsection369:
9959 ; O1-NEXT:    movl $42, %eax
9960 ; O1-NEXT:  .Lpcsection370:
9961 ; O1-NEXT:    lock cmpxchgq %rcx, (%rdi)
9962 ; O1-NEXT:    movq $3, foo(%rip)
9963 ; O1-NEXT:    retq
9965 ; O2-LABEL: atomic64_cas_seq_cst:
9966 ; O2:       # %bb.0: # %entry
9967 ; O2-NEXT:    movq foo(%rip), %rax
9968 ; O2-NEXT:    movl $1, %ecx
9969 ; O2-NEXT:  .Lpcsection365:
9970 ; O2-NEXT:    movl $42, %eax
9971 ; O2-NEXT:  .Lpcsection366:
9972 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9973 ; O2-NEXT:  .Lpcsection367:
9974 ; O2-NEXT:    movl $42, %eax
9975 ; O2-NEXT:  .Lpcsection368:
9976 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9977 ; O2-NEXT:  .Lpcsection369:
9978 ; O2-NEXT:    movl $42, %eax
9979 ; O2-NEXT:  .Lpcsection370:
9980 ; O2-NEXT:    lock cmpxchgq %rcx, (%rdi)
9981 ; O2-NEXT:    movq $3, foo(%rip)
9982 ; O2-NEXT:    retq
9984 ; O3-LABEL: atomic64_cas_seq_cst:
9985 ; O3:       # %bb.0: # %entry
9986 ; O3-NEXT:    movq foo(%rip), %rax
9987 ; O3-NEXT:    movl $1, %ecx
9988 ; O3-NEXT:  .Lpcsection365:
9989 ; O3-NEXT:    movl $42, %eax
9990 ; O3-NEXT:  .Lpcsection366:
9991 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9992 ; O3-NEXT:  .Lpcsection367:
9993 ; O3-NEXT:    movl $42, %eax
9994 ; O3-NEXT:  .Lpcsection368:
9995 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
9996 ; O3-NEXT:  .Lpcsection369:
9997 ; O3-NEXT:    movl $42, %eax
9998 ; O3-NEXT:  .Lpcsection370:
9999 ; O3-NEXT:    lock cmpxchgq %rcx, (%rdi)
10000 ; O3-NEXT:    movq $3, foo(%rip)
10001 ; O3-NEXT:    retq
10002 entry:
10003   load volatile i64, ptr @foo, align 8
10004   %x = cmpxchg ptr %a, i64 42, i64 1 seq_cst monotonic, align 8, !pcsections !0
10005   %y = cmpxchg ptr %a, i64 42, i64 1 seq_cst acquire, align 8, !pcsections !0
10006   %z = cmpxchg ptr %a, i64 42, i64 1 seq_cst seq_cst, align 8, !pcsections !0
10007   store volatile i64 3, ptr @foo, align 8
10008   ret void
10011 define void @atomic64_cas_seq_cst_ptr_ty(ptr %a, ptr %v1, ptr %v2) {
10012 ; O0-LABEL: atomic64_cas_seq_cst_ptr_ty:
10013 ; O0:       # %bb.0: # %entry
10014 ; O0-NEXT:    movq %rsi, %rax
10015 ; O0-NEXT:    movq foo(%rip), %rcx
10016 ; O0-NEXT:  .Lpcsection411:
10017 ; O0-NEXT:    lock cmpxchgq %rdx, (%rdi)
10018 ; O0-NEXT:    movq $1, foo
10019 ; O0-NEXT:    retq
10021 ; O1-LABEL: atomic64_cas_seq_cst_ptr_ty:
10022 ; O1:       # %bb.0: # %entry
10023 ; O1-NEXT:    movq %rsi, %rax
10024 ; O1-NEXT:    movq foo(%rip), %rcx
10025 ; O1-NEXT:  .Lpcsection371:
10026 ; O1-NEXT:    lock cmpxchgq %rdx, (%rdi)
10027 ; O1-NEXT:    movq $1, foo(%rip)
10028 ; O1-NEXT:    retq
10030 ; O2-LABEL: atomic64_cas_seq_cst_ptr_ty:
10031 ; O2:       # %bb.0: # %entry
10032 ; O2-NEXT:    movq %rsi, %rax
10033 ; O2-NEXT:    movq foo(%rip), %rcx
10034 ; O2-NEXT:  .Lpcsection371:
10035 ; O2-NEXT:    lock cmpxchgq %rdx, (%rdi)
10036 ; O2-NEXT:    movq $1, foo(%rip)
10037 ; O2-NEXT:    retq
10039 ; O3-LABEL: atomic64_cas_seq_cst_ptr_ty:
10040 ; O3:       # %bb.0: # %entry
10041 ; O3-NEXT:    movq %rsi, %rax
10042 ; O3-NEXT:    movq foo(%rip), %rcx
10043 ; O3-NEXT:  .Lpcsection371:
10044 ; O3-NEXT:    lock cmpxchgq %rdx, (%rdi)
10045 ; O3-NEXT:    movq $1, foo(%rip)
10046 ; O3-NEXT:    retq
10047 entry:
10048   load volatile i64, ptr @foo, align 8
10049   %x = cmpxchg ptr %a, ptr %v1, ptr %v2 seq_cst seq_cst, align 8, !pcsections !0
10050   store volatile i64 1, ptr @foo, align 8
10051   ret void
10054 define i64 @atomic_use_cond(ptr %a) {
10055 ; O0-LABEL: atomic_use_cond:
10056 ; O0:       # %bb.0: # %entry
10057 ; O0-NEXT:  .Lpcsection412:
10058 ; O0-NEXT:    lock decq (%rdi)
10059 ; O0-NEXT:  .Lpcsection413:
10060 ; O0-NEXT:    sete %al
10061 ; O0-NEXT:    testb $1, %al
10062 ; O0-NEXT:    je .LBB197_2
10063 ; O0-NEXT:  # %bb.1: # %then
10064 ; O0-NEXT:    movl $1, %eax
10065 ; O0-NEXT:    retq
10066 ; O0-NEXT:  .LBB197_2: # %else
10067 ; O0-NEXT:    movl $2, %eax
10068 ; O0-NEXT:    retq
10070 ; O1-LABEL: atomic_use_cond:
10071 ; O1:       # %bb.0: # %entry
10072 ; O1-NEXT:  .Lpcsection372:
10073 ; O1-NEXT:    lock decq (%rdi)
10074 ; O1-NEXT:    jne .LBB197_2
10075 ; O1-NEXT:  # %bb.1: # %then
10076 ; O1-NEXT:    movl $1, %eax
10077 ; O1-NEXT:    retq
10078 ; O1-NEXT:  .LBB197_2: # %else
10079 ; O1-NEXT:    movl $2, %eax
10080 ; O1-NEXT:    retq
10082 ; O2-LABEL: atomic_use_cond:
10083 ; O2:       # %bb.0: # %entry
10084 ; O2-NEXT:  .Lpcsection372:
10085 ; O2-NEXT:    lock decq (%rdi)
10086 ; O2-NEXT:    jne .LBB197_2
10087 ; O2-NEXT:  # %bb.1: # %then
10088 ; O2-NEXT:    movl $1, %eax
10089 ; O2-NEXT:    retq
10090 ; O2-NEXT:  .LBB197_2: # %else
10091 ; O2-NEXT:    movl $2, %eax
10092 ; O2-NEXT:    retq
10094 ; O3-LABEL: atomic_use_cond:
10095 ; O3:       # %bb.0: # %entry
10096 ; O3-NEXT:  .Lpcsection372:
10097 ; O3-NEXT:    lock decq (%rdi)
10098 ; O3-NEXT:    jne .LBB197_2
10099 ; O3-NEXT:  # %bb.1: # %then
10100 ; O3-NEXT:    movl $1, %eax
10101 ; O3-NEXT:    retq
10102 ; O3-NEXT:  .LBB197_2: # %else
10103 ; O3-NEXT:    movl $2, %eax
10104 ; O3-NEXT:    retq
10105 entry:
10106   %x = atomicrmw sub ptr %a, i64 1 seq_cst, align 8, !pcsections !0
10107   %y = icmp eq i64 %x, 1
10108   br i1 %y, label %then, label %else
10110 then:
10111   ret i64 1
10113 else:
10114   ret i64 2
10117 define i128 @atomic128_load_unordered(ptr %a) {
10118 ; O0-LABEL: atomic128_load_unordered:
10119 ; O0:       # %bb.0: # %entry
10120 ; O0-NEXT:    pushq %rbx
10121 ; O0-NEXT:    .cfi_def_cfa_offset 16
10122 ; O0-NEXT:    .cfi_offset %rbx, -16
10123 ; O0-NEXT:    movq foo(%rip), %rax
10124 ; O0-NEXT:  .Lpcsection414:
10125 ; O0-NEXT:    xorl %eax, %eax
10126 ; O0-NEXT:    movl %eax, %ebx
10127 ; O0-NEXT:    movq %rbx, %rax
10128 ; O0-NEXT:    movq %rbx, %rdx
10129 ; O0-NEXT:    movq %rbx, %rcx
10130 ; O0-NEXT:  .Lpcsection415:
10131 ; O0-NEXT:    lock cmpxchg16b (%rdi)
10132 ; O0-NEXT:    movq $1, foo(%rip)
10133 ; O0-NEXT:    popq %rbx
10134 ; O0-NEXT:    .cfi_def_cfa_offset 8
10135 ; O0-NEXT:    retq
10137 ; O1-LABEL: atomic128_load_unordered:
10138 ; O1:       # %bb.0: # %entry
10139 ; O1-NEXT:    pushq %rbx
10140 ; O1-NEXT:    .cfi_def_cfa_offset 16
10141 ; O1-NEXT:    .cfi_offset %rbx, -16
10142 ; O1-NEXT:    movq foo(%rip), %rax
10143 ; O1-NEXT:  .Lpcsection373:
10144 ; O1-NEXT:    xorl %eax, %eax
10145 ; O1-NEXT:  .Lpcsection374:
10146 ; O1-NEXT:    xorl %edx, %edx
10147 ; O1-NEXT:  .Lpcsection375:
10148 ; O1-NEXT:    xorl %ecx, %ecx
10149 ; O1-NEXT:  .Lpcsection376:
10150 ; O1-NEXT:    xorl %ebx, %ebx
10151 ; O1-NEXT:  .Lpcsection377:
10152 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10153 ; O1-NEXT:    movq $1, foo(%rip)
10154 ; O1-NEXT:    popq %rbx
10155 ; O1-NEXT:    .cfi_def_cfa_offset 8
10156 ; O1-NEXT:    retq
10158 ; O2-LABEL: atomic128_load_unordered:
10159 ; O2:       # %bb.0: # %entry
10160 ; O2-NEXT:    pushq %rbx
10161 ; O2-NEXT:    .cfi_def_cfa_offset 16
10162 ; O2-NEXT:    .cfi_offset %rbx, -16
10163 ; O2-NEXT:    movq foo(%rip), %rax
10164 ; O2-NEXT:  .Lpcsection373:
10165 ; O2-NEXT:    xorl %eax, %eax
10166 ; O2-NEXT:  .Lpcsection374:
10167 ; O2-NEXT:    xorl %edx, %edx
10168 ; O2-NEXT:  .Lpcsection375:
10169 ; O2-NEXT:    xorl %ecx, %ecx
10170 ; O2-NEXT:  .Lpcsection376:
10171 ; O2-NEXT:    xorl %ebx, %ebx
10172 ; O2-NEXT:  .Lpcsection377:
10173 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10174 ; O2-NEXT:    movq $1, foo(%rip)
10175 ; O2-NEXT:    popq %rbx
10176 ; O2-NEXT:    .cfi_def_cfa_offset 8
10177 ; O2-NEXT:    retq
10179 ; O3-LABEL: atomic128_load_unordered:
10180 ; O3:       # %bb.0: # %entry
10181 ; O3-NEXT:    pushq %rbx
10182 ; O3-NEXT:    .cfi_def_cfa_offset 16
10183 ; O3-NEXT:    .cfi_offset %rbx, -16
10184 ; O3-NEXT:    movq foo(%rip), %rax
10185 ; O3-NEXT:  .Lpcsection373:
10186 ; O3-NEXT:    xorl %eax, %eax
10187 ; O3-NEXT:  .Lpcsection374:
10188 ; O3-NEXT:    xorl %edx, %edx
10189 ; O3-NEXT:  .Lpcsection375:
10190 ; O3-NEXT:    xorl %ecx, %ecx
10191 ; O3-NEXT:  .Lpcsection376:
10192 ; O3-NEXT:    xorl %ebx, %ebx
10193 ; O3-NEXT:  .Lpcsection377:
10194 ; O3-NEXT:    lock cmpxchg16b (%rdi)
10195 ; O3-NEXT:    movq $1, foo(%rip)
10196 ; O3-NEXT:    popq %rbx
10197 ; O3-NEXT:    .cfi_def_cfa_offset 8
10198 ; O3-NEXT:    retq
10199 entry:
10200   load volatile i64, ptr @foo, align 8
10201   %x = load atomic i128, ptr %a unordered, align 16, !pcsections !0
10202   store volatile i64 1, ptr @foo, align 8
10203   ret i128 %x
10206 define i128 @atomic128_load_monotonic(ptr %a) {
10207 ; O0-LABEL: atomic128_load_monotonic:
10208 ; O0:       # %bb.0: # %entry
10209 ; O0-NEXT:    pushq %rbx
10210 ; O0-NEXT:    .cfi_def_cfa_offset 16
10211 ; O0-NEXT:    .cfi_offset %rbx, -16
10212 ; O0-NEXT:    movq foo(%rip), %rax
10213 ; O0-NEXT:  .Lpcsection416:
10214 ; O0-NEXT:    xorl %eax, %eax
10215 ; O0-NEXT:    movl %eax, %ebx
10216 ; O0-NEXT:    movq %rbx, %rax
10217 ; O0-NEXT:    movq %rbx, %rdx
10218 ; O0-NEXT:    movq %rbx, %rcx
10219 ; O0-NEXT:  .Lpcsection417:
10220 ; O0-NEXT:    lock cmpxchg16b (%rdi)
10221 ; O0-NEXT:    movq $1, foo(%rip)
10222 ; O0-NEXT:    popq %rbx
10223 ; O0-NEXT:    .cfi_def_cfa_offset 8
10224 ; O0-NEXT:    retq
10226 ; O1-LABEL: atomic128_load_monotonic:
10227 ; O1:       # %bb.0: # %entry
10228 ; O1-NEXT:    pushq %rbx
10229 ; O1-NEXT:    .cfi_def_cfa_offset 16
10230 ; O1-NEXT:    .cfi_offset %rbx, -16
10231 ; O1-NEXT:    movq foo(%rip), %rax
10232 ; O1-NEXT:  .Lpcsection378:
10233 ; O1-NEXT:    xorl %eax, %eax
10234 ; O1-NEXT:  .Lpcsection379:
10235 ; O1-NEXT:    xorl %edx, %edx
10236 ; O1-NEXT:  .Lpcsection380:
10237 ; O1-NEXT:    xorl %ecx, %ecx
10238 ; O1-NEXT:  .Lpcsection381:
10239 ; O1-NEXT:    xorl %ebx, %ebx
10240 ; O1-NEXT:  .Lpcsection382:
10241 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10242 ; O1-NEXT:    movq $1, foo(%rip)
10243 ; O1-NEXT:    popq %rbx
10244 ; O1-NEXT:    .cfi_def_cfa_offset 8
10245 ; O1-NEXT:    retq
10247 ; O2-LABEL: atomic128_load_monotonic:
10248 ; O2:       # %bb.0: # %entry
10249 ; O2-NEXT:    pushq %rbx
10250 ; O2-NEXT:    .cfi_def_cfa_offset 16
10251 ; O2-NEXT:    .cfi_offset %rbx, -16
10252 ; O2-NEXT:    movq foo(%rip), %rax
10253 ; O2-NEXT:  .Lpcsection378:
10254 ; O2-NEXT:    xorl %eax, %eax
10255 ; O2-NEXT:  .Lpcsection379:
10256 ; O2-NEXT:    xorl %edx, %edx
10257 ; O2-NEXT:  .Lpcsection380:
10258 ; O2-NEXT:    xorl %ecx, %ecx
10259 ; O2-NEXT:  .Lpcsection381:
10260 ; O2-NEXT:    xorl %ebx, %ebx
10261 ; O2-NEXT:  .Lpcsection382:
10262 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10263 ; O2-NEXT:    movq $1, foo(%rip)
10264 ; O2-NEXT:    popq %rbx
10265 ; O2-NEXT:    .cfi_def_cfa_offset 8
10266 ; O2-NEXT:    retq
10268 ; O3-LABEL: atomic128_load_monotonic:
10269 ; O3:       # %bb.0: # %entry
10270 ; O3-NEXT:    pushq %rbx
10271 ; O3-NEXT:    .cfi_def_cfa_offset 16
10272 ; O3-NEXT:    .cfi_offset %rbx, -16
10273 ; O3-NEXT:    movq foo(%rip), %rax
10274 ; O3-NEXT:  .Lpcsection378:
10275 ; O3-NEXT:    xorl %eax, %eax
10276 ; O3-NEXT:  .Lpcsection379:
10277 ; O3-NEXT:    xorl %edx, %edx
10278 ; O3-NEXT:  .Lpcsection380:
10279 ; O3-NEXT:    xorl %ecx, %ecx
10280 ; O3-NEXT:  .Lpcsection381:
10281 ; O3-NEXT:    xorl %ebx, %ebx
10282 ; O3-NEXT:  .Lpcsection382:
10283 ; O3-NEXT:    lock cmpxchg16b (%rdi)
10284 ; O3-NEXT:    movq $1, foo(%rip)
10285 ; O3-NEXT:    popq %rbx
10286 ; O3-NEXT:    .cfi_def_cfa_offset 8
10287 ; O3-NEXT:    retq
10288 entry:
10289   load volatile i64, ptr @foo, align 8
10290   %x = load atomic i128, ptr %a monotonic, align 16, !pcsections !0
10291   store volatile i64 1, ptr @foo, align 8
10292   ret i128 %x
10295 define i128 @atomic128_load_acquire(ptr %a) {
10296 ; O0-LABEL: atomic128_load_acquire:
10297 ; O0:       # %bb.0: # %entry
10298 ; O0-NEXT:    pushq %rbx
10299 ; O0-NEXT:    .cfi_def_cfa_offset 16
10300 ; O0-NEXT:    .cfi_offset %rbx, -16
10301 ; O0-NEXT:    movq foo(%rip), %rax
10302 ; O0-NEXT:  .Lpcsection418:
10303 ; O0-NEXT:    xorl %eax, %eax
10304 ; O0-NEXT:    movl %eax, %ebx
10305 ; O0-NEXT:    movq %rbx, %rax
10306 ; O0-NEXT:    movq %rbx, %rdx
10307 ; O0-NEXT:    movq %rbx, %rcx
10308 ; O0-NEXT:  .Lpcsection419:
10309 ; O0-NEXT:    lock cmpxchg16b (%rdi)
10310 ; O0-NEXT:    movq $1, foo(%rip)
10311 ; O0-NEXT:    popq %rbx
10312 ; O0-NEXT:    .cfi_def_cfa_offset 8
10313 ; O0-NEXT:    retq
10315 ; O1-LABEL: atomic128_load_acquire:
10316 ; O1:       # %bb.0: # %entry
10317 ; O1-NEXT:    pushq %rbx
10318 ; O1-NEXT:    .cfi_def_cfa_offset 16
10319 ; O1-NEXT:    .cfi_offset %rbx, -16
10320 ; O1-NEXT:    movq foo(%rip), %rax
10321 ; O1-NEXT:  .Lpcsection383:
10322 ; O1-NEXT:    xorl %eax, %eax
10323 ; O1-NEXT:  .Lpcsection384:
10324 ; O1-NEXT:    xorl %edx, %edx
10325 ; O1-NEXT:  .Lpcsection385:
10326 ; O1-NEXT:    xorl %ecx, %ecx
10327 ; O1-NEXT:  .Lpcsection386:
10328 ; O1-NEXT:    xorl %ebx, %ebx
10329 ; O1-NEXT:  .Lpcsection387:
10330 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10331 ; O1-NEXT:    movq $1, foo(%rip)
10332 ; O1-NEXT:    popq %rbx
10333 ; O1-NEXT:    .cfi_def_cfa_offset 8
10334 ; O1-NEXT:    retq
10336 ; O2-LABEL: atomic128_load_acquire:
10337 ; O2:       # %bb.0: # %entry
10338 ; O2-NEXT:    pushq %rbx
10339 ; O2-NEXT:    .cfi_def_cfa_offset 16
10340 ; O2-NEXT:    .cfi_offset %rbx, -16
10341 ; O2-NEXT:    movq foo(%rip), %rax
10342 ; O2-NEXT:  .Lpcsection383:
10343 ; O2-NEXT:    xorl %eax, %eax
10344 ; O2-NEXT:  .Lpcsection384:
10345 ; O2-NEXT:    xorl %edx, %edx
10346 ; O2-NEXT:  .Lpcsection385:
10347 ; O2-NEXT:    xorl %ecx, %ecx
10348 ; O2-NEXT:  .Lpcsection386:
10349 ; O2-NEXT:    xorl %ebx, %ebx
10350 ; O2-NEXT:  .Lpcsection387:
10351 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10352 ; O2-NEXT:    movq $1, foo(%rip)
10353 ; O2-NEXT:    popq %rbx
10354 ; O2-NEXT:    .cfi_def_cfa_offset 8
10355 ; O2-NEXT:    retq
10357 ; O3-LABEL: atomic128_load_acquire:
10358 ; O3:       # %bb.0: # %entry
10359 ; O3-NEXT:    pushq %rbx
10360 ; O3-NEXT:    .cfi_def_cfa_offset 16
10361 ; O3-NEXT:    .cfi_offset %rbx, -16
10362 ; O3-NEXT:    movq foo(%rip), %rax
10363 ; O3-NEXT:  .Lpcsection383:
10364 ; O3-NEXT:    xorl %eax, %eax
10365 ; O3-NEXT:  .Lpcsection384:
10366 ; O3-NEXT:    xorl %edx, %edx
10367 ; O3-NEXT:  .Lpcsection385:
10368 ; O3-NEXT:    xorl %ecx, %ecx
10369 ; O3-NEXT:  .Lpcsection386:
10370 ; O3-NEXT:    xorl %ebx, %ebx
10371 ; O3-NEXT:  .Lpcsection387:
10372 ; O3-NEXT:    lock cmpxchg16b (%rdi)
10373 ; O3-NEXT:    movq $1, foo(%rip)
10374 ; O3-NEXT:    popq %rbx
10375 ; O3-NEXT:    .cfi_def_cfa_offset 8
10376 ; O3-NEXT:    retq
10377 entry:
10378   load volatile i64, ptr @foo, align 8
10379   %x = load atomic i128, ptr %a acquire, align 16, !pcsections !0
10380   store volatile i64 1, ptr @foo, align 8
10381   ret i128 %x
10384 define i128 @atomic128_load_seq_cst(ptr %a) {
10385 ; O0-LABEL: atomic128_load_seq_cst:
10386 ; O0:       # %bb.0: # %entry
10387 ; O0-NEXT:    pushq %rbx
10388 ; O0-NEXT:    .cfi_def_cfa_offset 16
10389 ; O0-NEXT:    .cfi_offset %rbx, -16
10390 ; O0-NEXT:    movq foo(%rip), %rax
10391 ; O0-NEXT:  .Lpcsection420:
10392 ; O0-NEXT:    xorl %eax, %eax
10393 ; O0-NEXT:    movl %eax, %ebx
10394 ; O0-NEXT:    movq %rbx, %rax
10395 ; O0-NEXT:    movq %rbx, %rdx
10396 ; O0-NEXT:    movq %rbx, %rcx
10397 ; O0-NEXT:  .Lpcsection421:
10398 ; O0-NEXT:    lock cmpxchg16b (%rdi)
10399 ; O0-NEXT:    movq $1, foo(%rip)
10400 ; O0-NEXT:    popq %rbx
10401 ; O0-NEXT:    .cfi_def_cfa_offset 8
10402 ; O0-NEXT:    retq
10404 ; O1-LABEL: atomic128_load_seq_cst:
10405 ; O1:       # %bb.0: # %entry
10406 ; O1-NEXT:    pushq %rbx
10407 ; O1-NEXT:    .cfi_def_cfa_offset 16
10408 ; O1-NEXT:    .cfi_offset %rbx, -16
10409 ; O1-NEXT:    movq foo(%rip), %rax
10410 ; O1-NEXT:  .Lpcsection388:
10411 ; O1-NEXT:    xorl %eax, %eax
10412 ; O1-NEXT:  .Lpcsection389:
10413 ; O1-NEXT:    xorl %edx, %edx
10414 ; O1-NEXT:  .Lpcsection390:
10415 ; O1-NEXT:    xorl %ecx, %ecx
10416 ; O1-NEXT:  .Lpcsection391:
10417 ; O1-NEXT:    xorl %ebx, %ebx
10418 ; O1-NEXT:  .Lpcsection392:
10419 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10420 ; O1-NEXT:    movq $1, foo(%rip)
10421 ; O1-NEXT:    popq %rbx
10422 ; O1-NEXT:    .cfi_def_cfa_offset 8
10423 ; O1-NEXT:    retq
10425 ; O2-LABEL: atomic128_load_seq_cst:
10426 ; O2:       # %bb.0: # %entry
10427 ; O2-NEXT:    pushq %rbx
10428 ; O2-NEXT:    .cfi_def_cfa_offset 16
10429 ; O2-NEXT:    .cfi_offset %rbx, -16
10430 ; O2-NEXT:    movq foo(%rip), %rax
10431 ; O2-NEXT:  .Lpcsection388:
10432 ; O2-NEXT:    xorl %eax, %eax
10433 ; O2-NEXT:  .Lpcsection389:
10434 ; O2-NEXT:    xorl %edx, %edx
10435 ; O2-NEXT:  .Lpcsection390:
10436 ; O2-NEXT:    xorl %ecx, %ecx
10437 ; O2-NEXT:  .Lpcsection391:
10438 ; O2-NEXT:    xorl %ebx, %ebx
10439 ; O2-NEXT:  .Lpcsection392:
10440 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10441 ; O2-NEXT:    movq $1, foo(%rip)
10442 ; O2-NEXT:    popq %rbx
10443 ; O2-NEXT:    .cfi_def_cfa_offset 8
10444 ; O2-NEXT:    retq
10446 ; O3-LABEL: atomic128_load_seq_cst:
10447 ; O3:       # %bb.0: # %entry
10448 ; O3-NEXT:    pushq %rbx
10449 ; O3-NEXT:    .cfi_def_cfa_offset 16
10450 ; O3-NEXT:    .cfi_offset %rbx, -16
10451 ; O3-NEXT:    movq foo(%rip), %rax
10452 ; O3-NEXT:  .Lpcsection388:
10453 ; O3-NEXT:    xorl %eax, %eax
10454 ; O3-NEXT:  .Lpcsection389:
10455 ; O3-NEXT:    xorl %edx, %edx
10456 ; O3-NEXT:  .Lpcsection390:
10457 ; O3-NEXT:    xorl %ecx, %ecx
10458 ; O3-NEXT:  .Lpcsection391:
10459 ; O3-NEXT:    xorl %ebx, %ebx
10460 ; O3-NEXT:  .Lpcsection392:
10461 ; O3-NEXT:    lock cmpxchg16b (%rdi)
10462 ; O3-NEXT:    movq $1, foo(%rip)
10463 ; O3-NEXT:    popq %rbx
10464 ; O3-NEXT:    .cfi_def_cfa_offset 8
10465 ; O3-NEXT:    retq
10466 entry:
10467   load volatile i64, ptr @foo, align 8
10468   %x = load atomic i128, ptr %a seq_cst, align 16, !pcsections !0
10469   store volatile i64 1, ptr @foo, align 8
10470   ret i128 %x
10473 define ptr @atomic128_load_seq_cst_ptr_ty(ptr %a) {
10474 ; O0-LABEL: atomic128_load_seq_cst_ptr_ty:
10475 ; O0:       # %bb.0: # %entry
10476 ; O0-NEXT:    movq foo(%rip), %rax
10477 ; O0-NEXT:  .Lpcsection422:
10478 ; O0-NEXT:    movq (%rdi), %rax
10479 ; O0-NEXT:    movq $1, foo
10480 ; O0-NEXT:    retq
10482 ; O1-LABEL: atomic128_load_seq_cst_ptr_ty:
10483 ; O1:       # %bb.0: # %entry
10484 ; O1-NEXT:    movq foo(%rip), %rax
10485 ; O1-NEXT:  .Lpcsection393:
10486 ; O1-NEXT:    movq (%rdi), %rax
10487 ; O1-NEXT:    movq $1, foo(%rip)
10488 ; O1-NEXT:    retq
10490 ; O2-LABEL: atomic128_load_seq_cst_ptr_ty:
10491 ; O2:       # %bb.0: # %entry
10492 ; O2-NEXT:    movq foo(%rip), %rax
10493 ; O2-NEXT:  .Lpcsection393:
10494 ; O2-NEXT:    movq (%rdi), %rax
10495 ; O2-NEXT:    movq $1, foo(%rip)
10496 ; O2-NEXT:    retq
10498 ; O3-LABEL: atomic128_load_seq_cst_ptr_ty:
10499 ; O3:       # %bb.0: # %entry
10500 ; O3-NEXT:    movq foo(%rip), %rax
10501 ; O3-NEXT:  .Lpcsection393:
10502 ; O3-NEXT:    movq (%rdi), %rax
10503 ; O3-NEXT:    movq $1, foo(%rip)
10504 ; O3-NEXT:    retq
10505 entry:
10506   load volatile i64, ptr @foo, align 8
10507   %x = load atomic ptr, ptr %a seq_cst, align 16, !pcsections !0
10508   store volatile i64 1, ptr @foo, align 8
10509   ret ptr %x
10512 define void @atomic128_store_unordered(ptr %a) {
10513 ; O0-LABEL: atomic128_store_unordered:
10514 ; O0:       # %bb.0: # %entry
10515 ; O0-NEXT:    pushq %rbx
10516 ; O0-NEXT:    .cfi_def_cfa_offset 16
10517 ; O0-NEXT:    .cfi_offset %rbx, -16
10518 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10519 ; O0-NEXT:    movq foo(%rip), %rax
10520 ; O0-NEXT:  .Lpcsection423:
10521 ; O0-NEXT:    movq (%rdi), %rax
10522 ; O0-NEXT:  .Lpcsection424:
10523 ; O0-NEXT:    movq 8(%rdi), %rdx
10524 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10525 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10526 ; O0-NEXT:  .Lpcsection425:
10527 ; O0-NEXT:    jmp .LBB203_1
10528 ; O0-NEXT:  .LBB203_1: # %atomicrmw.start
10529 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
10530 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
10531 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
10532 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
10533 ; O0-NEXT:  .Lpcsection426:
10534 ; O0-NEXT:    xorl %ecx, %ecx
10535 ; O0-NEXT:  .Lpcsection427:
10536 ; O0-NEXT:    # kill: def $rcx killed $ecx
10537 ; O0-NEXT:  .Lpcsection428:
10538 ; O0-NEXT:    movl $42, %ebx
10539 ; O0-NEXT:  .Lpcsection429:
10540 ; O0-NEXT:    lock cmpxchg16b (%rsi)
10541 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10542 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10543 ; O0-NEXT:  .Lpcsection430:
10544 ; O0-NEXT:    jne .LBB203_1
10545 ; O0-NEXT:    jmp .LBB203_2
10546 ; O0-NEXT:  .LBB203_2: # %atomicrmw.end
10547 ; O0-NEXT:    movq $1, foo
10548 ; O0-NEXT:    popq %rbx
10549 ; O0-NEXT:    .cfi_def_cfa_offset 8
10550 ; O0-NEXT:    retq
10552 ; O1-LABEL: atomic128_store_unordered:
10553 ; O1:       # %bb.0: # %entry
10554 ; O1-NEXT:    pushq %rbx
10555 ; O1-NEXT:    .cfi_def_cfa_offset 16
10556 ; O1-NEXT:    .cfi_offset %rbx, -16
10557 ; O1-NEXT:    movq foo(%rip), %rax
10558 ; O1-NEXT:  .Lpcsection394:
10559 ; O1-NEXT:    movq (%rdi), %rax
10560 ; O1-NEXT:  .Lpcsection395:
10561 ; O1-NEXT:    movq 8(%rdi), %rdx
10562 ; O1-NEXT:  .Lpcsection396:
10563 ; O1-NEXT:    movl $42, %ebx
10564 ; O1-NEXT:    .p2align 4, 0x90
10565 ; O1-NEXT:  .LBB203_1: # %atomicrmw.start
10566 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
10567 ; O1-NEXT:  .Lpcsection397:
10568 ; O1-NEXT:    xorl %ecx, %ecx
10569 ; O1-NEXT:  .Lpcsection398:
10570 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10571 ; O1-NEXT:  .Lpcsection399:
10572 ; O1-NEXT:    jne .LBB203_1
10573 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
10574 ; O1-NEXT:    movq $1, foo(%rip)
10575 ; O1-NEXT:    popq %rbx
10576 ; O1-NEXT:    .cfi_def_cfa_offset 8
10577 ; O1-NEXT:    retq
10579 ; O2-LABEL: atomic128_store_unordered:
10580 ; O2:       # %bb.0: # %entry
10581 ; O2-NEXT:    pushq %rbx
10582 ; O2-NEXT:    .cfi_def_cfa_offset 16
10583 ; O2-NEXT:    .cfi_offset %rbx, -16
10584 ; O2-NEXT:    movq foo(%rip), %rax
10585 ; O2-NEXT:  .Lpcsection394:
10586 ; O2-NEXT:    movq (%rdi), %rax
10587 ; O2-NEXT:  .Lpcsection395:
10588 ; O2-NEXT:    movq 8(%rdi), %rdx
10589 ; O2-NEXT:  .Lpcsection396:
10590 ; O2-NEXT:    movl $42, %ebx
10591 ; O2-NEXT:    .p2align 4, 0x90
10592 ; O2-NEXT:  .LBB203_1: # %atomicrmw.start
10593 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
10594 ; O2-NEXT:  .Lpcsection397:
10595 ; O2-NEXT:    xorl %ecx, %ecx
10596 ; O2-NEXT:  .Lpcsection398:
10597 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10598 ; O2-NEXT:  .Lpcsection399:
10599 ; O2-NEXT:    jne .LBB203_1
10600 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
10601 ; O2-NEXT:    movq $1, foo(%rip)
10602 ; O2-NEXT:    popq %rbx
10603 ; O2-NEXT:    .cfi_def_cfa_offset 8
10604 ; O2-NEXT:    retq
10606 ; O3-LABEL: atomic128_store_unordered:
10607 ; O3:       # %bb.0: # %entry
10608 ; O3-NEXT:    pushq %rbx
10609 ; O3-NEXT:    .cfi_def_cfa_offset 16
10610 ; O3-NEXT:    .cfi_offset %rbx, -16
10611 ; O3-NEXT:    movq foo(%rip), %rax
10612 ; O3-NEXT:  .Lpcsection394:
10613 ; O3-NEXT:    movq (%rdi), %rax
10614 ; O3-NEXT:  .Lpcsection395:
10615 ; O3-NEXT:    movq 8(%rdi), %rdx
10616 ; O3-NEXT:  .Lpcsection396:
10617 ; O3-NEXT:    movl $42, %ebx
10618 ; O3-NEXT:    .p2align 4, 0x90
10619 ; O3-NEXT:  .LBB203_1: # %atomicrmw.start
10620 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
10621 ; O3-NEXT:  .Lpcsection397:
10622 ; O3-NEXT:    xorl %ecx, %ecx
10623 ; O3-NEXT:  .Lpcsection398:
10624 ; O3-NEXT:    lock cmpxchg16b (%rdi)
10625 ; O3-NEXT:  .Lpcsection399:
10626 ; O3-NEXT:    jne .LBB203_1
10627 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
10628 ; O3-NEXT:    movq $1, foo(%rip)
10629 ; O3-NEXT:    popq %rbx
10630 ; O3-NEXT:    .cfi_def_cfa_offset 8
10631 ; O3-NEXT:    retq
10632 entry:
10633   load volatile i64, ptr @foo, align 8
10634   store atomic i128 42, ptr %a unordered, align 16, !pcsections !0
10635   store volatile i64 1, ptr @foo, align 8
10636   ret void
10639 define void @atomic128_store_monotonic(ptr %a) {
10640 ; O0-LABEL: atomic128_store_monotonic:
10641 ; O0:       # %bb.0: # %entry
10642 ; O0-NEXT:    pushq %rbx
10643 ; O0-NEXT:    .cfi_def_cfa_offset 16
10644 ; O0-NEXT:    .cfi_offset %rbx, -16
10645 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10646 ; O0-NEXT:    movq foo(%rip), %rax
10647 ; O0-NEXT:  .Lpcsection431:
10648 ; O0-NEXT:    movq (%rdi), %rax
10649 ; O0-NEXT:  .Lpcsection432:
10650 ; O0-NEXT:    movq 8(%rdi), %rdx
10651 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10652 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10653 ; O0-NEXT:  .Lpcsection433:
10654 ; O0-NEXT:    jmp .LBB204_1
10655 ; O0-NEXT:  .LBB204_1: # %atomicrmw.start
10656 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
10657 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
10658 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
10659 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
10660 ; O0-NEXT:  .Lpcsection434:
10661 ; O0-NEXT:    xorl %ecx, %ecx
10662 ; O0-NEXT:  .Lpcsection435:
10663 ; O0-NEXT:    # kill: def $rcx killed $ecx
10664 ; O0-NEXT:  .Lpcsection436:
10665 ; O0-NEXT:    movl $42, %ebx
10666 ; O0-NEXT:  .Lpcsection437:
10667 ; O0-NEXT:    lock cmpxchg16b (%rsi)
10668 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10669 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10670 ; O0-NEXT:  .Lpcsection438:
10671 ; O0-NEXT:    jne .LBB204_1
10672 ; O0-NEXT:    jmp .LBB204_2
10673 ; O0-NEXT:  .LBB204_2: # %atomicrmw.end
10674 ; O0-NEXT:    movq $1, foo
10675 ; O0-NEXT:    popq %rbx
10676 ; O0-NEXT:    .cfi_def_cfa_offset 8
10677 ; O0-NEXT:    retq
10679 ; O1-LABEL: atomic128_store_monotonic:
10680 ; O1:       # %bb.0: # %entry
10681 ; O1-NEXT:    pushq %rbx
10682 ; O1-NEXT:    .cfi_def_cfa_offset 16
10683 ; O1-NEXT:    .cfi_offset %rbx, -16
10684 ; O1-NEXT:    movq foo(%rip), %rax
10685 ; O1-NEXT:  .Lpcsection400:
10686 ; O1-NEXT:    movq (%rdi), %rax
10687 ; O1-NEXT:  .Lpcsection401:
10688 ; O1-NEXT:    movq 8(%rdi), %rdx
10689 ; O1-NEXT:  .Lpcsection402:
10690 ; O1-NEXT:    movl $42, %ebx
10691 ; O1-NEXT:    .p2align 4, 0x90
10692 ; O1-NEXT:  .LBB204_1: # %atomicrmw.start
10693 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
10694 ; O1-NEXT:  .Lpcsection403:
10695 ; O1-NEXT:    xorl %ecx, %ecx
10696 ; O1-NEXT:  .Lpcsection404:
10697 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10698 ; O1-NEXT:  .Lpcsection405:
10699 ; O1-NEXT:    jne .LBB204_1
10700 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
10701 ; O1-NEXT:    movq $1, foo(%rip)
10702 ; O1-NEXT:    popq %rbx
10703 ; O1-NEXT:    .cfi_def_cfa_offset 8
10704 ; O1-NEXT:    retq
10706 ; O2-LABEL: atomic128_store_monotonic:
10707 ; O2:       # %bb.0: # %entry
10708 ; O2-NEXT:    pushq %rbx
10709 ; O2-NEXT:    .cfi_def_cfa_offset 16
10710 ; O2-NEXT:    .cfi_offset %rbx, -16
10711 ; O2-NEXT:    movq foo(%rip), %rax
10712 ; O2-NEXT:  .Lpcsection400:
10713 ; O2-NEXT:    movq (%rdi), %rax
10714 ; O2-NEXT:  .Lpcsection401:
10715 ; O2-NEXT:    movq 8(%rdi), %rdx
10716 ; O2-NEXT:  .Lpcsection402:
10717 ; O2-NEXT:    movl $42, %ebx
10718 ; O2-NEXT:    .p2align 4, 0x90
10719 ; O2-NEXT:  .LBB204_1: # %atomicrmw.start
10720 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
10721 ; O2-NEXT:  .Lpcsection403:
10722 ; O2-NEXT:    xorl %ecx, %ecx
10723 ; O2-NEXT:  .Lpcsection404:
10724 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10725 ; O2-NEXT:  .Lpcsection405:
10726 ; O2-NEXT:    jne .LBB204_1
10727 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
10728 ; O2-NEXT:    movq $1, foo(%rip)
10729 ; O2-NEXT:    popq %rbx
10730 ; O2-NEXT:    .cfi_def_cfa_offset 8
10731 ; O2-NEXT:    retq
10733 ; O3-LABEL: atomic128_store_monotonic:
10734 ; O3:       # %bb.0: # %entry
10735 ; O3-NEXT:    pushq %rbx
10736 ; O3-NEXT:    .cfi_def_cfa_offset 16
10737 ; O3-NEXT:    .cfi_offset %rbx, -16
10738 ; O3-NEXT:    movq foo(%rip), %rax
10739 ; O3-NEXT:  .Lpcsection400:
10740 ; O3-NEXT:    movq (%rdi), %rax
10741 ; O3-NEXT:  .Lpcsection401:
10742 ; O3-NEXT:    movq 8(%rdi), %rdx
10743 ; O3-NEXT:  .Lpcsection402:
10744 ; O3-NEXT:    movl $42, %ebx
10745 ; O3-NEXT:    .p2align 4, 0x90
10746 ; O3-NEXT:  .LBB204_1: # %atomicrmw.start
10747 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
10748 ; O3-NEXT:  .Lpcsection403:
10749 ; O3-NEXT:    xorl %ecx, %ecx
10750 ; O3-NEXT:  .Lpcsection404:
10751 ; O3-NEXT:    lock cmpxchg16b (%rdi)
10752 ; O3-NEXT:  .Lpcsection405:
10753 ; O3-NEXT:    jne .LBB204_1
10754 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
10755 ; O3-NEXT:    movq $1, foo(%rip)
10756 ; O3-NEXT:    popq %rbx
10757 ; O3-NEXT:    .cfi_def_cfa_offset 8
10758 ; O3-NEXT:    retq
10759 entry:
10760   load volatile i64, ptr @foo, align 8
10761   store atomic i128 42, ptr %a monotonic, align 16, !pcsections !0
10762   store volatile i64 1, ptr @foo, align 8
10763   ret void
10766 define void @atomic128_store_release(ptr %a) {
10767 ; O0-LABEL: atomic128_store_release:
10768 ; O0:       # %bb.0: # %entry
10769 ; O0-NEXT:    pushq %rbx
10770 ; O0-NEXT:    .cfi_def_cfa_offset 16
10771 ; O0-NEXT:    .cfi_offset %rbx, -16
10772 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10773 ; O0-NEXT:    movq foo(%rip), %rax
10774 ; O0-NEXT:  .Lpcsection439:
10775 ; O0-NEXT:    movq (%rdi), %rax
10776 ; O0-NEXT:  .Lpcsection440:
10777 ; O0-NEXT:    movq 8(%rdi), %rdx
10778 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10779 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10780 ; O0-NEXT:  .Lpcsection441:
10781 ; O0-NEXT:    jmp .LBB205_1
10782 ; O0-NEXT:  .LBB205_1: # %atomicrmw.start
10783 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
10784 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
10785 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
10786 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
10787 ; O0-NEXT:  .Lpcsection442:
10788 ; O0-NEXT:    xorl %ecx, %ecx
10789 ; O0-NEXT:  .Lpcsection443:
10790 ; O0-NEXT:    # kill: def $rcx killed $ecx
10791 ; O0-NEXT:  .Lpcsection444:
10792 ; O0-NEXT:    movl $42, %ebx
10793 ; O0-NEXT:  .Lpcsection445:
10794 ; O0-NEXT:    lock cmpxchg16b (%rsi)
10795 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10796 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10797 ; O0-NEXT:  .Lpcsection446:
10798 ; O0-NEXT:    jne .LBB205_1
10799 ; O0-NEXT:    jmp .LBB205_2
10800 ; O0-NEXT:  .LBB205_2: # %atomicrmw.end
10801 ; O0-NEXT:    movq $1, foo
10802 ; O0-NEXT:    popq %rbx
10803 ; O0-NEXT:    .cfi_def_cfa_offset 8
10804 ; O0-NEXT:    retq
10806 ; O1-LABEL: atomic128_store_release:
10807 ; O1:       # %bb.0: # %entry
10808 ; O1-NEXT:    pushq %rbx
10809 ; O1-NEXT:    .cfi_def_cfa_offset 16
10810 ; O1-NEXT:    .cfi_offset %rbx, -16
10811 ; O1-NEXT:    movq foo(%rip), %rax
10812 ; O1-NEXT:  .Lpcsection406:
10813 ; O1-NEXT:    movq (%rdi), %rax
10814 ; O1-NEXT:  .Lpcsection407:
10815 ; O1-NEXT:    movq 8(%rdi), %rdx
10816 ; O1-NEXT:  .Lpcsection408:
10817 ; O1-NEXT:    movl $42, %ebx
10818 ; O1-NEXT:    .p2align 4, 0x90
10819 ; O1-NEXT:  .LBB205_1: # %atomicrmw.start
10820 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
10821 ; O1-NEXT:  .Lpcsection409:
10822 ; O1-NEXT:    xorl %ecx, %ecx
10823 ; O1-NEXT:  .Lpcsection410:
10824 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10825 ; O1-NEXT:  .Lpcsection411:
10826 ; O1-NEXT:    jne .LBB205_1
10827 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
10828 ; O1-NEXT:    movq $1, foo(%rip)
10829 ; O1-NEXT:    popq %rbx
10830 ; O1-NEXT:    .cfi_def_cfa_offset 8
10831 ; O1-NEXT:    retq
10833 ; O2-LABEL: atomic128_store_release:
10834 ; O2:       # %bb.0: # %entry
10835 ; O2-NEXT:    pushq %rbx
10836 ; O2-NEXT:    .cfi_def_cfa_offset 16
10837 ; O2-NEXT:    .cfi_offset %rbx, -16
10838 ; O2-NEXT:    movq foo(%rip), %rax
10839 ; O2-NEXT:  .Lpcsection406:
10840 ; O2-NEXT:    movq (%rdi), %rax
10841 ; O2-NEXT:  .Lpcsection407:
10842 ; O2-NEXT:    movq 8(%rdi), %rdx
10843 ; O2-NEXT:  .Lpcsection408:
10844 ; O2-NEXT:    movl $42, %ebx
10845 ; O2-NEXT:    .p2align 4, 0x90
10846 ; O2-NEXT:  .LBB205_1: # %atomicrmw.start
10847 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
10848 ; O2-NEXT:  .Lpcsection409:
10849 ; O2-NEXT:    xorl %ecx, %ecx
10850 ; O2-NEXT:  .Lpcsection410:
10851 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10852 ; O2-NEXT:  .Lpcsection411:
10853 ; O2-NEXT:    jne .LBB205_1
10854 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
10855 ; O2-NEXT:    movq $1, foo(%rip)
10856 ; O2-NEXT:    popq %rbx
10857 ; O2-NEXT:    .cfi_def_cfa_offset 8
10858 ; O2-NEXT:    retq
10860 ; O3-LABEL: atomic128_store_release:
10861 ; O3:       # %bb.0: # %entry
10862 ; O3-NEXT:    pushq %rbx
10863 ; O3-NEXT:    .cfi_def_cfa_offset 16
10864 ; O3-NEXT:    .cfi_offset %rbx, -16
10865 ; O3-NEXT:    movq foo(%rip), %rax
10866 ; O3-NEXT:  .Lpcsection406:
10867 ; O3-NEXT:    movq (%rdi), %rax
10868 ; O3-NEXT:  .Lpcsection407:
10869 ; O3-NEXT:    movq 8(%rdi), %rdx
10870 ; O3-NEXT:  .Lpcsection408:
10871 ; O3-NEXT:    movl $42, %ebx
10872 ; O3-NEXT:    .p2align 4, 0x90
10873 ; O3-NEXT:  .LBB205_1: # %atomicrmw.start
10874 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
10875 ; O3-NEXT:  .Lpcsection409:
10876 ; O3-NEXT:    xorl %ecx, %ecx
10877 ; O3-NEXT:  .Lpcsection410:
10878 ; O3-NEXT:    lock cmpxchg16b (%rdi)
10879 ; O3-NEXT:  .Lpcsection411:
10880 ; O3-NEXT:    jne .LBB205_1
10881 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
10882 ; O3-NEXT:    movq $1, foo(%rip)
10883 ; O3-NEXT:    popq %rbx
10884 ; O3-NEXT:    .cfi_def_cfa_offset 8
10885 ; O3-NEXT:    retq
10886 entry:
10887   load volatile i64, ptr @foo, align 8
10888   store atomic i128 42, ptr %a release, align 16, !pcsections !0
10889   store volatile i64 1, ptr @foo, align 8
10890   ret void
10893 define void @atomic128_store_seq_cst(ptr %a) {
10894 ; O0-LABEL: atomic128_store_seq_cst:
10895 ; O0:       # %bb.0: # %entry
10896 ; O0-NEXT:    pushq %rbx
10897 ; O0-NEXT:    .cfi_def_cfa_offset 16
10898 ; O0-NEXT:    .cfi_offset %rbx, -16
10899 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10900 ; O0-NEXT:    movq foo(%rip), %rax
10901 ; O0-NEXT:  .Lpcsection447:
10902 ; O0-NEXT:    movq (%rdi), %rax
10903 ; O0-NEXT:  .Lpcsection448:
10904 ; O0-NEXT:    movq 8(%rdi), %rdx
10905 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10906 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10907 ; O0-NEXT:  .Lpcsection449:
10908 ; O0-NEXT:    jmp .LBB206_1
10909 ; O0-NEXT:  .LBB206_1: # %atomicrmw.start
10910 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
10911 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
10912 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
10913 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
10914 ; O0-NEXT:  .Lpcsection450:
10915 ; O0-NEXT:    xorl %ecx, %ecx
10916 ; O0-NEXT:  .Lpcsection451:
10917 ; O0-NEXT:    # kill: def $rcx killed $ecx
10918 ; O0-NEXT:  .Lpcsection452:
10919 ; O0-NEXT:    movl $42, %ebx
10920 ; O0-NEXT:  .Lpcsection453:
10921 ; O0-NEXT:    lock cmpxchg16b (%rsi)
10922 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10923 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
10924 ; O0-NEXT:  .Lpcsection454:
10925 ; O0-NEXT:    jne .LBB206_1
10926 ; O0-NEXT:    jmp .LBB206_2
10927 ; O0-NEXT:  .LBB206_2: # %atomicrmw.end
10928 ; O0-NEXT:    movq $1, foo
10929 ; O0-NEXT:    popq %rbx
10930 ; O0-NEXT:    .cfi_def_cfa_offset 8
10931 ; O0-NEXT:    retq
10933 ; O1-LABEL: atomic128_store_seq_cst:
10934 ; O1:       # %bb.0: # %entry
10935 ; O1-NEXT:    pushq %rbx
10936 ; O1-NEXT:    .cfi_def_cfa_offset 16
10937 ; O1-NEXT:    .cfi_offset %rbx, -16
10938 ; O1-NEXT:    movq foo(%rip), %rax
10939 ; O1-NEXT:  .Lpcsection412:
10940 ; O1-NEXT:    movq (%rdi), %rax
10941 ; O1-NEXT:  .Lpcsection413:
10942 ; O1-NEXT:    movq 8(%rdi), %rdx
10943 ; O1-NEXT:  .Lpcsection414:
10944 ; O1-NEXT:    movl $42, %ebx
10945 ; O1-NEXT:    .p2align 4, 0x90
10946 ; O1-NEXT:  .LBB206_1: # %atomicrmw.start
10947 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
10948 ; O1-NEXT:  .Lpcsection415:
10949 ; O1-NEXT:    xorl %ecx, %ecx
10950 ; O1-NEXT:  .Lpcsection416:
10951 ; O1-NEXT:    lock cmpxchg16b (%rdi)
10952 ; O1-NEXT:  .Lpcsection417:
10953 ; O1-NEXT:    jne .LBB206_1
10954 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
10955 ; O1-NEXT:    movq $1, foo(%rip)
10956 ; O1-NEXT:    popq %rbx
10957 ; O1-NEXT:    .cfi_def_cfa_offset 8
10958 ; O1-NEXT:    retq
10960 ; O2-LABEL: atomic128_store_seq_cst:
10961 ; O2:       # %bb.0: # %entry
10962 ; O2-NEXT:    pushq %rbx
10963 ; O2-NEXT:    .cfi_def_cfa_offset 16
10964 ; O2-NEXT:    .cfi_offset %rbx, -16
10965 ; O2-NEXT:    movq foo(%rip), %rax
10966 ; O2-NEXT:  .Lpcsection412:
10967 ; O2-NEXT:    movq (%rdi), %rax
10968 ; O2-NEXT:  .Lpcsection413:
10969 ; O2-NEXT:    movq 8(%rdi), %rdx
10970 ; O2-NEXT:  .Lpcsection414:
10971 ; O2-NEXT:    movl $42, %ebx
10972 ; O2-NEXT:    .p2align 4, 0x90
10973 ; O2-NEXT:  .LBB206_1: # %atomicrmw.start
10974 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
10975 ; O2-NEXT:  .Lpcsection415:
10976 ; O2-NEXT:    xorl %ecx, %ecx
10977 ; O2-NEXT:  .Lpcsection416:
10978 ; O2-NEXT:    lock cmpxchg16b (%rdi)
10979 ; O2-NEXT:  .Lpcsection417:
10980 ; O2-NEXT:    jne .LBB206_1
10981 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
10982 ; O2-NEXT:    movq $1, foo(%rip)
10983 ; O2-NEXT:    popq %rbx
10984 ; O2-NEXT:    .cfi_def_cfa_offset 8
10985 ; O2-NEXT:    retq
10987 ; O3-LABEL: atomic128_store_seq_cst:
10988 ; O3:       # %bb.0: # %entry
10989 ; O3-NEXT:    pushq %rbx
10990 ; O3-NEXT:    .cfi_def_cfa_offset 16
10991 ; O3-NEXT:    .cfi_offset %rbx, -16
10992 ; O3-NEXT:    movq foo(%rip), %rax
10993 ; O3-NEXT:  .Lpcsection412:
10994 ; O3-NEXT:    movq (%rdi), %rax
10995 ; O3-NEXT:  .Lpcsection413:
10996 ; O3-NEXT:    movq 8(%rdi), %rdx
10997 ; O3-NEXT:  .Lpcsection414:
10998 ; O3-NEXT:    movl $42, %ebx
10999 ; O3-NEXT:    .p2align 4, 0x90
11000 ; O3-NEXT:  .LBB206_1: # %atomicrmw.start
11001 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11002 ; O3-NEXT:  .Lpcsection415:
11003 ; O3-NEXT:    xorl %ecx, %ecx
11004 ; O3-NEXT:  .Lpcsection416:
11005 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11006 ; O3-NEXT:  .Lpcsection417:
11007 ; O3-NEXT:    jne .LBB206_1
11008 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11009 ; O3-NEXT:    movq $1, foo(%rip)
11010 ; O3-NEXT:    popq %rbx
11011 ; O3-NEXT:    .cfi_def_cfa_offset 8
11012 ; O3-NEXT:    retq
11013 entry:
11014   load volatile i64, ptr @foo, align 8
11015   store atomic i128 42, ptr %a seq_cst, align 16, !pcsections !0
11016   store volatile i64 1, ptr @foo, align 8
11017   ret void
11020 define void @atomic128_store_seq_cst_ptr_ty(ptr %a, ptr %v) {
11021 ; O0-LABEL: atomic128_store_seq_cst_ptr_ty:
11022 ; O0:       # %bb.0: # %entry
11023 ; O0-NEXT:    movq foo(%rip), %rax
11024 ; O0-NEXT:  .Lpcsection455:
11025 ; O0-NEXT:    xchgq %rsi, (%rdi)
11026 ; O0-NEXT:    movq $1, foo
11027 ; O0-NEXT:    retq
11029 ; O1-LABEL: atomic128_store_seq_cst_ptr_ty:
11030 ; O1:       # %bb.0: # %entry
11031 ; O1-NEXT:    movq foo(%rip), %rax
11032 ; O1-NEXT:  .Lpcsection418:
11033 ; O1-NEXT:    xchgq %rsi, (%rdi)
11034 ; O1-NEXT:    movq $1, foo(%rip)
11035 ; O1-NEXT:    retq
11037 ; O2-LABEL: atomic128_store_seq_cst_ptr_ty:
11038 ; O2:       # %bb.0: # %entry
11039 ; O2-NEXT:    movq foo(%rip), %rax
11040 ; O2-NEXT:  .Lpcsection418:
11041 ; O2-NEXT:    xchgq %rsi, (%rdi)
11042 ; O2-NEXT:    movq $1, foo(%rip)
11043 ; O2-NEXT:    retq
11045 ; O3-LABEL: atomic128_store_seq_cst_ptr_ty:
11046 ; O3:       # %bb.0: # %entry
11047 ; O3-NEXT:    movq foo(%rip), %rax
11048 ; O3-NEXT:  .Lpcsection418:
11049 ; O3-NEXT:    xchgq %rsi, (%rdi)
11050 ; O3-NEXT:    movq $1, foo(%rip)
11051 ; O3-NEXT:    retq
11052 entry:
11053   load volatile i64, ptr @foo, align 8
11054   store atomic ptr %v, ptr %a seq_cst, align 16, !pcsections !0
11055   store volatile i64 1, ptr @foo, align 8
11056   ret void
11059 define void @atomic128_xchg_monotonic(ptr %a) {
11060 ; O0-LABEL: atomic128_xchg_monotonic:
11061 ; O0:       # %bb.0: # %entry
11062 ; O0-NEXT:    pushq %rbx
11063 ; O0-NEXT:    .cfi_def_cfa_offset 16
11064 ; O0-NEXT:    .cfi_offset %rbx, -16
11065 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11066 ; O0-NEXT:    movq foo(%rip), %rax
11067 ; O0-NEXT:  .Lpcsection456:
11068 ; O0-NEXT:    movq (%rdi), %rax
11069 ; O0-NEXT:  .Lpcsection457:
11070 ; O0-NEXT:    movq 8(%rdi), %rdx
11071 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11072 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11073 ; O0-NEXT:  .Lpcsection458:
11074 ; O0-NEXT:    jmp .LBB208_1
11075 ; O0-NEXT:  .LBB208_1: # %atomicrmw.start
11076 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11077 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
11078 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11079 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11080 ; O0-NEXT:  .Lpcsection459:
11081 ; O0-NEXT:    xorl %ecx, %ecx
11082 ; O0-NEXT:  .Lpcsection460:
11083 ; O0-NEXT:    # kill: def $rcx killed $ecx
11084 ; O0-NEXT:  .Lpcsection461:
11085 ; O0-NEXT:    movl $42, %ebx
11086 ; O0-NEXT:  .Lpcsection462:
11087 ; O0-NEXT:    lock cmpxchg16b (%rsi)
11088 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11089 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11090 ; O0-NEXT:  .Lpcsection463:
11091 ; O0-NEXT:    jne .LBB208_1
11092 ; O0-NEXT:    jmp .LBB208_2
11093 ; O0-NEXT:  .LBB208_2: # %atomicrmw.end
11094 ; O0-NEXT:    movq $1, foo
11095 ; O0-NEXT:    popq %rbx
11096 ; O0-NEXT:    .cfi_def_cfa_offset 8
11097 ; O0-NEXT:    retq
11099 ; O1-LABEL: atomic128_xchg_monotonic:
11100 ; O1:       # %bb.0: # %entry
11101 ; O1-NEXT:    pushq %rbx
11102 ; O1-NEXT:    .cfi_def_cfa_offset 16
11103 ; O1-NEXT:    .cfi_offset %rbx, -16
11104 ; O1-NEXT:    movq foo(%rip), %rax
11105 ; O1-NEXT:  .Lpcsection419:
11106 ; O1-NEXT:    movq (%rdi), %rax
11107 ; O1-NEXT:  .Lpcsection420:
11108 ; O1-NEXT:    movq 8(%rdi), %rdx
11109 ; O1-NEXT:  .Lpcsection421:
11110 ; O1-NEXT:    movl $42, %ebx
11111 ; O1-NEXT:    .p2align 4, 0x90
11112 ; O1-NEXT:  .LBB208_1: # %atomicrmw.start
11113 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
11114 ; O1-NEXT:  .Lpcsection422:
11115 ; O1-NEXT:    xorl %ecx, %ecx
11116 ; O1-NEXT:  .Lpcsection423:
11117 ; O1-NEXT:    lock cmpxchg16b (%rdi)
11118 ; O1-NEXT:  .Lpcsection424:
11119 ; O1-NEXT:    jne .LBB208_1
11120 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
11121 ; O1-NEXT:    movq $1, foo(%rip)
11122 ; O1-NEXT:    popq %rbx
11123 ; O1-NEXT:    .cfi_def_cfa_offset 8
11124 ; O1-NEXT:    retq
11126 ; O2-LABEL: atomic128_xchg_monotonic:
11127 ; O2:       # %bb.0: # %entry
11128 ; O2-NEXT:    pushq %rbx
11129 ; O2-NEXT:    .cfi_def_cfa_offset 16
11130 ; O2-NEXT:    .cfi_offset %rbx, -16
11131 ; O2-NEXT:    movq foo(%rip), %rax
11132 ; O2-NEXT:  .Lpcsection419:
11133 ; O2-NEXT:    movq (%rdi), %rax
11134 ; O2-NEXT:  .Lpcsection420:
11135 ; O2-NEXT:    movq 8(%rdi), %rdx
11136 ; O2-NEXT:  .Lpcsection421:
11137 ; O2-NEXT:    movl $42, %ebx
11138 ; O2-NEXT:    .p2align 4, 0x90
11139 ; O2-NEXT:  .LBB208_1: # %atomicrmw.start
11140 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
11141 ; O2-NEXT:  .Lpcsection422:
11142 ; O2-NEXT:    xorl %ecx, %ecx
11143 ; O2-NEXT:  .Lpcsection423:
11144 ; O2-NEXT:    lock cmpxchg16b (%rdi)
11145 ; O2-NEXT:  .Lpcsection424:
11146 ; O2-NEXT:    jne .LBB208_1
11147 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
11148 ; O2-NEXT:    movq $1, foo(%rip)
11149 ; O2-NEXT:    popq %rbx
11150 ; O2-NEXT:    .cfi_def_cfa_offset 8
11151 ; O2-NEXT:    retq
11153 ; O3-LABEL: atomic128_xchg_monotonic:
11154 ; O3:       # %bb.0: # %entry
11155 ; O3-NEXT:    pushq %rbx
11156 ; O3-NEXT:    .cfi_def_cfa_offset 16
11157 ; O3-NEXT:    .cfi_offset %rbx, -16
11158 ; O3-NEXT:    movq foo(%rip), %rax
11159 ; O3-NEXT:  .Lpcsection419:
11160 ; O3-NEXT:    movq (%rdi), %rax
11161 ; O3-NEXT:  .Lpcsection420:
11162 ; O3-NEXT:    movq 8(%rdi), %rdx
11163 ; O3-NEXT:  .Lpcsection421:
11164 ; O3-NEXT:    movl $42, %ebx
11165 ; O3-NEXT:    .p2align 4, 0x90
11166 ; O3-NEXT:  .LBB208_1: # %atomicrmw.start
11167 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11168 ; O3-NEXT:  .Lpcsection422:
11169 ; O3-NEXT:    xorl %ecx, %ecx
11170 ; O3-NEXT:  .Lpcsection423:
11171 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11172 ; O3-NEXT:  .Lpcsection424:
11173 ; O3-NEXT:    jne .LBB208_1
11174 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11175 ; O3-NEXT:    movq $1, foo(%rip)
11176 ; O3-NEXT:    popq %rbx
11177 ; O3-NEXT:    .cfi_def_cfa_offset 8
11178 ; O3-NEXT:    retq
11179 entry:
11180   load volatile i64, ptr @foo, align 8
11181   %x = atomicrmw xchg ptr %a, i128 42 monotonic, align 16, !pcsections !0
11182   store volatile i64 1, ptr @foo, align 8
11183   ret void
11186 define void @atomic128_add_monotonic(ptr %a) {
11187 ; O0-LABEL: atomic128_add_monotonic:
11188 ; O0:       # %bb.0: # %entry
11189 ; O0-NEXT:    pushq %rbx
11190 ; O0-NEXT:    .cfi_def_cfa_offset 16
11191 ; O0-NEXT:    .cfi_offset %rbx, -16
11192 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11193 ; O0-NEXT:    movq foo(%rip), %rax
11194 ; O0-NEXT:  .Lpcsection464:
11195 ; O0-NEXT:    movq (%rdi), %rax
11196 ; O0-NEXT:  .Lpcsection465:
11197 ; O0-NEXT:    movq 8(%rdi), %rdx
11198 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11199 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11200 ; O0-NEXT:  .Lpcsection466:
11201 ; O0-NEXT:    jmp .LBB209_1
11202 ; O0-NEXT:  .LBB209_1: # %atomicrmw.start
11203 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11204 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
11205 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11206 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11207 ; O0-NEXT:    movq %rax, %rbx
11208 ; O0-NEXT:  .Lpcsection467:
11209 ; O0-NEXT:    addq $42, %rbx
11210 ; O0-NEXT:    movq %rdx, %rcx
11211 ; O0-NEXT:  .Lpcsection468:
11212 ; O0-NEXT:    adcq $0, %rcx
11213 ; O0-NEXT:  .Lpcsection469:
11214 ; O0-NEXT:    lock cmpxchg16b (%rsi)
11215 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11216 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11217 ; O0-NEXT:  .Lpcsection470:
11218 ; O0-NEXT:    jne .LBB209_1
11219 ; O0-NEXT:    jmp .LBB209_2
11220 ; O0-NEXT:  .LBB209_2: # %atomicrmw.end
11221 ; O0-NEXT:    movq $1, foo
11222 ; O0-NEXT:    popq %rbx
11223 ; O0-NEXT:    .cfi_def_cfa_offset 8
11224 ; O0-NEXT:    retq
11226 ; O1-LABEL: atomic128_add_monotonic:
11227 ; O1:       # %bb.0: # %entry
11228 ; O1-NEXT:    pushq %rbx
11229 ; O1-NEXT:    .cfi_def_cfa_offset 16
11230 ; O1-NEXT:    .cfi_offset %rbx, -16
11231 ; O1-NEXT:    movq foo(%rip), %rax
11232 ; O1-NEXT:  .Lpcsection425:
11233 ; O1-NEXT:    movq (%rdi), %rax
11234 ; O1-NEXT:  .Lpcsection426:
11235 ; O1-NEXT:    movq 8(%rdi), %rdx
11236 ; O1-NEXT:    .p2align 4, 0x90
11237 ; O1-NEXT:  .LBB209_1: # %atomicrmw.start
11238 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
11239 ; O1-NEXT:    movq %rax, %rbx
11240 ; O1-NEXT:  .Lpcsection427:
11241 ; O1-NEXT:    addq $42, %rbx
11242 ; O1-NEXT:    movq %rdx, %rcx
11243 ; O1-NEXT:  .Lpcsection428:
11244 ; O1-NEXT:    adcq $0, %rcx
11245 ; O1-NEXT:  .Lpcsection429:
11246 ; O1-NEXT:    lock cmpxchg16b (%rdi)
11247 ; O1-NEXT:  .Lpcsection430:
11248 ; O1-NEXT:    jne .LBB209_1
11249 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
11250 ; O1-NEXT:    movq $1, foo(%rip)
11251 ; O1-NEXT:    popq %rbx
11252 ; O1-NEXT:    .cfi_def_cfa_offset 8
11253 ; O1-NEXT:    retq
11255 ; O2-LABEL: atomic128_add_monotonic:
11256 ; O2:       # %bb.0: # %entry
11257 ; O2-NEXT:    pushq %rbx
11258 ; O2-NEXT:    .cfi_def_cfa_offset 16
11259 ; O2-NEXT:    .cfi_offset %rbx, -16
11260 ; O2-NEXT:    movq foo(%rip), %rax
11261 ; O2-NEXT:  .Lpcsection425:
11262 ; O2-NEXT:    movq (%rdi), %rax
11263 ; O2-NEXT:  .Lpcsection426:
11264 ; O2-NEXT:    movq 8(%rdi), %rdx
11265 ; O2-NEXT:    .p2align 4, 0x90
11266 ; O2-NEXT:  .LBB209_1: # %atomicrmw.start
11267 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
11268 ; O2-NEXT:    movq %rax, %rbx
11269 ; O2-NEXT:  .Lpcsection427:
11270 ; O2-NEXT:    addq $42, %rbx
11271 ; O2-NEXT:    movq %rdx, %rcx
11272 ; O2-NEXT:  .Lpcsection428:
11273 ; O2-NEXT:    adcq $0, %rcx
11274 ; O2-NEXT:  .Lpcsection429:
11275 ; O2-NEXT:    lock cmpxchg16b (%rdi)
11276 ; O2-NEXT:  .Lpcsection430:
11277 ; O2-NEXT:    jne .LBB209_1
11278 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
11279 ; O2-NEXT:    movq $1, foo(%rip)
11280 ; O2-NEXT:    popq %rbx
11281 ; O2-NEXT:    .cfi_def_cfa_offset 8
11282 ; O2-NEXT:    retq
11284 ; O3-LABEL: atomic128_add_monotonic:
11285 ; O3:       # %bb.0: # %entry
11286 ; O3-NEXT:    pushq %rbx
11287 ; O3-NEXT:    .cfi_def_cfa_offset 16
11288 ; O3-NEXT:    .cfi_offset %rbx, -16
11289 ; O3-NEXT:    movq foo(%rip), %rax
11290 ; O3-NEXT:  .Lpcsection425:
11291 ; O3-NEXT:    movq (%rdi), %rax
11292 ; O3-NEXT:  .Lpcsection426:
11293 ; O3-NEXT:    movq 8(%rdi), %rdx
11294 ; O3-NEXT:    .p2align 4, 0x90
11295 ; O3-NEXT:  .LBB209_1: # %atomicrmw.start
11296 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11297 ; O3-NEXT:    movq %rax, %rbx
11298 ; O3-NEXT:  .Lpcsection427:
11299 ; O3-NEXT:    addq $42, %rbx
11300 ; O3-NEXT:    movq %rdx, %rcx
11301 ; O3-NEXT:  .Lpcsection428:
11302 ; O3-NEXT:    adcq $0, %rcx
11303 ; O3-NEXT:  .Lpcsection429:
11304 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11305 ; O3-NEXT:  .Lpcsection430:
11306 ; O3-NEXT:    jne .LBB209_1
11307 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11308 ; O3-NEXT:    movq $1, foo(%rip)
11309 ; O3-NEXT:    popq %rbx
11310 ; O3-NEXT:    .cfi_def_cfa_offset 8
11311 ; O3-NEXT:    retq
11312 entry:
11313   load volatile i64, ptr @foo, align 8
11314   %x = atomicrmw add ptr %a, i128 42 monotonic, align 16, !pcsections !0
11315   store volatile i64 1, ptr @foo, align 8
11316   ret void
11319 define void @atomic128_sub_monotonic(ptr %a) {
11320 ; O0-LABEL: atomic128_sub_monotonic:
11321 ; O0:       # %bb.0: # %entry
11322 ; O0-NEXT:    pushq %rbx
11323 ; O0-NEXT:    .cfi_def_cfa_offset 16
11324 ; O0-NEXT:    .cfi_offset %rbx, -16
11325 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11326 ; O0-NEXT:    movq foo(%rip), %rax
11327 ; O0-NEXT:  .Lpcsection471:
11328 ; O0-NEXT:    movq (%rdi), %rax
11329 ; O0-NEXT:  .Lpcsection472:
11330 ; O0-NEXT:    movq 8(%rdi), %rdx
11331 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11332 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11333 ; O0-NEXT:  .Lpcsection473:
11334 ; O0-NEXT:    jmp .LBB210_1
11335 ; O0-NEXT:  .LBB210_1: # %atomicrmw.start
11336 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11337 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
11338 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11339 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11340 ; O0-NEXT:    movq %rax, %rbx
11341 ; O0-NEXT:  .Lpcsection474:
11342 ; O0-NEXT:    addq $-42, %rbx
11343 ; O0-NEXT:    movq %rdx, %rcx
11344 ; O0-NEXT:  .Lpcsection475:
11345 ; O0-NEXT:    adcq $-1, %rcx
11346 ; O0-NEXT:  .Lpcsection476:
11347 ; O0-NEXT:    lock cmpxchg16b (%rsi)
11348 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11349 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11350 ; O0-NEXT:  .Lpcsection477:
11351 ; O0-NEXT:    jne .LBB210_1
11352 ; O0-NEXT:    jmp .LBB210_2
11353 ; O0-NEXT:  .LBB210_2: # %atomicrmw.end
11354 ; O0-NEXT:    movq $1, foo
11355 ; O0-NEXT:    popq %rbx
11356 ; O0-NEXT:    .cfi_def_cfa_offset 8
11357 ; O0-NEXT:    retq
11359 ; O1-LABEL: atomic128_sub_monotonic:
11360 ; O1:       # %bb.0: # %entry
11361 ; O1-NEXT:    pushq %rbx
11362 ; O1-NEXT:    .cfi_def_cfa_offset 16
11363 ; O1-NEXT:    .cfi_offset %rbx, -16
11364 ; O1-NEXT:    movq foo(%rip), %rax
11365 ; O1-NEXT:  .Lpcsection431:
11366 ; O1-NEXT:    movq (%rdi), %rax
11367 ; O1-NEXT:  .Lpcsection432:
11368 ; O1-NEXT:    movq 8(%rdi), %rdx
11369 ; O1-NEXT:    .p2align 4, 0x90
11370 ; O1-NEXT:  .LBB210_1: # %atomicrmw.start
11371 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
11372 ; O1-NEXT:    movq %rax, %rbx
11373 ; O1-NEXT:  .Lpcsection433:
11374 ; O1-NEXT:    addq $-42, %rbx
11375 ; O1-NEXT:    movq %rdx, %rcx
11376 ; O1-NEXT:  .Lpcsection434:
11377 ; O1-NEXT:    adcq $-1, %rcx
11378 ; O1-NEXT:  .Lpcsection435:
11379 ; O1-NEXT:    lock cmpxchg16b (%rdi)
11380 ; O1-NEXT:  .Lpcsection436:
11381 ; O1-NEXT:    jne .LBB210_1
11382 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
11383 ; O1-NEXT:    movq $1, foo(%rip)
11384 ; O1-NEXT:    popq %rbx
11385 ; O1-NEXT:    .cfi_def_cfa_offset 8
11386 ; O1-NEXT:    retq
11388 ; O2-LABEL: atomic128_sub_monotonic:
11389 ; O2:       # %bb.0: # %entry
11390 ; O2-NEXT:    pushq %rbx
11391 ; O2-NEXT:    .cfi_def_cfa_offset 16
11392 ; O2-NEXT:    .cfi_offset %rbx, -16
11393 ; O2-NEXT:    movq foo(%rip), %rax
11394 ; O2-NEXT:  .Lpcsection431:
11395 ; O2-NEXT:    movq (%rdi), %rax
11396 ; O2-NEXT:  .Lpcsection432:
11397 ; O2-NEXT:    movq 8(%rdi), %rdx
11398 ; O2-NEXT:    .p2align 4, 0x90
11399 ; O2-NEXT:  .LBB210_1: # %atomicrmw.start
11400 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
11401 ; O2-NEXT:    movq %rax, %rbx
11402 ; O2-NEXT:  .Lpcsection433:
11403 ; O2-NEXT:    addq $-42, %rbx
11404 ; O2-NEXT:    movq %rdx, %rcx
11405 ; O2-NEXT:  .Lpcsection434:
11406 ; O2-NEXT:    adcq $-1, %rcx
11407 ; O2-NEXT:  .Lpcsection435:
11408 ; O2-NEXT:    lock cmpxchg16b (%rdi)
11409 ; O2-NEXT:  .Lpcsection436:
11410 ; O2-NEXT:    jne .LBB210_1
11411 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
11412 ; O2-NEXT:    movq $1, foo(%rip)
11413 ; O2-NEXT:    popq %rbx
11414 ; O2-NEXT:    .cfi_def_cfa_offset 8
11415 ; O2-NEXT:    retq
11417 ; O3-LABEL: atomic128_sub_monotonic:
11418 ; O3:       # %bb.0: # %entry
11419 ; O3-NEXT:    pushq %rbx
11420 ; O3-NEXT:    .cfi_def_cfa_offset 16
11421 ; O3-NEXT:    .cfi_offset %rbx, -16
11422 ; O3-NEXT:    movq foo(%rip), %rax
11423 ; O3-NEXT:  .Lpcsection431:
11424 ; O3-NEXT:    movq (%rdi), %rax
11425 ; O3-NEXT:  .Lpcsection432:
11426 ; O3-NEXT:    movq 8(%rdi), %rdx
11427 ; O3-NEXT:    .p2align 4, 0x90
11428 ; O3-NEXT:  .LBB210_1: # %atomicrmw.start
11429 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11430 ; O3-NEXT:    movq %rax, %rbx
11431 ; O3-NEXT:  .Lpcsection433:
11432 ; O3-NEXT:    addq $-42, %rbx
11433 ; O3-NEXT:    movq %rdx, %rcx
11434 ; O3-NEXT:  .Lpcsection434:
11435 ; O3-NEXT:    adcq $-1, %rcx
11436 ; O3-NEXT:  .Lpcsection435:
11437 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11438 ; O3-NEXT:  .Lpcsection436:
11439 ; O3-NEXT:    jne .LBB210_1
11440 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11441 ; O3-NEXT:    movq $1, foo(%rip)
11442 ; O3-NEXT:    popq %rbx
11443 ; O3-NEXT:    .cfi_def_cfa_offset 8
11444 ; O3-NEXT:    retq
11445 entry:
11446   load volatile i64, ptr @foo, align 8
11447   %x = atomicrmw sub ptr %a, i128 42 monotonic, align 16, !pcsections !0
11448   store volatile i64 1, ptr @foo, align 8
11449   ret void
11452 define void @atomic128_and_monotonic(ptr %a) {
11453 ; O0-LABEL: atomic128_and_monotonic:
11454 ; O0:       # %bb.0: # %entry
11455 ; O0-NEXT:    pushq %rbx
11456 ; O0-NEXT:    .cfi_def_cfa_offset 16
11457 ; O0-NEXT:    .cfi_offset %rbx, -16
11458 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11459 ; O0-NEXT:    movq foo(%rip), %rax
11460 ; O0-NEXT:  .Lpcsection478:
11461 ; O0-NEXT:    movq (%rdi), %rax
11462 ; O0-NEXT:  .Lpcsection479:
11463 ; O0-NEXT:    movq 8(%rdi), %rdx
11464 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11465 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11466 ; O0-NEXT:  .Lpcsection480:
11467 ; O0-NEXT:    jmp .LBB211_1
11468 ; O0-NEXT:  .LBB211_1: # %atomicrmw.start
11469 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11470 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
11471 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11472 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11473 ; O0-NEXT:    movl %eax, %ecx
11474 ; O0-NEXT:  .Lpcsection481:
11475 ; O0-NEXT:    andl $42, %ecx
11476 ; O0-NEXT:    movl %ecx, %ebx
11477 ; O0-NEXT:  .Lpcsection482:
11478 ; O0-NEXT:    xorl %ecx, %ecx
11479 ; O0-NEXT:  .Lpcsection483:
11480 ; O0-NEXT:    # kill: def $rcx killed $ecx
11481 ; O0-NEXT:  .Lpcsection484:
11482 ; O0-NEXT:    lock cmpxchg16b (%rsi)
11483 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11484 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11485 ; O0-NEXT:  .Lpcsection485:
11486 ; O0-NEXT:    jne .LBB211_1
11487 ; O0-NEXT:    jmp .LBB211_2
11488 ; O0-NEXT:  .LBB211_2: # %atomicrmw.end
11489 ; O0-NEXT:    movq $1, foo
11490 ; O0-NEXT:    popq %rbx
11491 ; O0-NEXT:    .cfi_def_cfa_offset 8
11492 ; O0-NEXT:    retq
11494 ; O1-LABEL: atomic128_and_monotonic:
11495 ; O1:       # %bb.0: # %entry
11496 ; O1-NEXT:    pushq %rbx
11497 ; O1-NEXT:    .cfi_def_cfa_offset 16
11498 ; O1-NEXT:    .cfi_offset %rbx, -16
11499 ; O1-NEXT:    movq foo(%rip), %rax
11500 ; O1-NEXT:  .Lpcsection437:
11501 ; O1-NEXT:    movq (%rdi), %rax
11502 ; O1-NEXT:  .Lpcsection438:
11503 ; O1-NEXT:    movq 8(%rdi), %rdx
11504 ; O1-NEXT:    .p2align 4, 0x90
11505 ; O1-NEXT:  .LBB211_1: # %atomicrmw.start
11506 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
11507 ; O1-NEXT:    movl %eax, %ebx
11508 ; O1-NEXT:  .Lpcsection439:
11509 ; O1-NEXT:    andl $42, %ebx
11510 ; O1-NEXT:  .Lpcsection440:
11511 ; O1-NEXT:    xorl %ecx, %ecx
11512 ; O1-NEXT:  .Lpcsection441:
11513 ; O1-NEXT:    lock cmpxchg16b (%rdi)
11514 ; O1-NEXT:  .Lpcsection442:
11515 ; O1-NEXT:    jne .LBB211_1
11516 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
11517 ; O1-NEXT:    movq $1, foo(%rip)
11518 ; O1-NEXT:    popq %rbx
11519 ; O1-NEXT:    .cfi_def_cfa_offset 8
11520 ; O1-NEXT:    retq
11522 ; O2-LABEL: atomic128_and_monotonic:
11523 ; O2:       # %bb.0: # %entry
11524 ; O2-NEXT:    pushq %rbx
11525 ; O2-NEXT:    .cfi_def_cfa_offset 16
11526 ; O2-NEXT:    .cfi_offset %rbx, -16
11527 ; O2-NEXT:    movq foo(%rip), %rax
11528 ; O2-NEXT:  .Lpcsection437:
11529 ; O2-NEXT:    movq (%rdi), %rax
11530 ; O2-NEXT:  .Lpcsection438:
11531 ; O2-NEXT:    movq 8(%rdi), %rdx
11532 ; O2-NEXT:    .p2align 4, 0x90
11533 ; O2-NEXT:  .LBB211_1: # %atomicrmw.start
11534 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
11535 ; O2-NEXT:    movl %eax, %ebx
11536 ; O2-NEXT:  .Lpcsection439:
11537 ; O2-NEXT:    andl $42, %ebx
11538 ; O2-NEXT:  .Lpcsection440:
11539 ; O2-NEXT:    xorl %ecx, %ecx
11540 ; O2-NEXT:  .Lpcsection441:
11541 ; O2-NEXT:    lock cmpxchg16b (%rdi)
11542 ; O2-NEXT:  .Lpcsection442:
11543 ; O2-NEXT:    jne .LBB211_1
11544 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
11545 ; O2-NEXT:    movq $1, foo(%rip)
11546 ; O2-NEXT:    popq %rbx
11547 ; O2-NEXT:    .cfi_def_cfa_offset 8
11548 ; O2-NEXT:    retq
11550 ; O3-LABEL: atomic128_and_monotonic:
11551 ; O3:       # %bb.0: # %entry
11552 ; O3-NEXT:    pushq %rbx
11553 ; O3-NEXT:    .cfi_def_cfa_offset 16
11554 ; O3-NEXT:    .cfi_offset %rbx, -16
11555 ; O3-NEXT:    movq foo(%rip), %rax
11556 ; O3-NEXT:  .Lpcsection437:
11557 ; O3-NEXT:    movq (%rdi), %rax
11558 ; O3-NEXT:  .Lpcsection438:
11559 ; O3-NEXT:    movq 8(%rdi), %rdx
11560 ; O3-NEXT:    .p2align 4, 0x90
11561 ; O3-NEXT:  .LBB211_1: # %atomicrmw.start
11562 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11563 ; O3-NEXT:    movl %eax, %ebx
11564 ; O3-NEXT:  .Lpcsection439:
11565 ; O3-NEXT:    andl $42, %ebx
11566 ; O3-NEXT:  .Lpcsection440:
11567 ; O3-NEXT:    xorl %ecx, %ecx
11568 ; O3-NEXT:  .Lpcsection441:
11569 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11570 ; O3-NEXT:  .Lpcsection442:
11571 ; O3-NEXT:    jne .LBB211_1
11572 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11573 ; O3-NEXT:    movq $1, foo(%rip)
11574 ; O3-NEXT:    popq %rbx
11575 ; O3-NEXT:    .cfi_def_cfa_offset 8
11576 ; O3-NEXT:    retq
11577 entry:
11578   load volatile i64, ptr @foo, align 8
11579   %x = atomicrmw and ptr %a, i128 42 monotonic, align 16, !pcsections !0
11580   store volatile i64 1, ptr @foo, align 8
11581   ret void
11584 define void @atomic128_or_monotonic(ptr %a) {
11585 ; O0-LABEL: atomic128_or_monotonic:
11586 ; O0:       # %bb.0: # %entry
11587 ; O0-NEXT:    pushq %rbx
11588 ; O0-NEXT:    .cfi_def_cfa_offset 16
11589 ; O0-NEXT:    .cfi_offset %rbx, -16
11590 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11591 ; O0-NEXT:    movq foo(%rip), %rax
11592 ; O0-NEXT:  .Lpcsection486:
11593 ; O0-NEXT:    movq (%rdi), %rax
11594 ; O0-NEXT:  .Lpcsection487:
11595 ; O0-NEXT:    movq 8(%rdi), %rdx
11596 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11597 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11598 ; O0-NEXT:  .Lpcsection488:
11599 ; O0-NEXT:    jmp .LBB212_1
11600 ; O0-NEXT:  .LBB212_1: # %atomicrmw.start
11601 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11602 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
11603 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11604 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11605 ; O0-NEXT:    movq %rax, %rbx
11606 ; O0-NEXT:  .Lpcsection489:
11607 ; O0-NEXT:    orq $42, %rbx
11608 ; O0-NEXT:    movq %rcx, %rdx
11609 ; O0-NEXT:  .Lpcsection490:
11610 ; O0-NEXT:    lock cmpxchg16b (%rsi)
11611 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11612 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11613 ; O0-NEXT:  .Lpcsection491:
11614 ; O0-NEXT:    jne .LBB212_1
11615 ; O0-NEXT:    jmp .LBB212_2
11616 ; O0-NEXT:  .LBB212_2: # %atomicrmw.end
11617 ; O0-NEXT:    movq $1, foo
11618 ; O0-NEXT:    popq %rbx
11619 ; O0-NEXT:    .cfi_def_cfa_offset 8
11620 ; O0-NEXT:    retq
11622 ; O1-LABEL: atomic128_or_monotonic:
11623 ; O1:       # %bb.0: # %entry
11624 ; O1-NEXT:    pushq %rbx
11625 ; O1-NEXT:    .cfi_def_cfa_offset 16
11626 ; O1-NEXT:    .cfi_offset %rbx, -16
11627 ; O1-NEXT:    movq foo(%rip), %rax
11628 ; O1-NEXT:  .Lpcsection443:
11629 ; O1-NEXT:    movq (%rdi), %rax
11630 ; O1-NEXT:  .Lpcsection444:
11631 ; O1-NEXT:    movq 8(%rdi), %rdx
11632 ; O1-NEXT:    .p2align 4, 0x90
11633 ; O1-NEXT:  .LBB212_1: # %atomicrmw.start
11634 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
11635 ; O1-NEXT:    movq %rax, %rbx
11636 ; O1-NEXT:  .Lpcsection445:
11637 ; O1-NEXT:    orq $42, %rbx
11638 ; O1-NEXT:    movq %rdx, %rcx
11639 ; O1-NEXT:  .Lpcsection446:
11640 ; O1-NEXT:    lock cmpxchg16b (%rdi)
11641 ; O1-NEXT:  .Lpcsection447:
11642 ; O1-NEXT:    jne .LBB212_1
11643 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
11644 ; O1-NEXT:    movq $1, foo(%rip)
11645 ; O1-NEXT:    popq %rbx
11646 ; O1-NEXT:    .cfi_def_cfa_offset 8
11647 ; O1-NEXT:    retq
11649 ; O2-LABEL: atomic128_or_monotonic:
11650 ; O2:       # %bb.0: # %entry
11651 ; O2-NEXT:    pushq %rbx
11652 ; O2-NEXT:    .cfi_def_cfa_offset 16
11653 ; O2-NEXT:    .cfi_offset %rbx, -16
11654 ; O2-NEXT:    movq foo(%rip), %rax
11655 ; O2-NEXT:  .Lpcsection443:
11656 ; O2-NEXT:    movq (%rdi), %rax
11657 ; O2-NEXT:  .Lpcsection444:
11658 ; O2-NEXT:    movq 8(%rdi), %rdx
11659 ; O2-NEXT:    .p2align 4, 0x90
11660 ; O2-NEXT:  .LBB212_1: # %atomicrmw.start
11661 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
11662 ; O2-NEXT:    movq %rax, %rbx
11663 ; O2-NEXT:  .Lpcsection445:
11664 ; O2-NEXT:    orq $42, %rbx
11665 ; O2-NEXT:    movq %rdx, %rcx
11666 ; O2-NEXT:  .Lpcsection446:
11667 ; O2-NEXT:    lock cmpxchg16b (%rdi)
11668 ; O2-NEXT:  .Lpcsection447:
11669 ; O2-NEXT:    jne .LBB212_1
11670 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
11671 ; O2-NEXT:    movq $1, foo(%rip)
11672 ; O2-NEXT:    popq %rbx
11673 ; O2-NEXT:    .cfi_def_cfa_offset 8
11674 ; O2-NEXT:    retq
11676 ; O3-LABEL: atomic128_or_monotonic:
11677 ; O3:       # %bb.0: # %entry
11678 ; O3-NEXT:    pushq %rbx
11679 ; O3-NEXT:    .cfi_def_cfa_offset 16
11680 ; O3-NEXT:    .cfi_offset %rbx, -16
11681 ; O3-NEXT:    movq foo(%rip), %rax
11682 ; O3-NEXT:  .Lpcsection443:
11683 ; O3-NEXT:    movq (%rdi), %rax
11684 ; O3-NEXT:  .Lpcsection444:
11685 ; O3-NEXT:    movq 8(%rdi), %rdx
11686 ; O3-NEXT:    .p2align 4, 0x90
11687 ; O3-NEXT:  .LBB212_1: # %atomicrmw.start
11688 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11689 ; O3-NEXT:    movq %rax, %rbx
11690 ; O3-NEXT:  .Lpcsection445:
11691 ; O3-NEXT:    orq $42, %rbx
11692 ; O3-NEXT:    movq %rdx, %rcx
11693 ; O3-NEXT:  .Lpcsection446:
11694 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11695 ; O3-NEXT:  .Lpcsection447:
11696 ; O3-NEXT:    jne .LBB212_1
11697 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11698 ; O3-NEXT:    movq $1, foo(%rip)
11699 ; O3-NEXT:    popq %rbx
11700 ; O3-NEXT:    .cfi_def_cfa_offset 8
11701 ; O3-NEXT:    retq
11702 entry:
11703   load volatile i64, ptr @foo, align 8
11704   %x = atomicrmw or ptr %a, i128 42 monotonic, align 16, !pcsections !0
11705   store volatile i64 1, ptr @foo, align 8
11706   ret void
11709 define void @atomic128_xor_monotonic(ptr %a) {
11710 ; O0-LABEL: atomic128_xor_monotonic:
11711 ; O0:       # %bb.0: # %entry
11712 ; O0-NEXT:    pushq %rbx
11713 ; O0-NEXT:    .cfi_def_cfa_offset 16
11714 ; O0-NEXT:    .cfi_offset %rbx, -16
11715 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11716 ; O0-NEXT:    movq foo(%rip), %rax
11717 ; O0-NEXT:  .Lpcsection492:
11718 ; O0-NEXT:    movq (%rdi), %rax
11719 ; O0-NEXT:  .Lpcsection493:
11720 ; O0-NEXT:    movq 8(%rdi), %rdx
11721 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11722 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11723 ; O0-NEXT:  .Lpcsection494:
11724 ; O0-NEXT:    jmp .LBB213_1
11725 ; O0-NEXT:  .LBB213_1: # %atomicrmw.start
11726 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11727 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
11728 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11729 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11730 ; O0-NEXT:    movq %rax, %rbx
11731 ; O0-NEXT:  .Lpcsection495:
11732 ; O0-NEXT:    xorq $42, %rbx
11733 ; O0-NEXT:    movq %rcx, %rdx
11734 ; O0-NEXT:  .Lpcsection496:
11735 ; O0-NEXT:    lock cmpxchg16b (%rsi)
11736 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11737 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11738 ; O0-NEXT:  .Lpcsection497:
11739 ; O0-NEXT:    jne .LBB213_1
11740 ; O0-NEXT:    jmp .LBB213_2
11741 ; O0-NEXT:  .LBB213_2: # %atomicrmw.end
11742 ; O0-NEXT:    movq $1, foo
11743 ; O0-NEXT:    popq %rbx
11744 ; O0-NEXT:    .cfi_def_cfa_offset 8
11745 ; O0-NEXT:    retq
11747 ; O1-LABEL: atomic128_xor_monotonic:
11748 ; O1:       # %bb.0: # %entry
11749 ; O1-NEXT:    pushq %rbx
11750 ; O1-NEXT:    .cfi_def_cfa_offset 16
11751 ; O1-NEXT:    .cfi_offset %rbx, -16
11752 ; O1-NEXT:    movq foo(%rip), %rax
11753 ; O1-NEXT:  .Lpcsection448:
11754 ; O1-NEXT:    movq (%rdi), %rax
11755 ; O1-NEXT:  .Lpcsection449:
11756 ; O1-NEXT:    movq 8(%rdi), %rdx
11757 ; O1-NEXT:    .p2align 4, 0x90
11758 ; O1-NEXT:  .LBB213_1: # %atomicrmw.start
11759 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
11760 ; O1-NEXT:    movq %rax, %rbx
11761 ; O1-NEXT:  .Lpcsection450:
11762 ; O1-NEXT:    xorq $42, %rbx
11763 ; O1-NEXT:    movq %rdx, %rcx
11764 ; O1-NEXT:  .Lpcsection451:
11765 ; O1-NEXT:    lock cmpxchg16b (%rdi)
11766 ; O1-NEXT:  .Lpcsection452:
11767 ; O1-NEXT:    jne .LBB213_1
11768 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
11769 ; O1-NEXT:    movq $1, foo(%rip)
11770 ; O1-NEXT:    popq %rbx
11771 ; O1-NEXT:    .cfi_def_cfa_offset 8
11772 ; O1-NEXT:    retq
11774 ; O2-LABEL: atomic128_xor_monotonic:
11775 ; O2:       # %bb.0: # %entry
11776 ; O2-NEXT:    pushq %rbx
11777 ; O2-NEXT:    .cfi_def_cfa_offset 16
11778 ; O2-NEXT:    .cfi_offset %rbx, -16
11779 ; O2-NEXT:    movq foo(%rip), %rax
11780 ; O2-NEXT:  .Lpcsection448:
11781 ; O2-NEXT:    movq (%rdi), %rax
11782 ; O2-NEXT:  .Lpcsection449:
11783 ; O2-NEXT:    movq 8(%rdi), %rdx
11784 ; O2-NEXT:    .p2align 4, 0x90
11785 ; O2-NEXT:  .LBB213_1: # %atomicrmw.start
11786 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
11787 ; O2-NEXT:    movq %rax, %rbx
11788 ; O2-NEXT:  .Lpcsection450:
11789 ; O2-NEXT:    xorq $42, %rbx
11790 ; O2-NEXT:    movq %rdx, %rcx
11791 ; O2-NEXT:  .Lpcsection451:
11792 ; O2-NEXT:    lock cmpxchg16b (%rdi)
11793 ; O2-NEXT:  .Lpcsection452:
11794 ; O2-NEXT:    jne .LBB213_1
11795 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
11796 ; O2-NEXT:    movq $1, foo(%rip)
11797 ; O2-NEXT:    popq %rbx
11798 ; O2-NEXT:    .cfi_def_cfa_offset 8
11799 ; O2-NEXT:    retq
11801 ; O3-LABEL: atomic128_xor_monotonic:
11802 ; O3:       # %bb.0: # %entry
11803 ; O3-NEXT:    pushq %rbx
11804 ; O3-NEXT:    .cfi_def_cfa_offset 16
11805 ; O3-NEXT:    .cfi_offset %rbx, -16
11806 ; O3-NEXT:    movq foo(%rip), %rax
11807 ; O3-NEXT:  .Lpcsection448:
11808 ; O3-NEXT:    movq (%rdi), %rax
11809 ; O3-NEXT:  .Lpcsection449:
11810 ; O3-NEXT:    movq 8(%rdi), %rdx
11811 ; O3-NEXT:    .p2align 4, 0x90
11812 ; O3-NEXT:  .LBB213_1: # %atomicrmw.start
11813 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11814 ; O3-NEXT:    movq %rax, %rbx
11815 ; O3-NEXT:  .Lpcsection450:
11816 ; O3-NEXT:    xorq $42, %rbx
11817 ; O3-NEXT:    movq %rdx, %rcx
11818 ; O3-NEXT:  .Lpcsection451:
11819 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11820 ; O3-NEXT:  .Lpcsection452:
11821 ; O3-NEXT:    jne .LBB213_1
11822 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11823 ; O3-NEXT:    movq $1, foo(%rip)
11824 ; O3-NEXT:    popq %rbx
11825 ; O3-NEXT:    .cfi_def_cfa_offset 8
11826 ; O3-NEXT:    retq
11827 entry:
11828   load volatile i64, ptr @foo, align 8
11829   %x = atomicrmw xor ptr %a, i128 42 monotonic, align 16, !pcsections !0
11830   store volatile i64 1, ptr @foo, align 8
11831   ret void
11834 define void @atomic128_nand_monotonic(ptr %a) {
11835 ; O0-LABEL: atomic128_nand_monotonic:
11836 ; O0:       # %bb.0: # %entry
11837 ; O0-NEXT:    pushq %rbx
11838 ; O0-NEXT:    .cfi_def_cfa_offset 16
11839 ; O0-NEXT:    .cfi_offset %rbx, -16
11840 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11841 ; O0-NEXT:    movq foo(%rip), %rax
11842 ; O0-NEXT:  .Lpcsection498:
11843 ; O0-NEXT:    movq (%rdi), %rax
11844 ; O0-NEXT:  .Lpcsection499:
11845 ; O0-NEXT:    movq 8(%rdi), %rdx
11846 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11847 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11848 ; O0-NEXT:  .Lpcsection500:
11849 ; O0-NEXT:    jmp .LBB214_1
11850 ; O0-NEXT:  .LBB214_1: # %atomicrmw.start
11851 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11852 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
11853 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11854 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11855 ; O0-NEXT:    movl %eax, %ecx
11856 ; O0-NEXT:  .Lpcsection501:
11857 ; O0-NEXT:    notl %ecx
11858 ; O0-NEXT:  .Lpcsection502:
11859 ; O0-NEXT:    # implicit-def: $rbx
11860 ; O0-NEXT:    movl %ecx, %ebx
11861 ; O0-NEXT:  .Lpcsection503:
11862 ; O0-NEXT:    orq $-43, %rbx
11863 ; O0-NEXT:  .Lpcsection504:
11864 ; O0-NEXT:    movq $-1, %rcx
11865 ; O0-NEXT:  .Lpcsection505:
11866 ; O0-NEXT:    lock cmpxchg16b (%rsi)
11867 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11868 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11869 ; O0-NEXT:  .Lpcsection506:
11870 ; O0-NEXT:    jne .LBB214_1
11871 ; O0-NEXT:    jmp .LBB214_2
11872 ; O0-NEXT:  .LBB214_2: # %atomicrmw.end
11873 ; O0-NEXT:    movq $1, foo
11874 ; O0-NEXT:    popq %rbx
11875 ; O0-NEXT:    .cfi_def_cfa_offset 8
11876 ; O0-NEXT:    retq
11878 ; O1-LABEL: atomic128_nand_monotonic:
11879 ; O1:       # %bb.0: # %entry
11880 ; O1-NEXT:    pushq %rbx
11881 ; O1-NEXT:    .cfi_def_cfa_offset 16
11882 ; O1-NEXT:    .cfi_offset %rbx, -16
11883 ; O1-NEXT:    movq foo(%rip), %rax
11884 ; O1-NEXT:  .Lpcsection453:
11885 ; O1-NEXT:    movq (%rdi), %rax
11886 ; O1-NEXT:  .Lpcsection454:
11887 ; O1-NEXT:    movq 8(%rdi), %rdx
11888 ; O1-NEXT:  .Lpcsection455:
11889 ; O1-NEXT:    movq $-1, %rcx
11890 ; O1-NEXT:    .p2align 4, 0x90
11891 ; O1-NEXT:  .LBB214_1: # %atomicrmw.start
11892 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
11893 ; O1-NEXT:    movl %eax, %ebx
11894 ; O1-NEXT:  .Lpcsection456:
11895 ; O1-NEXT:    notl %ebx
11896 ; O1-NEXT:  .Lpcsection457:
11897 ; O1-NEXT:    orq $-43, %rbx
11898 ; O1-NEXT:  .Lpcsection458:
11899 ; O1-NEXT:    lock cmpxchg16b (%rdi)
11900 ; O1-NEXT:  .Lpcsection459:
11901 ; O1-NEXT:    jne .LBB214_1
11902 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
11903 ; O1-NEXT:    movq $1, foo(%rip)
11904 ; O1-NEXT:    popq %rbx
11905 ; O1-NEXT:    .cfi_def_cfa_offset 8
11906 ; O1-NEXT:    retq
11908 ; O2-LABEL: atomic128_nand_monotonic:
11909 ; O2:       # %bb.0: # %entry
11910 ; O2-NEXT:    pushq %rbx
11911 ; O2-NEXT:    .cfi_def_cfa_offset 16
11912 ; O2-NEXT:    .cfi_offset %rbx, -16
11913 ; O2-NEXT:    movq foo(%rip), %rax
11914 ; O2-NEXT:  .Lpcsection453:
11915 ; O2-NEXT:    movq (%rdi), %rax
11916 ; O2-NEXT:  .Lpcsection454:
11917 ; O2-NEXT:    movq 8(%rdi), %rdx
11918 ; O2-NEXT:  .Lpcsection455:
11919 ; O2-NEXT:    movq $-1, %rcx
11920 ; O2-NEXT:    .p2align 4, 0x90
11921 ; O2-NEXT:  .LBB214_1: # %atomicrmw.start
11922 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
11923 ; O2-NEXT:    movl %eax, %ebx
11924 ; O2-NEXT:  .Lpcsection456:
11925 ; O2-NEXT:    notl %ebx
11926 ; O2-NEXT:  .Lpcsection457:
11927 ; O2-NEXT:    orq $-43, %rbx
11928 ; O2-NEXT:  .Lpcsection458:
11929 ; O2-NEXT:    lock cmpxchg16b (%rdi)
11930 ; O2-NEXT:  .Lpcsection459:
11931 ; O2-NEXT:    jne .LBB214_1
11932 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
11933 ; O2-NEXT:    movq $1, foo(%rip)
11934 ; O2-NEXT:    popq %rbx
11935 ; O2-NEXT:    .cfi_def_cfa_offset 8
11936 ; O2-NEXT:    retq
11938 ; O3-LABEL: atomic128_nand_monotonic:
11939 ; O3:       # %bb.0: # %entry
11940 ; O3-NEXT:    pushq %rbx
11941 ; O3-NEXT:    .cfi_def_cfa_offset 16
11942 ; O3-NEXT:    .cfi_offset %rbx, -16
11943 ; O3-NEXT:    movq foo(%rip), %rax
11944 ; O3-NEXT:  .Lpcsection453:
11945 ; O3-NEXT:    movq (%rdi), %rax
11946 ; O3-NEXT:  .Lpcsection454:
11947 ; O3-NEXT:    movq 8(%rdi), %rdx
11948 ; O3-NEXT:  .Lpcsection455:
11949 ; O3-NEXT:    movq $-1, %rcx
11950 ; O3-NEXT:    .p2align 4, 0x90
11951 ; O3-NEXT:  .LBB214_1: # %atomicrmw.start
11952 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
11953 ; O3-NEXT:    movl %eax, %ebx
11954 ; O3-NEXT:  .Lpcsection456:
11955 ; O3-NEXT:    notl %ebx
11956 ; O3-NEXT:  .Lpcsection457:
11957 ; O3-NEXT:    orq $-43, %rbx
11958 ; O3-NEXT:  .Lpcsection458:
11959 ; O3-NEXT:    lock cmpxchg16b (%rdi)
11960 ; O3-NEXT:  .Lpcsection459:
11961 ; O3-NEXT:    jne .LBB214_1
11962 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
11963 ; O3-NEXT:    movq $1, foo(%rip)
11964 ; O3-NEXT:    popq %rbx
11965 ; O3-NEXT:    .cfi_def_cfa_offset 8
11966 ; O3-NEXT:    retq
11967 entry:
11968   load volatile i64, ptr @foo, align 8
11969   %x = atomicrmw nand ptr %a, i128 42 monotonic, align 16, !pcsections !0
11970   store volatile i64 1, ptr @foo, align 8
11971   ret void
11974 define void @atomic128_xchg_acquire(ptr %a) {
11975 ; O0-LABEL: atomic128_xchg_acquire:
11976 ; O0:       # %bb.0: # %entry
11977 ; O0-NEXT:    pushq %rbx
11978 ; O0-NEXT:    .cfi_def_cfa_offset 16
11979 ; O0-NEXT:    .cfi_offset %rbx, -16
11980 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11981 ; O0-NEXT:    movq foo(%rip), %rax
11982 ; O0-NEXT:  .Lpcsection507:
11983 ; O0-NEXT:    movq (%rdi), %rax
11984 ; O0-NEXT:  .Lpcsection508:
11985 ; O0-NEXT:    movq 8(%rdi), %rdx
11986 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11987 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
11988 ; O0-NEXT:  .Lpcsection509:
11989 ; O0-NEXT:    jmp .LBB215_1
11990 ; O0-NEXT:  .LBB215_1: # %atomicrmw.start
11991 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
11992 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
11993 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
11994 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
11995 ; O0-NEXT:  .Lpcsection510:
11996 ; O0-NEXT:    xorl %ecx, %ecx
11997 ; O0-NEXT:  .Lpcsection511:
11998 ; O0-NEXT:    # kill: def $rcx killed $ecx
11999 ; O0-NEXT:  .Lpcsection512:
12000 ; O0-NEXT:    movl $42, %ebx
12001 ; O0-NEXT:  .Lpcsection513:
12002 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12003 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12004 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12005 ; O0-NEXT:  .Lpcsection514:
12006 ; O0-NEXT:    jne .LBB215_1
12007 ; O0-NEXT:    jmp .LBB215_2
12008 ; O0-NEXT:  .LBB215_2: # %atomicrmw.end
12009 ; O0-NEXT:    movq $1, foo
12010 ; O0-NEXT:    popq %rbx
12011 ; O0-NEXT:    .cfi_def_cfa_offset 8
12012 ; O0-NEXT:    retq
12014 ; O1-LABEL: atomic128_xchg_acquire:
12015 ; O1:       # %bb.0: # %entry
12016 ; O1-NEXT:    pushq %rbx
12017 ; O1-NEXT:    .cfi_def_cfa_offset 16
12018 ; O1-NEXT:    .cfi_offset %rbx, -16
12019 ; O1-NEXT:    movq foo(%rip), %rax
12020 ; O1-NEXT:  .Lpcsection460:
12021 ; O1-NEXT:    movq (%rdi), %rax
12022 ; O1-NEXT:  .Lpcsection461:
12023 ; O1-NEXT:    movq 8(%rdi), %rdx
12024 ; O1-NEXT:  .Lpcsection462:
12025 ; O1-NEXT:    movl $42, %ebx
12026 ; O1-NEXT:    .p2align 4, 0x90
12027 ; O1-NEXT:  .LBB215_1: # %atomicrmw.start
12028 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12029 ; O1-NEXT:  .Lpcsection463:
12030 ; O1-NEXT:    xorl %ecx, %ecx
12031 ; O1-NEXT:  .Lpcsection464:
12032 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12033 ; O1-NEXT:  .Lpcsection465:
12034 ; O1-NEXT:    jne .LBB215_1
12035 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12036 ; O1-NEXT:    movq $1, foo(%rip)
12037 ; O1-NEXT:    popq %rbx
12038 ; O1-NEXT:    .cfi_def_cfa_offset 8
12039 ; O1-NEXT:    retq
12041 ; O2-LABEL: atomic128_xchg_acquire:
12042 ; O2:       # %bb.0: # %entry
12043 ; O2-NEXT:    pushq %rbx
12044 ; O2-NEXT:    .cfi_def_cfa_offset 16
12045 ; O2-NEXT:    .cfi_offset %rbx, -16
12046 ; O2-NEXT:    movq foo(%rip), %rax
12047 ; O2-NEXT:  .Lpcsection460:
12048 ; O2-NEXT:    movq (%rdi), %rax
12049 ; O2-NEXT:  .Lpcsection461:
12050 ; O2-NEXT:    movq 8(%rdi), %rdx
12051 ; O2-NEXT:  .Lpcsection462:
12052 ; O2-NEXT:    movl $42, %ebx
12053 ; O2-NEXT:    .p2align 4, 0x90
12054 ; O2-NEXT:  .LBB215_1: # %atomicrmw.start
12055 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12056 ; O2-NEXT:  .Lpcsection463:
12057 ; O2-NEXT:    xorl %ecx, %ecx
12058 ; O2-NEXT:  .Lpcsection464:
12059 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12060 ; O2-NEXT:  .Lpcsection465:
12061 ; O2-NEXT:    jne .LBB215_1
12062 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12063 ; O2-NEXT:    movq $1, foo(%rip)
12064 ; O2-NEXT:    popq %rbx
12065 ; O2-NEXT:    .cfi_def_cfa_offset 8
12066 ; O2-NEXT:    retq
12068 ; O3-LABEL: atomic128_xchg_acquire:
12069 ; O3:       # %bb.0: # %entry
12070 ; O3-NEXT:    pushq %rbx
12071 ; O3-NEXT:    .cfi_def_cfa_offset 16
12072 ; O3-NEXT:    .cfi_offset %rbx, -16
12073 ; O3-NEXT:    movq foo(%rip), %rax
12074 ; O3-NEXT:  .Lpcsection460:
12075 ; O3-NEXT:    movq (%rdi), %rax
12076 ; O3-NEXT:  .Lpcsection461:
12077 ; O3-NEXT:    movq 8(%rdi), %rdx
12078 ; O3-NEXT:  .Lpcsection462:
12079 ; O3-NEXT:    movl $42, %ebx
12080 ; O3-NEXT:    .p2align 4, 0x90
12081 ; O3-NEXT:  .LBB215_1: # %atomicrmw.start
12082 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12083 ; O3-NEXT:  .Lpcsection463:
12084 ; O3-NEXT:    xorl %ecx, %ecx
12085 ; O3-NEXT:  .Lpcsection464:
12086 ; O3-NEXT:    lock cmpxchg16b (%rdi)
12087 ; O3-NEXT:  .Lpcsection465:
12088 ; O3-NEXT:    jne .LBB215_1
12089 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
12090 ; O3-NEXT:    movq $1, foo(%rip)
12091 ; O3-NEXT:    popq %rbx
12092 ; O3-NEXT:    .cfi_def_cfa_offset 8
12093 ; O3-NEXT:    retq
12094 entry:
12095   load volatile i64, ptr @foo, align 8
12096   %x = atomicrmw xchg ptr %a, i128 42 acquire, align 16, !pcsections !0
12097   store volatile i64 1, ptr @foo, align 8
12098   ret void
12101 define void @atomic128_add_acquire(ptr %a) {
12102 ; O0-LABEL: atomic128_add_acquire:
12103 ; O0:       # %bb.0: # %entry
12104 ; O0-NEXT:    pushq %rbx
12105 ; O0-NEXT:    .cfi_def_cfa_offset 16
12106 ; O0-NEXT:    .cfi_offset %rbx, -16
12107 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12108 ; O0-NEXT:    movq foo(%rip), %rax
12109 ; O0-NEXT:  .Lpcsection515:
12110 ; O0-NEXT:    movq (%rdi), %rax
12111 ; O0-NEXT:  .Lpcsection516:
12112 ; O0-NEXT:    movq 8(%rdi), %rdx
12113 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12114 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12115 ; O0-NEXT:  .Lpcsection517:
12116 ; O0-NEXT:    jmp .LBB216_1
12117 ; O0-NEXT:  .LBB216_1: # %atomicrmw.start
12118 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
12119 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
12120 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
12121 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
12122 ; O0-NEXT:    movq %rax, %rbx
12123 ; O0-NEXT:  .Lpcsection518:
12124 ; O0-NEXT:    addq $42, %rbx
12125 ; O0-NEXT:    movq %rdx, %rcx
12126 ; O0-NEXT:  .Lpcsection519:
12127 ; O0-NEXT:    adcq $0, %rcx
12128 ; O0-NEXT:  .Lpcsection520:
12129 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12130 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12131 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12132 ; O0-NEXT:  .Lpcsection521:
12133 ; O0-NEXT:    jne .LBB216_1
12134 ; O0-NEXT:    jmp .LBB216_2
12135 ; O0-NEXT:  .LBB216_2: # %atomicrmw.end
12136 ; O0-NEXT:    movq $1, foo
12137 ; O0-NEXT:    popq %rbx
12138 ; O0-NEXT:    .cfi_def_cfa_offset 8
12139 ; O0-NEXT:    retq
12141 ; O1-LABEL: atomic128_add_acquire:
12142 ; O1:       # %bb.0: # %entry
12143 ; O1-NEXT:    pushq %rbx
12144 ; O1-NEXT:    .cfi_def_cfa_offset 16
12145 ; O1-NEXT:    .cfi_offset %rbx, -16
12146 ; O1-NEXT:    movq foo(%rip), %rax
12147 ; O1-NEXT:  .Lpcsection466:
12148 ; O1-NEXT:    movq (%rdi), %rax
12149 ; O1-NEXT:  .Lpcsection467:
12150 ; O1-NEXT:    movq 8(%rdi), %rdx
12151 ; O1-NEXT:    .p2align 4, 0x90
12152 ; O1-NEXT:  .LBB216_1: # %atomicrmw.start
12153 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12154 ; O1-NEXT:    movq %rax, %rbx
12155 ; O1-NEXT:  .Lpcsection468:
12156 ; O1-NEXT:    addq $42, %rbx
12157 ; O1-NEXT:    movq %rdx, %rcx
12158 ; O1-NEXT:  .Lpcsection469:
12159 ; O1-NEXT:    adcq $0, %rcx
12160 ; O1-NEXT:  .Lpcsection470:
12161 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12162 ; O1-NEXT:  .Lpcsection471:
12163 ; O1-NEXT:    jne .LBB216_1
12164 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12165 ; O1-NEXT:    movq $1, foo(%rip)
12166 ; O1-NEXT:    popq %rbx
12167 ; O1-NEXT:    .cfi_def_cfa_offset 8
12168 ; O1-NEXT:    retq
12170 ; O2-LABEL: atomic128_add_acquire:
12171 ; O2:       # %bb.0: # %entry
12172 ; O2-NEXT:    pushq %rbx
12173 ; O2-NEXT:    .cfi_def_cfa_offset 16
12174 ; O2-NEXT:    .cfi_offset %rbx, -16
12175 ; O2-NEXT:    movq foo(%rip), %rax
12176 ; O2-NEXT:  .Lpcsection466:
12177 ; O2-NEXT:    movq (%rdi), %rax
12178 ; O2-NEXT:  .Lpcsection467:
12179 ; O2-NEXT:    movq 8(%rdi), %rdx
12180 ; O2-NEXT:    .p2align 4, 0x90
12181 ; O2-NEXT:  .LBB216_1: # %atomicrmw.start
12182 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12183 ; O2-NEXT:    movq %rax, %rbx
12184 ; O2-NEXT:  .Lpcsection468:
12185 ; O2-NEXT:    addq $42, %rbx
12186 ; O2-NEXT:    movq %rdx, %rcx
12187 ; O2-NEXT:  .Lpcsection469:
12188 ; O2-NEXT:    adcq $0, %rcx
12189 ; O2-NEXT:  .Lpcsection470:
12190 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12191 ; O2-NEXT:  .Lpcsection471:
12192 ; O2-NEXT:    jne .LBB216_1
12193 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12194 ; O2-NEXT:    movq $1, foo(%rip)
12195 ; O2-NEXT:    popq %rbx
12196 ; O2-NEXT:    .cfi_def_cfa_offset 8
12197 ; O2-NEXT:    retq
12199 ; O3-LABEL: atomic128_add_acquire:
12200 ; O3:       # %bb.0: # %entry
12201 ; O3-NEXT:    pushq %rbx
12202 ; O3-NEXT:    .cfi_def_cfa_offset 16
12203 ; O3-NEXT:    .cfi_offset %rbx, -16
12204 ; O3-NEXT:    movq foo(%rip), %rax
12205 ; O3-NEXT:  .Lpcsection466:
12206 ; O3-NEXT:    movq (%rdi), %rax
12207 ; O3-NEXT:  .Lpcsection467:
12208 ; O3-NEXT:    movq 8(%rdi), %rdx
12209 ; O3-NEXT:    .p2align 4, 0x90
12210 ; O3-NEXT:  .LBB216_1: # %atomicrmw.start
12211 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12212 ; O3-NEXT:    movq %rax, %rbx
12213 ; O3-NEXT:  .Lpcsection468:
12214 ; O3-NEXT:    addq $42, %rbx
12215 ; O3-NEXT:    movq %rdx, %rcx
12216 ; O3-NEXT:  .Lpcsection469:
12217 ; O3-NEXT:    adcq $0, %rcx
12218 ; O3-NEXT:  .Lpcsection470:
12219 ; O3-NEXT:    lock cmpxchg16b (%rdi)
12220 ; O3-NEXT:  .Lpcsection471:
12221 ; O3-NEXT:    jne .LBB216_1
12222 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
12223 ; O3-NEXT:    movq $1, foo(%rip)
12224 ; O3-NEXT:    popq %rbx
12225 ; O3-NEXT:    .cfi_def_cfa_offset 8
12226 ; O3-NEXT:    retq
12227 entry:
12228   load volatile i64, ptr @foo, align 8
12229   %x = atomicrmw add ptr %a, i128 42 acquire, align 16, !pcsections !0
12230   store volatile i64 1, ptr @foo, align 8
12231   ret void
12234 define void @atomic128_sub_acquire(ptr %a) {
12235 ; O0-LABEL: atomic128_sub_acquire:
12236 ; O0:       # %bb.0: # %entry
12237 ; O0-NEXT:    pushq %rbx
12238 ; O0-NEXT:    .cfi_def_cfa_offset 16
12239 ; O0-NEXT:    .cfi_offset %rbx, -16
12240 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12241 ; O0-NEXT:    movq foo(%rip), %rax
12242 ; O0-NEXT:  .Lpcsection522:
12243 ; O0-NEXT:    movq (%rdi), %rax
12244 ; O0-NEXT:  .Lpcsection523:
12245 ; O0-NEXT:    movq 8(%rdi), %rdx
12246 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12247 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12248 ; O0-NEXT:  .Lpcsection524:
12249 ; O0-NEXT:    jmp .LBB217_1
12250 ; O0-NEXT:  .LBB217_1: # %atomicrmw.start
12251 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
12252 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
12253 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
12254 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
12255 ; O0-NEXT:    movq %rax, %rbx
12256 ; O0-NEXT:  .Lpcsection525:
12257 ; O0-NEXT:    addq $-42, %rbx
12258 ; O0-NEXT:    movq %rdx, %rcx
12259 ; O0-NEXT:  .Lpcsection526:
12260 ; O0-NEXT:    adcq $-1, %rcx
12261 ; O0-NEXT:  .Lpcsection527:
12262 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12263 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12264 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12265 ; O0-NEXT:  .Lpcsection528:
12266 ; O0-NEXT:    jne .LBB217_1
12267 ; O0-NEXT:    jmp .LBB217_2
12268 ; O0-NEXT:  .LBB217_2: # %atomicrmw.end
12269 ; O0-NEXT:    movq $1, foo
12270 ; O0-NEXT:    popq %rbx
12271 ; O0-NEXT:    .cfi_def_cfa_offset 8
12272 ; O0-NEXT:    retq
12274 ; O1-LABEL: atomic128_sub_acquire:
12275 ; O1:       # %bb.0: # %entry
12276 ; O1-NEXT:    pushq %rbx
12277 ; O1-NEXT:    .cfi_def_cfa_offset 16
12278 ; O1-NEXT:    .cfi_offset %rbx, -16
12279 ; O1-NEXT:    movq foo(%rip), %rax
12280 ; O1-NEXT:  .Lpcsection472:
12281 ; O1-NEXT:    movq (%rdi), %rax
12282 ; O1-NEXT:  .Lpcsection473:
12283 ; O1-NEXT:    movq 8(%rdi), %rdx
12284 ; O1-NEXT:    .p2align 4, 0x90
12285 ; O1-NEXT:  .LBB217_1: # %atomicrmw.start
12286 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12287 ; O1-NEXT:    movq %rax, %rbx
12288 ; O1-NEXT:  .Lpcsection474:
12289 ; O1-NEXT:    addq $-42, %rbx
12290 ; O1-NEXT:    movq %rdx, %rcx
12291 ; O1-NEXT:  .Lpcsection475:
12292 ; O1-NEXT:    adcq $-1, %rcx
12293 ; O1-NEXT:  .Lpcsection476:
12294 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12295 ; O1-NEXT:  .Lpcsection477:
12296 ; O1-NEXT:    jne .LBB217_1
12297 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12298 ; O1-NEXT:    movq $1, foo(%rip)
12299 ; O1-NEXT:    popq %rbx
12300 ; O1-NEXT:    .cfi_def_cfa_offset 8
12301 ; O1-NEXT:    retq
12303 ; O2-LABEL: atomic128_sub_acquire:
12304 ; O2:       # %bb.0: # %entry
12305 ; O2-NEXT:    pushq %rbx
12306 ; O2-NEXT:    .cfi_def_cfa_offset 16
12307 ; O2-NEXT:    .cfi_offset %rbx, -16
12308 ; O2-NEXT:    movq foo(%rip), %rax
12309 ; O2-NEXT:  .Lpcsection472:
12310 ; O2-NEXT:    movq (%rdi), %rax
12311 ; O2-NEXT:  .Lpcsection473:
12312 ; O2-NEXT:    movq 8(%rdi), %rdx
12313 ; O2-NEXT:    .p2align 4, 0x90
12314 ; O2-NEXT:  .LBB217_1: # %atomicrmw.start
12315 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12316 ; O2-NEXT:    movq %rax, %rbx
12317 ; O2-NEXT:  .Lpcsection474:
12318 ; O2-NEXT:    addq $-42, %rbx
12319 ; O2-NEXT:    movq %rdx, %rcx
12320 ; O2-NEXT:  .Lpcsection475:
12321 ; O2-NEXT:    adcq $-1, %rcx
12322 ; O2-NEXT:  .Lpcsection476:
12323 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12324 ; O2-NEXT:  .Lpcsection477:
12325 ; O2-NEXT:    jne .LBB217_1
12326 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12327 ; O2-NEXT:    movq $1, foo(%rip)
12328 ; O2-NEXT:    popq %rbx
12329 ; O2-NEXT:    .cfi_def_cfa_offset 8
12330 ; O2-NEXT:    retq
12332 ; O3-LABEL: atomic128_sub_acquire:
12333 ; O3:       # %bb.0: # %entry
12334 ; O3-NEXT:    pushq %rbx
12335 ; O3-NEXT:    .cfi_def_cfa_offset 16
12336 ; O3-NEXT:    .cfi_offset %rbx, -16
12337 ; O3-NEXT:    movq foo(%rip), %rax
12338 ; O3-NEXT:  .Lpcsection472:
12339 ; O3-NEXT:    movq (%rdi), %rax
12340 ; O3-NEXT:  .Lpcsection473:
12341 ; O3-NEXT:    movq 8(%rdi), %rdx
12342 ; O3-NEXT:    .p2align 4, 0x90
12343 ; O3-NEXT:  .LBB217_1: # %atomicrmw.start
12344 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12345 ; O3-NEXT:    movq %rax, %rbx
12346 ; O3-NEXT:  .Lpcsection474:
12347 ; O3-NEXT:    addq $-42, %rbx
12348 ; O3-NEXT:    movq %rdx, %rcx
12349 ; O3-NEXT:  .Lpcsection475:
12350 ; O3-NEXT:    adcq $-1, %rcx
12351 ; O3-NEXT:  .Lpcsection476:
12352 ; O3-NEXT:    lock cmpxchg16b (%rdi)
12353 ; O3-NEXT:  .Lpcsection477:
12354 ; O3-NEXT:    jne .LBB217_1
12355 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
12356 ; O3-NEXT:    movq $1, foo(%rip)
12357 ; O3-NEXT:    popq %rbx
12358 ; O3-NEXT:    .cfi_def_cfa_offset 8
12359 ; O3-NEXT:    retq
12360 entry:
12361   load volatile i64, ptr @foo, align 8
12362   %x = atomicrmw sub ptr %a, i128 42 acquire, align 16, !pcsections !0
12363   store volatile i64 1, ptr @foo, align 8
12364   ret void
12367 define void @atomic128_and_acquire(ptr %a) {
12368 ; O0-LABEL: atomic128_and_acquire:
12369 ; O0:       # %bb.0: # %entry
12370 ; O0-NEXT:    pushq %rbx
12371 ; O0-NEXT:    .cfi_def_cfa_offset 16
12372 ; O0-NEXT:    .cfi_offset %rbx, -16
12373 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12374 ; O0-NEXT:    movq foo(%rip), %rax
12375 ; O0-NEXT:  .Lpcsection529:
12376 ; O0-NEXT:    movq (%rdi), %rax
12377 ; O0-NEXT:  .Lpcsection530:
12378 ; O0-NEXT:    movq 8(%rdi), %rdx
12379 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12380 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12381 ; O0-NEXT:  .Lpcsection531:
12382 ; O0-NEXT:    jmp .LBB218_1
12383 ; O0-NEXT:  .LBB218_1: # %atomicrmw.start
12384 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
12385 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
12386 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
12387 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
12388 ; O0-NEXT:    movl %eax, %ecx
12389 ; O0-NEXT:  .Lpcsection532:
12390 ; O0-NEXT:    andl $42, %ecx
12391 ; O0-NEXT:    movl %ecx, %ebx
12392 ; O0-NEXT:  .Lpcsection533:
12393 ; O0-NEXT:    xorl %ecx, %ecx
12394 ; O0-NEXT:  .Lpcsection534:
12395 ; O0-NEXT:    # kill: def $rcx killed $ecx
12396 ; O0-NEXT:  .Lpcsection535:
12397 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12398 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12399 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12400 ; O0-NEXT:  .Lpcsection536:
12401 ; O0-NEXT:    jne .LBB218_1
12402 ; O0-NEXT:    jmp .LBB218_2
12403 ; O0-NEXT:  .LBB218_2: # %atomicrmw.end
12404 ; O0-NEXT:    movq $1, foo
12405 ; O0-NEXT:    popq %rbx
12406 ; O0-NEXT:    .cfi_def_cfa_offset 8
12407 ; O0-NEXT:    retq
12409 ; O1-LABEL: atomic128_and_acquire:
12410 ; O1:       # %bb.0: # %entry
12411 ; O1-NEXT:    pushq %rbx
12412 ; O1-NEXT:    .cfi_def_cfa_offset 16
12413 ; O1-NEXT:    .cfi_offset %rbx, -16
12414 ; O1-NEXT:    movq foo(%rip), %rax
12415 ; O1-NEXT:  .Lpcsection478:
12416 ; O1-NEXT:    movq (%rdi), %rax
12417 ; O1-NEXT:  .Lpcsection479:
12418 ; O1-NEXT:    movq 8(%rdi), %rdx
12419 ; O1-NEXT:    .p2align 4, 0x90
12420 ; O1-NEXT:  .LBB218_1: # %atomicrmw.start
12421 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12422 ; O1-NEXT:    movl %eax, %ebx
12423 ; O1-NEXT:  .Lpcsection480:
12424 ; O1-NEXT:    andl $42, %ebx
12425 ; O1-NEXT:  .Lpcsection481:
12426 ; O1-NEXT:    xorl %ecx, %ecx
12427 ; O1-NEXT:  .Lpcsection482:
12428 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12429 ; O1-NEXT:  .Lpcsection483:
12430 ; O1-NEXT:    jne .LBB218_1
12431 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12432 ; O1-NEXT:    movq $1, foo(%rip)
12433 ; O1-NEXT:    popq %rbx
12434 ; O1-NEXT:    .cfi_def_cfa_offset 8
12435 ; O1-NEXT:    retq
12437 ; O2-LABEL: atomic128_and_acquire:
12438 ; O2:       # %bb.0: # %entry
12439 ; O2-NEXT:    pushq %rbx
12440 ; O2-NEXT:    .cfi_def_cfa_offset 16
12441 ; O2-NEXT:    .cfi_offset %rbx, -16
12442 ; O2-NEXT:    movq foo(%rip), %rax
12443 ; O2-NEXT:  .Lpcsection478:
12444 ; O2-NEXT:    movq (%rdi), %rax
12445 ; O2-NEXT:  .Lpcsection479:
12446 ; O2-NEXT:    movq 8(%rdi), %rdx
12447 ; O2-NEXT:    .p2align 4, 0x90
12448 ; O2-NEXT:  .LBB218_1: # %atomicrmw.start
12449 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12450 ; O2-NEXT:    movl %eax, %ebx
12451 ; O2-NEXT:  .Lpcsection480:
12452 ; O2-NEXT:    andl $42, %ebx
12453 ; O2-NEXT:  .Lpcsection481:
12454 ; O2-NEXT:    xorl %ecx, %ecx
12455 ; O2-NEXT:  .Lpcsection482:
12456 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12457 ; O2-NEXT:  .Lpcsection483:
12458 ; O2-NEXT:    jne .LBB218_1
12459 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12460 ; O2-NEXT:    movq $1, foo(%rip)
12461 ; O2-NEXT:    popq %rbx
12462 ; O2-NEXT:    .cfi_def_cfa_offset 8
12463 ; O2-NEXT:    retq
12465 ; O3-LABEL: atomic128_and_acquire:
12466 ; O3:       # %bb.0: # %entry
12467 ; O3-NEXT:    pushq %rbx
12468 ; O3-NEXT:    .cfi_def_cfa_offset 16
12469 ; O3-NEXT:    .cfi_offset %rbx, -16
12470 ; O3-NEXT:    movq foo(%rip), %rax
12471 ; O3-NEXT:  .Lpcsection478:
12472 ; O3-NEXT:    movq (%rdi), %rax
12473 ; O3-NEXT:  .Lpcsection479:
12474 ; O3-NEXT:    movq 8(%rdi), %rdx
12475 ; O3-NEXT:    .p2align 4, 0x90
12476 ; O3-NEXT:  .LBB218_1: # %atomicrmw.start
12477 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12478 ; O3-NEXT:    movl %eax, %ebx
12479 ; O3-NEXT:  .Lpcsection480:
12480 ; O3-NEXT:    andl $42, %ebx
12481 ; O3-NEXT:  .Lpcsection481:
12482 ; O3-NEXT:    xorl %ecx, %ecx
12483 ; O3-NEXT:  .Lpcsection482:
12484 ; O3-NEXT:    lock cmpxchg16b (%rdi)
12485 ; O3-NEXT:  .Lpcsection483:
12486 ; O3-NEXT:    jne .LBB218_1
12487 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
12488 ; O3-NEXT:    movq $1, foo(%rip)
12489 ; O3-NEXT:    popq %rbx
12490 ; O3-NEXT:    .cfi_def_cfa_offset 8
12491 ; O3-NEXT:    retq
12492 entry:
12493   load volatile i64, ptr @foo, align 8
12494   %x = atomicrmw and ptr %a, i128 42 acquire, align 16, !pcsections !0
12495   store volatile i64 1, ptr @foo, align 8
12496   ret void
12499 define void @atomic128_or_acquire(ptr %a) {
12500 ; O0-LABEL: atomic128_or_acquire:
12501 ; O0:       # %bb.0: # %entry
12502 ; O0-NEXT:    pushq %rbx
12503 ; O0-NEXT:    .cfi_def_cfa_offset 16
12504 ; O0-NEXT:    .cfi_offset %rbx, -16
12505 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12506 ; O0-NEXT:    movq foo(%rip), %rax
12507 ; O0-NEXT:  .Lpcsection537:
12508 ; O0-NEXT:    movq (%rdi), %rax
12509 ; O0-NEXT:  .Lpcsection538:
12510 ; O0-NEXT:    movq 8(%rdi), %rdx
12511 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12512 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12513 ; O0-NEXT:  .Lpcsection539:
12514 ; O0-NEXT:    jmp .LBB219_1
12515 ; O0-NEXT:  .LBB219_1: # %atomicrmw.start
12516 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
12517 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
12518 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
12519 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
12520 ; O0-NEXT:    movq %rax, %rbx
12521 ; O0-NEXT:  .Lpcsection540:
12522 ; O0-NEXT:    orq $42, %rbx
12523 ; O0-NEXT:    movq %rcx, %rdx
12524 ; O0-NEXT:  .Lpcsection541:
12525 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12526 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12527 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12528 ; O0-NEXT:  .Lpcsection542:
12529 ; O0-NEXT:    jne .LBB219_1
12530 ; O0-NEXT:    jmp .LBB219_2
12531 ; O0-NEXT:  .LBB219_2: # %atomicrmw.end
12532 ; O0-NEXT:    movq $1, foo
12533 ; O0-NEXT:    popq %rbx
12534 ; O0-NEXT:    .cfi_def_cfa_offset 8
12535 ; O0-NEXT:    retq
12537 ; O1-LABEL: atomic128_or_acquire:
12538 ; O1:       # %bb.0: # %entry
12539 ; O1-NEXT:    pushq %rbx
12540 ; O1-NEXT:    .cfi_def_cfa_offset 16
12541 ; O1-NEXT:    .cfi_offset %rbx, -16
12542 ; O1-NEXT:    movq foo(%rip), %rax
12543 ; O1-NEXT:  .Lpcsection484:
12544 ; O1-NEXT:    movq (%rdi), %rax
12545 ; O1-NEXT:  .Lpcsection485:
12546 ; O1-NEXT:    movq 8(%rdi), %rdx
12547 ; O1-NEXT:    .p2align 4, 0x90
12548 ; O1-NEXT:  .LBB219_1: # %atomicrmw.start
12549 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12550 ; O1-NEXT:    movq %rax, %rbx
12551 ; O1-NEXT:  .Lpcsection486:
12552 ; O1-NEXT:    orq $42, %rbx
12553 ; O1-NEXT:    movq %rdx, %rcx
12554 ; O1-NEXT:  .Lpcsection487:
12555 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12556 ; O1-NEXT:  .Lpcsection488:
12557 ; O1-NEXT:    jne .LBB219_1
12558 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12559 ; O1-NEXT:    movq $1, foo(%rip)
12560 ; O1-NEXT:    popq %rbx
12561 ; O1-NEXT:    .cfi_def_cfa_offset 8
12562 ; O1-NEXT:    retq
12564 ; O2-LABEL: atomic128_or_acquire:
12565 ; O2:       # %bb.0: # %entry
12566 ; O2-NEXT:    pushq %rbx
12567 ; O2-NEXT:    .cfi_def_cfa_offset 16
12568 ; O2-NEXT:    .cfi_offset %rbx, -16
12569 ; O2-NEXT:    movq foo(%rip), %rax
12570 ; O2-NEXT:  .Lpcsection484:
12571 ; O2-NEXT:    movq (%rdi), %rax
12572 ; O2-NEXT:  .Lpcsection485:
12573 ; O2-NEXT:    movq 8(%rdi), %rdx
12574 ; O2-NEXT:    .p2align 4, 0x90
12575 ; O2-NEXT:  .LBB219_1: # %atomicrmw.start
12576 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12577 ; O2-NEXT:    movq %rax, %rbx
12578 ; O2-NEXT:  .Lpcsection486:
12579 ; O2-NEXT:    orq $42, %rbx
12580 ; O2-NEXT:    movq %rdx, %rcx
12581 ; O2-NEXT:  .Lpcsection487:
12582 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12583 ; O2-NEXT:  .Lpcsection488:
12584 ; O2-NEXT:    jne .LBB219_1
12585 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12586 ; O2-NEXT:    movq $1, foo(%rip)
12587 ; O2-NEXT:    popq %rbx
12588 ; O2-NEXT:    .cfi_def_cfa_offset 8
12589 ; O2-NEXT:    retq
12591 ; O3-LABEL: atomic128_or_acquire:
12592 ; O3:       # %bb.0: # %entry
12593 ; O3-NEXT:    pushq %rbx
12594 ; O3-NEXT:    .cfi_def_cfa_offset 16
12595 ; O3-NEXT:    .cfi_offset %rbx, -16
12596 ; O3-NEXT:    movq foo(%rip), %rax
12597 ; O3-NEXT:  .Lpcsection484:
12598 ; O3-NEXT:    movq (%rdi), %rax
12599 ; O3-NEXT:  .Lpcsection485:
12600 ; O3-NEXT:    movq 8(%rdi), %rdx
12601 ; O3-NEXT:    .p2align 4, 0x90
12602 ; O3-NEXT:  .LBB219_1: # %atomicrmw.start
12603 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12604 ; O3-NEXT:    movq %rax, %rbx
12605 ; O3-NEXT:  .Lpcsection486:
12606 ; O3-NEXT:    orq $42, %rbx
12607 ; O3-NEXT:    movq %rdx, %rcx
12608 ; O3-NEXT:  .Lpcsection487:
12609 ; O3-NEXT:    lock cmpxchg16b (%rdi)
12610 ; O3-NEXT:  .Lpcsection488:
12611 ; O3-NEXT:    jne .LBB219_1
12612 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
12613 ; O3-NEXT:    movq $1, foo(%rip)
12614 ; O3-NEXT:    popq %rbx
12615 ; O3-NEXT:    .cfi_def_cfa_offset 8
12616 ; O3-NEXT:    retq
12617 entry:
12618   load volatile i64, ptr @foo, align 8
12619   %x = atomicrmw or ptr %a, i128 42 acquire, align 16, !pcsections !0
12620   store volatile i64 1, ptr @foo, align 8
12621   ret void
12624 define void @atomic128_xor_acquire(ptr %a) {
12625 ; O0-LABEL: atomic128_xor_acquire:
12626 ; O0:       # %bb.0: # %entry
12627 ; O0-NEXT:    pushq %rbx
12628 ; O0-NEXT:    .cfi_def_cfa_offset 16
12629 ; O0-NEXT:    .cfi_offset %rbx, -16
12630 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12631 ; O0-NEXT:    movq foo(%rip), %rax
12632 ; O0-NEXT:  .Lpcsection543:
12633 ; O0-NEXT:    movq (%rdi), %rax
12634 ; O0-NEXT:  .Lpcsection544:
12635 ; O0-NEXT:    movq 8(%rdi), %rdx
12636 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12637 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12638 ; O0-NEXT:  .Lpcsection545:
12639 ; O0-NEXT:    jmp .LBB220_1
12640 ; O0-NEXT:  .LBB220_1: # %atomicrmw.start
12641 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
12642 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
12643 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
12644 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
12645 ; O0-NEXT:    movq %rax, %rbx
12646 ; O0-NEXT:  .Lpcsection546:
12647 ; O0-NEXT:    xorq $42, %rbx
12648 ; O0-NEXT:    movq %rcx, %rdx
12649 ; O0-NEXT:  .Lpcsection547:
12650 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12651 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12652 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12653 ; O0-NEXT:  .Lpcsection548:
12654 ; O0-NEXT:    jne .LBB220_1
12655 ; O0-NEXT:    jmp .LBB220_2
12656 ; O0-NEXT:  .LBB220_2: # %atomicrmw.end
12657 ; O0-NEXT:    movq $1, foo
12658 ; O0-NEXT:    popq %rbx
12659 ; O0-NEXT:    .cfi_def_cfa_offset 8
12660 ; O0-NEXT:    retq
12662 ; O1-LABEL: atomic128_xor_acquire:
12663 ; O1:       # %bb.0: # %entry
12664 ; O1-NEXT:    pushq %rbx
12665 ; O1-NEXT:    .cfi_def_cfa_offset 16
12666 ; O1-NEXT:    .cfi_offset %rbx, -16
12667 ; O1-NEXT:    movq foo(%rip), %rax
12668 ; O1-NEXT:  .Lpcsection489:
12669 ; O1-NEXT:    movq (%rdi), %rax
12670 ; O1-NEXT:  .Lpcsection490:
12671 ; O1-NEXT:    movq 8(%rdi), %rdx
12672 ; O1-NEXT:    .p2align 4, 0x90
12673 ; O1-NEXT:  .LBB220_1: # %atomicrmw.start
12674 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12675 ; O1-NEXT:    movq %rax, %rbx
12676 ; O1-NEXT:  .Lpcsection491:
12677 ; O1-NEXT:    xorq $42, %rbx
12678 ; O1-NEXT:    movq %rdx, %rcx
12679 ; O1-NEXT:  .Lpcsection492:
12680 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12681 ; O1-NEXT:  .Lpcsection493:
12682 ; O1-NEXT:    jne .LBB220_1
12683 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12684 ; O1-NEXT:    movq $1, foo(%rip)
12685 ; O1-NEXT:    popq %rbx
12686 ; O1-NEXT:    .cfi_def_cfa_offset 8
12687 ; O1-NEXT:    retq
12689 ; O2-LABEL: atomic128_xor_acquire:
12690 ; O2:       # %bb.0: # %entry
12691 ; O2-NEXT:    pushq %rbx
12692 ; O2-NEXT:    .cfi_def_cfa_offset 16
12693 ; O2-NEXT:    .cfi_offset %rbx, -16
12694 ; O2-NEXT:    movq foo(%rip), %rax
12695 ; O2-NEXT:  .Lpcsection489:
12696 ; O2-NEXT:    movq (%rdi), %rax
12697 ; O2-NEXT:  .Lpcsection490:
12698 ; O2-NEXT:    movq 8(%rdi), %rdx
12699 ; O2-NEXT:    .p2align 4, 0x90
12700 ; O2-NEXT:  .LBB220_1: # %atomicrmw.start
12701 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12702 ; O2-NEXT:    movq %rax, %rbx
12703 ; O2-NEXT:  .Lpcsection491:
12704 ; O2-NEXT:    xorq $42, %rbx
12705 ; O2-NEXT:    movq %rdx, %rcx
12706 ; O2-NEXT:  .Lpcsection492:
12707 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12708 ; O2-NEXT:  .Lpcsection493:
12709 ; O2-NEXT:    jne .LBB220_1
12710 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12711 ; O2-NEXT:    movq $1, foo(%rip)
12712 ; O2-NEXT:    popq %rbx
12713 ; O2-NEXT:    .cfi_def_cfa_offset 8
12714 ; O2-NEXT:    retq
12716 ; O3-LABEL: atomic128_xor_acquire:
12717 ; O3:       # %bb.0: # %entry
12718 ; O3-NEXT:    pushq %rbx
12719 ; O3-NEXT:    .cfi_def_cfa_offset 16
12720 ; O3-NEXT:    .cfi_offset %rbx, -16
12721 ; O3-NEXT:    movq foo(%rip), %rax
12722 ; O3-NEXT:  .Lpcsection489:
12723 ; O3-NEXT:    movq (%rdi), %rax
12724 ; O3-NEXT:  .Lpcsection490:
12725 ; O3-NEXT:    movq 8(%rdi), %rdx
12726 ; O3-NEXT:    .p2align 4, 0x90
12727 ; O3-NEXT:  .LBB220_1: # %atomicrmw.start
12728 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12729 ; O3-NEXT:    movq %rax, %rbx
12730 ; O3-NEXT:  .Lpcsection491:
12731 ; O3-NEXT:    xorq $42, %rbx
12732 ; O3-NEXT:    movq %rdx, %rcx
12733 ; O3-NEXT:  .Lpcsection492:
12734 ; O3-NEXT:    lock cmpxchg16b (%rdi)
12735 ; O3-NEXT:  .Lpcsection493:
12736 ; O3-NEXT:    jne .LBB220_1
12737 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
12738 ; O3-NEXT:    movq $1, foo(%rip)
12739 ; O3-NEXT:    popq %rbx
12740 ; O3-NEXT:    .cfi_def_cfa_offset 8
12741 ; O3-NEXT:    retq
12742 entry:
12743   load volatile i64, ptr @foo, align 8
12744   %x = atomicrmw xor ptr %a, i128 42 acquire, align 16, !pcsections !0
12745   store volatile i64 1, ptr @foo, align 8
12746   ret void
12749 define void @atomic128_nand_acquire(ptr %a) {
12750 ; O0-LABEL: atomic128_nand_acquire:
12751 ; O0:       # %bb.0: # %entry
12752 ; O0-NEXT:    pushq %rbx
12753 ; O0-NEXT:    .cfi_def_cfa_offset 16
12754 ; O0-NEXT:    .cfi_offset %rbx, -16
12755 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12756 ; O0-NEXT:    movq foo(%rip), %rax
12757 ; O0-NEXT:  .Lpcsection549:
12758 ; O0-NEXT:    movq (%rdi), %rax
12759 ; O0-NEXT:  .Lpcsection550:
12760 ; O0-NEXT:    movq 8(%rdi), %rdx
12761 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12762 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12763 ; O0-NEXT:  .Lpcsection551:
12764 ; O0-NEXT:    jmp .LBB221_1
12765 ; O0-NEXT:  .LBB221_1: # %atomicrmw.start
12766 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
12767 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
12768 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
12769 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
12770 ; O0-NEXT:    movl %eax, %ecx
12771 ; O0-NEXT:  .Lpcsection552:
12772 ; O0-NEXT:    notl %ecx
12773 ; O0-NEXT:  .Lpcsection553:
12774 ; O0-NEXT:    # implicit-def: $rbx
12775 ; O0-NEXT:    movl %ecx, %ebx
12776 ; O0-NEXT:  .Lpcsection554:
12777 ; O0-NEXT:    orq $-43, %rbx
12778 ; O0-NEXT:  .Lpcsection555:
12779 ; O0-NEXT:    movq $-1, %rcx
12780 ; O0-NEXT:  .Lpcsection556:
12781 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12782 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12783 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12784 ; O0-NEXT:  .Lpcsection557:
12785 ; O0-NEXT:    jne .LBB221_1
12786 ; O0-NEXT:    jmp .LBB221_2
12787 ; O0-NEXT:  .LBB221_2: # %atomicrmw.end
12788 ; O0-NEXT:    movq $1, foo
12789 ; O0-NEXT:    popq %rbx
12790 ; O0-NEXT:    .cfi_def_cfa_offset 8
12791 ; O0-NEXT:    retq
12793 ; O1-LABEL: atomic128_nand_acquire:
12794 ; O1:       # %bb.0: # %entry
12795 ; O1-NEXT:    pushq %rbx
12796 ; O1-NEXT:    .cfi_def_cfa_offset 16
12797 ; O1-NEXT:    .cfi_offset %rbx, -16
12798 ; O1-NEXT:    movq foo(%rip), %rax
12799 ; O1-NEXT:  .Lpcsection494:
12800 ; O1-NEXT:    movq (%rdi), %rax
12801 ; O1-NEXT:  .Lpcsection495:
12802 ; O1-NEXT:    movq 8(%rdi), %rdx
12803 ; O1-NEXT:  .Lpcsection496:
12804 ; O1-NEXT:    movq $-1, %rcx
12805 ; O1-NEXT:    .p2align 4, 0x90
12806 ; O1-NEXT:  .LBB221_1: # %atomicrmw.start
12807 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12808 ; O1-NEXT:    movl %eax, %ebx
12809 ; O1-NEXT:  .Lpcsection497:
12810 ; O1-NEXT:    notl %ebx
12811 ; O1-NEXT:  .Lpcsection498:
12812 ; O1-NEXT:    orq $-43, %rbx
12813 ; O1-NEXT:  .Lpcsection499:
12814 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12815 ; O1-NEXT:  .Lpcsection500:
12816 ; O1-NEXT:    jne .LBB221_1
12817 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12818 ; O1-NEXT:    movq $1, foo(%rip)
12819 ; O1-NEXT:    popq %rbx
12820 ; O1-NEXT:    .cfi_def_cfa_offset 8
12821 ; O1-NEXT:    retq
12823 ; O2-LABEL: atomic128_nand_acquire:
12824 ; O2:       # %bb.0: # %entry
12825 ; O2-NEXT:    pushq %rbx
12826 ; O2-NEXT:    .cfi_def_cfa_offset 16
12827 ; O2-NEXT:    .cfi_offset %rbx, -16
12828 ; O2-NEXT:    movq foo(%rip), %rax
12829 ; O2-NEXT:  .Lpcsection494:
12830 ; O2-NEXT:    movq (%rdi), %rax
12831 ; O2-NEXT:  .Lpcsection495:
12832 ; O2-NEXT:    movq 8(%rdi), %rdx
12833 ; O2-NEXT:  .Lpcsection496:
12834 ; O2-NEXT:    movq $-1, %rcx
12835 ; O2-NEXT:    .p2align 4, 0x90
12836 ; O2-NEXT:  .LBB221_1: # %atomicrmw.start
12837 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12838 ; O2-NEXT:    movl %eax, %ebx
12839 ; O2-NEXT:  .Lpcsection497:
12840 ; O2-NEXT:    notl %ebx
12841 ; O2-NEXT:  .Lpcsection498:
12842 ; O2-NEXT:    orq $-43, %rbx
12843 ; O2-NEXT:  .Lpcsection499:
12844 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12845 ; O2-NEXT:  .Lpcsection500:
12846 ; O2-NEXT:    jne .LBB221_1
12847 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12848 ; O2-NEXT:    movq $1, foo(%rip)
12849 ; O2-NEXT:    popq %rbx
12850 ; O2-NEXT:    .cfi_def_cfa_offset 8
12851 ; O2-NEXT:    retq
12853 ; O3-LABEL: atomic128_nand_acquire:
12854 ; O3:       # %bb.0: # %entry
12855 ; O3-NEXT:    pushq %rbx
12856 ; O3-NEXT:    .cfi_def_cfa_offset 16
12857 ; O3-NEXT:    .cfi_offset %rbx, -16
12858 ; O3-NEXT:    movq foo(%rip), %rax
12859 ; O3-NEXT:  .Lpcsection494:
12860 ; O3-NEXT:    movq (%rdi), %rax
12861 ; O3-NEXT:  .Lpcsection495:
12862 ; O3-NEXT:    movq 8(%rdi), %rdx
12863 ; O3-NEXT:  .Lpcsection496:
12864 ; O3-NEXT:    movq $-1, %rcx
12865 ; O3-NEXT:    .p2align 4, 0x90
12866 ; O3-NEXT:  .LBB221_1: # %atomicrmw.start
12867 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12868 ; O3-NEXT:    movl %eax, %ebx
12869 ; O3-NEXT:  .Lpcsection497:
12870 ; O3-NEXT:    notl %ebx
12871 ; O3-NEXT:  .Lpcsection498:
12872 ; O3-NEXT:    orq $-43, %rbx
12873 ; O3-NEXT:  .Lpcsection499:
12874 ; O3-NEXT:    lock cmpxchg16b (%rdi)
12875 ; O3-NEXT:  .Lpcsection500:
12876 ; O3-NEXT:    jne .LBB221_1
12877 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
12878 ; O3-NEXT:    movq $1, foo(%rip)
12879 ; O3-NEXT:    popq %rbx
12880 ; O3-NEXT:    .cfi_def_cfa_offset 8
12881 ; O3-NEXT:    retq
12882 entry:
12883   load volatile i64, ptr @foo, align 8
12884   %x = atomicrmw nand ptr %a, i128 42 acquire, align 16, !pcsections !0
12885   store volatile i64 1, ptr @foo, align 8
12886   ret void
12889 define void @atomic128_xchg_release(ptr %a) {
12890 ; O0-LABEL: atomic128_xchg_release:
12891 ; O0:       # %bb.0:
12892 ; O0-NEXT:    pushq %rbx
12893 ; O0-NEXT:    .cfi_def_cfa_offset 16
12894 ; O0-NEXT:    .cfi_offset %rbx, -16
12895 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12896 ; O0-NEXT:    movq foo(%rip), %rax
12897 ; O0-NEXT:  .Lpcsection558:
12898 ; O0-NEXT:    movq (%rdi), %rax
12899 ; O0-NEXT:  .Lpcsection559:
12900 ; O0-NEXT:    movq 8(%rdi), %rdx
12901 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12902 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12903 ; O0-NEXT:  .Lpcsection560:
12904 ; O0-NEXT:    jmp .LBB222_1
12905 ; O0-NEXT:  .LBB222_1: # %atomicrmw.start
12906 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
12907 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
12908 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
12909 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
12910 ; O0-NEXT:  .Lpcsection561:
12911 ; O0-NEXT:    xorl %ecx, %ecx
12912 ; O0-NEXT:  .Lpcsection562:
12913 ; O0-NEXT:    # kill: def $rcx killed $ecx
12914 ; O0-NEXT:  .Lpcsection563:
12915 ; O0-NEXT:    movl $42, %ebx
12916 ; O0-NEXT:  .Lpcsection564:
12917 ; O0-NEXT:    lock cmpxchg16b (%rsi)
12918 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12919 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
12920 ; O0-NEXT:  .Lpcsection565:
12921 ; O0-NEXT:    jne .LBB222_1
12922 ; O0-NEXT:    jmp .LBB222_2
12923 ; O0-NEXT:  .LBB222_2: # %atomicrmw.end
12924 ; O0-NEXT:    movq $1, foo
12925 ; O0-NEXT:    popq %rbx
12926 ; O0-NEXT:    .cfi_def_cfa_offset 8
12927 ; O0-NEXT:    retq
12929 ; O1-LABEL: atomic128_xchg_release:
12930 ; O1:       # %bb.0:
12931 ; O1-NEXT:    pushq %rbx
12932 ; O1-NEXT:    .cfi_def_cfa_offset 16
12933 ; O1-NEXT:    .cfi_offset %rbx, -16
12934 ; O1-NEXT:    movq foo(%rip), %rax
12935 ; O1-NEXT:  .Lpcsection501:
12936 ; O1-NEXT:    movq (%rdi), %rax
12937 ; O1-NEXT:  .Lpcsection502:
12938 ; O1-NEXT:    movq 8(%rdi), %rdx
12939 ; O1-NEXT:  .Lpcsection503:
12940 ; O1-NEXT:    movl $42, %ebx
12941 ; O1-NEXT:    .p2align 4, 0x90
12942 ; O1-NEXT:  .LBB222_1: # %atomicrmw.start
12943 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
12944 ; O1-NEXT:  .Lpcsection504:
12945 ; O1-NEXT:    xorl %ecx, %ecx
12946 ; O1-NEXT:  .Lpcsection505:
12947 ; O1-NEXT:    lock cmpxchg16b (%rdi)
12948 ; O1-NEXT:  .Lpcsection506:
12949 ; O1-NEXT:    jne .LBB222_1
12950 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
12951 ; O1-NEXT:    movq $1, foo(%rip)
12952 ; O1-NEXT:    popq %rbx
12953 ; O1-NEXT:    .cfi_def_cfa_offset 8
12954 ; O1-NEXT:    retq
12956 ; O2-LABEL: atomic128_xchg_release:
12957 ; O2:       # %bb.0:
12958 ; O2-NEXT:    pushq %rbx
12959 ; O2-NEXT:    .cfi_def_cfa_offset 16
12960 ; O2-NEXT:    .cfi_offset %rbx, -16
12961 ; O2-NEXT:    movq foo(%rip), %rax
12962 ; O2-NEXT:  .Lpcsection501:
12963 ; O2-NEXT:    movq (%rdi), %rax
12964 ; O2-NEXT:  .Lpcsection502:
12965 ; O2-NEXT:    movq 8(%rdi), %rdx
12966 ; O2-NEXT:  .Lpcsection503:
12967 ; O2-NEXT:    movl $42, %ebx
12968 ; O2-NEXT:    .p2align 4, 0x90
12969 ; O2-NEXT:  .LBB222_1: # %atomicrmw.start
12970 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
12971 ; O2-NEXT:  .Lpcsection504:
12972 ; O2-NEXT:    xorl %ecx, %ecx
12973 ; O2-NEXT:  .Lpcsection505:
12974 ; O2-NEXT:    lock cmpxchg16b (%rdi)
12975 ; O2-NEXT:  .Lpcsection506:
12976 ; O2-NEXT:    jne .LBB222_1
12977 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
12978 ; O2-NEXT:    movq $1, foo(%rip)
12979 ; O2-NEXT:    popq %rbx
12980 ; O2-NEXT:    .cfi_def_cfa_offset 8
12981 ; O2-NEXT:    retq
12983 ; O3-LABEL: atomic128_xchg_release:
12984 ; O3:       # %bb.0:
12985 ; O3-NEXT:    pushq %rbx
12986 ; O3-NEXT:    .cfi_def_cfa_offset 16
12987 ; O3-NEXT:    .cfi_offset %rbx, -16
12988 ; O3-NEXT:    movq foo(%rip), %rax
12989 ; O3-NEXT:  .Lpcsection501:
12990 ; O3-NEXT:    movq (%rdi), %rax
12991 ; O3-NEXT:  .Lpcsection502:
12992 ; O3-NEXT:    movq 8(%rdi), %rdx
12993 ; O3-NEXT:  .Lpcsection503:
12994 ; O3-NEXT:    movl $42, %ebx
12995 ; O3-NEXT:    .p2align 4, 0x90
12996 ; O3-NEXT:  .LBB222_1: # %atomicrmw.start
12997 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
12998 ; O3-NEXT:  .Lpcsection504:
12999 ; O3-NEXT:    xorl %ecx, %ecx
13000 ; O3-NEXT:  .Lpcsection505:
13001 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13002 ; O3-NEXT:  .Lpcsection506:
13003 ; O3-NEXT:    jne .LBB222_1
13004 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13005 ; O3-NEXT:    movq $1, foo(%rip)
13006 ; O3-NEXT:    popq %rbx
13007 ; O3-NEXT:    .cfi_def_cfa_offset 8
13008 ; O3-NEXT:    retq
13009   load volatile i64, ptr @foo, align 8
13010   %x = atomicrmw xchg ptr %a, i128 42 release, align 16, !pcsections !0
13011   store volatile i64 1, ptr @foo, align 8
13012   ret void
13015 define void @atomic128_add_release(ptr %a) {
13016 ; O0-LABEL: atomic128_add_release:
13017 ; O0:       # %bb.0: # %entry
13018 ; O0-NEXT:    pushq %rbx
13019 ; O0-NEXT:    .cfi_def_cfa_offset 16
13020 ; O0-NEXT:    .cfi_offset %rbx, -16
13021 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13022 ; O0-NEXT:    movq foo(%rip), %rax
13023 ; O0-NEXT:  .Lpcsection566:
13024 ; O0-NEXT:    movq (%rdi), %rax
13025 ; O0-NEXT:  .Lpcsection567:
13026 ; O0-NEXT:    movq 8(%rdi), %rdx
13027 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13028 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13029 ; O0-NEXT:  .Lpcsection568:
13030 ; O0-NEXT:    jmp .LBB223_1
13031 ; O0-NEXT:  .LBB223_1: # %atomicrmw.start
13032 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13033 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
13034 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13035 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13036 ; O0-NEXT:    movq %rax, %rbx
13037 ; O0-NEXT:  .Lpcsection569:
13038 ; O0-NEXT:    addq $42, %rbx
13039 ; O0-NEXT:    movq %rdx, %rcx
13040 ; O0-NEXT:  .Lpcsection570:
13041 ; O0-NEXT:    adcq $0, %rcx
13042 ; O0-NEXT:  .Lpcsection571:
13043 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13044 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13045 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13046 ; O0-NEXT:  .Lpcsection572:
13047 ; O0-NEXT:    jne .LBB223_1
13048 ; O0-NEXT:    jmp .LBB223_2
13049 ; O0-NEXT:  .LBB223_2: # %atomicrmw.end
13050 ; O0-NEXT:    movq $1, foo
13051 ; O0-NEXT:    popq %rbx
13052 ; O0-NEXT:    .cfi_def_cfa_offset 8
13053 ; O0-NEXT:    retq
13055 ; O1-LABEL: atomic128_add_release:
13056 ; O1:       # %bb.0: # %entry
13057 ; O1-NEXT:    pushq %rbx
13058 ; O1-NEXT:    .cfi_def_cfa_offset 16
13059 ; O1-NEXT:    .cfi_offset %rbx, -16
13060 ; O1-NEXT:    movq foo(%rip), %rax
13061 ; O1-NEXT:  .Lpcsection507:
13062 ; O1-NEXT:    movq (%rdi), %rax
13063 ; O1-NEXT:  .Lpcsection508:
13064 ; O1-NEXT:    movq 8(%rdi), %rdx
13065 ; O1-NEXT:    .p2align 4, 0x90
13066 ; O1-NEXT:  .LBB223_1: # %atomicrmw.start
13067 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13068 ; O1-NEXT:    movq %rax, %rbx
13069 ; O1-NEXT:  .Lpcsection509:
13070 ; O1-NEXT:    addq $42, %rbx
13071 ; O1-NEXT:    movq %rdx, %rcx
13072 ; O1-NEXT:  .Lpcsection510:
13073 ; O1-NEXT:    adcq $0, %rcx
13074 ; O1-NEXT:  .Lpcsection511:
13075 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13076 ; O1-NEXT:  .Lpcsection512:
13077 ; O1-NEXT:    jne .LBB223_1
13078 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13079 ; O1-NEXT:    movq $1, foo(%rip)
13080 ; O1-NEXT:    popq %rbx
13081 ; O1-NEXT:    .cfi_def_cfa_offset 8
13082 ; O1-NEXT:    retq
13084 ; O2-LABEL: atomic128_add_release:
13085 ; O2:       # %bb.0: # %entry
13086 ; O2-NEXT:    pushq %rbx
13087 ; O2-NEXT:    .cfi_def_cfa_offset 16
13088 ; O2-NEXT:    .cfi_offset %rbx, -16
13089 ; O2-NEXT:    movq foo(%rip), %rax
13090 ; O2-NEXT:  .Lpcsection507:
13091 ; O2-NEXT:    movq (%rdi), %rax
13092 ; O2-NEXT:  .Lpcsection508:
13093 ; O2-NEXT:    movq 8(%rdi), %rdx
13094 ; O2-NEXT:    .p2align 4, 0x90
13095 ; O2-NEXT:  .LBB223_1: # %atomicrmw.start
13096 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
13097 ; O2-NEXT:    movq %rax, %rbx
13098 ; O2-NEXT:  .Lpcsection509:
13099 ; O2-NEXT:    addq $42, %rbx
13100 ; O2-NEXT:    movq %rdx, %rcx
13101 ; O2-NEXT:  .Lpcsection510:
13102 ; O2-NEXT:    adcq $0, %rcx
13103 ; O2-NEXT:  .Lpcsection511:
13104 ; O2-NEXT:    lock cmpxchg16b (%rdi)
13105 ; O2-NEXT:  .Lpcsection512:
13106 ; O2-NEXT:    jne .LBB223_1
13107 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
13108 ; O2-NEXT:    movq $1, foo(%rip)
13109 ; O2-NEXT:    popq %rbx
13110 ; O2-NEXT:    .cfi_def_cfa_offset 8
13111 ; O2-NEXT:    retq
13113 ; O3-LABEL: atomic128_add_release:
13114 ; O3:       # %bb.0: # %entry
13115 ; O3-NEXT:    pushq %rbx
13116 ; O3-NEXT:    .cfi_def_cfa_offset 16
13117 ; O3-NEXT:    .cfi_offset %rbx, -16
13118 ; O3-NEXT:    movq foo(%rip), %rax
13119 ; O3-NEXT:  .Lpcsection507:
13120 ; O3-NEXT:    movq (%rdi), %rax
13121 ; O3-NEXT:  .Lpcsection508:
13122 ; O3-NEXT:    movq 8(%rdi), %rdx
13123 ; O3-NEXT:    .p2align 4, 0x90
13124 ; O3-NEXT:  .LBB223_1: # %atomicrmw.start
13125 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
13126 ; O3-NEXT:    movq %rax, %rbx
13127 ; O3-NEXT:  .Lpcsection509:
13128 ; O3-NEXT:    addq $42, %rbx
13129 ; O3-NEXT:    movq %rdx, %rcx
13130 ; O3-NEXT:  .Lpcsection510:
13131 ; O3-NEXT:    adcq $0, %rcx
13132 ; O3-NEXT:  .Lpcsection511:
13133 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13134 ; O3-NEXT:  .Lpcsection512:
13135 ; O3-NEXT:    jne .LBB223_1
13136 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13137 ; O3-NEXT:    movq $1, foo(%rip)
13138 ; O3-NEXT:    popq %rbx
13139 ; O3-NEXT:    .cfi_def_cfa_offset 8
13140 ; O3-NEXT:    retq
13141 entry:
13142   load volatile i64, ptr @foo, align 8
13143   %x = atomicrmw add ptr %a, i128 42 release, align 16, !pcsections !0
13144   store volatile i64 1, ptr @foo, align 8
13145   ret void
13148 define void @atomic128_sub_release(ptr %a) {
13149 ; O0-LABEL: atomic128_sub_release:
13150 ; O0:       # %bb.0: # %entry
13151 ; O0-NEXT:    pushq %rbx
13152 ; O0-NEXT:    .cfi_def_cfa_offset 16
13153 ; O0-NEXT:    .cfi_offset %rbx, -16
13154 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13155 ; O0-NEXT:    movq foo(%rip), %rax
13156 ; O0-NEXT:  .Lpcsection573:
13157 ; O0-NEXT:    movq (%rdi), %rax
13158 ; O0-NEXT:  .Lpcsection574:
13159 ; O0-NEXT:    movq 8(%rdi), %rdx
13160 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13161 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13162 ; O0-NEXT:  .Lpcsection575:
13163 ; O0-NEXT:    jmp .LBB224_1
13164 ; O0-NEXT:  .LBB224_1: # %atomicrmw.start
13165 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13166 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
13167 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13168 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13169 ; O0-NEXT:    movq %rax, %rbx
13170 ; O0-NEXT:  .Lpcsection576:
13171 ; O0-NEXT:    addq $-42, %rbx
13172 ; O0-NEXT:    movq %rdx, %rcx
13173 ; O0-NEXT:  .Lpcsection577:
13174 ; O0-NEXT:    adcq $-1, %rcx
13175 ; O0-NEXT:  .Lpcsection578:
13176 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13177 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13178 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13179 ; O0-NEXT:  .Lpcsection579:
13180 ; O0-NEXT:    jne .LBB224_1
13181 ; O0-NEXT:    jmp .LBB224_2
13182 ; O0-NEXT:  .LBB224_2: # %atomicrmw.end
13183 ; O0-NEXT:    movq $1, foo
13184 ; O0-NEXT:    popq %rbx
13185 ; O0-NEXT:    .cfi_def_cfa_offset 8
13186 ; O0-NEXT:    retq
13188 ; O1-LABEL: atomic128_sub_release:
13189 ; O1:       # %bb.0: # %entry
13190 ; O1-NEXT:    pushq %rbx
13191 ; O1-NEXT:    .cfi_def_cfa_offset 16
13192 ; O1-NEXT:    .cfi_offset %rbx, -16
13193 ; O1-NEXT:    movq foo(%rip), %rax
13194 ; O1-NEXT:  .Lpcsection513:
13195 ; O1-NEXT:    movq (%rdi), %rax
13196 ; O1-NEXT:  .Lpcsection514:
13197 ; O1-NEXT:    movq 8(%rdi), %rdx
13198 ; O1-NEXT:    .p2align 4, 0x90
13199 ; O1-NEXT:  .LBB224_1: # %atomicrmw.start
13200 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13201 ; O1-NEXT:    movq %rax, %rbx
13202 ; O1-NEXT:  .Lpcsection515:
13203 ; O1-NEXT:    addq $-42, %rbx
13204 ; O1-NEXT:    movq %rdx, %rcx
13205 ; O1-NEXT:  .Lpcsection516:
13206 ; O1-NEXT:    adcq $-1, %rcx
13207 ; O1-NEXT:  .Lpcsection517:
13208 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13209 ; O1-NEXT:  .Lpcsection518:
13210 ; O1-NEXT:    jne .LBB224_1
13211 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13212 ; O1-NEXT:    movq $1, foo(%rip)
13213 ; O1-NEXT:    popq %rbx
13214 ; O1-NEXT:    .cfi_def_cfa_offset 8
13215 ; O1-NEXT:    retq
13217 ; O2-LABEL: atomic128_sub_release:
13218 ; O2:       # %bb.0: # %entry
13219 ; O2-NEXT:    pushq %rbx
13220 ; O2-NEXT:    .cfi_def_cfa_offset 16
13221 ; O2-NEXT:    .cfi_offset %rbx, -16
13222 ; O2-NEXT:    movq foo(%rip), %rax
13223 ; O2-NEXT:  .Lpcsection513:
13224 ; O2-NEXT:    movq (%rdi), %rax
13225 ; O2-NEXT:  .Lpcsection514:
13226 ; O2-NEXT:    movq 8(%rdi), %rdx
13227 ; O2-NEXT:    .p2align 4, 0x90
13228 ; O2-NEXT:  .LBB224_1: # %atomicrmw.start
13229 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
13230 ; O2-NEXT:    movq %rax, %rbx
13231 ; O2-NEXT:  .Lpcsection515:
13232 ; O2-NEXT:    addq $-42, %rbx
13233 ; O2-NEXT:    movq %rdx, %rcx
13234 ; O2-NEXT:  .Lpcsection516:
13235 ; O2-NEXT:    adcq $-1, %rcx
13236 ; O2-NEXT:  .Lpcsection517:
13237 ; O2-NEXT:    lock cmpxchg16b (%rdi)
13238 ; O2-NEXT:  .Lpcsection518:
13239 ; O2-NEXT:    jne .LBB224_1
13240 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
13241 ; O2-NEXT:    movq $1, foo(%rip)
13242 ; O2-NEXT:    popq %rbx
13243 ; O2-NEXT:    .cfi_def_cfa_offset 8
13244 ; O2-NEXT:    retq
13246 ; O3-LABEL: atomic128_sub_release:
13247 ; O3:       # %bb.0: # %entry
13248 ; O3-NEXT:    pushq %rbx
13249 ; O3-NEXT:    .cfi_def_cfa_offset 16
13250 ; O3-NEXT:    .cfi_offset %rbx, -16
13251 ; O3-NEXT:    movq foo(%rip), %rax
13252 ; O3-NEXT:  .Lpcsection513:
13253 ; O3-NEXT:    movq (%rdi), %rax
13254 ; O3-NEXT:  .Lpcsection514:
13255 ; O3-NEXT:    movq 8(%rdi), %rdx
13256 ; O3-NEXT:    .p2align 4, 0x90
13257 ; O3-NEXT:  .LBB224_1: # %atomicrmw.start
13258 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
13259 ; O3-NEXT:    movq %rax, %rbx
13260 ; O3-NEXT:  .Lpcsection515:
13261 ; O3-NEXT:    addq $-42, %rbx
13262 ; O3-NEXT:    movq %rdx, %rcx
13263 ; O3-NEXT:  .Lpcsection516:
13264 ; O3-NEXT:    adcq $-1, %rcx
13265 ; O3-NEXT:  .Lpcsection517:
13266 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13267 ; O3-NEXT:  .Lpcsection518:
13268 ; O3-NEXT:    jne .LBB224_1
13269 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13270 ; O3-NEXT:    movq $1, foo(%rip)
13271 ; O3-NEXT:    popq %rbx
13272 ; O3-NEXT:    .cfi_def_cfa_offset 8
13273 ; O3-NEXT:    retq
13274 entry:
13275   load volatile i64, ptr @foo, align 8
13276   %x = atomicrmw sub ptr %a, i128 42 release, align 16, !pcsections !0
13277   store volatile i64 1, ptr @foo, align 8
13278   ret void
13281 define void @atomic128_and_release(ptr %a) {
13282 ; O0-LABEL: atomic128_and_release:
13283 ; O0:       # %bb.0: # %entry
13284 ; O0-NEXT:    pushq %rbx
13285 ; O0-NEXT:    .cfi_def_cfa_offset 16
13286 ; O0-NEXT:    .cfi_offset %rbx, -16
13287 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13288 ; O0-NEXT:    movq foo(%rip), %rax
13289 ; O0-NEXT:  .Lpcsection580:
13290 ; O0-NEXT:    movq (%rdi), %rax
13291 ; O0-NEXT:  .Lpcsection581:
13292 ; O0-NEXT:    movq 8(%rdi), %rdx
13293 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13294 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13295 ; O0-NEXT:  .Lpcsection582:
13296 ; O0-NEXT:    jmp .LBB225_1
13297 ; O0-NEXT:  .LBB225_1: # %atomicrmw.start
13298 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13299 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
13300 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13301 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13302 ; O0-NEXT:    movl %eax, %ecx
13303 ; O0-NEXT:  .Lpcsection583:
13304 ; O0-NEXT:    andl $42, %ecx
13305 ; O0-NEXT:    movl %ecx, %ebx
13306 ; O0-NEXT:  .Lpcsection584:
13307 ; O0-NEXT:    xorl %ecx, %ecx
13308 ; O0-NEXT:  .Lpcsection585:
13309 ; O0-NEXT:    # kill: def $rcx killed $ecx
13310 ; O0-NEXT:  .Lpcsection586:
13311 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13312 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13313 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13314 ; O0-NEXT:  .Lpcsection587:
13315 ; O0-NEXT:    jne .LBB225_1
13316 ; O0-NEXT:    jmp .LBB225_2
13317 ; O0-NEXT:  .LBB225_2: # %atomicrmw.end
13318 ; O0-NEXT:    movq $1, foo
13319 ; O0-NEXT:    popq %rbx
13320 ; O0-NEXT:    .cfi_def_cfa_offset 8
13321 ; O0-NEXT:    retq
13323 ; O1-LABEL: atomic128_and_release:
13324 ; O1:       # %bb.0: # %entry
13325 ; O1-NEXT:    pushq %rbx
13326 ; O1-NEXT:    .cfi_def_cfa_offset 16
13327 ; O1-NEXT:    .cfi_offset %rbx, -16
13328 ; O1-NEXT:    movq foo(%rip), %rax
13329 ; O1-NEXT:  .Lpcsection519:
13330 ; O1-NEXT:    movq (%rdi), %rax
13331 ; O1-NEXT:  .Lpcsection520:
13332 ; O1-NEXT:    movq 8(%rdi), %rdx
13333 ; O1-NEXT:    .p2align 4, 0x90
13334 ; O1-NEXT:  .LBB225_1: # %atomicrmw.start
13335 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13336 ; O1-NEXT:    movl %eax, %ebx
13337 ; O1-NEXT:  .Lpcsection521:
13338 ; O1-NEXT:    andl $42, %ebx
13339 ; O1-NEXT:  .Lpcsection522:
13340 ; O1-NEXT:    xorl %ecx, %ecx
13341 ; O1-NEXT:  .Lpcsection523:
13342 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13343 ; O1-NEXT:  .Lpcsection524:
13344 ; O1-NEXT:    jne .LBB225_1
13345 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13346 ; O1-NEXT:    movq $1, foo(%rip)
13347 ; O1-NEXT:    popq %rbx
13348 ; O1-NEXT:    .cfi_def_cfa_offset 8
13349 ; O1-NEXT:    retq
13351 ; O2-LABEL: atomic128_and_release:
13352 ; O2:       # %bb.0: # %entry
13353 ; O2-NEXT:    pushq %rbx
13354 ; O2-NEXT:    .cfi_def_cfa_offset 16
13355 ; O2-NEXT:    .cfi_offset %rbx, -16
13356 ; O2-NEXT:    movq foo(%rip), %rax
13357 ; O2-NEXT:  .Lpcsection519:
13358 ; O2-NEXT:    movq (%rdi), %rax
13359 ; O2-NEXT:  .Lpcsection520:
13360 ; O2-NEXT:    movq 8(%rdi), %rdx
13361 ; O2-NEXT:    .p2align 4, 0x90
13362 ; O2-NEXT:  .LBB225_1: # %atomicrmw.start
13363 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
13364 ; O2-NEXT:    movl %eax, %ebx
13365 ; O2-NEXT:  .Lpcsection521:
13366 ; O2-NEXT:    andl $42, %ebx
13367 ; O2-NEXT:  .Lpcsection522:
13368 ; O2-NEXT:    xorl %ecx, %ecx
13369 ; O2-NEXT:  .Lpcsection523:
13370 ; O2-NEXT:    lock cmpxchg16b (%rdi)
13371 ; O2-NEXT:  .Lpcsection524:
13372 ; O2-NEXT:    jne .LBB225_1
13373 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
13374 ; O2-NEXT:    movq $1, foo(%rip)
13375 ; O2-NEXT:    popq %rbx
13376 ; O2-NEXT:    .cfi_def_cfa_offset 8
13377 ; O2-NEXT:    retq
13379 ; O3-LABEL: atomic128_and_release:
13380 ; O3:       # %bb.0: # %entry
13381 ; O3-NEXT:    pushq %rbx
13382 ; O3-NEXT:    .cfi_def_cfa_offset 16
13383 ; O3-NEXT:    .cfi_offset %rbx, -16
13384 ; O3-NEXT:    movq foo(%rip), %rax
13385 ; O3-NEXT:  .Lpcsection519:
13386 ; O3-NEXT:    movq (%rdi), %rax
13387 ; O3-NEXT:  .Lpcsection520:
13388 ; O3-NEXT:    movq 8(%rdi), %rdx
13389 ; O3-NEXT:    .p2align 4, 0x90
13390 ; O3-NEXT:  .LBB225_1: # %atomicrmw.start
13391 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
13392 ; O3-NEXT:    movl %eax, %ebx
13393 ; O3-NEXT:  .Lpcsection521:
13394 ; O3-NEXT:    andl $42, %ebx
13395 ; O3-NEXT:  .Lpcsection522:
13396 ; O3-NEXT:    xorl %ecx, %ecx
13397 ; O3-NEXT:  .Lpcsection523:
13398 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13399 ; O3-NEXT:  .Lpcsection524:
13400 ; O3-NEXT:    jne .LBB225_1
13401 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13402 ; O3-NEXT:    movq $1, foo(%rip)
13403 ; O3-NEXT:    popq %rbx
13404 ; O3-NEXT:    .cfi_def_cfa_offset 8
13405 ; O3-NEXT:    retq
13406 entry:
13407   load volatile i64, ptr @foo, align 8
13408   %x = atomicrmw and ptr %a, i128 42 release, align 16, !pcsections !0
13409   store volatile i64 1, ptr @foo, align 8
13410   ret void
13413 define void @atomic128_or_release(ptr %a) {
13414 ; O0-LABEL: atomic128_or_release:
13415 ; O0:       # %bb.0: # %entry
13416 ; O0-NEXT:    pushq %rbx
13417 ; O0-NEXT:    .cfi_def_cfa_offset 16
13418 ; O0-NEXT:    .cfi_offset %rbx, -16
13419 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13420 ; O0-NEXT:    movq foo(%rip), %rax
13421 ; O0-NEXT:  .Lpcsection588:
13422 ; O0-NEXT:    movq (%rdi), %rax
13423 ; O0-NEXT:  .Lpcsection589:
13424 ; O0-NEXT:    movq 8(%rdi), %rdx
13425 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13426 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13427 ; O0-NEXT:  .Lpcsection590:
13428 ; O0-NEXT:    jmp .LBB226_1
13429 ; O0-NEXT:  .LBB226_1: # %atomicrmw.start
13430 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13431 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
13432 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13433 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13434 ; O0-NEXT:    movq %rax, %rbx
13435 ; O0-NEXT:  .Lpcsection591:
13436 ; O0-NEXT:    orq $42, %rbx
13437 ; O0-NEXT:    movq %rcx, %rdx
13438 ; O0-NEXT:  .Lpcsection592:
13439 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13440 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13441 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13442 ; O0-NEXT:  .Lpcsection593:
13443 ; O0-NEXT:    jne .LBB226_1
13444 ; O0-NEXT:    jmp .LBB226_2
13445 ; O0-NEXT:  .LBB226_2: # %atomicrmw.end
13446 ; O0-NEXT:    movq $1, foo
13447 ; O0-NEXT:    popq %rbx
13448 ; O0-NEXT:    .cfi_def_cfa_offset 8
13449 ; O0-NEXT:    retq
13451 ; O1-LABEL: atomic128_or_release:
13452 ; O1:       # %bb.0: # %entry
13453 ; O1-NEXT:    pushq %rbx
13454 ; O1-NEXT:    .cfi_def_cfa_offset 16
13455 ; O1-NEXT:    .cfi_offset %rbx, -16
13456 ; O1-NEXT:    movq foo(%rip), %rax
13457 ; O1-NEXT:  .Lpcsection525:
13458 ; O1-NEXT:    movq (%rdi), %rax
13459 ; O1-NEXT:  .Lpcsection526:
13460 ; O1-NEXT:    movq 8(%rdi), %rdx
13461 ; O1-NEXT:    .p2align 4, 0x90
13462 ; O1-NEXT:  .LBB226_1: # %atomicrmw.start
13463 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13464 ; O1-NEXT:    movq %rax, %rbx
13465 ; O1-NEXT:  .Lpcsection527:
13466 ; O1-NEXT:    orq $42, %rbx
13467 ; O1-NEXT:    movq %rdx, %rcx
13468 ; O1-NEXT:  .Lpcsection528:
13469 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13470 ; O1-NEXT:  .Lpcsection529:
13471 ; O1-NEXT:    jne .LBB226_1
13472 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13473 ; O1-NEXT:    movq $1, foo(%rip)
13474 ; O1-NEXT:    popq %rbx
13475 ; O1-NEXT:    .cfi_def_cfa_offset 8
13476 ; O1-NEXT:    retq
13478 ; O2-LABEL: atomic128_or_release:
13479 ; O2:       # %bb.0: # %entry
13480 ; O2-NEXT:    pushq %rbx
13481 ; O2-NEXT:    .cfi_def_cfa_offset 16
13482 ; O2-NEXT:    .cfi_offset %rbx, -16
13483 ; O2-NEXT:    movq foo(%rip), %rax
13484 ; O2-NEXT:  .Lpcsection525:
13485 ; O2-NEXT:    movq (%rdi), %rax
13486 ; O2-NEXT:  .Lpcsection526:
13487 ; O2-NEXT:    movq 8(%rdi), %rdx
13488 ; O2-NEXT:    .p2align 4, 0x90
13489 ; O2-NEXT:  .LBB226_1: # %atomicrmw.start
13490 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
13491 ; O2-NEXT:    movq %rax, %rbx
13492 ; O2-NEXT:  .Lpcsection527:
13493 ; O2-NEXT:    orq $42, %rbx
13494 ; O2-NEXT:    movq %rdx, %rcx
13495 ; O2-NEXT:  .Lpcsection528:
13496 ; O2-NEXT:    lock cmpxchg16b (%rdi)
13497 ; O2-NEXT:  .Lpcsection529:
13498 ; O2-NEXT:    jne .LBB226_1
13499 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
13500 ; O2-NEXT:    movq $1, foo(%rip)
13501 ; O2-NEXT:    popq %rbx
13502 ; O2-NEXT:    .cfi_def_cfa_offset 8
13503 ; O2-NEXT:    retq
13505 ; O3-LABEL: atomic128_or_release:
13506 ; O3:       # %bb.0: # %entry
13507 ; O3-NEXT:    pushq %rbx
13508 ; O3-NEXT:    .cfi_def_cfa_offset 16
13509 ; O3-NEXT:    .cfi_offset %rbx, -16
13510 ; O3-NEXT:    movq foo(%rip), %rax
13511 ; O3-NEXT:  .Lpcsection525:
13512 ; O3-NEXT:    movq (%rdi), %rax
13513 ; O3-NEXT:  .Lpcsection526:
13514 ; O3-NEXT:    movq 8(%rdi), %rdx
13515 ; O3-NEXT:    .p2align 4, 0x90
13516 ; O3-NEXT:  .LBB226_1: # %atomicrmw.start
13517 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
13518 ; O3-NEXT:    movq %rax, %rbx
13519 ; O3-NEXT:  .Lpcsection527:
13520 ; O3-NEXT:    orq $42, %rbx
13521 ; O3-NEXT:    movq %rdx, %rcx
13522 ; O3-NEXT:  .Lpcsection528:
13523 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13524 ; O3-NEXT:  .Lpcsection529:
13525 ; O3-NEXT:    jne .LBB226_1
13526 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13527 ; O3-NEXT:    movq $1, foo(%rip)
13528 ; O3-NEXT:    popq %rbx
13529 ; O3-NEXT:    .cfi_def_cfa_offset 8
13530 ; O3-NEXT:    retq
13531 entry:
13532   load volatile i64, ptr @foo, align 8
13533   %x = atomicrmw or ptr %a, i128 42 release, align 16, !pcsections !0
13534   store volatile i64 1, ptr @foo, align 8
13535   ret void
13538 define void @atomic128_xor_release(ptr %a) {
13539 ; O0-LABEL: atomic128_xor_release:
13540 ; O0:       # %bb.0: # %entry
13541 ; O0-NEXT:    pushq %rbx
13542 ; O0-NEXT:    .cfi_def_cfa_offset 16
13543 ; O0-NEXT:    .cfi_offset %rbx, -16
13544 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13545 ; O0-NEXT:    movq foo(%rip), %rax
13546 ; O0-NEXT:  .Lpcsection594:
13547 ; O0-NEXT:    movq (%rdi), %rax
13548 ; O0-NEXT:  .Lpcsection595:
13549 ; O0-NEXT:    movq 8(%rdi), %rdx
13550 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13551 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13552 ; O0-NEXT:  .Lpcsection596:
13553 ; O0-NEXT:    jmp .LBB227_1
13554 ; O0-NEXT:  .LBB227_1: # %atomicrmw.start
13555 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13556 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
13557 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13558 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13559 ; O0-NEXT:    movq %rax, %rbx
13560 ; O0-NEXT:  .Lpcsection597:
13561 ; O0-NEXT:    xorq $42, %rbx
13562 ; O0-NEXT:    movq %rcx, %rdx
13563 ; O0-NEXT:  .Lpcsection598:
13564 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13565 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13566 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13567 ; O0-NEXT:  .Lpcsection599:
13568 ; O0-NEXT:    jne .LBB227_1
13569 ; O0-NEXT:    jmp .LBB227_2
13570 ; O0-NEXT:  .LBB227_2: # %atomicrmw.end
13571 ; O0-NEXT:    movq $1, foo
13572 ; O0-NEXT:    popq %rbx
13573 ; O0-NEXT:    .cfi_def_cfa_offset 8
13574 ; O0-NEXT:    retq
13576 ; O1-LABEL: atomic128_xor_release:
13577 ; O1:       # %bb.0: # %entry
13578 ; O1-NEXT:    pushq %rbx
13579 ; O1-NEXT:    .cfi_def_cfa_offset 16
13580 ; O1-NEXT:    .cfi_offset %rbx, -16
13581 ; O1-NEXT:    movq foo(%rip), %rax
13582 ; O1-NEXT:  .Lpcsection530:
13583 ; O1-NEXT:    movq (%rdi), %rax
13584 ; O1-NEXT:  .Lpcsection531:
13585 ; O1-NEXT:    movq 8(%rdi), %rdx
13586 ; O1-NEXT:    .p2align 4, 0x90
13587 ; O1-NEXT:  .LBB227_1: # %atomicrmw.start
13588 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13589 ; O1-NEXT:    movq %rax, %rbx
13590 ; O1-NEXT:  .Lpcsection532:
13591 ; O1-NEXT:    xorq $42, %rbx
13592 ; O1-NEXT:    movq %rdx, %rcx
13593 ; O1-NEXT:  .Lpcsection533:
13594 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13595 ; O1-NEXT:  .Lpcsection534:
13596 ; O1-NEXT:    jne .LBB227_1
13597 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13598 ; O1-NEXT:    movq $1, foo(%rip)
13599 ; O1-NEXT:    popq %rbx
13600 ; O1-NEXT:    .cfi_def_cfa_offset 8
13601 ; O1-NEXT:    retq
13603 ; O2-LABEL: atomic128_xor_release:
13604 ; O2:       # %bb.0: # %entry
13605 ; O2-NEXT:    pushq %rbx
13606 ; O2-NEXT:    .cfi_def_cfa_offset 16
13607 ; O2-NEXT:    .cfi_offset %rbx, -16
13608 ; O2-NEXT:    movq foo(%rip), %rax
13609 ; O2-NEXT:  .Lpcsection530:
13610 ; O2-NEXT:    movq (%rdi), %rax
13611 ; O2-NEXT:  .Lpcsection531:
13612 ; O2-NEXT:    movq 8(%rdi), %rdx
13613 ; O2-NEXT:    .p2align 4, 0x90
13614 ; O2-NEXT:  .LBB227_1: # %atomicrmw.start
13615 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
13616 ; O2-NEXT:    movq %rax, %rbx
13617 ; O2-NEXT:  .Lpcsection532:
13618 ; O2-NEXT:    xorq $42, %rbx
13619 ; O2-NEXT:    movq %rdx, %rcx
13620 ; O2-NEXT:  .Lpcsection533:
13621 ; O2-NEXT:    lock cmpxchg16b (%rdi)
13622 ; O2-NEXT:  .Lpcsection534:
13623 ; O2-NEXT:    jne .LBB227_1
13624 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
13625 ; O2-NEXT:    movq $1, foo(%rip)
13626 ; O2-NEXT:    popq %rbx
13627 ; O2-NEXT:    .cfi_def_cfa_offset 8
13628 ; O2-NEXT:    retq
13630 ; O3-LABEL: atomic128_xor_release:
13631 ; O3:       # %bb.0: # %entry
13632 ; O3-NEXT:    pushq %rbx
13633 ; O3-NEXT:    .cfi_def_cfa_offset 16
13634 ; O3-NEXT:    .cfi_offset %rbx, -16
13635 ; O3-NEXT:    movq foo(%rip), %rax
13636 ; O3-NEXT:  .Lpcsection530:
13637 ; O3-NEXT:    movq (%rdi), %rax
13638 ; O3-NEXT:  .Lpcsection531:
13639 ; O3-NEXT:    movq 8(%rdi), %rdx
13640 ; O3-NEXT:    .p2align 4, 0x90
13641 ; O3-NEXT:  .LBB227_1: # %atomicrmw.start
13642 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
13643 ; O3-NEXT:    movq %rax, %rbx
13644 ; O3-NEXT:  .Lpcsection532:
13645 ; O3-NEXT:    xorq $42, %rbx
13646 ; O3-NEXT:    movq %rdx, %rcx
13647 ; O3-NEXT:  .Lpcsection533:
13648 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13649 ; O3-NEXT:  .Lpcsection534:
13650 ; O3-NEXT:    jne .LBB227_1
13651 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13652 ; O3-NEXT:    movq $1, foo(%rip)
13653 ; O3-NEXT:    popq %rbx
13654 ; O3-NEXT:    .cfi_def_cfa_offset 8
13655 ; O3-NEXT:    retq
13656 entry:
13657   load volatile i64, ptr @foo, align 8
13658   %x = atomicrmw xor ptr %a, i128 42 release, align 16, !pcsections !0
13659   store volatile i64 1, ptr @foo, align 8
13660   ret void
13663 define void @atomic128_nand_release(ptr %a) {
13664 ; O0-LABEL: atomic128_nand_release:
13665 ; O0:       # %bb.0: # %entry
13666 ; O0-NEXT:    pushq %rbx
13667 ; O0-NEXT:    .cfi_def_cfa_offset 16
13668 ; O0-NEXT:    .cfi_offset %rbx, -16
13669 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13670 ; O0-NEXT:    movq foo(%rip), %rax
13671 ; O0-NEXT:  .Lpcsection600:
13672 ; O0-NEXT:    movq (%rdi), %rax
13673 ; O0-NEXT:  .Lpcsection601:
13674 ; O0-NEXT:    movq 8(%rdi), %rdx
13675 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13676 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13677 ; O0-NEXT:  .Lpcsection602:
13678 ; O0-NEXT:    jmp .LBB228_1
13679 ; O0-NEXT:  .LBB228_1: # %atomicrmw.start
13680 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13681 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
13682 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13683 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13684 ; O0-NEXT:    movl %eax, %ecx
13685 ; O0-NEXT:  .Lpcsection603:
13686 ; O0-NEXT:    notl %ecx
13687 ; O0-NEXT:  .Lpcsection604:
13688 ; O0-NEXT:    # implicit-def: $rbx
13689 ; O0-NEXT:    movl %ecx, %ebx
13690 ; O0-NEXT:  .Lpcsection605:
13691 ; O0-NEXT:    orq $-43, %rbx
13692 ; O0-NEXT:  .Lpcsection606:
13693 ; O0-NEXT:    movq $-1, %rcx
13694 ; O0-NEXT:  .Lpcsection607:
13695 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13696 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13697 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13698 ; O0-NEXT:  .Lpcsection608:
13699 ; O0-NEXT:    jne .LBB228_1
13700 ; O0-NEXT:    jmp .LBB228_2
13701 ; O0-NEXT:  .LBB228_2: # %atomicrmw.end
13702 ; O0-NEXT:    movq $1, foo
13703 ; O0-NEXT:    popq %rbx
13704 ; O0-NEXT:    .cfi_def_cfa_offset 8
13705 ; O0-NEXT:    retq
13707 ; O1-LABEL: atomic128_nand_release:
13708 ; O1:       # %bb.0: # %entry
13709 ; O1-NEXT:    pushq %rbx
13710 ; O1-NEXT:    .cfi_def_cfa_offset 16
13711 ; O1-NEXT:    .cfi_offset %rbx, -16
13712 ; O1-NEXT:    movq foo(%rip), %rax
13713 ; O1-NEXT:  .Lpcsection535:
13714 ; O1-NEXT:    movq (%rdi), %rax
13715 ; O1-NEXT:  .Lpcsection536:
13716 ; O1-NEXT:    movq 8(%rdi), %rdx
13717 ; O1-NEXT:  .Lpcsection537:
13718 ; O1-NEXT:    movq $-1, %rcx
13719 ; O1-NEXT:    .p2align 4, 0x90
13720 ; O1-NEXT:  .LBB228_1: # %atomicrmw.start
13721 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13722 ; O1-NEXT:    movl %eax, %ebx
13723 ; O1-NEXT:  .Lpcsection538:
13724 ; O1-NEXT:    notl %ebx
13725 ; O1-NEXT:  .Lpcsection539:
13726 ; O1-NEXT:    orq $-43, %rbx
13727 ; O1-NEXT:  .Lpcsection540:
13728 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13729 ; O1-NEXT:  .Lpcsection541:
13730 ; O1-NEXT:    jne .LBB228_1
13731 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13732 ; O1-NEXT:    movq $1, foo(%rip)
13733 ; O1-NEXT:    popq %rbx
13734 ; O1-NEXT:    .cfi_def_cfa_offset 8
13735 ; O1-NEXT:    retq
13737 ; O2-LABEL: atomic128_nand_release:
13738 ; O2:       # %bb.0: # %entry
13739 ; O2-NEXT:    pushq %rbx
13740 ; O2-NEXT:    .cfi_def_cfa_offset 16
13741 ; O2-NEXT:    .cfi_offset %rbx, -16
13742 ; O2-NEXT:    movq foo(%rip), %rax
13743 ; O2-NEXT:  .Lpcsection535:
13744 ; O2-NEXT:    movq (%rdi), %rax
13745 ; O2-NEXT:  .Lpcsection536:
13746 ; O2-NEXT:    movq 8(%rdi), %rdx
13747 ; O2-NEXT:  .Lpcsection537:
13748 ; O2-NEXT:    movq $-1, %rcx
13749 ; O2-NEXT:    .p2align 4, 0x90
13750 ; O2-NEXT:  .LBB228_1: # %atomicrmw.start
13751 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
13752 ; O2-NEXT:    movl %eax, %ebx
13753 ; O2-NEXT:  .Lpcsection538:
13754 ; O2-NEXT:    notl %ebx
13755 ; O2-NEXT:  .Lpcsection539:
13756 ; O2-NEXT:    orq $-43, %rbx
13757 ; O2-NEXT:  .Lpcsection540:
13758 ; O2-NEXT:    lock cmpxchg16b (%rdi)
13759 ; O2-NEXT:  .Lpcsection541:
13760 ; O2-NEXT:    jne .LBB228_1
13761 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
13762 ; O2-NEXT:    movq $1, foo(%rip)
13763 ; O2-NEXT:    popq %rbx
13764 ; O2-NEXT:    .cfi_def_cfa_offset 8
13765 ; O2-NEXT:    retq
13767 ; O3-LABEL: atomic128_nand_release:
13768 ; O3:       # %bb.0: # %entry
13769 ; O3-NEXT:    pushq %rbx
13770 ; O3-NEXT:    .cfi_def_cfa_offset 16
13771 ; O3-NEXT:    .cfi_offset %rbx, -16
13772 ; O3-NEXT:    movq foo(%rip), %rax
13773 ; O3-NEXT:  .Lpcsection535:
13774 ; O3-NEXT:    movq (%rdi), %rax
13775 ; O3-NEXT:  .Lpcsection536:
13776 ; O3-NEXT:    movq 8(%rdi), %rdx
13777 ; O3-NEXT:  .Lpcsection537:
13778 ; O3-NEXT:    movq $-1, %rcx
13779 ; O3-NEXT:    .p2align 4, 0x90
13780 ; O3-NEXT:  .LBB228_1: # %atomicrmw.start
13781 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
13782 ; O3-NEXT:    movl %eax, %ebx
13783 ; O3-NEXT:  .Lpcsection538:
13784 ; O3-NEXT:    notl %ebx
13785 ; O3-NEXT:  .Lpcsection539:
13786 ; O3-NEXT:    orq $-43, %rbx
13787 ; O3-NEXT:  .Lpcsection540:
13788 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13789 ; O3-NEXT:  .Lpcsection541:
13790 ; O3-NEXT:    jne .LBB228_1
13791 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13792 ; O3-NEXT:    movq $1, foo(%rip)
13793 ; O3-NEXT:    popq %rbx
13794 ; O3-NEXT:    .cfi_def_cfa_offset 8
13795 ; O3-NEXT:    retq
13796 entry:
13797   load volatile i64, ptr @foo, align 8
13798   %x = atomicrmw nand ptr %a, i128 42 release, align 16, !pcsections !0
13799   store volatile i64 1, ptr @foo, align 8
13800   ret void
13803 define void @atomic128_xchg_acq_rel(ptr %a) {
13804 ; O0-LABEL: atomic128_xchg_acq_rel:
13805 ; O0:       # %bb.0: # %entry
13806 ; O0-NEXT:    pushq %rbx
13807 ; O0-NEXT:    .cfi_def_cfa_offset 16
13808 ; O0-NEXT:    .cfi_offset %rbx, -16
13809 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13810 ; O0-NEXT:    movq foo(%rip), %rax
13811 ; O0-NEXT:  .Lpcsection609:
13812 ; O0-NEXT:    movq (%rdi), %rax
13813 ; O0-NEXT:  .Lpcsection610:
13814 ; O0-NEXT:    movq 8(%rdi), %rdx
13815 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13816 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13817 ; O0-NEXT:  .Lpcsection611:
13818 ; O0-NEXT:    jmp .LBB229_1
13819 ; O0-NEXT:  .LBB229_1: # %atomicrmw.start
13820 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13821 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
13822 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13823 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13824 ; O0-NEXT:  .Lpcsection612:
13825 ; O0-NEXT:    xorl %ecx, %ecx
13826 ; O0-NEXT:  .Lpcsection613:
13827 ; O0-NEXT:    # kill: def $rcx killed $ecx
13828 ; O0-NEXT:  .Lpcsection614:
13829 ; O0-NEXT:    movl $42, %ebx
13830 ; O0-NEXT:  .Lpcsection615:
13831 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13832 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13833 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13834 ; O0-NEXT:  .Lpcsection616:
13835 ; O0-NEXT:    jne .LBB229_1
13836 ; O0-NEXT:    jmp .LBB229_2
13837 ; O0-NEXT:  .LBB229_2: # %atomicrmw.end
13838 ; O0-NEXT:    movq $1, foo
13839 ; O0-NEXT:    popq %rbx
13840 ; O0-NEXT:    .cfi_def_cfa_offset 8
13841 ; O0-NEXT:    retq
13843 ; O1-LABEL: atomic128_xchg_acq_rel:
13844 ; O1:       # %bb.0: # %entry
13845 ; O1-NEXT:    pushq %rbx
13846 ; O1-NEXT:    .cfi_def_cfa_offset 16
13847 ; O1-NEXT:    .cfi_offset %rbx, -16
13848 ; O1-NEXT:    movq foo(%rip), %rax
13849 ; O1-NEXT:  .Lpcsection542:
13850 ; O1-NEXT:    movq (%rdi), %rax
13851 ; O1-NEXT:  .Lpcsection543:
13852 ; O1-NEXT:    movq 8(%rdi), %rdx
13853 ; O1-NEXT:  .Lpcsection544:
13854 ; O1-NEXT:    movl $42, %ebx
13855 ; O1-NEXT:    .p2align 4, 0x90
13856 ; O1-NEXT:  .LBB229_1: # %atomicrmw.start
13857 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13858 ; O1-NEXT:  .Lpcsection545:
13859 ; O1-NEXT:    xorl %ecx, %ecx
13860 ; O1-NEXT:  .Lpcsection546:
13861 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13862 ; O1-NEXT:  .Lpcsection547:
13863 ; O1-NEXT:    jne .LBB229_1
13864 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13865 ; O1-NEXT:    movq $1, foo(%rip)
13866 ; O1-NEXT:    popq %rbx
13867 ; O1-NEXT:    .cfi_def_cfa_offset 8
13868 ; O1-NEXT:    retq
13870 ; O2-LABEL: atomic128_xchg_acq_rel:
13871 ; O2:       # %bb.0: # %entry
13872 ; O2-NEXT:    pushq %rbx
13873 ; O2-NEXT:    .cfi_def_cfa_offset 16
13874 ; O2-NEXT:    .cfi_offset %rbx, -16
13875 ; O2-NEXT:    movq foo(%rip), %rax
13876 ; O2-NEXT:  .Lpcsection542:
13877 ; O2-NEXT:    movq (%rdi), %rax
13878 ; O2-NEXT:  .Lpcsection543:
13879 ; O2-NEXT:    movq 8(%rdi), %rdx
13880 ; O2-NEXT:  .Lpcsection544:
13881 ; O2-NEXT:    movl $42, %ebx
13882 ; O2-NEXT:    .p2align 4, 0x90
13883 ; O2-NEXT:  .LBB229_1: # %atomicrmw.start
13884 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
13885 ; O2-NEXT:  .Lpcsection545:
13886 ; O2-NEXT:    xorl %ecx, %ecx
13887 ; O2-NEXT:  .Lpcsection546:
13888 ; O2-NEXT:    lock cmpxchg16b (%rdi)
13889 ; O2-NEXT:  .Lpcsection547:
13890 ; O2-NEXT:    jne .LBB229_1
13891 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
13892 ; O2-NEXT:    movq $1, foo(%rip)
13893 ; O2-NEXT:    popq %rbx
13894 ; O2-NEXT:    .cfi_def_cfa_offset 8
13895 ; O2-NEXT:    retq
13897 ; O3-LABEL: atomic128_xchg_acq_rel:
13898 ; O3:       # %bb.0: # %entry
13899 ; O3-NEXT:    pushq %rbx
13900 ; O3-NEXT:    .cfi_def_cfa_offset 16
13901 ; O3-NEXT:    .cfi_offset %rbx, -16
13902 ; O3-NEXT:    movq foo(%rip), %rax
13903 ; O3-NEXT:  .Lpcsection542:
13904 ; O3-NEXT:    movq (%rdi), %rax
13905 ; O3-NEXT:  .Lpcsection543:
13906 ; O3-NEXT:    movq 8(%rdi), %rdx
13907 ; O3-NEXT:  .Lpcsection544:
13908 ; O3-NEXT:    movl $42, %ebx
13909 ; O3-NEXT:    .p2align 4, 0x90
13910 ; O3-NEXT:  .LBB229_1: # %atomicrmw.start
13911 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
13912 ; O3-NEXT:  .Lpcsection545:
13913 ; O3-NEXT:    xorl %ecx, %ecx
13914 ; O3-NEXT:  .Lpcsection546:
13915 ; O3-NEXT:    lock cmpxchg16b (%rdi)
13916 ; O3-NEXT:  .Lpcsection547:
13917 ; O3-NEXT:    jne .LBB229_1
13918 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
13919 ; O3-NEXT:    movq $1, foo(%rip)
13920 ; O3-NEXT:    popq %rbx
13921 ; O3-NEXT:    .cfi_def_cfa_offset 8
13922 ; O3-NEXT:    retq
13923 entry:
13924   load volatile i64, ptr @foo, align 8
13925   %x = atomicrmw xchg ptr %a, i128 42 acq_rel, align 16, !pcsections !0
13926   store volatile i64 1, ptr @foo, align 8
13927   ret void
13930 define void @atomic128_add_acq_rel(ptr %a) {
13931 ; O0-LABEL: atomic128_add_acq_rel:
13932 ; O0:       # %bb.0: # %entry
13933 ; O0-NEXT:    pushq %rbx
13934 ; O0-NEXT:    .cfi_def_cfa_offset 16
13935 ; O0-NEXT:    .cfi_offset %rbx, -16
13936 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13937 ; O0-NEXT:    movq foo(%rip), %rax
13938 ; O0-NEXT:  .Lpcsection617:
13939 ; O0-NEXT:    movq (%rdi), %rax
13940 ; O0-NEXT:  .Lpcsection618:
13941 ; O0-NEXT:    movq 8(%rdi), %rdx
13942 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13943 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13944 ; O0-NEXT:  .Lpcsection619:
13945 ; O0-NEXT:    jmp .LBB230_1
13946 ; O0-NEXT:  .LBB230_1: # %atomicrmw.start
13947 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
13948 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
13949 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
13950 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
13951 ; O0-NEXT:    movq %rax, %rbx
13952 ; O0-NEXT:  .Lpcsection620:
13953 ; O0-NEXT:    addq $42, %rbx
13954 ; O0-NEXT:    movq %rdx, %rcx
13955 ; O0-NEXT:  .Lpcsection621:
13956 ; O0-NEXT:    adcq $0, %rcx
13957 ; O0-NEXT:  .Lpcsection622:
13958 ; O0-NEXT:    lock cmpxchg16b (%rsi)
13959 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13960 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
13961 ; O0-NEXT:  .Lpcsection623:
13962 ; O0-NEXT:    jne .LBB230_1
13963 ; O0-NEXT:    jmp .LBB230_2
13964 ; O0-NEXT:  .LBB230_2: # %atomicrmw.end
13965 ; O0-NEXT:    movq $1, foo
13966 ; O0-NEXT:    popq %rbx
13967 ; O0-NEXT:    .cfi_def_cfa_offset 8
13968 ; O0-NEXT:    retq
13970 ; O1-LABEL: atomic128_add_acq_rel:
13971 ; O1:       # %bb.0: # %entry
13972 ; O1-NEXT:    pushq %rbx
13973 ; O1-NEXT:    .cfi_def_cfa_offset 16
13974 ; O1-NEXT:    .cfi_offset %rbx, -16
13975 ; O1-NEXT:    movq foo(%rip), %rax
13976 ; O1-NEXT:  .Lpcsection548:
13977 ; O1-NEXT:    movq (%rdi), %rax
13978 ; O1-NEXT:  .Lpcsection549:
13979 ; O1-NEXT:    movq 8(%rdi), %rdx
13980 ; O1-NEXT:    .p2align 4, 0x90
13981 ; O1-NEXT:  .LBB230_1: # %atomicrmw.start
13982 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
13983 ; O1-NEXT:    movq %rax, %rbx
13984 ; O1-NEXT:  .Lpcsection550:
13985 ; O1-NEXT:    addq $42, %rbx
13986 ; O1-NEXT:    movq %rdx, %rcx
13987 ; O1-NEXT:  .Lpcsection551:
13988 ; O1-NEXT:    adcq $0, %rcx
13989 ; O1-NEXT:  .Lpcsection552:
13990 ; O1-NEXT:    lock cmpxchg16b (%rdi)
13991 ; O1-NEXT:  .Lpcsection553:
13992 ; O1-NEXT:    jne .LBB230_1
13993 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
13994 ; O1-NEXT:    movq $1, foo(%rip)
13995 ; O1-NEXT:    popq %rbx
13996 ; O1-NEXT:    .cfi_def_cfa_offset 8
13997 ; O1-NEXT:    retq
13999 ; O2-LABEL: atomic128_add_acq_rel:
14000 ; O2:       # %bb.0: # %entry
14001 ; O2-NEXT:    pushq %rbx
14002 ; O2-NEXT:    .cfi_def_cfa_offset 16
14003 ; O2-NEXT:    .cfi_offset %rbx, -16
14004 ; O2-NEXT:    movq foo(%rip), %rax
14005 ; O2-NEXT:  .Lpcsection548:
14006 ; O2-NEXT:    movq (%rdi), %rax
14007 ; O2-NEXT:  .Lpcsection549:
14008 ; O2-NEXT:    movq 8(%rdi), %rdx
14009 ; O2-NEXT:    .p2align 4, 0x90
14010 ; O2-NEXT:  .LBB230_1: # %atomicrmw.start
14011 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14012 ; O2-NEXT:    movq %rax, %rbx
14013 ; O2-NEXT:  .Lpcsection550:
14014 ; O2-NEXT:    addq $42, %rbx
14015 ; O2-NEXT:    movq %rdx, %rcx
14016 ; O2-NEXT:  .Lpcsection551:
14017 ; O2-NEXT:    adcq $0, %rcx
14018 ; O2-NEXT:  .Lpcsection552:
14019 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14020 ; O2-NEXT:  .Lpcsection553:
14021 ; O2-NEXT:    jne .LBB230_1
14022 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14023 ; O2-NEXT:    movq $1, foo(%rip)
14024 ; O2-NEXT:    popq %rbx
14025 ; O2-NEXT:    .cfi_def_cfa_offset 8
14026 ; O2-NEXT:    retq
14028 ; O3-LABEL: atomic128_add_acq_rel:
14029 ; O3:       # %bb.0: # %entry
14030 ; O3-NEXT:    pushq %rbx
14031 ; O3-NEXT:    .cfi_def_cfa_offset 16
14032 ; O3-NEXT:    .cfi_offset %rbx, -16
14033 ; O3-NEXT:    movq foo(%rip), %rax
14034 ; O3-NEXT:  .Lpcsection548:
14035 ; O3-NEXT:    movq (%rdi), %rax
14036 ; O3-NEXT:  .Lpcsection549:
14037 ; O3-NEXT:    movq 8(%rdi), %rdx
14038 ; O3-NEXT:    .p2align 4, 0x90
14039 ; O3-NEXT:  .LBB230_1: # %atomicrmw.start
14040 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14041 ; O3-NEXT:    movq %rax, %rbx
14042 ; O3-NEXT:  .Lpcsection550:
14043 ; O3-NEXT:    addq $42, %rbx
14044 ; O3-NEXT:    movq %rdx, %rcx
14045 ; O3-NEXT:  .Lpcsection551:
14046 ; O3-NEXT:    adcq $0, %rcx
14047 ; O3-NEXT:  .Lpcsection552:
14048 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14049 ; O3-NEXT:  .Lpcsection553:
14050 ; O3-NEXT:    jne .LBB230_1
14051 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14052 ; O3-NEXT:    movq $1, foo(%rip)
14053 ; O3-NEXT:    popq %rbx
14054 ; O3-NEXT:    .cfi_def_cfa_offset 8
14055 ; O3-NEXT:    retq
14056 entry:
14057   load volatile i64, ptr @foo, align 8
14058   %x = atomicrmw add ptr %a, i128 42 acq_rel, align 16, !pcsections !0
14059   store volatile i64 1, ptr @foo, align 8
14060   ret void
14063 define void @atomic128_sub_acq_rel(ptr %a) {
14064 ; O0-LABEL: atomic128_sub_acq_rel:
14065 ; O0:       # %bb.0: # %entry
14066 ; O0-NEXT:    pushq %rbx
14067 ; O0-NEXT:    .cfi_def_cfa_offset 16
14068 ; O0-NEXT:    .cfi_offset %rbx, -16
14069 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14070 ; O0-NEXT:    movq foo(%rip), %rax
14071 ; O0-NEXT:  .Lpcsection624:
14072 ; O0-NEXT:    movq (%rdi), %rax
14073 ; O0-NEXT:  .Lpcsection625:
14074 ; O0-NEXT:    movq 8(%rdi), %rdx
14075 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14076 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14077 ; O0-NEXT:  .Lpcsection626:
14078 ; O0-NEXT:    jmp .LBB231_1
14079 ; O0-NEXT:  .LBB231_1: # %atomicrmw.start
14080 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14081 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
14082 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14083 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14084 ; O0-NEXT:    movq %rax, %rbx
14085 ; O0-NEXT:  .Lpcsection627:
14086 ; O0-NEXT:    addq $-42, %rbx
14087 ; O0-NEXT:    movq %rdx, %rcx
14088 ; O0-NEXT:  .Lpcsection628:
14089 ; O0-NEXT:    adcq $-1, %rcx
14090 ; O0-NEXT:  .Lpcsection629:
14091 ; O0-NEXT:    lock cmpxchg16b (%rsi)
14092 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14093 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14094 ; O0-NEXT:  .Lpcsection630:
14095 ; O0-NEXT:    jne .LBB231_1
14096 ; O0-NEXT:    jmp .LBB231_2
14097 ; O0-NEXT:  .LBB231_2: # %atomicrmw.end
14098 ; O0-NEXT:    movq $1, foo
14099 ; O0-NEXT:    popq %rbx
14100 ; O0-NEXT:    .cfi_def_cfa_offset 8
14101 ; O0-NEXT:    retq
14103 ; O1-LABEL: atomic128_sub_acq_rel:
14104 ; O1:       # %bb.0: # %entry
14105 ; O1-NEXT:    pushq %rbx
14106 ; O1-NEXT:    .cfi_def_cfa_offset 16
14107 ; O1-NEXT:    .cfi_offset %rbx, -16
14108 ; O1-NEXT:    movq foo(%rip), %rax
14109 ; O1-NEXT:  .Lpcsection554:
14110 ; O1-NEXT:    movq (%rdi), %rax
14111 ; O1-NEXT:  .Lpcsection555:
14112 ; O1-NEXT:    movq 8(%rdi), %rdx
14113 ; O1-NEXT:    .p2align 4, 0x90
14114 ; O1-NEXT:  .LBB231_1: # %atomicrmw.start
14115 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
14116 ; O1-NEXT:    movq %rax, %rbx
14117 ; O1-NEXT:  .Lpcsection556:
14118 ; O1-NEXT:    addq $-42, %rbx
14119 ; O1-NEXT:    movq %rdx, %rcx
14120 ; O1-NEXT:  .Lpcsection557:
14121 ; O1-NEXT:    adcq $-1, %rcx
14122 ; O1-NEXT:  .Lpcsection558:
14123 ; O1-NEXT:    lock cmpxchg16b (%rdi)
14124 ; O1-NEXT:  .Lpcsection559:
14125 ; O1-NEXT:    jne .LBB231_1
14126 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
14127 ; O1-NEXT:    movq $1, foo(%rip)
14128 ; O1-NEXT:    popq %rbx
14129 ; O1-NEXT:    .cfi_def_cfa_offset 8
14130 ; O1-NEXT:    retq
14132 ; O2-LABEL: atomic128_sub_acq_rel:
14133 ; O2:       # %bb.0: # %entry
14134 ; O2-NEXT:    pushq %rbx
14135 ; O2-NEXT:    .cfi_def_cfa_offset 16
14136 ; O2-NEXT:    .cfi_offset %rbx, -16
14137 ; O2-NEXT:    movq foo(%rip), %rax
14138 ; O2-NEXT:  .Lpcsection554:
14139 ; O2-NEXT:    movq (%rdi), %rax
14140 ; O2-NEXT:  .Lpcsection555:
14141 ; O2-NEXT:    movq 8(%rdi), %rdx
14142 ; O2-NEXT:    .p2align 4, 0x90
14143 ; O2-NEXT:  .LBB231_1: # %atomicrmw.start
14144 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14145 ; O2-NEXT:    movq %rax, %rbx
14146 ; O2-NEXT:  .Lpcsection556:
14147 ; O2-NEXT:    addq $-42, %rbx
14148 ; O2-NEXT:    movq %rdx, %rcx
14149 ; O2-NEXT:  .Lpcsection557:
14150 ; O2-NEXT:    adcq $-1, %rcx
14151 ; O2-NEXT:  .Lpcsection558:
14152 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14153 ; O2-NEXT:  .Lpcsection559:
14154 ; O2-NEXT:    jne .LBB231_1
14155 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14156 ; O2-NEXT:    movq $1, foo(%rip)
14157 ; O2-NEXT:    popq %rbx
14158 ; O2-NEXT:    .cfi_def_cfa_offset 8
14159 ; O2-NEXT:    retq
14161 ; O3-LABEL: atomic128_sub_acq_rel:
14162 ; O3:       # %bb.0: # %entry
14163 ; O3-NEXT:    pushq %rbx
14164 ; O3-NEXT:    .cfi_def_cfa_offset 16
14165 ; O3-NEXT:    .cfi_offset %rbx, -16
14166 ; O3-NEXT:    movq foo(%rip), %rax
14167 ; O3-NEXT:  .Lpcsection554:
14168 ; O3-NEXT:    movq (%rdi), %rax
14169 ; O3-NEXT:  .Lpcsection555:
14170 ; O3-NEXT:    movq 8(%rdi), %rdx
14171 ; O3-NEXT:    .p2align 4, 0x90
14172 ; O3-NEXT:  .LBB231_1: # %atomicrmw.start
14173 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14174 ; O3-NEXT:    movq %rax, %rbx
14175 ; O3-NEXT:  .Lpcsection556:
14176 ; O3-NEXT:    addq $-42, %rbx
14177 ; O3-NEXT:    movq %rdx, %rcx
14178 ; O3-NEXT:  .Lpcsection557:
14179 ; O3-NEXT:    adcq $-1, %rcx
14180 ; O3-NEXT:  .Lpcsection558:
14181 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14182 ; O3-NEXT:  .Lpcsection559:
14183 ; O3-NEXT:    jne .LBB231_1
14184 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14185 ; O3-NEXT:    movq $1, foo(%rip)
14186 ; O3-NEXT:    popq %rbx
14187 ; O3-NEXT:    .cfi_def_cfa_offset 8
14188 ; O3-NEXT:    retq
14189 entry:
14190   load volatile i64, ptr @foo, align 8
14191   %x = atomicrmw sub ptr %a, i128 42 acq_rel, align 16, !pcsections !0
14192   store volatile i64 1, ptr @foo, align 8
14193   ret void
14196 define void @atomic128_and_acq_rel(ptr %a) {
14197 ; O0-LABEL: atomic128_and_acq_rel:
14198 ; O0:       # %bb.0: # %entry
14199 ; O0-NEXT:    pushq %rbx
14200 ; O0-NEXT:    .cfi_def_cfa_offset 16
14201 ; O0-NEXT:    .cfi_offset %rbx, -16
14202 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14203 ; O0-NEXT:    movq foo(%rip), %rax
14204 ; O0-NEXT:  .Lpcsection631:
14205 ; O0-NEXT:    movq (%rdi), %rax
14206 ; O0-NEXT:  .Lpcsection632:
14207 ; O0-NEXT:    movq 8(%rdi), %rdx
14208 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14209 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14210 ; O0-NEXT:  .Lpcsection633:
14211 ; O0-NEXT:    jmp .LBB232_1
14212 ; O0-NEXT:  .LBB232_1: # %atomicrmw.start
14213 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14214 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
14215 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14216 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14217 ; O0-NEXT:    movl %eax, %ecx
14218 ; O0-NEXT:  .Lpcsection634:
14219 ; O0-NEXT:    andl $42, %ecx
14220 ; O0-NEXT:    movl %ecx, %ebx
14221 ; O0-NEXT:  .Lpcsection635:
14222 ; O0-NEXT:    xorl %ecx, %ecx
14223 ; O0-NEXT:  .Lpcsection636:
14224 ; O0-NEXT:    # kill: def $rcx killed $ecx
14225 ; O0-NEXT:  .Lpcsection637:
14226 ; O0-NEXT:    lock cmpxchg16b (%rsi)
14227 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14228 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14229 ; O0-NEXT:  .Lpcsection638:
14230 ; O0-NEXT:    jne .LBB232_1
14231 ; O0-NEXT:    jmp .LBB232_2
14232 ; O0-NEXT:  .LBB232_2: # %atomicrmw.end
14233 ; O0-NEXT:    movq $1, foo
14234 ; O0-NEXT:    popq %rbx
14235 ; O0-NEXT:    .cfi_def_cfa_offset 8
14236 ; O0-NEXT:    retq
14238 ; O1-LABEL: atomic128_and_acq_rel:
14239 ; O1:       # %bb.0: # %entry
14240 ; O1-NEXT:    pushq %rbx
14241 ; O1-NEXT:    .cfi_def_cfa_offset 16
14242 ; O1-NEXT:    .cfi_offset %rbx, -16
14243 ; O1-NEXT:    movq foo(%rip), %rax
14244 ; O1-NEXT:  .Lpcsection560:
14245 ; O1-NEXT:    movq (%rdi), %rax
14246 ; O1-NEXT:  .Lpcsection561:
14247 ; O1-NEXT:    movq 8(%rdi), %rdx
14248 ; O1-NEXT:    .p2align 4, 0x90
14249 ; O1-NEXT:  .LBB232_1: # %atomicrmw.start
14250 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
14251 ; O1-NEXT:    movl %eax, %ebx
14252 ; O1-NEXT:  .Lpcsection562:
14253 ; O1-NEXT:    andl $42, %ebx
14254 ; O1-NEXT:  .Lpcsection563:
14255 ; O1-NEXT:    xorl %ecx, %ecx
14256 ; O1-NEXT:  .Lpcsection564:
14257 ; O1-NEXT:    lock cmpxchg16b (%rdi)
14258 ; O1-NEXT:  .Lpcsection565:
14259 ; O1-NEXT:    jne .LBB232_1
14260 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
14261 ; O1-NEXT:    movq $1, foo(%rip)
14262 ; O1-NEXT:    popq %rbx
14263 ; O1-NEXT:    .cfi_def_cfa_offset 8
14264 ; O1-NEXT:    retq
14266 ; O2-LABEL: atomic128_and_acq_rel:
14267 ; O2:       # %bb.0: # %entry
14268 ; O2-NEXT:    pushq %rbx
14269 ; O2-NEXT:    .cfi_def_cfa_offset 16
14270 ; O2-NEXT:    .cfi_offset %rbx, -16
14271 ; O2-NEXT:    movq foo(%rip), %rax
14272 ; O2-NEXT:  .Lpcsection560:
14273 ; O2-NEXT:    movq (%rdi), %rax
14274 ; O2-NEXT:  .Lpcsection561:
14275 ; O2-NEXT:    movq 8(%rdi), %rdx
14276 ; O2-NEXT:    .p2align 4, 0x90
14277 ; O2-NEXT:  .LBB232_1: # %atomicrmw.start
14278 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14279 ; O2-NEXT:    movl %eax, %ebx
14280 ; O2-NEXT:  .Lpcsection562:
14281 ; O2-NEXT:    andl $42, %ebx
14282 ; O2-NEXT:  .Lpcsection563:
14283 ; O2-NEXT:    xorl %ecx, %ecx
14284 ; O2-NEXT:  .Lpcsection564:
14285 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14286 ; O2-NEXT:  .Lpcsection565:
14287 ; O2-NEXT:    jne .LBB232_1
14288 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14289 ; O2-NEXT:    movq $1, foo(%rip)
14290 ; O2-NEXT:    popq %rbx
14291 ; O2-NEXT:    .cfi_def_cfa_offset 8
14292 ; O2-NEXT:    retq
14294 ; O3-LABEL: atomic128_and_acq_rel:
14295 ; O3:       # %bb.0: # %entry
14296 ; O3-NEXT:    pushq %rbx
14297 ; O3-NEXT:    .cfi_def_cfa_offset 16
14298 ; O3-NEXT:    .cfi_offset %rbx, -16
14299 ; O3-NEXT:    movq foo(%rip), %rax
14300 ; O3-NEXT:  .Lpcsection560:
14301 ; O3-NEXT:    movq (%rdi), %rax
14302 ; O3-NEXT:  .Lpcsection561:
14303 ; O3-NEXT:    movq 8(%rdi), %rdx
14304 ; O3-NEXT:    .p2align 4, 0x90
14305 ; O3-NEXT:  .LBB232_1: # %atomicrmw.start
14306 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14307 ; O3-NEXT:    movl %eax, %ebx
14308 ; O3-NEXT:  .Lpcsection562:
14309 ; O3-NEXT:    andl $42, %ebx
14310 ; O3-NEXT:  .Lpcsection563:
14311 ; O3-NEXT:    xorl %ecx, %ecx
14312 ; O3-NEXT:  .Lpcsection564:
14313 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14314 ; O3-NEXT:  .Lpcsection565:
14315 ; O3-NEXT:    jne .LBB232_1
14316 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14317 ; O3-NEXT:    movq $1, foo(%rip)
14318 ; O3-NEXT:    popq %rbx
14319 ; O3-NEXT:    .cfi_def_cfa_offset 8
14320 ; O3-NEXT:    retq
14321 entry:
14322   load volatile i64, ptr @foo, align 8
14323   %x = atomicrmw and ptr %a, i128 42 acq_rel, align 16, !pcsections !0
14324   store volatile i64 1, ptr @foo, align 8
14325   ret void
14328 define void @atomic128_or_acq_rel(ptr %a) {
14329 ; O0-LABEL: atomic128_or_acq_rel:
14330 ; O0:       # %bb.0: # %entry
14331 ; O0-NEXT:    pushq %rbx
14332 ; O0-NEXT:    .cfi_def_cfa_offset 16
14333 ; O0-NEXT:    .cfi_offset %rbx, -16
14334 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14335 ; O0-NEXT:    movq foo(%rip), %rax
14336 ; O0-NEXT:  .Lpcsection639:
14337 ; O0-NEXT:    movq (%rdi), %rax
14338 ; O0-NEXT:  .Lpcsection640:
14339 ; O0-NEXT:    movq 8(%rdi), %rdx
14340 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14341 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14342 ; O0-NEXT:  .Lpcsection641:
14343 ; O0-NEXT:    jmp .LBB233_1
14344 ; O0-NEXT:  .LBB233_1: # %atomicrmw.start
14345 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14346 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
14347 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14348 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14349 ; O0-NEXT:    movq %rax, %rbx
14350 ; O0-NEXT:  .Lpcsection642:
14351 ; O0-NEXT:    orq $42, %rbx
14352 ; O0-NEXT:    movq %rcx, %rdx
14353 ; O0-NEXT:  .Lpcsection643:
14354 ; O0-NEXT:    lock cmpxchg16b (%rsi)
14355 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14356 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14357 ; O0-NEXT:  .Lpcsection644:
14358 ; O0-NEXT:    jne .LBB233_1
14359 ; O0-NEXT:    jmp .LBB233_2
14360 ; O0-NEXT:  .LBB233_2: # %atomicrmw.end
14361 ; O0-NEXT:    movq $1, foo
14362 ; O0-NEXT:    popq %rbx
14363 ; O0-NEXT:    .cfi_def_cfa_offset 8
14364 ; O0-NEXT:    retq
14366 ; O1-LABEL: atomic128_or_acq_rel:
14367 ; O1:       # %bb.0: # %entry
14368 ; O1-NEXT:    pushq %rbx
14369 ; O1-NEXT:    .cfi_def_cfa_offset 16
14370 ; O1-NEXT:    .cfi_offset %rbx, -16
14371 ; O1-NEXT:    movq foo(%rip), %rax
14372 ; O1-NEXT:  .Lpcsection566:
14373 ; O1-NEXT:    movq (%rdi), %rax
14374 ; O1-NEXT:  .Lpcsection567:
14375 ; O1-NEXT:    movq 8(%rdi), %rdx
14376 ; O1-NEXT:    .p2align 4, 0x90
14377 ; O1-NEXT:  .LBB233_1: # %atomicrmw.start
14378 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
14379 ; O1-NEXT:    movq %rax, %rbx
14380 ; O1-NEXT:  .Lpcsection568:
14381 ; O1-NEXT:    orq $42, %rbx
14382 ; O1-NEXT:    movq %rdx, %rcx
14383 ; O1-NEXT:  .Lpcsection569:
14384 ; O1-NEXT:    lock cmpxchg16b (%rdi)
14385 ; O1-NEXT:  .Lpcsection570:
14386 ; O1-NEXT:    jne .LBB233_1
14387 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
14388 ; O1-NEXT:    movq $1, foo(%rip)
14389 ; O1-NEXT:    popq %rbx
14390 ; O1-NEXT:    .cfi_def_cfa_offset 8
14391 ; O1-NEXT:    retq
14393 ; O2-LABEL: atomic128_or_acq_rel:
14394 ; O2:       # %bb.0: # %entry
14395 ; O2-NEXT:    pushq %rbx
14396 ; O2-NEXT:    .cfi_def_cfa_offset 16
14397 ; O2-NEXT:    .cfi_offset %rbx, -16
14398 ; O2-NEXT:    movq foo(%rip), %rax
14399 ; O2-NEXT:  .Lpcsection566:
14400 ; O2-NEXT:    movq (%rdi), %rax
14401 ; O2-NEXT:  .Lpcsection567:
14402 ; O2-NEXT:    movq 8(%rdi), %rdx
14403 ; O2-NEXT:    .p2align 4, 0x90
14404 ; O2-NEXT:  .LBB233_1: # %atomicrmw.start
14405 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14406 ; O2-NEXT:    movq %rax, %rbx
14407 ; O2-NEXT:  .Lpcsection568:
14408 ; O2-NEXT:    orq $42, %rbx
14409 ; O2-NEXT:    movq %rdx, %rcx
14410 ; O2-NEXT:  .Lpcsection569:
14411 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14412 ; O2-NEXT:  .Lpcsection570:
14413 ; O2-NEXT:    jne .LBB233_1
14414 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14415 ; O2-NEXT:    movq $1, foo(%rip)
14416 ; O2-NEXT:    popq %rbx
14417 ; O2-NEXT:    .cfi_def_cfa_offset 8
14418 ; O2-NEXT:    retq
14420 ; O3-LABEL: atomic128_or_acq_rel:
14421 ; O3:       # %bb.0: # %entry
14422 ; O3-NEXT:    pushq %rbx
14423 ; O3-NEXT:    .cfi_def_cfa_offset 16
14424 ; O3-NEXT:    .cfi_offset %rbx, -16
14425 ; O3-NEXT:    movq foo(%rip), %rax
14426 ; O3-NEXT:  .Lpcsection566:
14427 ; O3-NEXT:    movq (%rdi), %rax
14428 ; O3-NEXT:  .Lpcsection567:
14429 ; O3-NEXT:    movq 8(%rdi), %rdx
14430 ; O3-NEXT:    .p2align 4, 0x90
14431 ; O3-NEXT:  .LBB233_1: # %atomicrmw.start
14432 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14433 ; O3-NEXT:    movq %rax, %rbx
14434 ; O3-NEXT:  .Lpcsection568:
14435 ; O3-NEXT:    orq $42, %rbx
14436 ; O3-NEXT:    movq %rdx, %rcx
14437 ; O3-NEXT:  .Lpcsection569:
14438 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14439 ; O3-NEXT:  .Lpcsection570:
14440 ; O3-NEXT:    jne .LBB233_1
14441 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14442 ; O3-NEXT:    movq $1, foo(%rip)
14443 ; O3-NEXT:    popq %rbx
14444 ; O3-NEXT:    .cfi_def_cfa_offset 8
14445 ; O3-NEXT:    retq
14446 entry:
14447   load volatile i64, ptr @foo, align 8
14448   %x = atomicrmw or ptr %a, i128 42 acq_rel, align 16, !pcsections !0
14449   store volatile i64 1, ptr @foo, align 8
14450   ret void
14453 define void @atomic128_xor_acq_rel(ptr %a) {
14454 ; O0-LABEL: atomic128_xor_acq_rel:
14455 ; O0:       # %bb.0: # %entry
14456 ; O0-NEXT:    pushq %rbx
14457 ; O0-NEXT:    .cfi_def_cfa_offset 16
14458 ; O0-NEXT:    .cfi_offset %rbx, -16
14459 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14460 ; O0-NEXT:    movq foo(%rip), %rax
14461 ; O0-NEXT:  .Lpcsection645:
14462 ; O0-NEXT:    movq (%rdi), %rax
14463 ; O0-NEXT:  .Lpcsection646:
14464 ; O0-NEXT:    movq 8(%rdi), %rdx
14465 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14466 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14467 ; O0-NEXT:  .Lpcsection647:
14468 ; O0-NEXT:    jmp .LBB234_1
14469 ; O0-NEXT:  .LBB234_1: # %atomicrmw.start
14470 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14471 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
14472 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14473 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14474 ; O0-NEXT:    movq %rax, %rbx
14475 ; O0-NEXT:  .Lpcsection648:
14476 ; O0-NEXT:    xorq $42, %rbx
14477 ; O0-NEXT:    movq %rcx, %rdx
14478 ; O0-NEXT:  .Lpcsection649:
14479 ; O0-NEXT:    lock cmpxchg16b (%rsi)
14480 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14481 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14482 ; O0-NEXT:  .Lpcsection650:
14483 ; O0-NEXT:    jne .LBB234_1
14484 ; O0-NEXT:    jmp .LBB234_2
14485 ; O0-NEXT:  .LBB234_2: # %atomicrmw.end
14486 ; O0-NEXT:    movq $1, foo
14487 ; O0-NEXT:    popq %rbx
14488 ; O0-NEXT:    .cfi_def_cfa_offset 8
14489 ; O0-NEXT:    retq
14491 ; O1-LABEL: atomic128_xor_acq_rel:
14492 ; O1:       # %bb.0: # %entry
14493 ; O1-NEXT:    pushq %rbx
14494 ; O1-NEXT:    .cfi_def_cfa_offset 16
14495 ; O1-NEXT:    .cfi_offset %rbx, -16
14496 ; O1-NEXT:    movq foo(%rip), %rax
14497 ; O1-NEXT:  .Lpcsection571:
14498 ; O1-NEXT:    movq (%rdi), %rax
14499 ; O1-NEXT:  .Lpcsection572:
14500 ; O1-NEXT:    movq 8(%rdi), %rdx
14501 ; O1-NEXT:    .p2align 4, 0x90
14502 ; O1-NEXT:  .LBB234_1: # %atomicrmw.start
14503 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
14504 ; O1-NEXT:    movq %rax, %rbx
14505 ; O1-NEXT:  .Lpcsection573:
14506 ; O1-NEXT:    xorq $42, %rbx
14507 ; O1-NEXT:    movq %rdx, %rcx
14508 ; O1-NEXT:  .Lpcsection574:
14509 ; O1-NEXT:    lock cmpxchg16b (%rdi)
14510 ; O1-NEXT:  .Lpcsection575:
14511 ; O1-NEXT:    jne .LBB234_1
14512 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
14513 ; O1-NEXT:    movq $1, foo(%rip)
14514 ; O1-NEXT:    popq %rbx
14515 ; O1-NEXT:    .cfi_def_cfa_offset 8
14516 ; O1-NEXT:    retq
14518 ; O2-LABEL: atomic128_xor_acq_rel:
14519 ; O2:       # %bb.0: # %entry
14520 ; O2-NEXT:    pushq %rbx
14521 ; O2-NEXT:    .cfi_def_cfa_offset 16
14522 ; O2-NEXT:    .cfi_offset %rbx, -16
14523 ; O2-NEXT:    movq foo(%rip), %rax
14524 ; O2-NEXT:  .Lpcsection571:
14525 ; O2-NEXT:    movq (%rdi), %rax
14526 ; O2-NEXT:  .Lpcsection572:
14527 ; O2-NEXT:    movq 8(%rdi), %rdx
14528 ; O2-NEXT:    .p2align 4, 0x90
14529 ; O2-NEXT:  .LBB234_1: # %atomicrmw.start
14530 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14531 ; O2-NEXT:    movq %rax, %rbx
14532 ; O2-NEXT:  .Lpcsection573:
14533 ; O2-NEXT:    xorq $42, %rbx
14534 ; O2-NEXT:    movq %rdx, %rcx
14535 ; O2-NEXT:  .Lpcsection574:
14536 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14537 ; O2-NEXT:  .Lpcsection575:
14538 ; O2-NEXT:    jne .LBB234_1
14539 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14540 ; O2-NEXT:    movq $1, foo(%rip)
14541 ; O2-NEXT:    popq %rbx
14542 ; O2-NEXT:    .cfi_def_cfa_offset 8
14543 ; O2-NEXT:    retq
14545 ; O3-LABEL: atomic128_xor_acq_rel:
14546 ; O3:       # %bb.0: # %entry
14547 ; O3-NEXT:    pushq %rbx
14548 ; O3-NEXT:    .cfi_def_cfa_offset 16
14549 ; O3-NEXT:    .cfi_offset %rbx, -16
14550 ; O3-NEXT:    movq foo(%rip), %rax
14551 ; O3-NEXT:  .Lpcsection571:
14552 ; O3-NEXT:    movq (%rdi), %rax
14553 ; O3-NEXT:  .Lpcsection572:
14554 ; O3-NEXT:    movq 8(%rdi), %rdx
14555 ; O3-NEXT:    .p2align 4, 0x90
14556 ; O3-NEXT:  .LBB234_1: # %atomicrmw.start
14557 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14558 ; O3-NEXT:    movq %rax, %rbx
14559 ; O3-NEXT:  .Lpcsection573:
14560 ; O3-NEXT:    xorq $42, %rbx
14561 ; O3-NEXT:    movq %rdx, %rcx
14562 ; O3-NEXT:  .Lpcsection574:
14563 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14564 ; O3-NEXT:  .Lpcsection575:
14565 ; O3-NEXT:    jne .LBB234_1
14566 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14567 ; O3-NEXT:    movq $1, foo(%rip)
14568 ; O3-NEXT:    popq %rbx
14569 ; O3-NEXT:    .cfi_def_cfa_offset 8
14570 ; O3-NEXT:    retq
14571 entry:
14572   load volatile i64, ptr @foo, align 8
14573   %x = atomicrmw xor ptr %a, i128 42 acq_rel, align 16, !pcsections !0
14574   store volatile i64 1, ptr @foo, align 8
14575   ret void
14578 define void @atomic128_nand_acq_rel(ptr %a) {
14579 ; O0-LABEL: atomic128_nand_acq_rel:
14580 ; O0:       # %bb.0: # %entry
14581 ; O0-NEXT:    pushq %rbx
14582 ; O0-NEXT:    .cfi_def_cfa_offset 16
14583 ; O0-NEXT:    .cfi_offset %rbx, -16
14584 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14585 ; O0-NEXT:    movq foo(%rip), %rax
14586 ; O0-NEXT:  .Lpcsection651:
14587 ; O0-NEXT:    movq (%rdi), %rax
14588 ; O0-NEXT:  .Lpcsection652:
14589 ; O0-NEXT:    movq 8(%rdi), %rdx
14590 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14591 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14592 ; O0-NEXT:  .Lpcsection653:
14593 ; O0-NEXT:    jmp .LBB235_1
14594 ; O0-NEXT:  .LBB235_1: # %atomicrmw.start
14595 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14596 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
14597 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14598 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14599 ; O0-NEXT:    movl %eax, %ecx
14600 ; O0-NEXT:  .Lpcsection654:
14601 ; O0-NEXT:    notl %ecx
14602 ; O0-NEXT:  .Lpcsection655:
14603 ; O0-NEXT:    # implicit-def: $rbx
14604 ; O0-NEXT:    movl %ecx, %ebx
14605 ; O0-NEXT:  .Lpcsection656:
14606 ; O0-NEXT:    orq $-43, %rbx
14607 ; O0-NEXT:  .Lpcsection657:
14608 ; O0-NEXT:    movq $-1, %rcx
14609 ; O0-NEXT:  .Lpcsection658:
14610 ; O0-NEXT:    lock cmpxchg16b (%rsi)
14611 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14612 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14613 ; O0-NEXT:  .Lpcsection659:
14614 ; O0-NEXT:    jne .LBB235_1
14615 ; O0-NEXT:    jmp .LBB235_2
14616 ; O0-NEXT:  .LBB235_2: # %atomicrmw.end
14617 ; O0-NEXT:    movq $1, foo
14618 ; O0-NEXT:    popq %rbx
14619 ; O0-NEXT:    .cfi_def_cfa_offset 8
14620 ; O0-NEXT:    retq
14622 ; O1-LABEL: atomic128_nand_acq_rel:
14623 ; O1:       # %bb.0: # %entry
14624 ; O1-NEXT:    pushq %rbx
14625 ; O1-NEXT:    .cfi_def_cfa_offset 16
14626 ; O1-NEXT:    .cfi_offset %rbx, -16
14627 ; O1-NEXT:    movq foo(%rip), %rax
14628 ; O1-NEXT:  .Lpcsection576:
14629 ; O1-NEXT:    movq (%rdi), %rax
14630 ; O1-NEXT:  .Lpcsection577:
14631 ; O1-NEXT:    movq 8(%rdi), %rdx
14632 ; O1-NEXT:  .Lpcsection578:
14633 ; O1-NEXT:    movq $-1, %rcx
14634 ; O1-NEXT:    .p2align 4, 0x90
14635 ; O1-NEXT:  .LBB235_1: # %atomicrmw.start
14636 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
14637 ; O1-NEXT:    movl %eax, %ebx
14638 ; O1-NEXT:  .Lpcsection579:
14639 ; O1-NEXT:    notl %ebx
14640 ; O1-NEXT:  .Lpcsection580:
14641 ; O1-NEXT:    orq $-43, %rbx
14642 ; O1-NEXT:  .Lpcsection581:
14643 ; O1-NEXT:    lock cmpxchg16b (%rdi)
14644 ; O1-NEXT:  .Lpcsection582:
14645 ; O1-NEXT:    jne .LBB235_1
14646 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
14647 ; O1-NEXT:    movq $1, foo(%rip)
14648 ; O1-NEXT:    popq %rbx
14649 ; O1-NEXT:    .cfi_def_cfa_offset 8
14650 ; O1-NEXT:    retq
14652 ; O2-LABEL: atomic128_nand_acq_rel:
14653 ; O2:       # %bb.0: # %entry
14654 ; O2-NEXT:    pushq %rbx
14655 ; O2-NEXT:    .cfi_def_cfa_offset 16
14656 ; O2-NEXT:    .cfi_offset %rbx, -16
14657 ; O2-NEXT:    movq foo(%rip), %rax
14658 ; O2-NEXT:  .Lpcsection576:
14659 ; O2-NEXT:    movq (%rdi), %rax
14660 ; O2-NEXT:  .Lpcsection577:
14661 ; O2-NEXT:    movq 8(%rdi), %rdx
14662 ; O2-NEXT:  .Lpcsection578:
14663 ; O2-NEXT:    movq $-1, %rcx
14664 ; O2-NEXT:    .p2align 4, 0x90
14665 ; O2-NEXT:  .LBB235_1: # %atomicrmw.start
14666 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14667 ; O2-NEXT:    movl %eax, %ebx
14668 ; O2-NEXT:  .Lpcsection579:
14669 ; O2-NEXT:    notl %ebx
14670 ; O2-NEXT:  .Lpcsection580:
14671 ; O2-NEXT:    orq $-43, %rbx
14672 ; O2-NEXT:  .Lpcsection581:
14673 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14674 ; O2-NEXT:  .Lpcsection582:
14675 ; O2-NEXT:    jne .LBB235_1
14676 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14677 ; O2-NEXT:    movq $1, foo(%rip)
14678 ; O2-NEXT:    popq %rbx
14679 ; O2-NEXT:    .cfi_def_cfa_offset 8
14680 ; O2-NEXT:    retq
14682 ; O3-LABEL: atomic128_nand_acq_rel:
14683 ; O3:       # %bb.0: # %entry
14684 ; O3-NEXT:    pushq %rbx
14685 ; O3-NEXT:    .cfi_def_cfa_offset 16
14686 ; O3-NEXT:    .cfi_offset %rbx, -16
14687 ; O3-NEXT:    movq foo(%rip), %rax
14688 ; O3-NEXT:  .Lpcsection576:
14689 ; O3-NEXT:    movq (%rdi), %rax
14690 ; O3-NEXT:  .Lpcsection577:
14691 ; O3-NEXT:    movq 8(%rdi), %rdx
14692 ; O3-NEXT:  .Lpcsection578:
14693 ; O3-NEXT:    movq $-1, %rcx
14694 ; O3-NEXT:    .p2align 4, 0x90
14695 ; O3-NEXT:  .LBB235_1: # %atomicrmw.start
14696 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14697 ; O3-NEXT:    movl %eax, %ebx
14698 ; O3-NEXT:  .Lpcsection579:
14699 ; O3-NEXT:    notl %ebx
14700 ; O3-NEXT:  .Lpcsection580:
14701 ; O3-NEXT:    orq $-43, %rbx
14702 ; O3-NEXT:  .Lpcsection581:
14703 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14704 ; O3-NEXT:  .Lpcsection582:
14705 ; O3-NEXT:    jne .LBB235_1
14706 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14707 ; O3-NEXT:    movq $1, foo(%rip)
14708 ; O3-NEXT:    popq %rbx
14709 ; O3-NEXT:    .cfi_def_cfa_offset 8
14710 ; O3-NEXT:    retq
14711 entry:
14712   load volatile i64, ptr @foo, align 8
14713   %x = atomicrmw nand ptr %a, i128 42 acq_rel, align 16, !pcsections !0
14714   store volatile i64 1, ptr @foo, align 8
14715   ret void
14718 define void @atomic128_xchg_seq_cst(ptr %a) {
14719 ; O0-LABEL: atomic128_xchg_seq_cst:
14720 ; O0:       # %bb.0: # %entry
14721 ; O0-NEXT:    pushq %rbx
14722 ; O0-NEXT:    .cfi_def_cfa_offset 16
14723 ; O0-NEXT:    .cfi_offset %rbx, -16
14724 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14725 ; O0-NEXT:    movq foo(%rip), %rax
14726 ; O0-NEXT:  .Lpcsection660:
14727 ; O0-NEXT:    movq (%rdi), %rax
14728 ; O0-NEXT:  .Lpcsection661:
14729 ; O0-NEXT:    movq 8(%rdi), %rdx
14730 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14731 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14732 ; O0-NEXT:  .Lpcsection662:
14733 ; O0-NEXT:    jmp .LBB236_1
14734 ; O0-NEXT:  .LBB236_1: # %atomicrmw.start
14735 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14736 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
14737 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14738 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14739 ; O0-NEXT:  .Lpcsection663:
14740 ; O0-NEXT:    xorl %ecx, %ecx
14741 ; O0-NEXT:  .Lpcsection664:
14742 ; O0-NEXT:    # kill: def $rcx killed $ecx
14743 ; O0-NEXT:  .Lpcsection665:
14744 ; O0-NEXT:    movl $42, %ebx
14745 ; O0-NEXT:  .Lpcsection666:
14746 ; O0-NEXT:    lock cmpxchg16b (%rsi)
14747 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14748 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14749 ; O0-NEXT:  .Lpcsection667:
14750 ; O0-NEXT:    jne .LBB236_1
14751 ; O0-NEXT:    jmp .LBB236_2
14752 ; O0-NEXT:  .LBB236_2: # %atomicrmw.end
14753 ; O0-NEXT:    movq $1, foo
14754 ; O0-NEXT:    popq %rbx
14755 ; O0-NEXT:    .cfi_def_cfa_offset 8
14756 ; O0-NEXT:    retq
14758 ; O1-LABEL: atomic128_xchg_seq_cst:
14759 ; O1:       # %bb.0: # %entry
14760 ; O1-NEXT:    pushq %rbx
14761 ; O1-NEXT:    .cfi_def_cfa_offset 16
14762 ; O1-NEXT:    .cfi_offset %rbx, -16
14763 ; O1-NEXT:    movq foo(%rip), %rax
14764 ; O1-NEXT:  .Lpcsection583:
14765 ; O1-NEXT:    movq (%rdi), %rax
14766 ; O1-NEXT:  .Lpcsection584:
14767 ; O1-NEXT:    movq 8(%rdi), %rdx
14768 ; O1-NEXT:  .Lpcsection585:
14769 ; O1-NEXT:    movl $42, %ebx
14770 ; O1-NEXT:    .p2align 4, 0x90
14771 ; O1-NEXT:  .LBB236_1: # %atomicrmw.start
14772 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
14773 ; O1-NEXT:  .Lpcsection586:
14774 ; O1-NEXT:    xorl %ecx, %ecx
14775 ; O1-NEXT:  .Lpcsection587:
14776 ; O1-NEXT:    lock cmpxchg16b (%rdi)
14777 ; O1-NEXT:  .Lpcsection588:
14778 ; O1-NEXT:    jne .LBB236_1
14779 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
14780 ; O1-NEXT:    movq $1, foo(%rip)
14781 ; O1-NEXT:    popq %rbx
14782 ; O1-NEXT:    .cfi_def_cfa_offset 8
14783 ; O1-NEXT:    retq
14785 ; O2-LABEL: atomic128_xchg_seq_cst:
14786 ; O2:       # %bb.0: # %entry
14787 ; O2-NEXT:    pushq %rbx
14788 ; O2-NEXT:    .cfi_def_cfa_offset 16
14789 ; O2-NEXT:    .cfi_offset %rbx, -16
14790 ; O2-NEXT:    movq foo(%rip), %rax
14791 ; O2-NEXT:  .Lpcsection583:
14792 ; O2-NEXT:    movq (%rdi), %rax
14793 ; O2-NEXT:  .Lpcsection584:
14794 ; O2-NEXT:    movq 8(%rdi), %rdx
14795 ; O2-NEXT:  .Lpcsection585:
14796 ; O2-NEXT:    movl $42, %ebx
14797 ; O2-NEXT:    .p2align 4, 0x90
14798 ; O2-NEXT:  .LBB236_1: # %atomicrmw.start
14799 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14800 ; O2-NEXT:  .Lpcsection586:
14801 ; O2-NEXT:    xorl %ecx, %ecx
14802 ; O2-NEXT:  .Lpcsection587:
14803 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14804 ; O2-NEXT:  .Lpcsection588:
14805 ; O2-NEXT:    jne .LBB236_1
14806 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14807 ; O2-NEXT:    movq $1, foo(%rip)
14808 ; O2-NEXT:    popq %rbx
14809 ; O2-NEXT:    .cfi_def_cfa_offset 8
14810 ; O2-NEXT:    retq
14812 ; O3-LABEL: atomic128_xchg_seq_cst:
14813 ; O3:       # %bb.0: # %entry
14814 ; O3-NEXT:    pushq %rbx
14815 ; O3-NEXT:    .cfi_def_cfa_offset 16
14816 ; O3-NEXT:    .cfi_offset %rbx, -16
14817 ; O3-NEXT:    movq foo(%rip), %rax
14818 ; O3-NEXT:  .Lpcsection583:
14819 ; O3-NEXT:    movq (%rdi), %rax
14820 ; O3-NEXT:  .Lpcsection584:
14821 ; O3-NEXT:    movq 8(%rdi), %rdx
14822 ; O3-NEXT:  .Lpcsection585:
14823 ; O3-NEXT:    movl $42, %ebx
14824 ; O3-NEXT:    .p2align 4, 0x90
14825 ; O3-NEXT:  .LBB236_1: # %atomicrmw.start
14826 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14827 ; O3-NEXT:  .Lpcsection586:
14828 ; O3-NEXT:    xorl %ecx, %ecx
14829 ; O3-NEXT:  .Lpcsection587:
14830 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14831 ; O3-NEXT:  .Lpcsection588:
14832 ; O3-NEXT:    jne .LBB236_1
14833 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14834 ; O3-NEXT:    movq $1, foo(%rip)
14835 ; O3-NEXT:    popq %rbx
14836 ; O3-NEXT:    .cfi_def_cfa_offset 8
14837 ; O3-NEXT:    retq
14838 entry:
14839   load volatile i64, ptr @foo, align 8
14840   %x = atomicrmw xchg ptr %a, i128 42 seq_cst, align 16, !pcsections !0
14841   store volatile i64 1, ptr @foo, align 8
14842   ret void
14845 define void @atomic128_add_seq_cst(ptr %a) {
14846 ; O0-LABEL: atomic128_add_seq_cst:
14847 ; O0:       # %bb.0: # %entry
14848 ; O0-NEXT:    pushq %rbx
14849 ; O0-NEXT:    .cfi_def_cfa_offset 16
14850 ; O0-NEXT:    .cfi_offset %rbx, -16
14851 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14852 ; O0-NEXT:    movq foo(%rip), %rax
14853 ; O0-NEXT:  .Lpcsection668:
14854 ; O0-NEXT:    movq (%rdi), %rax
14855 ; O0-NEXT:  .Lpcsection669:
14856 ; O0-NEXT:    movq 8(%rdi), %rdx
14857 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14858 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14859 ; O0-NEXT:  .Lpcsection670:
14860 ; O0-NEXT:    jmp .LBB237_1
14861 ; O0-NEXT:  .LBB237_1: # %atomicrmw.start
14862 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14863 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
14864 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14865 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14866 ; O0-NEXT:    movq %rax, %rbx
14867 ; O0-NEXT:  .Lpcsection671:
14868 ; O0-NEXT:    addq $42, %rbx
14869 ; O0-NEXT:    movq %rdx, %rcx
14870 ; O0-NEXT:  .Lpcsection672:
14871 ; O0-NEXT:    adcq $0, %rcx
14872 ; O0-NEXT:  .Lpcsection673:
14873 ; O0-NEXT:    lock cmpxchg16b (%rsi)
14874 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14875 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14876 ; O0-NEXT:  .Lpcsection674:
14877 ; O0-NEXT:    jne .LBB237_1
14878 ; O0-NEXT:    jmp .LBB237_2
14879 ; O0-NEXT:  .LBB237_2: # %atomicrmw.end
14880 ; O0-NEXT:    movq $1, foo
14881 ; O0-NEXT:    popq %rbx
14882 ; O0-NEXT:    .cfi_def_cfa_offset 8
14883 ; O0-NEXT:    retq
14885 ; O1-LABEL: atomic128_add_seq_cst:
14886 ; O1:       # %bb.0: # %entry
14887 ; O1-NEXT:    pushq %rbx
14888 ; O1-NEXT:    .cfi_def_cfa_offset 16
14889 ; O1-NEXT:    .cfi_offset %rbx, -16
14890 ; O1-NEXT:    movq foo(%rip), %rax
14891 ; O1-NEXT:  .Lpcsection589:
14892 ; O1-NEXT:    movq (%rdi), %rax
14893 ; O1-NEXT:  .Lpcsection590:
14894 ; O1-NEXT:    movq 8(%rdi), %rdx
14895 ; O1-NEXT:    .p2align 4, 0x90
14896 ; O1-NEXT:  .LBB237_1: # %atomicrmw.start
14897 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
14898 ; O1-NEXT:    movq %rax, %rbx
14899 ; O1-NEXT:  .Lpcsection591:
14900 ; O1-NEXT:    addq $42, %rbx
14901 ; O1-NEXT:    movq %rdx, %rcx
14902 ; O1-NEXT:  .Lpcsection592:
14903 ; O1-NEXT:    adcq $0, %rcx
14904 ; O1-NEXT:  .Lpcsection593:
14905 ; O1-NEXT:    lock cmpxchg16b (%rdi)
14906 ; O1-NEXT:  .Lpcsection594:
14907 ; O1-NEXT:    jne .LBB237_1
14908 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
14909 ; O1-NEXT:    movq $1, foo(%rip)
14910 ; O1-NEXT:    popq %rbx
14911 ; O1-NEXT:    .cfi_def_cfa_offset 8
14912 ; O1-NEXT:    retq
14914 ; O2-LABEL: atomic128_add_seq_cst:
14915 ; O2:       # %bb.0: # %entry
14916 ; O2-NEXT:    pushq %rbx
14917 ; O2-NEXT:    .cfi_def_cfa_offset 16
14918 ; O2-NEXT:    .cfi_offset %rbx, -16
14919 ; O2-NEXT:    movq foo(%rip), %rax
14920 ; O2-NEXT:  .Lpcsection589:
14921 ; O2-NEXT:    movq (%rdi), %rax
14922 ; O2-NEXT:  .Lpcsection590:
14923 ; O2-NEXT:    movq 8(%rdi), %rdx
14924 ; O2-NEXT:    .p2align 4, 0x90
14925 ; O2-NEXT:  .LBB237_1: # %atomicrmw.start
14926 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
14927 ; O2-NEXT:    movq %rax, %rbx
14928 ; O2-NEXT:  .Lpcsection591:
14929 ; O2-NEXT:    addq $42, %rbx
14930 ; O2-NEXT:    movq %rdx, %rcx
14931 ; O2-NEXT:  .Lpcsection592:
14932 ; O2-NEXT:    adcq $0, %rcx
14933 ; O2-NEXT:  .Lpcsection593:
14934 ; O2-NEXT:    lock cmpxchg16b (%rdi)
14935 ; O2-NEXT:  .Lpcsection594:
14936 ; O2-NEXT:    jne .LBB237_1
14937 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
14938 ; O2-NEXT:    movq $1, foo(%rip)
14939 ; O2-NEXT:    popq %rbx
14940 ; O2-NEXT:    .cfi_def_cfa_offset 8
14941 ; O2-NEXT:    retq
14943 ; O3-LABEL: atomic128_add_seq_cst:
14944 ; O3:       # %bb.0: # %entry
14945 ; O3-NEXT:    pushq %rbx
14946 ; O3-NEXT:    .cfi_def_cfa_offset 16
14947 ; O3-NEXT:    .cfi_offset %rbx, -16
14948 ; O3-NEXT:    movq foo(%rip), %rax
14949 ; O3-NEXT:  .Lpcsection589:
14950 ; O3-NEXT:    movq (%rdi), %rax
14951 ; O3-NEXT:  .Lpcsection590:
14952 ; O3-NEXT:    movq 8(%rdi), %rdx
14953 ; O3-NEXT:    .p2align 4, 0x90
14954 ; O3-NEXT:  .LBB237_1: # %atomicrmw.start
14955 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
14956 ; O3-NEXT:    movq %rax, %rbx
14957 ; O3-NEXT:  .Lpcsection591:
14958 ; O3-NEXT:    addq $42, %rbx
14959 ; O3-NEXT:    movq %rdx, %rcx
14960 ; O3-NEXT:  .Lpcsection592:
14961 ; O3-NEXT:    adcq $0, %rcx
14962 ; O3-NEXT:  .Lpcsection593:
14963 ; O3-NEXT:    lock cmpxchg16b (%rdi)
14964 ; O3-NEXT:  .Lpcsection594:
14965 ; O3-NEXT:    jne .LBB237_1
14966 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
14967 ; O3-NEXT:    movq $1, foo(%rip)
14968 ; O3-NEXT:    popq %rbx
14969 ; O3-NEXT:    .cfi_def_cfa_offset 8
14970 ; O3-NEXT:    retq
14971 entry:
14972   load volatile i64, ptr @foo, align 8
14973   %x = atomicrmw add ptr %a, i128 42 seq_cst, align 16, !pcsections !0
14974   store volatile i64 1, ptr @foo, align 8
14975   ret void
14978 define void @atomic128_sub_seq_cst(ptr %a) {
14979 ; O0-LABEL: atomic128_sub_seq_cst:
14980 ; O0:       # %bb.0: # %entry
14981 ; O0-NEXT:    pushq %rbx
14982 ; O0-NEXT:    .cfi_def_cfa_offset 16
14983 ; O0-NEXT:    .cfi_offset %rbx, -16
14984 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14985 ; O0-NEXT:    movq foo(%rip), %rax
14986 ; O0-NEXT:  .Lpcsection675:
14987 ; O0-NEXT:    movq (%rdi), %rax
14988 ; O0-NEXT:  .Lpcsection676:
14989 ; O0-NEXT:    movq 8(%rdi), %rdx
14990 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14991 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
14992 ; O0-NEXT:  .Lpcsection677:
14993 ; O0-NEXT:    jmp .LBB238_1
14994 ; O0-NEXT:  .LBB238_1: # %atomicrmw.start
14995 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
14996 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
14997 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
14998 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
14999 ; O0-NEXT:    movq %rax, %rbx
15000 ; O0-NEXT:  .Lpcsection678:
15001 ; O0-NEXT:    addq $-42, %rbx
15002 ; O0-NEXT:    movq %rdx, %rcx
15003 ; O0-NEXT:  .Lpcsection679:
15004 ; O0-NEXT:    adcq $-1, %rcx
15005 ; O0-NEXT:  .Lpcsection680:
15006 ; O0-NEXT:    lock cmpxchg16b (%rsi)
15007 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15008 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15009 ; O0-NEXT:  .Lpcsection681:
15010 ; O0-NEXT:    jne .LBB238_1
15011 ; O0-NEXT:    jmp .LBB238_2
15012 ; O0-NEXT:  .LBB238_2: # %atomicrmw.end
15013 ; O0-NEXT:    movq $1, foo
15014 ; O0-NEXT:    popq %rbx
15015 ; O0-NEXT:    .cfi_def_cfa_offset 8
15016 ; O0-NEXT:    retq
15018 ; O1-LABEL: atomic128_sub_seq_cst:
15019 ; O1:       # %bb.0: # %entry
15020 ; O1-NEXT:    pushq %rbx
15021 ; O1-NEXT:    .cfi_def_cfa_offset 16
15022 ; O1-NEXT:    .cfi_offset %rbx, -16
15023 ; O1-NEXT:    movq foo(%rip), %rax
15024 ; O1-NEXT:  .Lpcsection595:
15025 ; O1-NEXT:    movq (%rdi), %rax
15026 ; O1-NEXT:  .Lpcsection596:
15027 ; O1-NEXT:    movq 8(%rdi), %rdx
15028 ; O1-NEXT:    .p2align 4, 0x90
15029 ; O1-NEXT:  .LBB238_1: # %atomicrmw.start
15030 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
15031 ; O1-NEXT:    movq %rax, %rbx
15032 ; O1-NEXT:  .Lpcsection597:
15033 ; O1-NEXT:    addq $-42, %rbx
15034 ; O1-NEXT:    movq %rdx, %rcx
15035 ; O1-NEXT:  .Lpcsection598:
15036 ; O1-NEXT:    adcq $-1, %rcx
15037 ; O1-NEXT:  .Lpcsection599:
15038 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15039 ; O1-NEXT:  .Lpcsection600:
15040 ; O1-NEXT:    jne .LBB238_1
15041 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
15042 ; O1-NEXT:    movq $1, foo(%rip)
15043 ; O1-NEXT:    popq %rbx
15044 ; O1-NEXT:    .cfi_def_cfa_offset 8
15045 ; O1-NEXT:    retq
15047 ; O2-LABEL: atomic128_sub_seq_cst:
15048 ; O2:       # %bb.0: # %entry
15049 ; O2-NEXT:    pushq %rbx
15050 ; O2-NEXT:    .cfi_def_cfa_offset 16
15051 ; O2-NEXT:    .cfi_offset %rbx, -16
15052 ; O2-NEXT:    movq foo(%rip), %rax
15053 ; O2-NEXT:  .Lpcsection595:
15054 ; O2-NEXT:    movq (%rdi), %rax
15055 ; O2-NEXT:  .Lpcsection596:
15056 ; O2-NEXT:    movq 8(%rdi), %rdx
15057 ; O2-NEXT:    .p2align 4, 0x90
15058 ; O2-NEXT:  .LBB238_1: # %atomicrmw.start
15059 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
15060 ; O2-NEXT:    movq %rax, %rbx
15061 ; O2-NEXT:  .Lpcsection597:
15062 ; O2-NEXT:    addq $-42, %rbx
15063 ; O2-NEXT:    movq %rdx, %rcx
15064 ; O2-NEXT:  .Lpcsection598:
15065 ; O2-NEXT:    adcq $-1, %rcx
15066 ; O2-NEXT:  .Lpcsection599:
15067 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15068 ; O2-NEXT:  .Lpcsection600:
15069 ; O2-NEXT:    jne .LBB238_1
15070 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
15071 ; O2-NEXT:    movq $1, foo(%rip)
15072 ; O2-NEXT:    popq %rbx
15073 ; O2-NEXT:    .cfi_def_cfa_offset 8
15074 ; O2-NEXT:    retq
15076 ; O3-LABEL: atomic128_sub_seq_cst:
15077 ; O3:       # %bb.0: # %entry
15078 ; O3-NEXT:    pushq %rbx
15079 ; O3-NEXT:    .cfi_def_cfa_offset 16
15080 ; O3-NEXT:    .cfi_offset %rbx, -16
15081 ; O3-NEXT:    movq foo(%rip), %rax
15082 ; O3-NEXT:  .Lpcsection595:
15083 ; O3-NEXT:    movq (%rdi), %rax
15084 ; O3-NEXT:  .Lpcsection596:
15085 ; O3-NEXT:    movq 8(%rdi), %rdx
15086 ; O3-NEXT:    .p2align 4, 0x90
15087 ; O3-NEXT:  .LBB238_1: # %atomicrmw.start
15088 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
15089 ; O3-NEXT:    movq %rax, %rbx
15090 ; O3-NEXT:  .Lpcsection597:
15091 ; O3-NEXT:    addq $-42, %rbx
15092 ; O3-NEXT:    movq %rdx, %rcx
15093 ; O3-NEXT:  .Lpcsection598:
15094 ; O3-NEXT:    adcq $-1, %rcx
15095 ; O3-NEXT:  .Lpcsection599:
15096 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15097 ; O3-NEXT:  .Lpcsection600:
15098 ; O3-NEXT:    jne .LBB238_1
15099 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
15100 ; O3-NEXT:    movq $1, foo(%rip)
15101 ; O3-NEXT:    popq %rbx
15102 ; O3-NEXT:    .cfi_def_cfa_offset 8
15103 ; O3-NEXT:    retq
15104 entry:
15105   load volatile i64, ptr @foo, align 8
15106   %x = atomicrmw sub ptr %a, i128 42 seq_cst, align 16, !pcsections !0
15107   store volatile i64 1, ptr @foo, align 8
15108   ret void
15111 define void @atomic128_and_seq_cst(ptr %a) {
15112 ; O0-LABEL: atomic128_and_seq_cst:
15113 ; O0:       # %bb.0: # %entry
15114 ; O0-NEXT:    pushq %rbx
15115 ; O0-NEXT:    .cfi_def_cfa_offset 16
15116 ; O0-NEXT:    .cfi_offset %rbx, -16
15117 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15118 ; O0-NEXT:    movq foo(%rip), %rax
15119 ; O0-NEXT:  .Lpcsection682:
15120 ; O0-NEXT:    movq (%rdi), %rax
15121 ; O0-NEXT:  .Lpcsection683:
15122 ; O0-NEXT:    movq 8(%rdi), %rdx
15123 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15124 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15125 ; O0-NEXT:  .Lpcsection684:
15126 ; O0-NEXT:    jmp .LBB239_1
15127 ; O0-NEXT:  .LBB239_1: # %atomicrmw.start
15128 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
15129 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
15130 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15131 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
15132 ; O0-NEXT:    movl %eax, %ecx
15133 ; O0-NEXT:  .Lpcsection685:
15134 ; O0-NEXT:    andl $42, %ecx
15135 ; O0-NEXT:    movl %ecx, %ebx
15136 ; O0-NEXT:  .Lpcsection686:
15137 ; O0-NEXT:    xorl %ecx, %ecx
15138 ; O0-NEXT:  .Lpcsection687:
15139 ; O0-NEXT:    # kill: def $rcx killed $ecx
15140 ; O0-NEXT:  .Lpcsection688:
15141 ; O0-NEXT:    lock cmpxchg16b (%rsi)
15142 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15143 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15144 ; O0-NEXT:  .Lpcsection689:
15145 ; O0-NEXT:    jne .LBB239_1
15146 ; O0-NEXT:    jmp .LBB239_2
15147 ; O0-NEXT:  .LBB239_2: # %atomicrmw.end
15148 ; O0-NEXT:    movq $1, foo
15149 ; O0-NEXT:    popq %rbx
15150 ; O0-NEXT:    .cfi_def_cfa_offset 8
15151 ; O0-NEXT:    retq
15153 ; O1-LABEL: atomic128_and_seq_cst:
15154 ; O1:       # %bb.0: # %entry
15155 ; O1-NEXT:    pushq %rbx
15156 ; O1-NEXT:    .cfi_def_cfa_offset 16
15157 ; O1-NEXT:    .cfi_offset %rbx, -16
15158 ; O1-NEXT:    movq foo(%rip), %rax
15159 ; O1-NEXT:  .Lpcsection601:
15160 ; O1-NEXT:    movq (%rdi), %rax
15161 ; O1-NEXT:  .Lpcsection602:
15162 ; O1-NEXT:    movq 8(%rdi), %rdx
15163 ; O1-NEXT:    .p2align 4, 0x90
15164 ; O1-NEXT:  .LBB239_1: # %atomicrmw.start
15165 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
15166 ; O1-NEXT:    movl %eax, %ebx
15167 ; O1-NEXT:  .Lpcsection603:
15168 ; O1-NEXT:    andl $42, %ebx
15169 ; O1-NEXT:  .Lpcsection604:
15170 ; O1-NEXT:    xorl %ecx, %ecx
15171 ; O1-NEXT:  .Lpcsection605:
15172 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15173 ; O1-NEXT:  .Lpcsection606:
15174 ; O1-NEXT:    jne .LBB239_1
15175 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
15176 ; O1-NEXT:    movq $1, foo(%rip)
15177 ; O1-NEXT:    popq %rbx
15178 ; O1-NEXT:    .cfi_def_cfa_offset 8
15179 ; O1-NEXT:    retq
15181 ; O2-LABEL: atomic128_and_seq_cst:
15182 ; O2:       # %bb.0: # %entry
15183 ; O2-NEXT:    pushq %rbx
15184 ; O2-NEXT:    .cfi_def_cfa_offset 16
15185 ; O2-NEXT:    .cfi_offset %rbx, -16
15186 ; O2-NEXT:    movq foo(%rip), %rax
15187 ; O2-NEXT:  .Lpcsection601:
15188 ; O2-NEXT:    movq (%rdi), %rax
15189 ; O2-NEXT:  .Lpcsection602:
15190 ; O2-NEXT:    movq 8(%rdi), %rdx
15191 ; O2-NEXT:    .p2align 4, 0x90
15192 ; O2-NEXT:  .LBB239_1: # %atomicrmw.start
15193 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
15194 ; O2-NEXT:    movl %eax, %ebx
15195 ; O2-NEXT:  .Lpcsection603:
15196 ; O2-NEXT:    andl $42, %ebx
15197 ; O2-NEXT:  .Lpcsection604:
15198 ; O2-NEXT:    xorl %ecx, %ecx
15199 ; O2-NEXT:  .Lpcsection605:
15200 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15201 ; O2-NEXT:  .Lpcsection606:
15202 ; O2-NEXT:    jne .LBB239_1
15203 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
15204 ; O2-NEXT:    movq $1, foo(%rip)
15205 ; O2-NEXT:    popq %rbx
15206 ; O2-NEXT:    .cfi_def_cfa_offset 8
15207 ; O2-NEXT:    retq
15209 ; O3-LABEL: atomic128_and_seq_cst:
15210 ; O3:       # %bb.0: # %entry
15211 ; O3-NEXT:    pushq %rbx
15212 ; O3-NEXT:    .cfi_def_cfa_offset 16
15213 ; O3-NEXT:    .cfi_offset %rbx, -16
15214 ; O3-NEXT:    movq foo(%rip), %rax
15215 ; O3-NEXT:  .Lpcsection601:
15216 ; O3-NEXT:    movq (%rdi), %rax
15217 ; O3-NEXT:  .Lpcsection602:
15218 ; O3-NEXT:    movq 8(%rdi), %rdx
15219 ; O3-NEXT:    .p2align 4, 0x90
15220 ; O3-NEXT:  .LBB239_1: # %atomicrmw.start
15221 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
15222 ; O3-NEXT:    movl %eax, %ebx
15223 ; O3-NEXT:  .Lpcsection603:
15224 ; O3-NEXT:    andl $42, %ebx
15225 ; O3-NEXT:  .Lpcsection604:
15226 ; O3-NEXT:    xorl %ecx, %ecx
15227 ; O3-NEXT:  .Lpcsection605:
15228 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15229 ; O3-NEXT:  .Lpcsection606:
15230 ; O3-NEXT:    jne .LBB239_1
15231 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
15232 ; O3-NEXT:    movq $1, foo(%rip)
15233 ; O3-NEXT:    popq %rbx
15234 ; O3-NEXT:    .cfi_def_cfa_offset 8
15235 ; O3-NEXT:    retq
15236 entry:
15237   load volatile i64, ptr @foo, align 8
15238   %x = atomicrmw and ptr %a, i128 42 seq_cst, align 16, !pcsections !0
15239   store volatile i64 1, ptr @foo, align 8
15240   ret void
15243 define void @atomic128_or_seq_cst(ptr %a) {
15244 ; O0-LABEL: atomic128_or_seq_cst:
15245 ; O0:       # %bb.0: # %entry
15246 ; O0-NEXT:    pushq %rbx
15247 ; O0-NEXT:    .cfi_def_cfa_offset 16
15248 ; O0-NEXT:    .cfi_offset %rbx, -16
15249 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15250 ; O0-NEXT:    movq foo(%rip), %rax
15251 ; O0-NEXT:  .Lpcsection690:
15252 ; O0-NEXT:    movq (%rdi), %rax
15253 ; O0-NEXT:  .Lpcsection691:
15254 ; O0-NEXT:    movq 8(%rdi), %rdx
15255 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15256 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15257 ; O0-NEXT:  .Lpcsection692:
15258 ; O0-NEXT:    jmp .LBB240_1
15259 ; O0-NEXT:  .LBB240_1: # %atomicrmw.start
15260 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
15261 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15262 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15263 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
15264 ; O0-NEXT:    movq %rax, %rbx
15265 ; O0-NEXT:  .Lpcsection693:
15266 ; O0-NEXT:    orq $42, %rbx
15267 ; O0-NEXT:    movq %rcx, %rdx
15268 ; O0-NEXT:  .Lpcsection694:
15269 ; O0-NEXT:    lock cmpxchg16b (%rsi)
15270 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15271 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15272 ; O0-NEXT:  .Lpcsection695:
15273 ; O0-NEXT:    jne .LBB240_1
15274 ; O0-NEXT:    jmp .LBB240_2
15275 ; O0-NEXT:  .LBB240_2: # %atomicrmw.end
15276 ; O0-NEXT:    movq $1, foo
15277 ; O0-NEXT:    popq %rbx
15278 ; O0-NEXT:    .cfi_def_cfa_offset 8
15279 ; O0-NEXT:    retq
15281 ; O1-LABEL: atomic128_or_seq_cst:
15282 ; O1:       # %bb.0: # %entry
15283 ; O1-NEXT:    pushq %rbx
15284 ; O1-NEXT:    .cfi_def_cfa_offset 16
15285 ; O1-NEXT:    .cfi_offset %rbx, -16
15286 ; O1-NEXT:    movq foo(%rip), %rax
15287 ; O1-NEXT:  .Lpcsection607:
15288 ; O1-NEXT:    movq (%rdi), %rax
15289 ; O1-NEXT:  .Lpcsection608:
15290 ; O1-NEXT:    movq 8(%rdi), %rdx
15291 ; O1-NEXT:    .p2align 4, 0x90
15292 ; O1-NEXT:  .LBB240_1: # %atomicrmw.start
15293 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
15294 ; O1-NEXT:    movq %rax, %rbx
15295 ; O1-NEXT:  .Lpcsection609:
15296 ; O1-NEXT:    orq $42, %rbx
15297 ; O1-NEXT:    movq %rdx, %rcx
15298 ; O1-NEXT:  .Lpcsection610:
15299 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15300 ; O1-NEXT:  .Lpcsection611:
15301 ; O1-NEXT:    jne .LBB240_1
15302 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
15303 ; O1-NEXT:    movq $1, foo(%rip)
15304 ; O1-NEXT:    popq %rbx
15305 ; O1-NEXT:    .cfi_def_cfa_offset 8
15306 ; O1-NEXT:    retq
15308 ; O2-LABEL: atomic128_or_seq_cst:
15309 ; O2:       # %bb.0: # %entry
15310 ; O2-NEXT:    pushq %rbx
15311 ; O2-NEXT:    .cfi_def_cfa_offset 16
15312 ; O2-NEXT:    .cfi_offset %rbx, -16
15313 ; O2-NEXT:    movq foo(%rip), %rax
15314 ; O2-NEXT:  .Lpcsection607:
15315 ; O2-NEXT:    movq (%rdi), %rax
15316 ; O2-NEXT:  .Lpcsection608:
15317 ; O2-NEXT:    movq 8(%rdi), %rdx
15318 ; O2-NEXT:    .p2align 4, 0x90
15319 ; O2-NEXT:  .LBB240_1: # %atomicrmw.start
15320 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
15321 ; O2-NEXT:    movq %rax, %rbx
15322 ; O2-NEXT:  .Lpcsection609:
15323 ; O2-NEXT:    orq $42, %rbx
15324 ; O2-NEXT:    movq %rdx, %rcx
15325 ; O2-NEXT:  .Lpcsection610:
15326 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15327 ; O2-NEXT:  .Lpcsection611:
15328 ; O2-NEXT:    jne .LBB240_1
15329 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
15330 ; O2-NEXT:    movq $1, foo(%rip)
15331 ; O2-NEXT:    popq %rbx
15332 ; O2-NEXT:    .cfi_def_cfa_offset 8
15333 ; O2-NEXT:    retq
15335 ; O3-LABEL: atomic128_or_seq_cst:
15336 ; O3:       # %bb.0: # %entry
15337 ; O3-NEXT:    pushq %rbx
15338 ; O3-NEXT:    .cfi_def_cfa_offset 16
15339 ; O3-NEXT:    .cfi_offset %rbx, -16
15340 ; O3-NEXT:    movq foo(%rip), %rax
15341 ; O3-NEXT:  .Lpcsection607:
15342 ; O3-NEXT:    movq (%rdi), %rax
15343 ; O3-NEXT:  .Lpcsection608:
15344 ; O3-NEXT:    movq 8(%rdi), %rdx
15345 ; O3-NEXT:    .p2align 4, 0x90
15346 ; O3-NEXT:  .LBB240_1: # %atomicrmw.start
15347 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
15348 ; O3-NEXT:    movq %rax, %rbx
15349 ; O3-NEXT:  .Lpcsection609:
15350 ; O3-NEXT:    orq $42, %rbx
15351 ; O3-NEXT:    movq %rdx, %rcx
15352 ; O3-NEXT:  .Lpcsection610:
15353 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15354 ; O3-NEXT:  .Lpcsection611:
15355 ; O3-NEXT:    jne .LBB240_1
15356 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
15357 ; O3-NEXT:    movq $1, foo(%rip)
15358 ; O3-NEXT:    popq %rbx
15359 ; O3-NEXT:    .cfi_def_cfa_offset 8
15360 ; O3-NEXT:    retq
15361 entry:
15362   load volatile i64, ptr @foo, align 8
15363   %x = atomicrmw or ptr %a, i128 42 seq_cst, align 16, !pcsections !0
15364   store volatile i64 1, ptr @foo, align 8
15365   ret void
15368 define void @atomic128_xor_seq_cst(ptr %a) {
15369 ; O0-LABEL: atomic128_xor_seq_cst:
15370 ; O0:       # %bb.0: # %entry
15371 ; O0-NEXT:    pushq %rbx
15372 ; O0-NEXT:    .cfi_def_cfa_offset 16
15373 ; O0-NEXT:    .cfi_offset %rbx, -16
15374 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15375 ; O0-NEXT:    movq foo(%rip), %rax
15376 ; O0-NEXT:  .Lpcsection696:
15377 ; O0-NEXT:    movq (%rdi), %rax
15378 ; O0-NEXT:  .Lpcsection697:
15379 ; O0-NEXT:    movq 8(%rdi), %rdx
15380 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15381 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15382 ; O0-NEXT:  .Lpcsection698:
15383 ; O0-NEXT:    jmp .LBB241_1
15384 ; O0-NEXT:  .LBB241_1: # %atomicrmw.start
15385 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
15386 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15387 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15388 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
15389 ; O0-NEXT:    movq %rax, %rbx
15390 ; O0-NEXT:  .Lpcsection699:
15391 ; O0-NEXT:    xorq $42, %rbx
15392 ; O0-NEXT:    movq %rcx, %rdx
15393 ; O0-NEXT:  .Lpcsection700:
15394 ; O0-NEXT:    lock cmpxchg16b (%rsi)
15395 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15396 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15397 ; O0-NEXT:  .Lpcsection701:
15398 ; O0-NEXT:    jne .LBB241_1
15399 ; O0-NEXT:    jmp .LBB241_2
15400 ; O0-NEXT:  .LBB241_2: # %atomicrmw.end
15401 ; O0-NEXT:    movq $1, foo
15402 ; O0-NEXT:    popq %rbx
15403 ; O0-NEXT:    .cfi_def_cfa_offset 8
15404 ; O0-NEXT:    retq
15406 ; O1-LABEL: atomic128_xor_seq_cst:
15407 ; O1:       # %bb.0: # %entry
15408 ; O1-NEXT:    pushq %rbx
15409 ; O1-NEXT:    .cfi_def_cfa_offset 16
15410 ; O1-NEXT:    .cfi_offset %rbx, -16
15411 ; O1-NEXT:    movq foo(%rip), %rax
15412 ; O1-NEXT:  .Lpcsection612:
15413 ; O1-NEXT:    movq (%rdi), %rax
15414 ; O1-NEXT:  .Lpcsection613:
15415 ; O1-NEXT:    movq 8(%rdi), %rdx
15416 ; O1-NEXT:    .p2align 4, 0x90
15417 ; O1-NEXT:  .LBB241_1: # %atomicrmw.start
15418 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
15419 ; O1-NEXT:    movq %rax, %rbx
15420 ; O1-NEXT:  .Lpcsection614:
15421 ; O1-NEXT:    xorq $42, %rbx
15422 ; O1-NEXT:    movq %rdx, %rcx
15423 ; O1-NEXT:  .Lpcsection615:
15424 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15425 ; O1-NEXT:  .Lpcsection616:
15426 ; O1-NEXT:    jne .LBB241_1
15427 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
15428 ; O1-NEXT:    movq $1, foo(%rip)
15429 ; O1-NEXT:    popq %rbx
15430 ; O1-NEXT:    .cfi_def_cfa_offset 8
15431 ; O1-NEXT:    retq
15433 ; O2-LABEL: atomic128_xor_seq_cst:
15434 ; O2:       # %bb.0: # %entry
15435 ; O2-NEXT:    pushq %rbx
15436 ; O2-NEXT:    .cfi_def_cfa_offset 16
15437 ; O2-NEXT:    .cfi_offset %rbx, -16
15438 ; O2-NEXT:    movq foo(%rip), %rax
15439 ; O2-NEXT:  .Lpcsection612:
15440 ; O2-NEXT:    movq (%rdi), %rax
15441 ; O2-NEXT:  .Lpcsection613:
15442 ; O2-NEXT:    movq 8(%rdi), %rdx
15443 ; O2-NEXT:    .p2align 4, 0x90
15444 ; O2-NEXT:  .LBB241_1: # %atomicrmw.start
15445 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
15446 ; O2-NEXT:    movq %rax, %rbx
15447 ; O2-NEXT:  .Lpcsection614:
15448 ; O2-NEXT:    xorq $42, %rbx
15449 ; O2-NEXT:    movq %rdx, %rcx
15450 ; O2-NEXT:  .Lpcsection615:
15451 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15452 ; O2-NEXT:  .Lpcsection616:
15453 ; O2-NEXT:    jne .LBB241_1
15454 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
15455 ; O2-NEXT:    movq $1, foo(%rip)
15456 ; O2-NEXT:    popq %rbx
15457 ; O2-NEXT:    .cfi_def_cfa_offset 8
15458 ; O2-NEXT:    retq
15460 ; O3-LABEL: atomic128_xor_seq_cst:
15461 ; O3:       # %bb.0: # %entry
15462 ; O3-NEXT:    pushq %rbx
15463 ; O3-NEXT:    .cfi_def_cfa_offset 16
15464 ; O3-NEXT:    .cfi_offset %rbx, -16
15465 ; O3-NEXT:    movq foo(%rip), %rax
15466 ; O3-NEXT:  .Lpcsection612:
15467 ; O3-NEXT:    movq (%rdi), %rax
15468 ; O3-NEXT:  .Lpcsection613:
15469 ; O3-NEXT:    movq 8(%rdi), %rdx
15470 ; O3-NEXT:    .p2align 4, 0x90
15471 ; O3-NEXT:  .LBB241_1: # %atomicrmw.start
15472 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
15473 ; O3-NEXT:    movq %rax, %rbx
15474 ; O3-NEXT:  .Lpcsection614:
15475 ; O3-NEXT:    xorq $42, %rbx
15476 ; O3-NEXT:    movq %rdx, %rcx
15477 ; O3-NEXT:  .Lpcsection615:
15478 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15479 ; O3-NEXT:  .Lpcsection616:
15480 ; O3-NEXT:    jne .LBB241_1
15481 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
15482 ; O3-NEXT:    movq $1, foo(%rip)
15483 ; O3-NEXT:    popq %rbx
15484 ; O3-NEXT:    .cfi_def_cfa_offset 8
15485 ; O3-NEXT:    retq
15486 entry:
15487   load volatile i64, ptr @foo, align 8
15488   %x = atomicrmw xor ptr %a, i128 42 seq_cst, align 16, !pcsections !0
15489   store volatile i64 1, ptr @foo, align 8
15490   ret void
15493 define void @atomic128_nand_seq_cst(ptr %a) {
15494 ; O0-LABEL: atomic128_nand_seq_cst:
15495 ; O0:       # %bb.0: # %entry
15496 ; O0-NEXT:    pushq %rbx
15497 ; O0-NEXT:    .cfi_def_cfa_offset 16
15498 ; O0-NEXT:    .cfi_offset %rbx, -16
15499 ; O0-NEXT:    movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15500 ; O0-NEXT:    movq foo(%rip), %rax
15501 ; O0-NEXT:  .Lpcsection702:
15502 ; O0-NEXT:    movq (%rdi), %rax
15503 ; O0-NEXT:  .Lpcsection703:
15504 ; O0-NEXT:    movq 8(%rdi), %rdx
15505 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15506 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15507 ; O0-NEXT:  .Lpcsection704:
15508 ; O0-NEXT:    jmp .LBB242_1
15509 ; O0-NEXT:  .LBB242_1: # %atomicrmw.start
15510 ; O0-NEXT:    # =>This Inner Loop Header: Depth=1
15511 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload
15512 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15513 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
15514 ; O0-NEXT:    movl %eax, %ecx
15515 ; O0-NEXT:  .Lpcsection705:
15516 ; O0-NEXT:    notl %ecx
15517 ; O0-NEXT:  .Lpcsection706:
15518 ; O0-NEXT:    # implicit-def: $rbx
15519 ; O0-NEXT:    movl %ecx, %ebx
15520 ; O0-NEXT:  .Lpcsection707:
15521 ; O0-NEXT:    orq $-43, %rbx
15522 ; O0-NEXT:  .Lpcsection708:
15523 ; O0-NEXT:    movq $-1, %rcx
15524 ; O0-NEXT:  .Lpcsection709:
15525 ; O0-NEXT:    lock cmpxchg16b (%rsi)
15526 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15527 ; O0-NEXT:    movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15528 ; O0-NEXT:  .Lpcsection710:
15529 ; O0-NEXT:    jne .LBB242_1
15530 ; O0-NEXT:    jmp .LBB242_2
15531 ; O0-NEXT:  .LBB242_2: # %atomicrmw.end
15532 ; O0-NEXT:    movq $1, foo
15533 ; O0-NEXT:    popq %rbx
15534 ; O0-NEXT:    .cfi_def_cfa_offset 8
15535 ; O0-NEXT:    retq
15537 ; O1-LABEL: atomic128_nand_seq_cst:
15538 ; O1:       # %bb.0: # %entry
15539 ; O1-NEXT:    pushq %rbx
15540 ; O1-NEXT:    .cfi_def_cfa_offset 16
15541 ; O1-NEXT:    .cfi_offset %rbx, -16
15542 ; O1-NEXT:    movq foo(%rip), %rax
15543 ; O1-NEXT:  .Lpcsection617:
15544 ; O1-NEXT:    movq (%rdi), %rax
15545 ; O1-NEXT:  .Lpcsection618:
15546 ; O1-NEXT:    movq 8(%rdi), %rdx
15547 ; O1-NEXT:  .Lpcsection619:
15548 ; O1-NEXT:    movq $-1, %rcx
15549 ; O1-NEXT:    .p2align 4, 0x90
15550 ; O1-NEXT:  .LBB242_1: # %atomicrmw.start
15551 ; O1-NEXT:    # =>This Inner Loop Header: Depth=1
15552 ; O1-NEXT:    movl %eax, %ebx
15553 ; O1-NEXT:  .Lpcsection620:
15554 ; O1-NEXT:    notl %ebx
15555 ; O1-NEXT:  .Lpcsection621:
15556 ; O1-NEXT:    orq $-43, %rbx
15557 ; O1-NEXT:  .Lpcsection622:
15558 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15559 ; O1-NEXT:  .Lpcsection623:
15560 ; O1-NEXT:    jne .LBB242_1
15561 ; O1-NEXT:  # %bb.2: # %atomicrmw.end
15562 ; O1-NEXT:    movq $1, foo(%rip)
15563 ; O1-NEXT:    popq %rbx
15564 ; O1-NEXT:    .cfi_def_cfa_offset 8
15565 ; O1-NEXT:    retq
15567 ; O2-LABEL: atomic128_nand_seq_cst:
15568 ; O2:       # %bb.0: # %entry
15569 ; O2-NEXT:    pushq %rbx
15570 ; O2-NEXT:    .cfi_def_cfa_offset 16
15571 ; O2-NEXT:    .cfi_offset %rbx, -16
15572 ; O2-NEXT:    movq foo(%rip), %rax
15573 ; O2-NEXT:  .Lpcsection617:
15574 ; O2-NEXT:    movq (%rdi), %rax
15575 ; O2-NEXT:  .Lpcsection618:
15576 ; O2-NEXT:    movq 8(%rdi), %rdx
15577 ; O2-NEXT:  .Lpcsection619:
15578 ; O2-NEXT:    movq $-1, %rcx
15579 ; O2-NEXT:    .p2align 4, 0x90
15580 ; O2-NEXT:  .LBB242_1: # %atomicrmw.start
15581 ; O2-NEXT:    # =>This Inner Loop Header: Depth=1
15582 ; O2-NEXT:    movl %eax, %ebx
15583 ; O2-NEXT:  .Lpcsection620:
15584 ; O2-NEXT:    notl %ebx
15585 ; O2-NEXT:  .Lpcsection621:
15586 ; O2-NEXT:    orq $-43, %rbx
15587 ; O2-NEXT:  .Lpcsection622:
15588 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15589 ; O2-NEXT:  .Lpcsection623:
15590 ; O2-NEXT:    jne .LBB242_1
15591 ; O2-NEXT:  # %bb.2: # %atomicrmw.end
15592 ; O2-NEXT:    movq $1, foo(%rip)
15593 ; O2-NEXT:    popq %rbx
15594 ; O2-NEXT:    .cfi_def_cfa_offset 8
15595 ; O2-NEXT:    retq
15597 ; O3-LABEL: atomic128_nand_seq_cst:
15598 ; O3:       # %bb.0: # %entry
15599 ; O3-NEXT:    pushq %rbx
15600 ; O3-NEXT:    .cfi_def_cfa_offset 16
15601 ; O3-NEXT:    .cfi_offset %rbx, -16
15602 ; O3-NEXT:    movq foo(%rip), %rax
15603 ; O3-NEXT:  .Lpcsection617:
15604 ; O3-NEXT:    movq (%rdi), %rax
15605 ; O3-NEXT:  .Lpcsection618:
15606 ; O3-NEXT:    movq 8(%rdi), %rdx
15607 ; O3-NEXT:  .Lpcsection619:
15608 ; O3-NEXT:    movq $-1, %rcx
15609 ; O3-NEXT:    .p2align 4, 0x90
15610 ; O3-NEXT:  .LBB242_1: # %atomicrmw.start
15611 ; O3-NEXT:    # =>This Inner Loop Header: Depth=1
15612 ; O3-NEXT:    movl %eax, %ebx
15613 ; O3-NEXT:  .Lpcsection620:
15614 ; O3-NEXT:    notl %ebx
15615 ; O3-NEXT:  .Lpcsection621:
15616 ; O3-NEXT:    orq $-43, %rbx
15617 ; O3-NEXT:  .Lpcsection622:
15618 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15619 ; O3-NEXT:  .Lpcsection623:
15620 ; O3-NEXT:    jne .LBB242_1
15621 ; O3-NEXT:  # %bb.2: # %atomicrmw.end
15622 ; O3-NEXT:    movq $1, foo(%rip)
15623 ; O3-NEXT:    popq %rbx
15624 ; O3-NEXT:    .cfi_def_cfa_offset 8
15625 ; O3-NEXT:    retq
15626 entry:
15627   load volatile i64, ptr @foo, align 8
15628   %x = atomicrmw nand ptr %a, i128 42 seq_cst, align 16, !pcsections !0
15629   store volatile i64 1, ptr @foo, align 8
15630   ret void
15633 define void @atomic128_cas_monotonic(ptr %a) {
15634 ; O0-LABEL: atomic128_cas_monotonic:
15635 ; O0:       # %bb.0: # %entry
15636 ; O0-NEXT:    pushq %rbx
15637 ; O0-NEXT:    .cfi_def_cfa_offset 16
15638 ; O0-NEXT:    .cfi_offset %rbx, -16
15639 ; O0-NEXT:    movq foo(%rip), %rax
15640 ; O0-NEXT:  .Lpcsection711:
15641 ; O0-NEXT:    xorl %eax, %eax
15642 ; O0-NEXT:    movl %eax, %ecx
15643 ; O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15644 ; O0-NEXT:  .Lpcsection712:
15645 ; O0-NEXT:    movl $42, %eax
15646 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15647 ; O0-NEXT:  .Lpcsection713:
15648 ; O0-NEXT:    movl $1, %ebx
15649 ; O0-NEXT:    movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15650 ; O0-NEXT:    movq %rcx, %rdx
15651 ; O0-NEXT:  .Lpcsection714:
15652 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15653 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15654 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
15655 ; O0-NEXT:  .Lpcsection715:
15656 ; O0-NEXT:    # kill: def $rsi killed $rax
15657 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15658 ; O0-NEXT:    movq %rcx, %rdx
15659 ; O0-NEXT:  .Lpcsection716:
15660 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15661 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15662 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
15663 ; O0-NEXT:  .Lpcsection717:
15664 ; O0-NEXT:    # kill: def $rsi killed $rax
15665 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15666 ; O0-NEXT:    movq %rcx, %rdx
15667 ; O0-NEXT:  .Lpcsection718:
15668 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15669 ; O0-NEXT:    movq $1, foo
15670 ; O0-NEXT:    popq %rbx
15671 ; O0-NEXT:    .cfi_def_cfa_offset 8
15672 ; O0-NEXT:    retq
15674 ; O1-LABEL: atomic128_cas_monotonic:
15675 ; O1:       # %bb.0: # %entry
15676 ; O1-NEXT:    pushq %rbx
15677 ; O1-NEXT:    .cfi_def_cfa_offset 16
15678 ; O1-NEXT:    .cfi_offset %rbx, -16
15679 ; O1-NEXT:    movq foo(%rip), %rax
15680 ; O1-NEXT:  .Lpcsection624:
15681 ; O1-NEXT:    movl $42, %eax
15682 ; O1-NEXT:  .Lpcsection625:
15683 ; O1-NEXT:    movl $1, %ebx
15684 ; O1-NEXT:  .Lpcsection626:
15685 ; O1-NEXT:    xorl %edx, %edx
15686 ; O1-NEXT:  .Lpcsection627:
15687 ; O1-NEXT:    xorl %ecx, %ecx
15688 ; O1-NEXT:  .Lpcsection628:
15689 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15690 ; O1-NEXT:  .Lpcsection629:
15691 ; O1-NEXT:    movl $42, %eax
15692 ; O1-NEXT:  .Lpcsection630:
15693 ; O1-NEXT:    xorl %edx, %edx
15694 ; O1-NEXT:  .Lpcsection631:
15695 ; O1-NEXT:    xorl %ecx, %ecx
15696 ; O1-NEXT:  .Lpcsection632:
15697 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15698 ; O1-NEXT:  .Lpcsection633:
15699 ; O1-NEXT:    movl $42, %eax
15700 ; O1-NEXT:  .Lpcsection634:
15701 ; O1-NEXT:    xorl %edx, %edx
15702 ; O1-NEXT:  .Lpcsection635:
15703 ; O1-NEXT:    xorl %ecx, %ecx
15704 ; O1-NEXT:  .Lpcsection636:
15705 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15706 ; O1-NEXT:    movq $1, foo(%rip)
15707 ; O1-NEXT:    popq %rbx
15708 ; O1-NEXT:    .cfi_def_cfa_offset 8
15709 ; O1-NEXT:    retq
15711 ; O2-LABEL: atomic128_cas_monotonic:
15712 ; O2:       # %bb.0: # %entry
15713 ; O2-NEXT:    pushq %rbx
15714 ; O2-NEXT:    .cfi_def_cfa_offset 16
15715 ; O2-NEXT:    .cfi_offset %rbx, -16
15716 ; O2-NEXT:    movq foo(%rip), %rax
15717 ; O2-NEXT:  .Lpcsection624:
15718 ; O2-NEXT:    movl $42, %eax
15719 ; O2-NEXT:  .Lpcsection625:
15720 ; O2-NEXT:    movl $1, %ebx
15721 ; O2-NEXT:  .Lpcsection626:
15722 ; O2-NEXT:    xorl %edx, %edx
15723 ; O2-NEXT:  .Lpcsection627:
15724 ; O2-NEXT:    xorl %ecx, %ecx
15725 ; O2-NEXT:  .Lpcsection628:
15726 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15727 ; O2-NEXT:  .Lpcsection629:
15728 ; O2-NEXT:    movl $42, %eax
15729 ; O2-NEXT:  .Lpcsection630:
15730 ; O2-NEXT:    xorl %edx, %edx
15731 ; O2-NEXT:  .Lpcsection631:
15732 ; O2-NEXT:    xorl %ecx, %ecx
15733 ; O2-NEXT:  .Lpcsection632:
15734 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15735 ; O2-NEXT:  .Lpcsection633:
15736 ; O2-NEXT:    movl $42, %eax
15737 ; O2-NEXT:  .Lpcsection634:
15738 ; O2-NEXT:    xorl %edx, %edx
15739 ; O2-NEXT:  .Lpcsection635:
15740 ; O2-NEXT:    xorl %ecx, %ecx
15741 ; O2-NEXT:  .Lpcsection636:
15742 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15743 ; O2-NEXT:    movq $1, foo(%rip)
15744 ; O2-NEXT:    popq %rbx
15745 ; O2-NEXT:    .cfi_def_cfa_offset 8
15746 ; O2-NEXT:    retq
15748 ; O3-LABEL: atomic128_cas_monotonic:
15749 ; O3:       # %bb.0: # %entry
15750 ; O3-NEXT:    pushq %rbx
15751 ; O3-NEXT:    .cfi_def_cfa_offset 16
15752 ; O3-NEXT:    .cfi_offset %rbx, -16
15753 ; O3-NEXT:    movq foo(%rip), %rax
15754 ; O3-NEXT:  .Lpcsection624:
15755 ; O3-NEXT:    movl $42, %eax
15756 ; O3-NEXT:  .Lpcsection625:
15757 ; O3-NEXT:    movl $1, %ebx
15758 ; O3-NEXT:  .Lpcsection626:
15759 ; O3-NEXT:    xorl %edx, %edx
15760 ; O3-NEXT:  .Lpcsection627:
15761 ; O3-NEXT:    xorl %ecx, %ecx
15762 ; O3-NEXT:  .Lpcsection628:
15763 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15764 ; O3-NEXT:  .Lpcsection629:
15765 ; O3-NEXT:    movl $42, %eax
15766 ; O3-NEXT:  .Lpcsection630:
15767 ; O3-NEXT:    xorl %edx, %edx
15768 ; O3-NEXT:  .Lpcsection631:
15769 ; O3-NEXT:    xorl %ecx, %ecx
15770 ; O3-NEXT:  .Lpcsection632:
15771 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15772 ; O3-NEXT:  .Lpcsection633:
15773 ; O3-NEXT:    movl $42, %eax
15774 ; O3-NEXT:  .Lpcsection634:
15775 ; O3-NEXT:    xorl %edx, %edx
15776 ; O3-NEXT:  .Lpcsection635:
15777 ; O3-NEXT:    xorl %ecx, %ecx
15778 ; O3-NEXT:  .Lpcsection636:
15779 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15780 ; O3-NEXT:    movq $1, foo(%rip)
15781 ; O3-NEXT:    popq %rbx
15782 ; O3-NEXT:    .cfi_def_cfa_offset 8
15783 ; O3-NEXT:    retq
15784 entry:
15785   load volatile i64, ptr @foo, align 8
15786   %x = cmpxchg ptr %a, i128 42, i128 1 monotonic monotonic, align 16, !pcsections !0
15787   %y = cmpxchg ptr %a, i128 42, i128 1 monotonic acquire, align 16, !pcsections !0
15788   %z = cmpxchg ptr %a, i128 42, i128 1 monotonic seq_cst, align 16, !pcsections !0
15789   store volatile i64 1, ptr @foo, align 8
15790   ret void
15793 define void @atomic128_cas_acquire(ptr %a) {
15794 ; O0-LABEL: atomic128_cas_acquire:
15795 ; O0:       # %bb.0: # %entry
15796 ; O0-NEXT:    pushq %rbx
15797 ; O0-NEXT:    .cfi_def_cfa_offset 16
15798 ; O0-NEXT:    .cfi_offset %rbx, -16
15799 ; O0-NEXT:    movq foo(%rip), %rax
15800 ; O0-NEXT:  .Lpcsection719:
15801 ; O0-NEXT:    xorl %eax, %eax
15802 ; O0-NEXT:    movl %eax, %ecx
15803 ; O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15804 ; O0-NEXT:  .Lpcsection720:
15805 ; O0-NEXT:    movl $42, %eax
15806 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15807 ; O0-NEXT:  .Lpcsection721:
15808 ; O0-NEXT:    movl $1, %ebx
15809 ; O0-NEXT:    movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15810 ; O0-NEXT:    movq %rcx, %rdx
15811 ; O0-NEXT:  .Lpcsection722:
15812 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15813 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15814 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
15815 ; O0-NEXT:  .Lpcsection723:
15816 ; O0-NEXT:    # kill: def $rsi killed $rax
15817 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15818 ; O0-NEXT:    movq %rcx, %rdx
15819 ; O0-NEXT:  .Lpcsection724:
15820 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15821 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15822 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
15823 ; O0-NEXT:  .Lpcsection725:
15824 ; O0-NEXT:    # kill: def $rsi killed $rax
15825 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15826 ; O0-NEXT:    movq %rcx, %rdx
15827 ; O0-NEXT:  .Lpcsection726:
15828 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15829 ; O0-NEXT:    movq $1, foo
15830 ; O0-NEXT:    popq %rbx
15831 ; O0-NEXT:    .cfi_def_cfa_offset 8
15832 ; O0-NEXT:    retq
15834 ; O1-LABEL: atomic128_cas_acquire:
15835 ; O1:       # %bb.0: # %entry
15836 ; O1-NEXT:    pushq %rbx
15837 ; O1-NEXT:    .cfi_def_cfa_offset 16
15838 ; O1-NEXT:    .cfi_offset %rbx, -16
15839 ; O1-NEXT:    movq foo(%rip), %rax
15840 ; O1-NEXT:  .Lpcsection637:
15841 ; O1-NEXT:    movl $42, %eax
15842 ; O1-NEXT:  .Lpcsection638:
15843 ; O1-NEXT:    movl $1, %ebx
15844 ; O1-NEXT:  .Lpcsection639:
15845 ; O1-NEXT:    xorl %edx, %edx
15846 ; O1-NEXT:  .Lpcsection640:
15847 ; O1-NEXT:    xorl %ecx, %ecx
15848 ; O1-NEXT:  .Lpcsection641:
15849 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15850 ; O1-NEXT:  .Lpcsection642:
15851 ; O1-NEXT:    movl $42, %eax
15852 ; O1-NEXT:  .Lpcsection643:
15853 ; O1-NEXT:    xorl %edx, %edx
15854 ; O1-NEXT:  .Lpcsection644:
15855 ; O1-NEXT:    xorl %ecx, %ecx
15856 ; O1-NEXT:  .Lpcsection645:
15857 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15858 ; O1-NEXT:  .Lpcsection646:
15859 ; O1-NEXT:    movl $42, %eax
15860 ; O1-NEXT:  .Lpcsection647:
15861 ; O1-NEXT:    xorl %edx, %edx
15862 ; O1-NEXT:  .Lpcsection648:
15863 ; O1-NEXT:    xorl %ecx, %ecx
15864 ; O1-NEXT:  .Lpcsection649:
15865 ; O1-NEXT:    lock cmpxchg16b (%rdi)
15866 ; O1-NEXT:    movq $1, foo(%rip)
15867 ; O1-NEXT:    popq %rbx
15868 ; O1-NEXT:    .cfi_def_cfa_offset 8
15869 ; O1-NEXT:    retq
15871 ; O2-LABEL: atomic128_cas_acquire:
15872 ; O2:       # %bb.0: # %entry
15873 ; O2-NEXT:    pushq %rbx
15874 ; O2-NEXT:    .cfi_def_cfa_offset 16
15875 ; O2-NEXT:    .cfi_offset %rbx, -16
15876 ; O2-NEXT:    movq foo(%rip), %rax
15877 ; O2-NEXT:  .Lpcsection637:
15878 ; O2-NEXT:    movl $42, %eax
15879 ; O2-NEXT:  .Lpcsection638:
15880 ; O2-NEXT:    movl $1, %ebx
15881 ; O2-NEXT:  .Lpcsection639:
15882 ; O2-NEXT:    xorl %edx, %edx
15883 ; O2-NEXT:  .Lpcsection640:
15884 ; O2-NEXT:    xorl %ecx, %ecx
15885 ; O2-NEXT:  .Lpcsection641:
15886 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15887 ; O2-NEXT:  .Lpcsection642:
15888 ; O2-NEXT:    movl $42, %eax
15889 ; O2-NEXT:  .Lpcsection643:
15890 ; O2-NEXT:    xorl %edx, %edx
15891 ; O2-NEXT:  .Lpcsection644:
15892 ; O2-NEXT:    xorl %ecx, %ecx
15893 ; O2-NEXT:  .Lpcsection645:
15894 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15895 ; O2-NEXT:  .Lpcsection646:
15896 ; O2-NEXT:    movl $42, %eax
15897 ; O2-NEXT:  .Lpcsection647:
15898 ; O2-NEXT:    xorl %edx, %edx
15899 ; O2-NEXT:  .Lpcsection648:
15900 ; O2-NEXT:    xorl %ecx, %ecx
15901 ; O2-NEXT:  .Lpcsection649:
15902 ; O2-NEXT:    lock cmpxchg16b (%rdi)
15903 ; O2-NEXT:    movq $1, foo(%rip)
15904 ; O2-NEXT:    popq %rbx
15905 ; O2-NEXT:    .cfi_def_cfa_offset 8
15906 ; O2-NEXT:    retq
15908 ; O3-LABEL: atomic128_cas_acquire:
15909 ; O3:       # %bb.0: # %entry
15910 ; O3-NEXT:    pushq %rbx
15911 ; O3-NEXT:    .cfi_def_cfa_offset 16
15912 ; O3-NEXT:    .cfi_offset %rbx, -16
15913 ; O3-NEXT:    movq foo(%rip), %rax
15914 ; O3-NEXT:  .Lpcsection637:
15915 ; O3-NEXT:    movl $42, %eax
15916 ; O3-NEXT:  .Lpcsection638:
15917 ; O3-NEXT:    movl $1, %ebx
15918 ; O3-NEXT:  .Lpcsection639:
15919 ; O3-NEXT:    xorl %edx, %edx
15920 ; O3-NEXT:  .Lpcsection640:
15921 ; O3-NEXT:    xorl %ecx, %ecx
15922 ; O3-NEXT:  .Lpcsection641:
15923 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15924 ; O3-NEXT:  .Lpcsection642:
15925 ; O3-NEXT:    movl $42, %eax
15926 ; O3-NEXT:  .Lpcsection643:
15927 ; O3-NEXT:    xorl %edx, %edx
15928 ; O3-NEXT:  .Lpcsection644:
15929 ; O3-NEXT:    xorl %ecx, %ecx
15930 ; O3-NEXT:  .Lpcsection645:
15931 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15932 ; O3-NEXT:  .Lpcsection646:
15933 ; O3-NEXT:    movl $42, %eax
15934 ; O3-NEXT:  .Lpcsection647:
15935 ; O3-NEXT:    xorl %edx, %edx
15936 ; O3-NEXT:  .Lpcsection648:
15937 ; O3-NEXT:    xorl %ecx, %ecx
15938 ; O3-NEXT:  .Lpcsection649:
15939 ; O3-NEXT:    lock cmpxchg16b (%rdi)
15940 ; O3-NEXT:    movq $1, foo(%rip)
15941 ; O3-NEXT:    popq %rbx
15942 ; O3-NEXT:    .cfi_def_cfa_offset 8
15943 ; O3-NEXT:    retq
15944 entry:
15945   load volatile i64, ptr @foo, align 8
15946   %x = cmpxchg ptr %a, i128 42, i128 1 acquire monotonic, align 16, !pcsections !0
15947   %y = cmpxchg ptr %a, i128 42, i128 1 acquire acquire, align 16, !pcsections !0
15948   %z = cmpxchg ptr %a, i128 42, i128 1 acquire seq_cst, align 16, !pcsections !0
15949   store volatile i64 1, ptr @foo, align 8
15950   ret void
15953 define void @atomic128_cas_release(ptr %a) {
15954 ; O0-LABEL: atomic128_cas_release:
15955 ; O0:       # %bb.0: # %entry
15956 ; O0-NEXT:    pushq %rbx
15957 ; O0-NEXT:    .cfi_def_cfa_offset 16
15958 ; O0-NEXT:    .cfi_offset %rbx, -16
15959 ; O0-NEXT:    movq foo(%rip), %rax
15960 ; O0-NEXT:  .Lpcsection727:
15961 ; O0-NEXT:    xorl %eax, %eax
15962 ; O0-NEXT:    movl %eax, %ecx
15963 ; O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15964 ; O0-NEXT:  .Lpcsection728:
15965 ; O0-NEXT:    movl $42, %eax
15966 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15967 ; O0-NEXT:  .Lpcsection729:
15968 ; O0-NEXT:    movl $1, %ebx
15969 ; O0-NEXT:    movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
15970 ; O0-NEXT:    movq %rcx, %rdx
15971 ; O0-NEXT:  .Lpcsection730:
15972 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15973 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15974 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
15975 ; O0-NEXT:  .Lpcsection731:
15976 ; O0-NEXT:    # kill: def $rsi killed $rax
15977 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15978 ; O0-NEXT:    movq %rcx, %rdx
15979 ; O0-NEXT:  .Lpcsection732:
15980 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15981 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
15982 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
15983 ; O0-NEXT:  .Lpcsection733:
15984 ; O0-NEXT:    # kill: def $rsi killed $rax
15985 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
15986 ; O0-NEXT:    movq %rcx, %rdx
15987 ; O0-NEXT:  .Lpcsection734:
15988 ; O0-NEXT:    lock cmpxchg16b (%rdi)
15989 ; O0-NEXT:    movq $1, foo
15990 ; O0-NEXT:    popq %rbx
15991 ; O0-NEXT:    .cfi_def_cfa_offset 8
15992 ; O0-NEXT:    retq
15994 ; O1-LABEL: atomic128_cas_release:
15995 ; O1:       # %bb.0: # %entry
15996 ; O1-NEXT:    pushq %rbx
15997 ; O1-NEXT:    .cfi_def_cfa_offset 16
15998 ; O1-NEXT:    .cfi_offset %rbx, -16
15999 ; O1-NEXT:    movq foo(%rip), %rax
16000 ; O1-NEXT:  .Lpcsection650:
16001 ; O1-NEXT:    movl $42, %eax
16002 ; O1-NEXT:  .Lpcsection651:
16003 ; O1-NEXT:    movl $1, %ebx
16004 ; O1-NEXT:  .Lpcsection652:
16005 ; O1-NEXT:    xorl %edx, %edx
16006 ; O1-NEXT:  .Lpcsection653:
16007 ; O1-NEXT:    xorl %ecx, %ecx
16008 ; O1-NEXT:  .Lpcsection654:
16009 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16010 ; O1-NEXT:  .Lpcsection655:
16011 ; O1-NEXT:    movl $42, %eax
16012 ; O1-NEXT:  .Lpcsection656:
16013 ; O1-NEXT:    xorl %edx, %edx
16014 ; O1-NEXT:  .Lpcsection657:
16015 ; O1-NEXT:    xorl %ecx, %ecx
16016 ; O1-NEXT:  .Lpcsection658:
16017 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16018 ; O1-NEXT:  .Lpcsection659:
16019 ; O1-NEXT:    movl $42, %eax
16020 ; O1-NEXT:  .Lpcsection660:
16021 ; O1-NEXT:    xorl %edx, %edx
16022 ; O1-NEXT:  .Lpcsection661:
16023 ; O1-NEXT:    xorl %ecx, %ecx
16024 ; O1-NEXT:  .Lpcsection662:
16025 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16026 ; O1-NEXT:    movq $1, foo(%rip)
16027 ; O1-NEXT:    popq %rbx
16028 ; O1-NEXT:    .cfi_def_cfa_offset 8
16029 ; O1-NEXT:    retq
16031 ; O2-LABEL: atomic128_cas_release:
16032 ; O2:       # %bb.0: # %entry
16033 ; O2-NEXT:    pushq %rbx
16034 ; O2-NEXT:    .cfi_def_cfa_offset 16
16035 ; O2-NEXT:    .cfi_offset %rbx, -16
16036 ; O2-NEXT:    movq foo(%rip), %rax
16037 ; O2-NEXT:  .Lpcsection650:
16038 ; O2-NEXT:    movl $42, %eax
16039 ; O2-NEXT:  .Lpcsection651:
16040 ; O2-NEXT:    movl $1, %ebx
16041 ; O2-NEXT:  .Lpcsection652:
16042 ; O2-NEXT:    xorl %edx, %edx
16043 ; O2-NEXT:  .Lpcsection653:
16044 ; O2-NEXT:    xorl %ecx, %ecx
16045 ; O2-NEXT:  .Lpcsection654:
16046 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16047 ; O2-NEXT:  .Lpcsection655:
16048 ; O2-NEXT:    movl $42, %eax
16049 ; O2-NEXT:  .Lpcsection656:
16050 ; O2-NEXT:    xorl %edx, %edx
16051 ; O2-NEXT:  .Lpcsection657:
16052 ; O2-NEXT:    xorl %ecx, %ecx
16053 ; O2-NEXT:  .Lpcsection658:
16054 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16055 ; O2-NEXT:  .Lpcsection659:
16056 ; O2-NEXT:    movl $42, %eax
16057 ; O2-NEXT:  .Lpcsection660:
16058 ; O2-NEXT:    xorl %edx, %edx
16059 ; O2-NEXT:  .Lpcsection661:
16060 ; O2-NEXT:    xorl %ecx, %ecx
16061 ; O2-NEXT:  .Lpcsection662:
16062 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16063 ; O2-NEXT:    movq $1, foo(%rip)
16064 ; O2-NEXT:    popq %rbx
16065 ; O2-NEXT:    .cfi_def_cfa_offset 8
16066 ; O2-NEXT:    retq
16068 ; O3-LABEL: atomic128_cas_release:
16069 ; O3:       # %bb.0: # %entry
16070 ; O3-NEXT:    pushq %rbx
16071 ; O3-NEXT:    .cfi_def_cfa_offset 16
16072 ; O3-NEXT:    .cfi_offset %rbx, -16
16073 ; O3-NEXT:    movq foo(%rip), %rax
16074 ; O3-NEXT:  .Lpcsection650:
16075 ; O3-NEXT:    movl $42, %eax
16076 ; O3-NEXT:  .Lpcsection651:
16077 ; O3-NEXT:    movl $1, %ebx
16078 ; O3-NEXT:  .Lpcsection652:
16079 ; O3-NEXT:    xorl %edx, %edx
16080 ; O3-NEXT:  .Lpcsection653:
16081 ; O3-NEXT:    xorl %ecx, %ecx
16082 ; O3-NEXT:  .Lpcsection654:
16083 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16084 ; O3-NEXT:  .Lpcsection655:
16085 ; O3-NEXT:    movl $42, %eax
16086 ; O3-NEXT:  .Lpcsection656:
16087 ; O3-NEXT:    xorl %edx, %edx
16088 ; O3-NEXT:  .Lpcsection657:
16089 ; O3-NEXT:    xorl %ecx, %ecx
16090 ; O3-NEXT:  .Lpcsection658:
16091 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16092 ; O3-NEXT:  .Lpcsection659:
16093 ; O3-NEXT:    movl $42, %eax
16094 ; O3-NEXT:  .Lpcsection660:
16095 ; O3-NEXT:    xorl %edx, %edx
16096 ; O3-NEXT:  .Lpcsection661:
16097 ; O3-NEXT:    xorl %ecx, %ecx
16098 ; O3-NEXT:  .Lpcsection662:
16099 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16100 ; O3-NEXT:    movq $1, foo(%rip)
16101 ; O3-NEXT:    popq %rbx
16102 ; O3-NEXT:    .cfi_def_cfa_offset 8
16103 ; O3-NEXT:    retq
16104 entry:
16105   load volatile i64, ptr @foo, align 8
16106   %x = cmpxchg ptr %a, i128 42, i128 1 release monotonic, align 16, !pcsections !0
16107   %y = cmpxchg ptr %a, i128 42, i128 1 release acquire, align 16, !pcsections !0
16108   %z = cmpxchg ptr %a, i128 42, i128 1 release seq_cst, align 16, !pcsections !0
16109   store volatile i64 1, ptr @foo, align 8
16110   ret void
16113 define void @atomic128_cas_acq_rel(ptr %a) {
16114 ; O0-LABEL: atomic128_cas_acq_rel:
16115 ; O0:       # %bb.0: # %entry
16116 ; O0-NEXT:    pushq %rbx
16117 ; O0-NEXT:    .cfi_def_cfa_offset 16
16118 ; O0-NEXT:    .cfi_offset %rbx, -16
16119 ; O0-NEXT:    movq foo(%rip), %rax
16120 ; O0-NEXT:  .Lpcsection735:
16121 ; O0-NEXT:    xorl %eax, %eax
16122 ; O0-NEXT:    movl %eax, %ecx
16123 ; O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
16124 ; O0-NEXT:  .Lpcsection736:
16125 ; O0-NEXT:    movl $42, %eax
16126 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
16127 ; O0-NEXT:  .Lpcsection737:
16128 ; O0-NEXT:    movl $1, %ebx
16129 ; O0-NEXT:    movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
16130 ; O0-NEXT:    movq %rcx, %rdx
16131 ; O0-NEXT:  .Lpcsection738:
16132 ; O0-NEXT:    lock cmpxchg16b (%rdi)
16133 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
16134 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
16135 ; O0-NEXT:  .Lpcsection739:
16136 ; O0-NEXT:    # kill: def $rsi killed $rax
16137 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
16138 ; O0-NEXT:    movq %rcx, %rdx
16139 ; O0-NEXT:  .Lpcsection740:
16140 ; O0-NEXT:    lock cmpxchg16b (%rdi)
16141 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
16142 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
16143 ; O0-NEXT:  .Lpcsection741:
16144 ; O0-NEXT:    # kill: def $rsi killed $rax
16145 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
16146 ; O0-NEXT:    movq %rcx, %rdx
16147 ; O0-NEXT:  .Lpcsection742:
16148 ; O0-NEXT:    lock cmpxchg16b (%rdi)
16149 ; O0-NEXT:    movq $1, foo
16150 ; O0-NEXT:    popq %rbx
16151 ; O0-NEXT:    .cfi_def_cfa_offset 8
16152 ; O0-NEXT:    retq
16154 ; O1-LABEL: atomic128_cas_acq_rel:
16155 ; O1:       # %bb.0: # %entry
16156 ; O1-NEXT:    pushq %rbx
16157 ; O1-NEXT:    .cfi_def_cfa_offset 16
16158 ; O1-NEXT:    .cfi_offset %rbx, -16
16159 ; O1-NEXT:    movq foo(%rip), %rax
16160 ; O1-NEXT:  .Lpcsection663:
16161 ; O1-NEXT:    movl $42, %eax
16162 ; O1-NEXT:  .Lpcsection664:
16163 ; O1-NEXT:    movl $1, %ebx
16164 ; O1-NEXT:  .Lpcsection665:
16165 ; O1-NEXT:    xorl %edx, %edx
16166 ; O1-NEXT:  .Lpcsection666:
16167 ; O1-NEXT:    xorl %ecx, %ecx
16168 ; O1-NEXT:  .Lpcsection667:
16169 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16170 ; O1-NEXT:  .Lpcsection668:
16171 ; O1-NEXT:    movl $42, %eax
16172 ; O1-NEXT:  .Lpcsection669:
16173 ; O1-NEXT:    xorl %edx, %edx
16174 ; O1-NEXT:  .Lpcsection670:
16175 ; O1-NEXT:    xorl %ecx, %ecx
16176 ; O1-NEXT:  .Lpcsection671:
16177 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16178 ; O1-NEXT:  .Lpcsection672:
16179 ; O1-NEXT:    movl $42, %eax
16180 ; O1-NEXT:  .Lpcsection673:
16181 ; O1-NEXT:    xorl %edx, %edx
16182 ; O1-NEXT:  .Lpcsection674:
16183 ; O1-NEXT:    xorl %ecx, %ecx
16184 ; O1-NEXT:  .Lpcsection675:
16185 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16186 ; O1-NEXT:    movq $1, foo(%rip)
16187 ; O1-NEXT:    popq %rbx
16188 ; O1-NEXT:    .cfi_def_cfa_offset 8
16189 ; O1-NEXT:    retq
16191 ; O2-LABEL: atomic128_cas_acq_rel:
16192 ; O2:       # %bb.0: # %entry
16193 ; O2-NEXT:    pushq %rbx
16194 ; O2-NEXT:    .cfi_def_cfa_offset 16
16195 ; O2-NEXT:    .cfi_offset %rbx, -16
16196 ; O2-NEXT:    movq foo(%rip), %rax
16197 ; O2-NEXT:  .Lpcsection663:
16198 ; O2-NEXT:    movl $42, %eax
16199 ; O2-NEXT:  .Lpcsection664:
16200 ; O2-NEXT:    movl $1, %ebx
16201 ; O2-NEXT:  .Lpcsection665:
16202 ; O2-NEXT:    xorl %edx, %edx
16203 ; O2-NEXT:  .Lpcsection666:
16204 ; O2-NEXT:    xorl %ecx, %ecx
16205 ; O2-NEXT:  .Lpcsection667:
16206 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16207 ; O2-NEXT:  .Lpcsection668:
16208 ; O2-NEXT:    movl $42, %eax
16209 ; O2-NEXT:  .Lpcsection669:
16210 ; O2-NEXT:    xorl %edx, %edx
16211 ; O2-NEXT:  .Lpcsection670:
16212 ; O2-NEXT:    xorl %ecx, %ecx
16213 ; O2-NEXT:  .Lpcsection671:
16214 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16215 ; O2-NEXT:  .Lpcsection672:
16216 ; O2-NEXT:    movl $42, %eax
16217 ; O2-NEXT:  .Lpcsection673:
16218 ; O2-NEXT:    xorl %edx, %edx
16219 ; O2-NEXT:  .Lpcsection674:
16220 ; O2-NEXT:    xorl %ecx, %ecx
16221 ; O2-NEXT:  .Lpcsection675:
16222 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16223 ; O2-NEXT:    movq $1, foo(%rip)
16224 ; O2-NEXT:    popq %rbx
16225 ; O2-NEXT:    .cfi_def_cfa_offset 8
16226 ; O2-NEXT:    retq
16228 ; O3-LABEL: atomic128_cas_acq_rel:
16229 ; O3:       # %bb.0: # %entry
16230 ; O3-NEXT:    pushq %rbx
16231 ; O3-NEXT:    .cfi_def_cfa_offset 16
16232 ; O3-NEXT:    .cfi_offset %rbx, -16
16233 ; O3-NEXT:    movq foo(%rip), %rax
16234 ; O3-NEXT:  .Lpcsection663:
16235 ; O3-NEXT:    movl $42, %eax
16236 ; O3-NEXT:  .Lpcsection664:
16237 ; O3-NEXT:    movl $1, %ebx
16238 ; O3-NEXT:  .Lpcsection665:
16239 ; O3-NEXT:    xorl %edx, %edx
16240 ; O3-NEXT:  .Lpcsection666:
16241 ; O3-NEXT:    xorl %ecx, %ecx
16242 ; O3-NEXT:  .Lpcsection667:
16243 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16244 ; O3-NEXT:  .Lpcsection668:
16245 ; O3-NEXT:    movl $42, %eax
16246 ; O3-NEXT:  .Lpcsection669:
16247 ; O3-NEXT:    xorl %edx, %edx
16248 ; O3-NEXT:  .Lpcsection670:
16249 ; O3-NEXT:    xorl %ecx, %ecx
16250 ; O3-NEXT:  .Lpcsection671:
16251 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16252 ; O3-NEXT:  .Lpcsection672:
16253 ; O3-NEXT:    movl $42, %eax
16254 ; O3-NEXT:  .Lpcsection673:
16255 ; O3-NEXT:    xorl %edx, %edx
16256 ; O3-NEXT:  .Lpcsection674:
16257 ; O3-NEXT:    xorl %ecx, %ecx
16258 ; O3-NEXT:  .Lpcsection675:
16259 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16260 ; O3-NEXT:    movq $1, foo(%rip)
16261 ; O3-NEXT:    popq %rbx
16262 ; O3-NEXT:    .cfi_def_cfa_offset 8
16263 ; O3-NEXT:    retq
16264 entry:
16265   load volatile i64, ptr @foo, align 8
16266   %x = cmpxchg ptr %a, i128 42, i128 1 acq_rel monotonic, align 16, !pcsections !0
16267   %y = cmpxchg ptr %a, i128 42, i128 1 acq_rel acquire, align 16, !pcsections !0
16268   %z = cmpxchg ptr %a, i128 42, i128 1 acq_rel seq_cst, align 16, !pcsections !0
16269   store volatile i64 1, ptr @foo, align 8
16270   ret void
16273 define void @atomic128_cas_seq_cst(ptr %a) {
16274 ; O0-LABEL: atomic128_cas_seq_cst:
16275 ; O0:       # %bb.0: # %entry
16276 ; O0-NEXT:    pushq %rbx
16277 ; O0-NEXT:    .cfi_def_cfa_offset 16
16278 ; O0-NEXT:    .cfi_offset %rbx, -16
16279 ; O0-NEXT:    movq foo(%rip), %rax
16280 ; O0-NEXT:  .Lpcsection743:
16281 ; O0-NEXT:    xorl %eax, %eax
16282 ; O0-NEXT:    movl %eax, %ecx
16283 ; O0-NEXT:    movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
16284 ; O0-NEXT:  .Lpcsection744:
16285 ; O0-NEXT:    movl $42, %eax
16286 ; O0-NEXT:    movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
16287 ; O0-NEXT:  .Lpcsection745:
16288 ; O0-NEXT:    movl $1, %ebx
16289 ; O0-NEXT:    movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
16290 ; O0-NEXT:    movq %rcx, %rdx
16291 ; O0-NEXT:  .Lpcsection746:
16292 ; O0-NEXT:    lock cmpxchg16b (%rdi)
16293 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
16294 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
16295 ; O0-NEXT:  .Lpcsection747:
16296 ; O0-NEXT:    # kill: def $rsi killed $rax
16297 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
16298 ; O0-NEXT:    movq %rcx, %rdx
16299 ; O0-NEXT:  .Lpcsection748:
16300 ; O0-NEXT:    lock cmpxchg16b (%rdi)
16301 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
16302 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
16303 ; O0-NEXT:  .Lpcsection749:
16304 ; O0-NEXT:    # kill: def $rsi killed $rax
16305 ; O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
16306 ; O0-NEXT:    movq %rcx, %rdx
16307 ; O0-NEXT:  .Lpcsection750:
16308 ; O0-NEXT:    lock cmpxchg16b (%rdi)
16309 ; O0-NEXT:    movq $3, foo
16310 ; O0-NEXT:    popq %rbx
16311 ; O0-NEXT:    .cfi_def_cfa_offset 8
16312 ; O0-NEXT:    retq
16314 ; O1-LABEL: atomic128_cas_seq_cst:
16315 ; O1:       # %bb.0: # %entry
16316 ; O1-NEXT:    pushq %rbx
16317 ; O1-NEXT:    .cfi_def_cfa_offset 16
16318 ; O1-NEXT:    .cfi_offset %rbx, -16
16319 ; O1-NEXT:    movq foo(%rip), %rax
16320 ; O1-NEXT:  .Lpcsection676:
16321 ; O1-NEXT:    movl $42, %eax
16322 ; O1-NEXT:  .Lpcsection677:
16323 ; O1-NEXT:    movl $1, %ebx
16324 ; O1-NEXT:  .Lpcsection678:
16325 ; O1-NEXT:    xorl %edx, %edx
16326 ; O1-NEXT:  .Lpcsection679:
16327 ; O1-NEXT:    xorl %ecx, %ecx
16328 ; O1-NEXT:  .Lpcsection680:
16329 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16330 ; O1-NEXT:  .Lpcsection681:
16331 ; O1-NEXT:    movl $42, %eax
16332 ; O1-NEXT:  .Lpcsection682:
16333 ; O1-NEXT:    xorl %edx, %edx
16334 ; O1-NEXT:  .Lpcsection683:
16335 ; O1-NEXT:    xorl %ecx, %ecx
16336 ; O1-NEXT:  .Lpcsection684:
16337 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16338 ; O1-NEXT:  .Lpcsection685:
16339 ; O1-NEXT:    movl $42, %eax
16340 ; O1-NEXT:  .Lpcsection686:
16341 ; O1-NEXT:    xorl %edx, %edx
16342 ; O1-NEXT:  .Lpcsection687:
16343 ; O1-NEXT:    xorl %ecx, %ecx
16344 ; O1-NEXT:  .Lpcsection688:
16345 ; O1-NEXT:    lock cmpxchg16b (%rdi)
16346 ; O1-NEXT:    movq $3, foo(%rip)
16347 ; O1-NEXT:    popq %rbx
16348 ; O1-NEXT:    .cfi_def_cfa_offset 8
16349 ; O1-NEXT:    retq
16351 ; O2-LABEL: atomic128_cas_seq_cst:
16352 ; O2:       # %bb.0: # %entry
16353 ; O2-NEXT:    pushq %rbx
16354 ; O2-NEXT:    .cfi_def_cfa_offset 16
16355 ; O2-NEXT:    .cfi_offset %rbx, -16
16356 ; O2-NEXT:    movq foo(%rip), %rax
16357 ; O2-NEXT:  .Lpcsection676:
16358 ; O2-NEXT:    movl $42, %eax
16359 ; O2-NEXT:  .Lpcsection677:
16360 ; O2-NEXT:    movl $1, %ebx
16361 ; O2-NEXT:  .Lpcsection678:
16362 ; O2-NEXT:    xorl %edx, %edx
16363 ; O2-NEXT:  .Lpcsection679:
16364 ; O2-NEXT:    xorl %ecx, %ecx
16365 ; O2-NEXT:  .Lpcsection680:
16366 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16367 ; O2-NEXT:  .Lpcsection681:
16368 ; O2-NEXT:    movl $42, %eax
16369 ; O2-NEXT:  .Lpcsection682:
16370 ; O2-NEXT:    xorl %edx, %edx
16371 ; O2-NEXT:  .Lpcsection683:
16372 ; O2-NEXT:    xorl %ecx, %ecx
16373 ; O2-NEXT:  .Lpcsection684:
16374 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16375 ; O2-NEXT:  .Lpcsection685:
16376 ; O2-NEXT:    movl $42, %eax
16377 ; O2-NEXT:  .Lpcsection686:
16378 ; O2-NEXT:    xorl %edx, %edx
16379 ; O2-NEXT:  .Lpcsection687:
16380 ; O2-NEXT:    xorl %ecx, %ecx
16381 ; O2-NEXT:  .Lpcsection688:
16382 ; O2-NEXT:    lock cmpxchg16b (%rdi)
16383 ; O2-NEXT:    movq $3, foo(%rip)
16384 ; O2-NEXT:    popq %rbx
16385 ; O2-NEXT:    .cfi_def_cfa_offset 8
16386 ; O2-NEXT:    retq
16388 ; O3-LABEL: atomic128_cas_seq_cst:
16389 ; O3:       # %bb.0: # %entry
16390 ; O3-NEXT:    pushq %rbx
16391 ; O3-NEXT:    .cfi_def_cfa_offset 16
16392 ; O3-NEXT:    .cfi_offset %rbx, -16
16393 ; O3-NEXT:    movq foo(%rip), %rax
16394 ; O3-NEXT:  .Lpcsection676:
16395 ; O3-NEXT:    movl $42, %eax
16396 ; O3-NEXT:  .Lpcsection677:
16397 ; O3-NEXT:    movl $1, %ebx
16398 ; O3-NEXT:  .Lpcsection678:
16399 ; O3-NEXT:    xorl %edx, %edx
16400 ; O3-NEXT:  .Lpcsection679:
16401 ; O3-NEXT:    xorl %ecx, %ecx
16402 ; O3-NEXT:  .Lpcsection680:
16403 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16404 ; O3-NEXT:  .Lpcsection681:
16405 ; O3-NEXT:    movl $42, %eax
16406 ; O3-NEXT:  .Lpcsection682:
16407 ; O3-NEXT:    xorl %edx, %edx
16408 ; O3-NEXT:  .Lpcsection683:
16409 ; O3-NEXT:    xorl %ecx, %ecx
16410 ; O3-NEXT:  .Lpcsection684:
16411 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16412 ; O3-NEXT:  .Lpcsection685:
16413 ; O3-NEXT:    movl $42, %eax
16414 ; O3-NEXT:  .Lpcsection686:
16415 ; O3-NEXT:    xorl %edx, %edx
16416 ; O3-NEXT:  .Lpcsection687:
16417 ; O3-NEXT:    xorl %ecx, %ecx
16418 ; O3-NEXT:  .Lpcsection688:
16419 ; O3-NEXT:    lock cmpxchg16b (%rdi)
16420 ; O3-NEXT:    movq $3, foo(%rip)
16421 ; O3-NEXT:    popq %rbx
16422 ; O3-NEXT:    .cfi_def_cfa_offset 8
16423 ; O3-NEXT:    retq
16424 entry:
16425   load volatile i64, ptr @foo, align 8
16426   %x = cmpxchg ptr %a, i128 42, i128 1 seq_cst monotonic, align 16, !pcsections !0
16427   %y = cmpxchg ptr %a, i128 42, i128 1 seq_cst acquire, align 16, !pcsections !0
16428   %z = cmpxchg ptr %a, i128 42, i128 1 seq_cst seq_cst, align 16, !pcsections !0
16429   store volatile i64 3, ptr @foo, align 8
16430   ret void
16433 !0 = !{!"somesection"}