; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; ; Test that atomic ops in IR marked with !pcsections end up in a PC section in ; asm. All functions start with a non-atomic access, continue with an atomic ; access, and end with another non-atomic access; this is to test that the ; !pcsections propagation doesn't accidentally touch adjacent instructions. ; ; RUN: llc -O0 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O0 ; RUN: llc -O1 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O1 ; RUN: llc -O2 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O2 ; RUN: llc -O3 -mattr=cx16 < %s | FileCheck %s --check-prefixes=O3 target triple = "x86_64-unknown-linux-gnu" @foo = dso_local global i64 0, align 8 define void @mixed_atomic_non_atomic(ptr %a) { ; O0-LABEL: mixed_atomic_non_atomic: ; O0: # %bb.0: # %entry ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: incl %eax ; O0-NEXT: movl %eax, (%rdi) ; O0-NEXT: .Lpcsection0: ; O0-NEXT: movl $1, (%rdi) ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: addl $-1, %eax ; O0-NEXT: movl %eax, (%rdi) ; O0-NEXT: retq ; ; O1-LABEL: mixed_atomic_non_atomic: ; O1: # %bb.0: # %entry ; O1-NEXT: incl (%rdi) ; O1-NEXT: .Lpcsection0: ; O1-NEXT: movl $1, (%rdi) ; O1-NEXT: decl (%rdi) ; O1-NEXT: retq ; ; O2-LABEL: mixed_atomic_non_atomic: ; O2: # %bb.0: # %entry ; O2-NEXT: incl (%rdi) ; O2-NEXT: .Lpcsection0: ; O2-NEXT: movl $1, (%rdi) ; O2-NEXT: decl (%rdi) ; O2-NEXT: retq ; ; O3-LABEL: mixed_atomic_non_atomic: ; O3: # %bb.0: # %entry ; O3-NEXT: incl (%rdi) ; O3-NEXT: .Lpcsection0: ; O3-NEXT: movl $1, (%rdi) ; O3-NEXT: decl (%rdi) ; O3-NEXT: retq entry: ; Accesses the same location atomically and non-atomically. %0 = load volatile i32, ptr %a, align 4 %inc = add nsw i32 %0, 1 store volatile i32 %inc, ptr %a, align 4 store atomic volatile i32 1, ptr %a monotonic, align 4, !pcsections !0 %1 = load volatile i32, ptr %a, align 4 %dec = add nsw i32 %1, -1 store volatile i32 %dec, ptr %a, align 4 ret void } define i64 @mixed_complex_atomic_non_atomic(ptr %a, ptr %b) { ; O0-LABEL: mixed_complex_atomic_non_atomic: ; O0: # %bb.0: # %entry ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection1: ; O0-NEXT: lock xaddq %rcx, (%rdi) ; O0-NEXT: movq (%rsi), %rax ; O0-NEXT: movq %rax, %rdx ; O0-NEXT: addq $1, %rdx ; O0-NEXT: movq %rdx, (%rsi) ; O0-NEXT: addq %rcx, %rax ; O0-NEXT: retq ; ; O1-LABEL: mixed_complex_atomic_non_atomic: ; O1: # %bb.0: # %entry ; O1-NEXT: movl $1, %eax ; O1-NEXT: .Lpcsection1: ; O1-NEXT: lock xaddq %rax, (%rdi) ; O1-NEXT: movq (%rsi), %rcx ; O1-NEXT: leaq 1(%rcx), %rdx ; O1-NEXT: movq %rdx, (%rsi) ; O1-NEXT: addq %rcx, %rax ; O1-NEXT: retq ; ; O2-LABEL: mixed_complex_atomic_non_atomic: ; O2: # %bb.0: # %entry ; O2-NEXT: movl $1, %eax ; O2-NEXT: .Lpcsection1: ; O2-NEXT: lock xaddq %rax, (%rdi) ; O2-NEXT: movq (%rsi), %rcx ; O2-NEXT: leaq 1(%rcx), %rdx ; O2-NEXT: movq %rdx, (%rsi) ; O2-NEXT: addq %rcx, %rax ; O2-NEXT: retq ; ; O3-LABEL: mixed_complex_atomic_non_atomic: ; O3: # %bb.0: # %entry ; O3-NEXT: movl $1, %eax ; O3-NEXT: .Lpcsection1: ; O3-NEXT: lock xaddq %rax, (%rdi) ; O3-NEXT: movq (%rsi), %rcx ; O3-NEXT: leaq 1(%rcx), %rdx ; O3-NEXT: movq %rdx, (%rsi) ; O3-NEXT: addq %rcx, %rax ; O3-NEXT: retq entry: %0 = atomicrmw add ptr %a, i64 1 monotonic, align 8, !pcsections !0 %1 = load i64, ptr %b, align 8 %inc = add nsw i64 %1, 1 store i64 %inc, ptr %b, align 8 %add = add nsw i64 %1, %0 ret i64 %add } define i8 @atomic8_load_unordered(ptr %a) { ; O0-LABEL: atomic8_load_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection2: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_load_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection2: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_load_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection2: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_load_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection2: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i8, ptr %a unordered, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i8 %x } define i8 @atomic8_load_monotonic(ptr %a) { ; O0-LABEL: atomic8_load_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection3: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_load_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection3: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_load_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection3: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_load_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection3: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i8, ptr %a monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i8 %x } define i8 @atomic8_load_acquire(ptr %a) { ; O0-LABEL: atomic8_load_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection4: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_load_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection4: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_load_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection4: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_load_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection4: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i8, ptr %a acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i8 %x } define i8 @atomic8_load_seq_cst(ptr %a) { ; O0-LABEL: atomic8_load_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection5: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_load_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection5: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_load_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection5: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_load_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection5: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i8, ptr %a seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i8 %x } define void @atomic8_store_unordered(ptr %a) { ; O0-LABEL: atomic8_store_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection6: ; O0-NEXT: movb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_store_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection6: ; O1-NEXT: movb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_store_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection6: ; O2-NEXT: movb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_store_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection6: ; O3-NEXT: movb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i8 42, ptr %a unordered, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_store_monotonic(ptr %a) { ; O0-LABEL: atomic8_store_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection7: ; O0-NEXT: movb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_store_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection7: ; O1-NEXT: movb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_store_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection7: ; O2-NEXT: movb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_store_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection7: ; O3-NEXT: movb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i8 42, ptr %a monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_store_release(ptr %a) { ; O0-LABEL: atomic8_store_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection8: ; O0-NEXT: movb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_store_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection8: ; O1-NEXT: movb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_store_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection8: ; O2-NEXT: movb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_store_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection8: ; O3-NEXT: movb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i8 42, ptr %a release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_store_seq_cst(ptr %a) { ; O0-LABEL: atomic8_store_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: .Lpcsection9: ; O0-NEXT: xchgb %al, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_store_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection9: ; O1-NEXT: xchgb %al, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_store_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection9: ; O2-NEXT: xchgb %al, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_store_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection9: ; O3-NEXT: xchgb %al, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i8 42, ptr %a seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xchg_monotonic(ptr %a) { ; O0-LABEL: atomic8_xchg_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: .Lpcsection10: ; O0-NEXT: xchgb %al, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xchg_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection10: ; O1-NEXT: xchgb %al, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xchg_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection10: ; O2-NEXT: xchgb %al, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xchg_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection10: ; O3-NEXT: xchgb %al, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i8 42 monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_add_monotonic(ptr %a) { ; O0-LABEL: atomic8_add_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection11: ; O0-NEXT: lock addb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_add_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection11: ; O1-NEXT: lock addb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_add_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection11: ; O2-NEXT: lock addb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_add_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection11: ; O3-NEXT: lock addb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i8 42 monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_sub_monotonic(ptr %a) { ; O0-LABEL: atomic8_sub_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection12: ; O0-NEXT: lock subb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_sub_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection12: ; O1-NEXT: lock subb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_sub_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection12: ; O2-NEXT: lock subb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_sub_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection12: ; O3-NEXT: lock subb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i8 42 monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_and_monotonic(ptr %a) { ; O0-LABEL: atomic8_and_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection13: ; O0-NEXT: lock andb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_and_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection13: ; O1-NEXT: lock andb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_and_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection13: ; O2-NEXT: lock andb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_and_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection13: ; O3-NEXT: lock andb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i8 42 monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_or_monotonic(ptr %a) { ; O0-LABEL: atomic8_or_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection14: ; O0-NEXT: lock orb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_or_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection14: ; O1-NEXT: lock orb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_or_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection14: ; O2-NEXT: lock orb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_or_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection14: ; O3-NEXT: lock orb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i8 42 monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xor_monotonic(ptr %a) { ; O0-LABEL: atomic8_xor_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection15: ; O0-NEXT: lock xorb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xor_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection15: ; O1-NEXT: lock xorb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xor_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection15: ; O2-NEXT: lock xorb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xor_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection15: ; O3-NEXT: lock xorb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i8 42 monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_nand_monotonic(ptr %a) { ; O0-LABEL: atomic8_nand_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection16: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .LBB16_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movb %al, %dl ; O0-NEXT: .Lpcsection17: ; O0-NEXT: notb %dl ; O0-NEXT: .Lpcsection18: ; O0-NEXT: orb $-43, %dl ; O0-NEXT: .Lpcsection19: ; O0-NEXT: lock cmpxchgb %dl, (%rcx) ; O0-NEXT: .Lpcsection20: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection21: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .Lpcsection22: ; O0-NEXT: jne .LBB16_2 ; O0-NEXT: jmp .LBB16_1 ; O0-NEXT: .LBB16_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_nand_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection16: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB16_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection17: ; O1-NEXT: notb %cl ; O1-NEXT: .Lpcsection18: ; O1-NEXT: orb $-43, %cl ; O1-NEXT: .Lpcsection19: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection20: ; O1-NEXT: jne .LBB16_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_nand_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection16: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB16_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection17: ; O2-NEXT: notb %cl ; O2-NEXT: .Lpcsection18: ; O2-NEXT: orb $-43, %cl ; O2-NEXT: .Lpcsection19: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection20: ; O2-NEXT: jne .LBB16_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_nand_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection16: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB16_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection17: ; O3-NEXT: notb %cl ; O3-NEXT: .Lpcsection18: ; O3-NEXT: orb $-43, %cl ; O3-NEXT: .Lpcsection19: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection20: ; O3-NEXT: jne .LBB16_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i8 42 monotonic, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xchg_acquire(ptr %a) { ; O0-LABEL: atomic8_xchg_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: .Lpcsection23: ; O0-NEXT: xchgb %al, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xchg_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection21: ; O1-NEXT: xchgb %al, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xchg_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection21: ; O2-NEXT: xchgb %al, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xchg_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection21: ; O3-NEXT: xchgb %al, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i8 42 acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_add_acquire(ptr %a) { ; O0-LABEL: atomic8_add_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection24: ; O0-NEXT: lock addb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_add_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection22: ; O1-NEXT: lock addb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_add_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection22: ; O2-NEXT: lock addb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_add_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection22: ; O3-NEXT: lock addb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i8 42 acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_sub_acquire(ptr %a) { ; O0-LABEL: atomic8_sub_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection25: ; O0-NEXT: lock subb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_sub_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection23: ; O1-NEXT: lock subb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_sub_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection23: ; O2-NEXT: lock subb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_sub_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection23: ; O3-NEXT: lock subb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i8 42 acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_and_acquire(ptr %a) { ; O0-LABEL: atomic8_and_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection26: ; O0-NEXT: lock andb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_and_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection24: ; O1-NEXT: lock andb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_and_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection24: ; O2-NEXT: lock andb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_and_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection24: ; O3-NEXT: lock andb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i8 42 acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_or_acquire(ptr %a) { ; O0-LABEL: atomic8_or_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection27: ; O0-NEXT: lock orb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_or_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection25: ; O1-NEXT: lock orb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_or_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection25: ; O2-NEXT: lock orb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_or_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection25: ; O3-NEXT: lock orb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i8 42 acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xor_acquire(ptr %a) { ; O0-LABEL: atomic8_xor_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection28: ; O0-NEXT: lock xorb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xor_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection26: ; O1-NEXT: lock xorb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xor_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection26: ; O2-NEXT: lock xorb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xor_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection26: ; O3-NEXT: lock xorb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i8 42 acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_nand_acquire(ptr %a) { ; O0-LABEL: atomic8_nand_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection29: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .LBB23_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movb %al, %dl ; O0-NEXT: .Lpcsection30: ; O0-NEXT: notb %dl ; O0-NEXT: .Lpcsection31: ; O0-NEXT: orb $-43, %dl ; O0-NEXT: .Lpcsection32: ; O0-NEXT: lock cmpxchgb %dl, (%rcx) ; O0-NEXT: .Lpcsection33: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection34: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .Lpcsection35: ; O0-NEXT: jne .LBB23_2 ; O0-NEXT: jmp .LBB23_1 ; O0-NEXT: .LBB23_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_nand_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection27: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB23_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection28: ; O1-NEXT: notb %cl ; O1-NEXT: .Lpcsection29: ; O1-NEXT: orb $-43, %cl ; O1-NEXT: .Lpcsection30: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection31: ; O1-NEXT: jne .LBB23_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_nand_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection27: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB23_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection28: ; O2-NEXT: notb %cl ; O2-NEXT: .Lpcsection29: ; O2-NEXT: orb $-43, %cl ; O2-NEXT: .Lpcsection30: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection31: ; O2-NEXT: jne .LBB23_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_nand_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection27: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB23_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection28: ; O3-NEXT: notb %cl ; O3-NEXT: .Lpcsection29: ; O3-NEXT: orb $-43, %cl ; O3-NEXT: .Lpcsection30: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection31: ; O3-NEXT: jne .LBB23_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i8 42 acquire, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xchg_release(ptr %a) { ; O0-LABEL: atomic8_xchg_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: .Lpcsection36: ; O0-NEXT: xchgb %al, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xchg_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection32: ; O1-NEXT: xchgb %al, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xchg_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection32: ; O2-NEXT: xchgb %al, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xchg_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection32: ; O3-NEXT: xchgb %al, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i8 42 release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_add_release(ptr %a) { ; O0-LABEL: atomic8_add_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection37: ; O0-NEXT: lock addb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_add_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection33: ; O1-NEXT: lock addb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_add_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection33: ; O2-NEXT: lock addb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_add_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection33: ; O3-NEXT: lock addb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i8 42 release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_sub_release(ptr %a) { ; O0-LABEL: atomic8_sub_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection38: ; O0-NEXT: lock subb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_sub_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection34: ; O1-NEXT: lock subb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_sub_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection34: ; O2-NEXT: lock subb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_sub_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection34: ; O3-NEXT: lock subb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i8 42 release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_and_release(ptr %a) { ; O0-LABEL: atomic8_and_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection39: ; O0-NEXT: lock andb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_and_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection35: ; O1-NEXT: lock andb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_and_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection35: ; O2-NEXT: lock andb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_and_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection35: ; O3-NEXT: lock andb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i8 42 release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_or_release(ptr %a) { ; O0-LABEL: atomic8_or_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection40: ; O0-NEXT: lock orb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_or_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection36: ; O1-NEXT: lock orb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_or_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection36: ; O2-NEXT: lock orb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_or_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection36: ; O3-NEXT: lock orb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i8 42 release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xor_release(ptr %a) { ; O0-LABEL: atomic8_xor_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection41: ; O0-NEXT: lock xorb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xor_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection37: ; O1-NEXT: lock xorb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xor_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection37: ; O2-NEXT: lock xorb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xor_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection37: ; O3-NEXT: lock xorb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i8 42 release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_nand_release(ptr %a) { ; O0-LABEL: atomic8_nand_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection42: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .LBB30_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movb %al, %dl ; O0-NEXT: .Lpcsection43: ; O0-NEXT: notb %dl ; O0-NEXT: .Lpcsection44: ; O0-NEXT: orb $-43, %dl ; O0-NEXT: .Lpcsection45: ; O0-NEXT: lock cmpxchgb %dl, (%rcx) ; O0-NEXT: .Lpcsection46: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection47: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .Lpcsection48: ; O0-NEXT: jne .LBB30_2 ; O0-NEXT: jmp .LBB30_1 ; O0-NEXT: .LBB30_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_nand_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection38: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB30_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection39: ; O1-NEXT: notb %cl ; O1-NEXT: .Lpcsection40: ; O1-NEXT: orb $-43, %cl ; O1-NEXT: .Lpcsection41: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection42: ; O1-NEXT: jne .LBB30_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_nand_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection38: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB30_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection39: ; O2-NEXT: notb %cl ; O2-NEXT: .Lpcsection40: ; O2-NEXT: orb $-43, %cl ; O2-NEXT: .Lpcsection41: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection42: ; O2-NEXT: jne .LBB30_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_nand_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection38: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB30_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection39: ; O3-NEXT: notb %cl ; O3-NEXT: .Lpcsection40: ; O3-NEXT: orb $-43, %cl ; O3-NEXT: .Lpcsection41: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection42: ; O3-NEXT: jne .LBB30_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i8 42 release, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xchg_acq_rel(ptr %a) { ; O0-LABEL: atomic8_xchg_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: .Lpcsection49: ; O0-NEXT: xchgb %al, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xchg_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection43: ; O1-NEXT: xchgb %al, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xchg_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection43: ; O2-NEXT: xchgb %al, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xchg_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection43: ; O3-NEXT: xchgb %al, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i8 42 acq_rel, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_add_acq_rel(ptr %a) { ; O0-LABEL: atomic8_add_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection50: ; O0-NEXT: lock addb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_add_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection44: ; O1-NEXT: lock addb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_add_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection44: ; O2-NEXT: lock addb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_add_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection44: ; O3-NEXT: lock addb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i8 42 acq_rel, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_sub_acq_rel(ptr %a) { ; O0-LABEL: atomic8_sub_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection51: ; O0-NEXT: lock subb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_sub_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection45: ; O1-NEXT: lock subb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_sub_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection45: ; O2-NEXT: lock subb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_sub_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection45: ; O3-NEXT: lock subb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i8 42 acq_rel, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_and_acq_rel(ptr %a) { ; O0-LABEL: atomic8_and_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection52: ; O0-NEXT: lock andb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_and_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection46: ; O1-NEXT: lock andb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_and_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection46: ; O2-NEXT: lock andb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_and_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection46: ; O3-NEXT: lock andb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i8 42 acq_rel, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_or_acq_rel(ptr %a) { ; O0-LABEL: atomic8_or_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection53: ; O0-NEXT: lock orb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_or_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection47: ; O1-NEXT: lock orb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_or_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection47: ; O2-NEXT: lock orb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_or_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection47: ; O3-NEXT: lock orb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i8 42 acq_rel, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xor_acq_rel(ptr %a) { ; O0-LABEL: atomic8_xor_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection54: ; O0-NEXT: lock xorb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xor_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection48: ; O1-NEXT: lock xorb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xor_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection48: ; O2-NEXT: lock xorb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xor_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection48: ; O3-NEXT: lock xorb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i8 42 acq_rel, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_nand_acq_rel(ptr %a) { ; O0-LABEL: atomic8_nand_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection55: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .LBB37_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movb %al, %dl ; O0-NEXT: .Lpcsection56: ; O0-NEXT: notb %dl ; O0-NEXT: .Lpcsection57: ; O0-NEXT: orb $-43, %dl ; O0-NEXT: .Lpcsection58: ; O0-NEXT: lock cmpxchgb %dl, (%rcx) ; O0-NEXT: .Lpcsection59: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection60: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .Lpcsection61: ; O0-NEXT: jne .LBB37_2 ; O0-NEXT: jmp .LBB37_1 ; O0-NEXT: .LBB37_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_nand_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection49: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB37_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection50: ; O1-NEXT: notb %cl ; O1-NEXT: .Lpcsection51: ; O1-NEXT: orb $-43, %cl ; O1-NEXT: .Lpcsection52: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection53: ; O1-NEXT: jne .LBB37_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_nand_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection49: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB37_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection50: ; O2-NEXT: notb %cl ; O2-NEXT: .Lpcsection51: ; O2-NEXT: orb $-43, %cl ; O2-NEXT: .Lpcsection52: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection53: ; O2-NEXT: jne .LBB37_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_nand_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection49: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB37_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection50: ; O3-NEXT: notb %cl ; O3-NEXT: .Lpcsection51: ; O3-NEXT: orb $-43, %cl ; O3-NEXT: .Lpcsection52: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection53: ; O3-NEXT: jne .LBB37_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i8 42 acq_rel, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xchg_seq_cst(ptr %a) { ; O0-LABEL: atomic8_xchg_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: .Lpcsection62: ; O0-NEXT: xchgb %al, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xchg_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection54: ; O1-NEXT: xchgb %al, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xchg_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection54: ; O2-NEXT: xchgb %al, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xchg_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection54: ; O3-NEXT: xchgb %al, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i8 42 seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_add_seq_cst(ptr %a) { ; O0-LABEL: atomic8_add_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection63: ; O0-NEXT: lock addb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_add_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection55: ; O1-NEXT: lock addb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_add_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection55: ; O2-NEXT: lock addb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_add_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection55: ; O3-NEXT: lock addb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i8 42 seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_sub_seq_cst(ptr %a) { ; O0-LABEL: atomic8_sub_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection64: ; O0-NEXT: lock subb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_sub_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection56: ; O1-NEXT: lock subb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_sub_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection56: ; O2-NEXT: lock subb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_sub_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection56: ; O3-NEXT: lock subb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i8 42 seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_and_seq_cst(ptr %a) { ; O0-LABEL: atomic8_and_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection65: ; O0-NEXT: lock andb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_and_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection57: ; O1-NEXT: lock andb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_and_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection57: ; O2-NEXT: lock andb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_and_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection57: ; O3-NEXT: lock andb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i8 42 seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_or_seq_cst(ptr %a) { ; O0-LABEL: atomic8_or_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection66: ; O0-NEXT: lock orb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_or_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection58: ; O1-NEXT: lock orb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_or_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection58: ; O2-NEXT: lock orb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_or_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection58: ; O3-NEXT: lock orb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i8 42 seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_xor_seq_cst(ptr %a) { ; O0-LABEL: atomic8_xor_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection67: ; O0-NEXT: lock xorb $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_xor_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection59: ; O1-NEXT: lock xorb $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_xor_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection59: ; O2-NEXT: lock xorb $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_xor_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection59: ; O3-NEXT: lock xorb $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i8 42 seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_nand_seq_cst(ptr %a) { ; O0-LABEL: atomic8_nand_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection68: ; O0-NEXT: movb (%rdi), %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .LBB44_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movb %al, %dl ; O0-NEXT: .Lpcsection69: ; O0-NEXT: notb %dl ; O0-NEXT: .Lpcsection70: ; O0-NEXT: orb $-43, %dl ; O0-NEXT: .Lpcsection71: ; O0-NEXT: lock cmpxchgb %dl, (%rcx) ; O0-NEXT: .Lpcsection72: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection73: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: .Lpcsection74: ; O0-NEXT: jne .LBB44_2 ; O0-NEXT: jmp .LBB44_1 ; O0-NEXT: .LBB44_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_nand_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection60: ; O1-NEXT: movzbl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB44_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection61: ; O1-NEXT: notb %cl ; O1-NEXT: .Lpcsection62: ; O1-NEXT: orb $-43, %cl ; O1-NEXT: .Lpcsection63: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection64: ; O1-NEXT: jne .LBB44_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_nand_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection60: ; O2-NEXT: movzbl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB44_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection61: ; O2-NEXT: notb %cl ; O2-NEXT: .Lpcsection62: ; O2-NEXT: orb $-43, %cl ; O2-NEXT: .Lpcsection63: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection64: ; O2-NEXT: jne .LBB44_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_nand_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection60: ; O3-NEXT: movzbl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB44_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection61: ; O3-NEXT: notb %cl ; O3-NEXT: .Lpcsection62: ; O3-NEXT: orb $-43, %cl ; O3-NEXT: .Lpcsection63: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection64: ; O3-NEXT: jne .LBB44_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i8 42 seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_cas_monotonic(ptr %a) { ; O0-LABEL: atomic8_cas_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: movb $1, %cl ; O0-NEXT: .Lpcsection75: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection76: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection77: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection78: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection79: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_cas_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $1, %cl ; O1-NEXT: .Lpcsection65: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection66: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection67: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection68: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection69: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection70: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_cas_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $1, %cl ; O2-NEXT: .Lpcsection65: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection66: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection67: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection68: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection69: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection70: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_cas_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $1, %cl ; O3-NEXT: .Lpcsection65: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection66: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection67: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection68: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection69: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection70: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i8 42, i8 1 monotonic monotonic, align 1, !pcsections !0 %y = cmpxchg ptr %a, i8 42, i8 1 monotonic acquire, align 1, !pcsections !0 %z = cmpxchg ptr %a, i8 42, i8 1 monotonic seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_cas_acquire(ptr %a) { ; O0-LABEL: atomic8_cas_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: movb $1, %cl ; O0-NEXT: .Lpcsection80: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection81: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection82: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection83: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection84: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_cas_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $1, %cl ; O1-NEXT: .Lpcsection71: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection72: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection73: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection74: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection75: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection76: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_cas_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $1, %cl ; O2-NEXT: .Lpcsection71: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection72: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection73: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection74: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection75: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection76: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_cas_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $1, %cl ; O3-NEXT: .Lpcsection71: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection72: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection73: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection74: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection75: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection76: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i8 42, i8 1 acquire monotonic, align 1, !pcsections !0 %y = cmpxchg ptr %a, i8 42, i8 1 acquire acquire, align 1, !pcsections !0 %z = cmpxchg ptr %a, i8 42, i8 1 acquire seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_cas_release(ptr %a) { ; O0-LABEL: atomic8_cas_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: movb $1, %cl ; O0-NEXT: .Lpcsection85: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection86: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection87: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection88: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection89: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_cas_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $1, %cl ; O1-NEXT: .Lpcsection77: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection78: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection79: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection80: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection81: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection82: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_cas_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $1, %cl ; O2-NEXT: .Lpcsection77: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection78: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection79: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection80: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection81: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection82: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_cas_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $1, %cl ; O3-NEXT: .Lpcsection77: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection78: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection79: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection80: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection81: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection82: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i8 42, i8 1 release monotonic, align 1, !pcsections !0 %y = cmpxchg ptr %a, i8 42, i8 1 release acquire, align 1, !pcsections !0 %z = cmpxchg ptr %a, i8 42, i8 1 release seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_cas_acq_rel(ptr %a) { ; O0-LABEL: atomic8_cas_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: movb $1, %cl ; O0-NEXT: .Lpcsection90: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection91: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection92: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection93: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection94: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_cas_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $1, %cl ; O1-NEXT: .Lpcsection83: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection84: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection85: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection86: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection87: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection88: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_cas_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $1, %cl ; O2-NEXT: .Lpcsection83: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection84: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection85: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection86: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection87: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection88: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_cas_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $1, %cl ; O3-NEXT: .Lpcsection83: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection84: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection85: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection86: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection87: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection88: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i8 42, i8 1 acq_rel monotonic, align 1, !pcsections !0 %y = cmpxchg ptr %a, i8 42, i8 1 acq_rel acquire, align 1, !pcsections !0 %z = cmpxchg ptr %a, i8 42, i8 1 acq_rel seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic8_cas_seq_cst(ptr %a) { ; O0-LABEL: atomic8_cas_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movb $42, %al ; O0-NEXT: movb %al, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill ; O0-NEXT: movb $1, %cl ; O0-NEXT: .Lpcsection95: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection96: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection97: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: .Lpcsection98: ; O0-NEXT: # kill: def $dl killed $al ; O0-NEXT: movb {{[-0-9]+}}(%r{{[sb]}}p), %al # 1-byte Reload ; O0-NEXT: .Lpcsection99: ; O0-NEXT: lock cmpxchgb %cl, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic8_cas_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movb $1, %cl ; O1-NEXT: .Lpcsection89: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection90: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection91: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection92: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: .Lpcsection93: ; O1-NEXT: movb $42, %al ; O1-NEXT: .Lpcsection94: ; O1-NEXT: lock cmpxchgb %cl, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic8_cas_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movb $1, %cl ; O2-NEXT: .Lpcsection89: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection90: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection91: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection92: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: .Lpcsection93: ; O2-NEXT: movb $42, %al ; O2-NEXT: .Lpcsection94: ; O2-NEXT: lock cmpxchgb %cl, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic8_cas_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movb $1, %cl ; O3-NEXT: .Lpcsection89: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection90: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection91: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection92: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: .Lpcsection93: ; O3-NEXT: movb $42, %al ; O3-NEXT: .Lpcsection94: ; O3-NEXT: lock cmpxchgb %cl, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i8 42, i8 1 seq_cst monotonic, align 1, !pcsections !0 %y = cmpxchg ptr %a, i8 42, i8 1 seq_cst acquire, align 1, !pcsections !0 %z = cmpxchg ptr %a, i8 42, i8 1 seq_cst seq_cst, align 1, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define i16 @atomic16_load_unordered(ptr %a) { ; O0-LABEL: atomic16_load_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection100: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_load_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection95: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_load_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection95: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_load_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection95: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i16, ptr %a unordered, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i16 %x } define i16 @atomic16_load_monotonic(ptr %a) { ; O0-LABEL: atomic16_load_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection101: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_load_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection96: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_load_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection96: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_load_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection96: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i16, ptr %a monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i16 %x } define i16 @atomic16_load_acquire(ptr %a) { ; O0-LABEL: atomic16_load_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection102: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_load_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection97: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_load_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection97: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_load_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection97: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i16, ptr %a acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i16 %x } define i16 @atomic16_load_seq_cst(ptr %a) { ; O0-LABEL: atomic16_load_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection103: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_load_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection98: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_load_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection98: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_load_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection98: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i16, ptr %a seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i16 %x } define void @atomic16_store_unordered(ptr %a) { ; O0-LABEL: atomic16_store_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection104: ; O0-NEXT: movw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_store_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection99: ; O1-NEXT: movw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_store_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection99: ; O2-NEXT: movw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_store_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection99: ; O3-NEXT: movw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i16 42, ptr %a unordered, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_store_monotonic(ptr %a) { ; O0-LABEL: atomic16_store_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection105: ; O0-NEXT: movw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_store_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection100: ; O1-NEXT: movw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_store_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection100: ; O2-NEXT: movw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_store_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection100: ; O3-NEXT: movw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i16 42, ptr %a monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_store_release(ptr %a) { ; O0-LABEL: atomic16_store_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection106: ; O0-NEXT: movw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_store_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection101: ; O1-NEXT: movw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_store_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection101: ; O2-NEXT: movw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_store_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection101: ; O3-NEXT: movw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i16 42, ptr %a release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_store_seq_cst(ptr %a) { ; O0-LABEL: atomic16_store_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: .Lpcsection107: ; O0-NEXT: xchgw %ax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_store_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection102: ; O1-NEXT: xchgw %ax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_store_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection102: ; O2-NEXT: xchgw %ax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_store_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection102: ; O3-NEXT: xchgw %ax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i16 42, ptr %a seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xchg_monotonic(ptr %a) { ; O0-LABEL: atomic16_xchg_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: .Lpcsection108: ; O0-NEXT: xchgw %ax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xchg_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection103: ; O1-NEXT: xchgw %ax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xchg_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection103: ; O2-NEXT: xchgw %ax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xchg_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection103: ; O3-NEXT: xchgw %ax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i16 42 monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_add_monotonic(ptr %a) { ; O0-LABEL: atomic16_add_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection109: ; O0-NEXT: lock addw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_add_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection104: ; O1-NEXT: lock addw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_add_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection104: ; O2-NEXT: lock addw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_add_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection104: ; O3-NEXT: lock addw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i16 42 monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_sub_monotonic(ptr %a) { ; O0-LABEL: atomic16_sub_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection110: ; O0-NEXT: lock subw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_sub_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection105: ; O1-NEXT: lock subw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_sub_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection105: ; O2-NEXT: lock subw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_sub_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection105: ; O3-NEXT: lock subw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i16 42 monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_and_monotonic(ptr %a) { ; O0-LABEL: atomic16_and_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection111: ; O0-NEXT: lock andw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_and_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection106: ; O1-NEXT: lock andw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_and_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection106: ; O2-NEXT: lock andw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_and_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection106: ; O3-NEXT: lock andw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i16 42 monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_or_monotonic(ptr %a) { ; O0-LABEL: atomic16_or_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection112: ; O0-NEXT: lock orw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_or_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection107: ; O1-NEXT: lock orw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_or_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection107: ; O2-NEXT: lock orw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_or_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection107: ; O3-NEXT: lock orw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i16 42 monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xor_monotonic(ptr %a) { ; O0-LABEL: atomic16_xor_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection113: ; O0-NEXT: lock xorw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xor_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection108: ; O1-NEXT: lock xorw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xor_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection108: ; O2-NEXT: lock xorw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xor_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection108: ; O3-NEXT: lock xorw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i16 42 monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_nand_monotonic(ptr %a) { ; O0-LABEL: atomic16_nand_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection114: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .LBB64_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: .Lpcsection115: ; O0-NEXT: # implicit-def: $edx ; O0-NEXT: movw %ax, %dx ; O0-NEXT: .Lpcsection116: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection117: ; O0-NEXT: orl $65493, %edx # imm = 0xFFD5 ; O0-NEXT: .Lpcsection118: ; O0-NEXT: # kill: def $dx killed $dx killed $edx ; O0-NEXT: .Lpcsection119: ; O0-NEXT: lock cmpxchgw %dx, (%rcx) ; O0-NEXT: .Lpcsection120: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection121: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .Lpcsection122: ; O0-NEXT: jne .LBB64_2 ; O0-NEXT: jmp .LBB64_1 ; O0-NEXT: .LBB64_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_nand_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection109: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB64_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection110: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection111: ; O1-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O1-NEXT: .Lpcsection112: ; O1-NEXT: # kill: def $ax killed $ax killed $eax ; O1-NEXT: .Lpcsection113: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: .Lpcsection114: ; O1-NEXT: # kill: def $ax killed $ax def $eax ; O1-NEXT: .Lpcsection115: ; O1-NEXT: jne .LBB64_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_nand_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection109: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB64_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection110: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection111: ; O2-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O2-NEXT: .Lpcsection112: ; O2-NEXT: # kill: def $ax killed $ax killed $eax ; O2-NEXT: .Lpcsection113: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: .Lpcsection114: ; O2-NEXT: # kill: def $ax killed $ax def $eax ; O2-NEXT: .Lpcsection115: ; O2-NEXT: jne .LBB64_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_nand_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection109: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB64_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection110: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection111: ; O3-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O3-NEXT: .Lpcsection112: ; O3-NEXT: # kill: def $ax killed $ax killed $eax ; O3-NEXT: .Lpcsection113: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: .Lpcsection114: ; O3-NEXT: # kill: def $ax killed $ax def $eax ; O3-NEXT: .Lpcsection115: ; O3-NEXT: jne .LBB64_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i16 42 monotonic, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xchg_acquire(ptr %a) { ; O0-LABEL: atomic16_xchg_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: .Lpcsection123: ; O0-NEXT: xchgw %ax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xchg_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection116: ; O1-NEXT: xchgw %ax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xchg_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection116: ; O2-NEXT: xchgw %ax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xchg_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection116: ; O3-NEXT: xchgw %ax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i16 42 acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_add_acquire(ptr %a) { ; O0-LABEL: atomic16_add_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection124: ; O0-NEXT: lock addw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_add_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection117: ; O1-NEXT: lock addw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_add_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection117: ; O2-NEXT: lock addw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_add_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection117: ; O3-NEXT: lock addw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i16 42 acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_sub_acquire(ptr %a) { ; O0-LABEL: atomic16_sub_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection125: ; O0-NEXT: lock subw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_sub_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection118: ; O1-NEXT: lock subw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_sub_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection118: ; O2-NEXT: lock subw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_sub_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection118: ; O3-NEXT: lock subw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i16 42 acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_and_acquire(ptr %a) { ; O0-LABEL: atomic16_and_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection126: ; O0-NEXT: lock andw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_and_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection119: ; O1-NEXT: lock andw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_and_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection119: ; O2-NEXT: lock andw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_and_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection119: ; O3-NEXT: lock andw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i16 42 acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_or_acquire(ptr %a) { ; O0-LABEL: atomic16_or_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection127: ; O0-NEXT: lock orw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_or_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection120: ; O1-NEXT: lock orw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_or_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection120: ; O2-NEXT: lock orw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_or_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection120: ; O3-NEXT: lock orw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i16 42 acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xor_acquire(ptr %a) { ; O0-LABEL: atomic16_xor_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection128: ; O0-NEXT: lock xorw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xor_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection121: ; O1-NEXT: lock xorw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xor_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection121: ; O2-NEXT: lock xorw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xor_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection121: ; O3-NEXT: lock xorw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i16 42 acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_nand_acquire(ptr %a) { ; O0-LABEL: atomic16_nand_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection129: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .LBB71_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: .Lpcsection130: ; O0-NEXT: # implicit-def: $edx ; O0-NEXT: movw %ax, %dx ; O0-NEXT: .Lpcsection131: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection132: ; O0-NEXT: orl $65493, %edx # imm = 0xFFD5 ; O0-NEXT: .Lpcsection133: ; O0-NEXT: # kill: def $dx killed $dx killed $edx ; O0-NEXT: .Lpcsection134: ; O0-NEXT: lock cmpxchgw %dx, (%rcx) ; O0-NEXT: .Lpcsection135: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection136: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .Lpcsection137: ; O0-NEXT: jne .LBB71_2 ; O0-NEXT: jmp .LBB71_1 ; O0-NEXT: .LBB71_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_nand_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection122: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB71_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection123: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection124: ; O1-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O1-NEXT: .Lpcsection125: ; O1-NEXT: # kill: def $ax killed $ax killed $eax ; O1-NEXT: .Lpcsection126: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: .Lpcsection127: ; O1-NEXT: # kill: def $ax killed $ax def $eax ; O1-NEXT: .Lpcsection128: ; O1-NEXT: jne .LBB71_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_nand_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection122: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB71_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection123: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection124: ; O2-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O2-NEXT: .Lpcsection125: ; O2-NEXT: # kill: def $ax killed $ax killed $eax ; O2-NEXT: .Lpcsection126: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: .Lpcsection127: ; O2-NEXT: # kill: def $ax killed $ax def $eax ; O2-NEXT: .Lpcsection128: ; O2-NEXT: jne .LBB71_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_nand_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection122: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB71_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection123: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection124: ; O3-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O3-NEXT: .Lpcsection125: ; O3-NEXT: # kill: def $ax killed $ax killed $eax ; O3-NEXT: .Lpcsection126: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: .Lpcsection127: ; O3-NEXT: # kill: def $ax killed $ax def $eax ; O3-NEXT: .Lpcsection128: ; O3-NEXT: jne .LBB71_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i16 42 acquire, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xchg_release(ptr %a) { ; O0-LABEL: atomic16_xchg_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: .Lpcsection138: ; O0-NEXT: xchgw %ax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xchg_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection129: ; O1-NEXT: xchgw %ax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xchg_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection129: ; O2-NEXT: xchgw %ax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xchg_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection129: ; O3-NEXT: xchgw %ax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i16 42 release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_add_release(ptr %a) { ; O0-LABEL: atomic16_add_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection139: ; O0-NEXT: lock addw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_add_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection130: ; O1-NEXT: lock addw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_add_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection130: ; O2-NEXT: lock addw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_add_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection130: ; O3-NEXT: lock addw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i16 42 release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_sub_release(ptr %a) { ; O0-LABEL: atomic16_sub_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection140: ; O0-NEXT: lock subw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_sub_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection131: ; O1-NEXT: lock subw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_sub_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection131: ; O2-NEXT: lock subw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_sub_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection131: ; O3-NEXT: lock subw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i16 42 release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_and_release(ptr %a) { ; O0-LABEL: atomic16_and_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection141: ; O0-NEXT: lock andw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_and_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection132: ; O1-NEXT: lock andw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_and_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection132: ; O2-NEXT: lock andw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_and_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection132: ; O3-NEXT: lock andw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i16 42 release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_or_release(ptr %a) { ; O0-LABEL: atomic16_or_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection142: ; O0-NEXT: lock orw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_or_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection133: ; O1-NEXT: lock orw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_or_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection133: ; O2-NEXT: lock orw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_or_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection133: ; O3-NEXT: lock orw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i16 42 release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xor_release(ptr %a) { ; O0-LABEL: atomic16_xor_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection143: ; O0-NEXT: lock xorw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xor_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection134: ; O1-NEXT: lock xorw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xor_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection134: ; O2-NEXT: lock xorw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xor_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection134: ; O3-NEXT: lock xorw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i16 42 release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_nand_release(ptr %a) { ; O0-LABEL: atomic16_nand_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection144: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .LBB78_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: .Lpcsection145: ; O0-NEXT: # implicit-def: $edx ; O0-NEXT: movw %ax, %dx ; O0-NEXT: .Lpcsection146: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection147: ; O0-NEXT: orl $65493, %edx # imm = 0xFFD5 ; O0-NEXT: .Lpcsection148: ; O0-NEXT: # kill: def $dx killed $dx killed $edx ; O0-NEXT: .Lpcsection149: ; O0-NEXT: lock cmpxchgw %dx, (%rcx) ; O0-NEXT: .Lpcsection150: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection151: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .Lpcsection152: ; O0-NEXT: jne .LBB78_2 ; O0-NEXT: jmp .LBB78_1 ; O0-NEXT: .LBB78_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_nand_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection135: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB78_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection136: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection137: ; O1-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O1-NEXT: .Lpcsection138: ; O1-NEXT: # kill: def $ax killed $ax killed $eax ; O1-NEXT: .Lpcsection139: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: .Lpcsection140: ; O1-NEXT: # kill: def $ax killed $ax def $eax ; O1-NEXT: .Lpcsection141: ; O1-NEXT: jne .LBB78_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_nand_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection135: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB78_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection136: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection137: ; O2-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O2-NEXT: .Lpcsection138: ; O2-NEXT: # kill: def $ax killed $ax killed $eax ; O2-NEXT: .Lpcsection139: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: .Lpcsection140: ; O2-NEXT: # kill: def $ax killed $ax def $eax ; O2-NEXT: .Lpcsection141: ; O2-NEXT: jne .LBB78_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_nand_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection135: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB78_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection136: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection137: ; O3-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O3-NEXT: .Lpcsection138: ; O3-NEXT: # kill: def $ax killed $ax killed $eax ; O3-NEXT: .Lpcsection139: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: .Lpcsection140: ; O3-NEXT: # kill: def $ax killed $ax def $eax ; O3-NEXT: .Lpcsection141: ; O3-NEXT: jne .LBB78_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i16 42 release, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xchg_acq_rel(ptr %a) { ; O0-LABEL: atomic16_xchg_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: .Lpcsection153: ; O0-NEXT: xchgw %ax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xchg_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection142: ; O1-NEXT: xchgw %ax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xchg_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection142: ; O2-NEXT: xchgw %ax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xchg_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection142: ; O3-NEXT: xchgw %ax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i16 42 acq_rel, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_add_acq_rel(ptr %a) { ; O0-LABEL: atomic16_add_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection154: ; O0-NEXT: lock addw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_add_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection143: ; O1-NEXT: lock addw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_add_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection143: ; O2-NEXT: lock addw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_add_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection143: ; O3-NEXT: lock addw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i16 42 acq_rel, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_sub_acq_rel(ptr %a) { ; O0-LABEL: atomic16_sub_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection155: ; O0-NEXT: lock subw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_sub_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection144: ; O1-NEXT: lock subw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_sub_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection144: ; O2-NEXT: lock subw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_sub_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection144: ; O3-NEXT: lock subw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i16 42 acq_rel, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_and_acq_rel(ptr %a) { ; O0-LABEL: atomic16_and_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection156: ; O0-NEXT: lock andw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_and_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection145: ; O1-NEXT: lock andw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_and_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection145: ; O2-NEXT: lock andw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_and_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection145: ; O3-NEXT: lock andw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i16 42 acq_rel, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_or_acq_rel(ptr %a) { ; O0-LABEL: atomic16_or_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection157: ; O0-NEXT: lock orw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_or_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection146: ; O1-NEXT: lock orw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_or_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection146: ; O2-NEXT: lock orw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_or_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection146: ; O3-NEXT: lock orw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i16 42 acq_rel, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xor_acq_rel(ptr %a) { ; O0-LABEL: atomic16_xor_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection158: ; O0-NEXT: lock xorw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xor_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection147: ; O1-NEXT: lock xorw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xor_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection147: ; O2-NEXT: lock xorw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xor_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection147: ; O3-NEXT: lock xorw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i16 42 acq_rel, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_nand_acq_rel(ptr %a) { ; O0-LABEL: atomic16_nand_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection159: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .LBB85_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: .Lpcsection160: ; O0-NEXT: # implicit-def: $edx ; O0-NEXT: movw %ax, %dx ; O0-NEXT: .Lpcsection161: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection162: ; O0-NEXT: orl $65493, %edx # imm = 0xFFD5 ; O0-NEXT: .Lpcsection163: ; O0-NEXT: # kill: def $dx killed $dx killed $edx ; O0-NEXT: .Lpcsection164: ; O0-NEXT: lock cmpxchgw %dx, (%rcx) ; O0-NEXT: .Lpcsection165: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection166: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .Lpcsection167: ; O0-NEXT: jne .LBB85_2 ; O0-NEXT: jmp .LBB85_1 ; O0-NEXT: .LBB85_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_nand_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection148: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB85_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection149: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection150: ; O1-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O1-NEXT: .Lpcsection151: ; O1-NEXT: # kill: def $ax killed $ax killed $eax ; O1-NEXT: .Lpcsection152: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: .Lpcsection153: ; O1-NEXT: # kill: def $ax killed $ax def $eax ; O1-NEXT: .Lpcsection154: ; O1-NEXT: jne .LBB85_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_nand_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection148: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB85_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection149: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection150: ; O2-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O2-NEXT: .Lpcsection151: ; O2-NEXT: # kill: def $ax killed $ax killed $eax ; O2-NEXT: .Lpcsection152: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: .Lpcsection153: ; O2-NEXT: # kill: def $ax killed $ax def $eax ; O2-NEXT: .Lpcsection154: ; O2-NEXT: jne .LBB85_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_nand_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection148: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB85_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection149: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection150: ; O3-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O3-NEXT: .Lpcsection151: ; O3-NEXT: # kill: def $ax killed $ax killed $eax ; O3-NEXT: .Lpcsection152: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: .Lpcsection153: ; O3-NEXT: # kill: def $ax killed $ax def $eax ; O3-NEXT: .Lpcsection154: ; O3-NEXT: jne .LBB85_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i16 42 acq_rel, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xchg_seq_cst(ptr %a) { ; O0-LABEL: atomic16_xchg_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: .Lpcsection168: ; O0-NEXT: xchgw %ax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xchg_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection155: ; O1-NEXT: xchgw %ax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xchg_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection155: ; O2-NEXT: xchgw %ax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xchg_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection155: ; O3-NEXT: xchgw %ax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i16 42 seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_add_seq_cst(ptr %a) { ; O0-LABEL: atomic16_add_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection169: ; O0-NEXT: lock addw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_add_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection156: ; O1-NEXT: lock addw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_add_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection156: ; O2-NEXT: lock addw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_add_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection156: ; O3-NEXT: lock addw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i16 42 seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_sub_seq_cst(ptr %a) { ; O0-LABEL: atomic16_sub_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection170: ; O0-NEXT: lock subw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_sub_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection157: ; O1-NEXT: lock subw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_sub_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection157: ; O2-NEXT: lock subw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_sub_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection157: ; O3-NEXT: lock subw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i16 42 seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_and_seq_cst(ptr %a) { ; O0-LABEL: atomic16_and_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection171: ; O0-NEXT: lock andw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_and_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection158: ; O1-NEXT: lock andw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_and_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection158: ; O2-NEXT: lock andw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_and_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection158: ; O3-NEXT: lock andw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i16 42 seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_or_seq_cst(ptr %a) { ; O0-LABEL: atomic16_or_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection172: ; O0-NEXT: lock orw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_or_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection159: ; O1-NEXT: lock orw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_or_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection159: ; O2-NEXT: lock orw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_or_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection159: ; O3-NEXT: lock orw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i16 42 seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_xor_seq_cst(ptr %a) { ; O0-LABEL: atomic16_xor_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection173: ; O0-NEXT: lock xorw $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_xor_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection160: ; O1-NEXT: lock xorw $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_xor_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection160: ; O2-NEXT: lock xorw $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_xor_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection160: ; O3-NEXT: lock xorw $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i16 42 seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_nand_seq_cst(ptr %a) { ; O0-LABEL: atomic16_nand_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection174: ; O0-NEXT: movw (%rdi), %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .LBB92_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: .Lpcsection175: ; O0-NEXT: # implicit-def: $edx ; O0-NEXT: movw %ax, %dx ; O0-NEXT: .Lpcsection176: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection177: ; O0-NEXT: orl $65493, %edx # imm = 0xFFD5 ; O0-NEXT: .Lpcsection178: ; O0-NEXT: # kill: def $dx killed $dx killed $edx ; O0-NEXT: .Lpcsection179: ; O0-NEXT: lock cmpxchgw %dx, (%rcx) ; O0-NEXT: .Lpcsection180: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection181: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: .Lpcsection182: ; O0-NEXT: jne .LBB92_2 ; O0-NEXT: jmp .LBB92_1 ; O0-NEXT: .LBB92_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_nand_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection161: ; O1-NEXT: movzwl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB92_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection162: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection163: ; O1-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O1-NEXT: .Lpcsection164: ; O1-NEXT: # kill: def $ax killed $ax killed $eax ; O1-NEXT: .Lpcsection165: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: .Lpcsection166: ; O1-NEXT: # kill: def $ax killed $ax def $eax ; O1-NEXT: .Lpcsection167: ; O1-NEXT: jne .LBB92_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_nand_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection161: ; O2-NEXT: movzwl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB92_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection162: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection163: ; O2-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O2-NEXT: .Lpcsection164: ; O2-NEXT: # kill: def $ax killed $ax killed $eax ; O2-NEXT: .Lpcsection165: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: .Lpcsection166: ; O2-NEXT: # kill: def $ax killed $ax def $eax ; O2-NEXT: .Lpcsection167: ; O2-NEXT: jne .LBB92_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_nand_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection161: ; O3-NEXT: movzwl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB92_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection162: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection163: ; O3-NEXT: orl $65493, %ecx # imm = 0xFFD5 ; O3-NEXT: .Lpcsection164: ; O3-NEXT: # kill: def $ax killed $ax killed $eax ; O3-NEXT: .Lpcsection165: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: .Lpcsection166: ; O3-NEXT: # kill: def $ax killed $ax def $eax ; O3-NEXT: .Lpcsection167: ; O3-NEXT: jne .LBB92_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i16 42 seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_cas_monotonic(ptr %a) { ; O0-LABEL: atomic16_cas_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: movw $1, %cx ; O0-NEXT: .Lpcsection183: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection184: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection185: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection186: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection187: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_cas_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $1, %cx ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection168: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection169: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection170: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_cas_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $1, %cx ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection168: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection169: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection170: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_cas_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $1, %cx ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection168: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection169: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection170: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i16 42, i16 1 monotonic monotonic, align 2, !pcsections !0 %y = cmpxchg ptr %a, i16 42, i16 1 monotonic acquire, align 2, !pcsections !0 %z = cmpxchg ptr %a, i16 42, i16 1 monotonic seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_cas_acquire(ptr %a) { ; O0-LABEL: atomic16_cas_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: movw $1, %cx ; O0-NEXT: .Lpcsection188: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection189: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection190: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection191: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection192: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_cas_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $1, %cx ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection171: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection172: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection173: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_cas_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $1, %cx ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection171: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection172: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection173: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_cas_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $1, %cx ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection171: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection172: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection173: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i16 42, i16 1 acquire monotonic, align 2, !pcsections !0 %y = cmpxchg ptr %a, i16 42, i16 1 acquire acquire, align 2, !pcsections !0 %z = cmpxchg ptr %a, i16 42, i16 1 acquire seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_cas_release(ptr %a) { ; O0-LABEL: atomic16_cas_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: movw $1, %cx ; O0-NEXT: .Lpcsection193: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection194: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection195: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection196: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection197: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_cas_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $1, %cx ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection174: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection175: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection176: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_cas_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $1, %cx ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection174: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection175: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection176: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_cas_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $1, %cx ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection174: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection175: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection176: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i16 42, i16 1 release monotonic, align 2, !pcsections !0 %y = cmpxchg ptr %a, i16 42, i16 1 release acquire, align 2, !pcsections !0 %z = cmpxchg ptr %a, i16 42, i16 1 release seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_cas_acq_rel(ptr %a) { ; O0-LABEL: atomic16_cas_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: movw $1, %cx ; O0-NEXT: .Lpcsection198: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection199: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection200: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection201: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection202: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_cas_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $1, %cx ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection177: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection178: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection179: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_cas_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $1, %cx ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection177: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection178: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection179: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_cas_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $1, %cx ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection177: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection178: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection179: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i16 42, i16 1 acq_rel monotonic, align 2, !pcsections !0 %y = cmpxchg ptr %a, i16 42, i16 1 acq_rel acquire, align 2, !pcsections !0 %z = cmpxchg ptr %a, i16 42, i16 1 acq_rel seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic16_cas_seq_cst(ptr %a) { ; O0-LABEL: atomic16_cas_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movw $42, %ax ; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill ; O0-NEXT: movw $1, %cx ; O0-NEXT: .Lpcsection203: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection204: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection205: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: .Lpcsection206: ; O0-NEXT: # kill: def $dx killed $ax ; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload ; O0-NEXT: .Lpcsection207: ; O0-NEXT: lock cmpxchgw %cx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic16_cas_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movw $1, %cx ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection180: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection181: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movw $42, %ax ; O1-NEXT: .Lpcsection182: ; O1-NEXT: lock cmpxchgw %cx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic16_cas_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movw $1, %cx ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection180: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection181: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movw $42, %ax ; O2-NEXT: .Lpcsection182: ; O2-NEXT: lock cmpxchgw %cx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic16_cas_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movw $1, %cx ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection180: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection181: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movw $42, %ax ; O3-NEXT: .Lpcsection182: ; O3-NEXT: lock cmpxchgw %cx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i16 42, i16 1 seq_cst monotonic, align 2, !pcsections !0 %y = cmpxchg ptr %a, i16 42, i16 1 seq_cst acquire, align 2, !pcsections !0 %z = cmpxchg ptr %a, i16 42, i16 1 seq_cst seq_cst, align 2, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define i32 @atomic32_load_unordered(ptr %a) { ; O0-LABEL: atomic32_load_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection208: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_load_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection183: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_load_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection183: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_load_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection183: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i32, ptr %a unordered, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i32 %x } define i32 @atomic32_load_monotonic(ptr %a) { ; O0-LABEL: atomic32_load_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection209: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_load_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection184: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_load_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection184: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_load_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection184: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i32, ptr %a monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i32 %x } define i32 @atomic32_load_acquire(ptr %a) { ; O0-LABEL: atomic32_load_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection210: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_load_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection185: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_load_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection185: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_load_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection185: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i32, ptr %a acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i32 %x } define i32 @atomic32_load_seq_cst(ptr %a) { ; O0-LABEL: atomic32_load_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection211: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_load_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection186: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_load_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection186: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_load_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection186: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i32, ptr %a seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i32 %x } define void @atomic32_store_unordered(ptr %a) { ; O0-LABEL: atomic32_store_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection212: ; O0-NEXT: movl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_store_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection187: ; O1-NEXT: movl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_store_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection187: ; O2-NEXT: movl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_store_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection187: ; O3-NEXT: movl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i32 42, ptr %a unordered, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_store_monotonic(ptr %a) { ; O0-LABEL: atomic32_store_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection213: ; O0-NEXT: movl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_store_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection188: ; O1-NEXT: movl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_store_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection188: ; O2-NEXT: movl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_store_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection188: ; O3-NEXT: movl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i32 42, ptr %a monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_store_release(ptr %a) { ; O0-LABEL: atomic32_store_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection214: ; O0-NEXT: movl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_store_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection189: ; O1-NEXT: movl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_store_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection189: ; O2-NEXT: movl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_store_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection189: ; O3-NEXT: movl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i32 42, ptr %a release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_store_seq_cst(ptr %a) { ; O0-LABEL: atomic32_store_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection215: ; O0-NEXT: xchgl %eax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_store_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection190: ; O1-NEXT: xchgl %eax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_store_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection190: ; O2-NEXT: xchgl %eax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_store_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection190: ; O3-NEXT: xchgl %eax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i32 42, ptr %a seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xchg_monotonic(ptr %a) { ; O0-LABEL: atomic32_xchg_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection216: ; O0-NEXT: xchgl %eax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xchg_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection191: ; O1-NEXT: xchgl %eax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xchg_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection191: ; O2-NEXT: xchgl %eax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xchg_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection191: ; O3-NEXT: xchgl %eax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i32 42 monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_add_monotonic(ptr %a) { ; O0-LABEL: atomic32_add_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection217: ; O0-NEXT: lock addl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_add_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection192: ; O1-NEXT: lock addl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_add_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection192: ; O2-NEXT: lock addl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_add_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection192: ; O3-NEXT: lock addl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i32 42 monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_sub_monotonic(ptr %a) { ; O0-LABEL: atomic32_sub_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection218: ; O0-NEXT: lock subl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_sub_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection193: ; O1-NEXT: lock subl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_sub_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection193: ; O2-NEXT: lock subl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_sub_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection193: ; O3-NEXT: lock subl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i32 42 monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_and_monotonic(ptr %a) { ; O0-LABEL: atomic32_and_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection219: ; O0-NEXT: lock andl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_and_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection194: ; O1-NEXT: lock andl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_and_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection194: ; O2-NEXT: lock andl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_and_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection194: ; O3-NEXT: lock andl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i32 42 monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_or_monotonic(ptr %a) { ; O0-LABEL: atomic32_or_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection220: ; O0-NEXT: lock orl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_or_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection195: ; O1-NEXT: lock orl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_or_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection195: ; O2-NEXT: lock orl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_or_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection195: ; O3-NEXT: lock orl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i32 42 monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xor_monotonic(ptr %a) { ; O0-LABEL: atomic32_xor_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection221: ; O0-NEXT: lock xorl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xor_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection196: ; O1-NEXT: lock xorl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xor_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection196: ; O2-NEXT: lock xorl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xor_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection196: ; O3-NEXT: lock xorl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i32 42 monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_nand_monotonic(ptr %a) { ; O0-LABEL: atomic32_nand_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection222: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .LBB112_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %edx ; O0-NEXT: .Lpcsection223: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection224: ; O0-NEXT: orl $-43, %edx ; O0-NEXT: .Lpcsection225: ; O0-NEXT: lock cmpxchgl %edx, (%rcx) ; O0-NEXT: .Lpcsection226: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection227: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .Lpcsection228: ; O0-NEXT: jne .LBB112_2 ; O0-NEXT: jmp .LBB112_1 ; O0-NEXT: .LBB112_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_nand_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection197: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB112_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection198: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection199: ; O1-NEXT: orl $-43, %ecx ; O1-NEXT: .Lpcsection200: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection201: ; O1-NEXT: jne .LBB112_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_nand_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection197: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB112_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection198: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection199: ; O2-NEXT: orl $-43, %ecx ; O2-NEXT: .Lpcsection200: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection201: ; O2-NEXT: jne .LBB112_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_nand_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection197: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB112_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection198: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection199: ; O3-NEXT: orl $-43, %ecx ; O3-NEXT: .Lpcsection200: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection201: ; O3-NEXT: jne .LBB112_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i32 42 monotonic, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xchg_acquire(ptr %a) { ; O0-LABEL: atomic32_xchg_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection229: ; O0-NEXT: xchgl %eax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xchg_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection202: ; O1-NEXT: xchgl %eax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xchg_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection202: ; O2-NEXT: xchgl %eax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xchg_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection202: ; O3-NEXT: xchgl %eax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i32 42 acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_add_acquire(ptr %a) { ; O0-LABEL: atomic32_add_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection230: ; O0-NEXT: lock addl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_add_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection203: ; O1-NEXT: lock addl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_add_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection203: ; O2-NEXT: lock addl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_add_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection203: ; O3-NEXT: lock addl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i32 42 acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_sub_acquire(ptr %a) { ; O0-LABEL: atomic32_sub_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection231: ; O0-NEXT: lock subl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_sub_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection204: ; O1-NEXT: lock subl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_sub_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection204: ; O2-NEXT: lock subl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_sub_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection204: ; O3-NEXT: lock subl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i32 42 acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_and_acquire(ptr %a) { ; O0-LABEL: atomic32_and_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection232: ; O0-NEXT: lock andl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_and_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection205: ; O1-NEXT: lock andl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_and_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection205: ; O2-NEXT: lock andl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_and_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection205: ; O3-NEXT: lock andl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i32 42 acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_or_acquire(ptr %a) { ; O0-LABEL: atomic32_or_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection233: ; O0-NEXT: lock orl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_or_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection206: ; O1-NEXT: lock orl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_or_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection206: ; O2-NEXT: lock orl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_or_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection206: ; O3-NEXT: lock orl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i32 42 acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xor_acquire(ptr %a) { ; O0-LABEL: atomic32_xor_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection234: ; O0-NEXT: lock xorl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xor_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection207: ; O1-NEXT: lock xorl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xor_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection207: ; O2-NEXT: lock xorl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xor_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection207: ; O3-NEXT: lock xorl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i32 42 acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_nand_acquire(ptr %a) { ; O0-LABEL: atomic32_nand_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection235: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .LBB119_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %edx ; O0-NEXT: .Lpcsection236: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection237: ; O0-NEXT: orl $-43, %edx ; O0-NEXT: .Lpcsection238: ; O0-NEXT: lock cmpxchgl %edx, (%rcx) ; O0-NEXT: .Lpcsection239: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection240: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .Lpcsection241: ; O0-NEXT: jne .LBB119_2 ; O0-NEXT: jmp .LBB119_1 ; O0-NEXT: .LBB119_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_nand_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection208: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB119_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection209: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection210: ; O1-NEXT: orl $-43, %ecx ; O1-NEXT: .Lpcsection211: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection212: ; O1-NEXT: jne .LBB119_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_nand_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection208: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB119_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection209: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection210: ; O2-NEXT: orl $-43, %ecx ; O2-NEXT: .Lpcsection211: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection212: ; O2-NEXT: jne .LBB119_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_nand_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection208: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB119_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection209: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection210: ; O3-NEXT: orl $-43, %ecx ; O3-NEXT: .Lpcsection211: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection212: ; O3-NEXT: jne .LBB119_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i32 42 acquire, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xchg_release(ptr %a) { ; O0-LABEL: atomic32_xchg_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection242: ; O0-NEXT: xchgl %eax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xchg_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection213: ; O1-NEXT: xchgl %eax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xchg_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection213: ; O2-NEXT: xchgl %eax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xchg_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection213: ; O3-NEXT: xchgl %eax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i32 42 release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_add_release(ptr %a) { ; O0-LABEL: atomic32_add_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection243: ; O0-NEXT: lock addl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_add_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection214: ; O1-NEXT: lock addl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_add_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection214: ; O2-NEXT: lock addl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_add_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection214: ; O3-NEXT: lock addl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i32 42 release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_sub_release(ptr %a) { ; O0-LABEL: atomic32_sub_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection244: ; O0-NEXT: lock subl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_sub_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection215: ; O1-NEXT: lock subl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_sub_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection215: ; O2-NEXT: lock subl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_sub_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection215: ; O3-NEXT: lock subl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i32 42 release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_and_release(ptr %a) { ; O0-LABEL: atomic32_and_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection245: ; O0-NEXT: lock andl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_and_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection216: ; O1-NEXT: lock andl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_and_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection216: ; O2-NEXT: lock andl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_and_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection216: ; O3-NEXT: lock andl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i32 42 release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_or_release(ptr %a) { ; O0-LABEL: atomic32_or_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection246: ; O0-NEXT: lock orl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_or_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection217: ; O1-NEXT: lock orl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_or_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection217: ; O2-NEXT: lock orl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_or_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection217: ; O3-NEXT: lock orl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i32 42 release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xor_release(ptr %a) { ; O0-LABEL: atomic32_xor_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection247: ; O0-NEXT: lock xorl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xor_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection218: ; O1-NEXT: lock xorl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xor_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection218: ; O2-NEXT: lock xorl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xor_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection218: ; O3-NEXT: lock xorl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i32 42 release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_nand_release(ptr %a) { ; O0-LABEL: atomic32_nand_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection248: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .LBB126_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %edx ; O0-NEXT: .Lpcsection249: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection250: ; O0-NEXT: orl $-43, %edx ; O0-NEXT: .Lpcsection251: ; O0-NEXT: lock cmpxchgl %edx, (%rcx) ; O0-NEXT: .Lpcsection252: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection253: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .Lpcsection254: ; O0-NEXT: jne .LBB126_2 ; O0-NEXT: jmp .LBB126_1 ; O0-NEXT: .LBB126_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_nand_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection219: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB126_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection220: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection221: ; O1-NEXT: orl $-43, %ecx ; O1-NEXT: .Lpcsection222: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection223: ; O1-NEXT: jne .LBB126_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_nand_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection219: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB126_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection220: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection221: ; O2-NEXT: orl $-43, %ecx ; O2-NEXT: .Lpcsection222: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection223: ; O2-NEXT: jne .LBB126_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_nand_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection219: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB126_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection220: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection221: ; O3-NEXT: orl $-43, %ecx ; O3-NEXT: .Lpcsection222: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection223: ; O3-NEXT: jne .LBB126_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i32 42 release, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xchg_acq_rel(ptr %a) { ; O0-LABEL: atomic32_xchg_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection255: ; O0-NEXT: xchgl %eax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xchg_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection224: ; O1-NEXT: xchgl %eax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xchg_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection224: ; O2-NEXT: xchgl %eax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xchg_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection224: ; O3-NEXT: xchgl %eax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i32 42 acq_rel, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_add_acq_rel(ptr %a) { ; O0-LABEL: atomic32_add_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection256: ; O0-NEXT: lock addl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_add_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection225: ; O1-NEXT: lock addl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_add_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection225: ; O2-NEXT: lock addl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_add_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection225: ; O3-NEXT: lock addl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i32 42 acq_rel, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_sub_acq_rel(ptr %a) { ; O0-LABEL: atomic32_sub_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection257: ; O0-NEXT: lock subl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_sub_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection226: ; O1-NEXT: lock subl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_sub_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection226: ; O2-NEXT: lock subl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_sub_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection226: ; O3-NEXT: lock subl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i32 42 acq_rel, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_and_acq_rel(ptr %a) { ; O0-LABEL: atomic32_and_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection258: ; O0-NEXT: lock andl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_and_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection227: ; O1-NEXT: lock andl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_and_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection227: ; O2-NEXT: lock andl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_and_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection227: ; O3-NEXT: lock andl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i32 42 acq_rel, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_or_acq_rel(ptr %a) { ; O0-LABEL: atomic32_or_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection259: ; O0-NEXT: lock orl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_or_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection228: ; O1-NEXT: lock orl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_or_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection228: ; O2-NEXT: lock orl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_or_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection228: ; O3-NEXT: lock orl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i32 42 acq_rel, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xor_acq_rel(ptr %a) { ; O0-LABEL: atomic32_xor_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection260: ; O0-NEXT: lock xorl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xor_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection229: ; O1-NEXT: lock xorl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xor_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection229: ; O2-NEXT: lock xorl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xor_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection229: ; O3-NEXT: lock xorl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i32 42 acq_rel, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_nand_acq_rel(ptr %a) { ; O0-LABEL: atomic32_nand_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection261: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .LBB133_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %edx ; O0-NEXT: .Lpcsection262: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection263: ; O0-NEXT: orl $-43, %edx ; O0-NEXT: .Lpcsection264: ; O0-NEXT: lock cmpxchgl %edx, (%rcx) ; O0-NEXT: .Lpcsection265: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection266: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .Lpcsection267: ; O0-NEXT: jne .LBB133_2 ; O0-NEXT: jmp .LBB133_1 ; O0-NEXT: .LBB133_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_nand_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection230: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB133_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection231: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection232: ; O1-NEXT: orl $-43, %ecx ; O1-NEXT: .Lpcsection233: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection234: ; O1-NEXT: jne .LBB133_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_nand_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection230: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB133_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection231: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection232: ; O2-NEXT: orl $-43, %ecx ; O2-NEXT: .Lpcsection233: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection234: ; O2-NEXT: jne .LBB133_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_nand_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection230: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB133_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection231: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection232: ; O3-NEXT: orl $-43, %ecx ; O3-NEXT: .Lpcsection233: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection234: ; O3-NEXT: jne .LBB133_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i32 42 acq_rel, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xchg_seq_cst(ptr %a) { ; O0-LABEL: atomic32_xchg_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection268: ; O0-NEXT: xchgl %eax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xchg_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection235: ; O1-NEXT: xchgl %eax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xchg_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection235: ; O2-NEXT: xchgl %eax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xchg_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection235: ; O3-NEXT: xchgl %eax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i32 42 seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_add_seq_cst(ptr %a) { ; O0-LABEL: atomic32_add_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection269: ; O0-NEXT: lock addl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_add_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection236: ; O1-NEXT: lock addl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_add_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection236: ; O2-NEXT: lock addl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_add_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection236: ; O3-NEXT: lock addl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i32 42 seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_sub_seq_cst(ptr %a) { ; O0-LABEL: atomic32_sub_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection270: ; O0-NEXT: lock subl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_sub_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection237: ; O1-NEXT: lock subl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_sub_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection237: ; O2-NEXT: lock subl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_sub_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection237: ; O3-NEXT: lock subl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i32 42 seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_and_seq_cst(ptr %a) { ; O0-LABEL: atomic32_and_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection271: ; O0-NEXT: lock andl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_and_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection238: ; O1-NEXT: lock andl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_and_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection238: ; O2-NEXT: lock andl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_and_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection238: ; O3-NEXT: lock andl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i32 42 seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_or_seq_cst(ptr %a) { ; O0-LABEL: atomic32_or_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection272: ; O0-NEXT: lock orl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_or_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection239: ; O1-NEXT: lock orl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_or_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection239: ; O2-NEXT: lock orl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_or_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection239: ; O3-NEXT: lock orl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i32 42 seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_xor_seq_cst(ptr %a) { ; O0-LABEL: atomic32_xor_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection273: ; O0-NEXT: lock xorl $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_xor_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection240: ; O1-NEXT: lock xorl $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_xor_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection240: ; O2-NEXT: lock xorl $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_xor_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection240: ; O3-NEXT: lock xorl $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i32 42 seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_nand_seq_cst(ptr %a) { ; O0-LABEL: atomic32_nand_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection274: ; O0-NEXT: movl (%rdi), %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .LBB140_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %edx ; O0-NEXT: .Lpcsection275: ; O0-NEXT: notl %edx ; O0-NEXT: .Lpcsection276: ; O0-NEXT: orl $-43, %edx ; O0-NEXT: .Lpcsection277: ; O0-NEXT: lock cmpxchgl %edx, (%rcx) ; O0-NEXT: .Lpcsection278: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection279: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: .Lpcsection280: ; O0-NEXT: jne .LBB140_2 ; O0-NEXT: jmp .LBB140_1 ; O0-NEXT: .LBB140_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_nand_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection241: ; O1-NEXT: movl (%rdi), %eax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB140_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection242: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection243: ; O1-NEXT: orl $-43, %ecx ; O1-NEXT: .Lpcsection244: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection245: ; O1-NEXT: jne .LBB140_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_nand_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection241: ; O2-NEXT: movl (%rdi), %eax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB140_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection242: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection243: ; O2-NEXT: orl $-43, %ecx ; O2-NEXT: .Lpcsection244: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection245: ; O2-NEXT: jne .LBB140_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_nand_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection241: ; O3-NEXT: movl (%rdi), %eax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB140_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection242: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection243: ; O3-NEXT: orl $-43, %ecx ; O3-NEXT: .Lpcsection244: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection245: ; O3-NEXT: jne .LBB140_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i32 42 seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_cas_monotonic(ptr %a) { ; O0-LABEL: atomic32_cas_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection281: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection282: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection283: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection284: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection285: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_cas_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection246: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection247: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection248: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection249: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection250: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection251: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_cas_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection246: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection247: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection248: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection249: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection250: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection251: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_cas_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection246: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection247: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection248: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection249: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection250: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection251: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i32 42, i32 1 monotonic monotonic, align 4, !pcsections !0 %y = cmpxchg ptr %a, i32 42, i32 1 monotonic acquire, align 4, !pcsections !0 %z = cmpxchg ptr %a, i32 42, i32 1 monotonic seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_cas_acquire(ptr %a) { ; O0-LABEL: atomic32_cas_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection286: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection287: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection288: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection289: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection290: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_cas_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection252: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection253: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection254: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection255: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection256: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection257: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_cas_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection252: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection253: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection254: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection255: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection256: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection257: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_cas_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection252: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection253: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection254: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection255: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection256: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection257: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i32 42, i32 1 acquire monotonic, align 4, !pcsections !0 %y = cmpxchg ptr %a, i32 42, i32 1 acquire acquire, align 4, !pcsections !0 %z = cmpxchg ptr %a, i32 42, i32 1 acquire seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_cas_release(ptr %a) { ; O0-LABEL: atomic32_cas_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection291: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection292: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection293: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection294: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection295: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_cas_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection258: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection259: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection260: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection261: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection262: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection263: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_cas_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection258: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection259: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection260: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection261: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection262: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection263: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_cas_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection258: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection259: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection260: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection261: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection262: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection263: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i32 42, i32 1 release monotonic, align 4, !pcsections !0 %y = cmpxchg ptr %a, i32 42, i32 1 release acquire, align 4, !pcsections !0 %z = cmpxchg ptr %a, i32 42, i32 1 release seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_cas_acq_rel(ptr %a) { ; O0-LABEL: atomic32_cas_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection296: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection297: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection298: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection299: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection300: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_cas_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection264: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection265: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection266: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection267: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection268: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection269: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_cas_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection264: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection265: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection266: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection267: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection268: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection269: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_cas_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection264: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection265: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection266: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection267: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection268: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection269: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i32 42, i32 1 acq_rel monotonic, align 4, !pcsections !0 %y = cmpxchg ptr %a, i32 42, i32 1 acq_rel acquire, align 4, !pcsections !0 %z = cmpxchg ptr %a, i32 42, i32 1 acq_rel seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic32_cas_seq_cst(ptr %a) { ; O0-LABEL: atomic32_cas_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection301: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection302: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection303: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: .Lpcsection304: ; O0-NEXT: # kill: def $edx killed $eax ; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload ; O0-NEXT: .Lpcsection305: ; O0-NEXT: lock cmpxchgl %ecx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic32_cas_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection270: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection271: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection272: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection273: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: .Lpcsection274: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection275: ; O1-NEXT: lock cmpxchgl %ecx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic32_cas_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection270: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection271: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection272: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection273: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: .Lpcsection274: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection275: ; O2-NEXT: lock cmpxchgl %ecx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic32_cas_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection270: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection271: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection272: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection273: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: .Lpcsection274: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection275: ; O3-NEXT: lock cmpxchgl %ecx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i32 42, i32 1 seq_cst monotonic, align 4, !pcsections !0 %y = cmpxchg ptr %a, i32 42, i32 1 seq_cst acquire, align 4, !pcsections !0 %z = cmpxchg ptr %a, i32 42, i32 1 seq_cst seq_cst, align 4, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define i64 @atomic64_load_unordered(ptr %a) { ; O0-LABEL: atomic64_load_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection306: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_load_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection276: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_load_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection276: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_load_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection276: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i64, ptr %a unordered, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i64 %x } define i64 @atomic64_load_monotonic(ptr %a) { ; O0-LABEL: atomic64_load_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection307: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_load_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection277: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_load_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection277: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_load_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection277: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i64, ptr %a monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i64 %x } define i64 @atomic64_load_acquire(ptr %a) { ; O0-LABEL: atomic64_load_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection308: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_load_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection278: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_load_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection278: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_load_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection278: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i64, ptr %a acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i64 %x } define i64 @atomic64_load_seq_cst(ptr %a) { ; O0-LABEL: atomic64_load_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection309: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_load_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection279: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_load_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection279: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_load_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection279: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i64, ptr %a seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i64 %x } define ptr @atomic64_load_seq_cst_ptr_ty(ptr %a) { ; O0-LABEL: atomic64_load_seq_cst_ptr_ty: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection310: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_load_seq_cst_ptr_ty: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection280: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_load_seq_cst_ptr_ty: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection280: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_load_seq_cst_ptr_ty: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection280: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic ptr, ptr %a seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret ptr %x } define void @atomic64_store_unordered(ptr %a) { ; O0-LABEL: atomic64_store_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection311: ; O0-NEXT: movq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_store_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection281: ; O1-NEXT: movq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_store_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection281: ; O2-NEXT: movq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_store_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection281: ; O3-NEXT: movq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i64 42, ptr %a unordered, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_store_monotonic(ptr %a) { ; O0-LABEL: atomic64_store_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection312: ; O0-NEXT: movq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_store_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection282: ; O1-NEXT: movq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_store_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection282: ; O2-NEXT: movq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_store_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection282: ; O3-NEXT: movq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i64 42, ptr %a monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_store_release(ptr %a) { ; O0-LABEL: atomic64_store_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection313: ; O0-NEXT: movq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_store_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection283: ; O1-NEXT: movq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_store_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection283: ; O2-NEXT: movq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_store_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection283: ; O3-NEXT: movq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i64 42, ptr %a release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_store_seq_cst(ptr %a) { ; O0-LABEL: atomic64_store_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection314: ; O0-NEXT: xchgq %rax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_store_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection284: ; O1-NEXT: xchgq %rax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_store_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection284: ; O2-NEXT: xchgq %rax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_store_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection284: ; O3-NEXT: xchgq %rax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i64 42, ptr %a seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_store_seq_cst_ptr_ty(ptr %a, ptr %v) { ; O0-LABEL: atomic64_store_seq_cst_ptr_ty: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection315: ; O0-NEXT: xchgq %rsi, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_store_seq_cst_ptr_ty: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection285: ; O1-NEXT: xchgq %rsi, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_store_seq_cst_ptr_ty: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection285: ; O2-NEXT: xchgq %rsi, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_store_seq_cst_ptr_ty: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection285: ; O3-NEXT: xchgq %rsi, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic ptr %v, ptr %a seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xchg_monotonic(ptr %a) { ; O0-LABEL: atomic64_xchg_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection316: ; O0-NEXT: xchgq %rax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xchg_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection286: ; O1-NEXT: xchgq %rax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xchg_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection286: ; O2-NEXT: xchgq %rax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xchg_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection286: ; O3-NEXT: xchgq %rax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i64 42 monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_add_monotonic(ptr %a) { ; O0-LABEL: atomic64_add_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection317: ; O0-NEXT: lock addq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_add_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection287: ; O1-NEXT: lock addq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_add_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection287: ; O2-NEXT: lock addq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_add_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection287: ; O3-NEXT: lock addq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i64 42 monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_sub_monotonic(ptr %a) { ; O0-LABEL: atomic64_sub_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection318: ; O0-NEXT: lock subq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_sub_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection288: ; O1-NEXT: lock subq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_sub_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection288: ; O2-NEXT: lock subq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_sub_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection288: ; O3-NEXT: lock subq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i64 42 monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_and_monotonic(ptr %a) { ; O0-LABEL: atomic64_and_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection319: ; O0-NEXT: lock andq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_and_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection289: ; O1-NEXT: lock andq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_and_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection289: ; O2-NEXT: lock andq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_and_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection289: ; O3-NEXT: lock andq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i64 42 monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_or_monotonic(ptr %a) { ; O0-LABEL: atomic64_or_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection320: ; O0-NEXT: lock orq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_or_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection290: ; O1-NEXT: lock orq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_or_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection290: ; O2-NEXT: lock orq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_or_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection290: ; O3-NEXT: lock orq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i64 42 monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xor_monotonic(ptr %a) { ; O0-LABEL: atomic64_xor_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection321: ; O0-NEXT: lock xorq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xor_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection291: ; O1-NEXT: lock xorq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xor_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection291: ; O2-NEXT: lock xorq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xor_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection291: ; O3-NEXT: lock xorq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i64 42 monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_nand_monotonic(ptr %a) { ; O0-LABEL: atomic64_nand_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection322: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .LBB162_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %esi ; O0-NEXT: .Lpcsection323: ; O0-NEXT: notl %esi ; O0-NEXT: .Lpcsection324: ; O0-NEXT: # implicit-def: $rdx ; O0-NEXT: movl %esi, %edx ; O0-NEXT: .Lpcsection325: ; O0-NEXT: orq $-43, %rdx ; O0-NEXT: .Lpcsection326: ; O0-NEXT: lock cmpxchgq %rdx, (%rcx) ; O0-NEXT: .Lpcsection327: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection328: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection329: ; O0-NEXT: jne .LBB162_2 ; O0-NEXT: jmp .LBB162_1 ; O0-NEXT: .LBB162_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_nand_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection292: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB162_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection293: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection294: ; O1-NEXT: orq $-43, %rcx ; O1-NEXT: .Lpcsection295: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection296: ; O1-NEXT: jne .LBB162_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_nand_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection292: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB162_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection293: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection294: ; O2-NEXT: orq $-43, %rcx ; O2-NEXT: .Lpcsection295: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection296: ; O2-NEXT: jne .LBB162_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_nand_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection292: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB162_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection293: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection294: ; O3-NEXT: orq $-43, %rcx ; O3-NEXT: .Lpcsection295: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection296: ; O3-NEXT: jne .LBB162_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i64 42 monotonic, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xchg_acquire(ptr %a) { ; O0-LABEL: atomic64_xchg_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection330: ; O0-NEXT: xchgq %rax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xchg_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection297: ; O1-NEXT: xchgq %rax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xchg_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection297: ; O2-NEXT: xchgq %rax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xchg_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection297: ; O3-NEXT: xchgq %rax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i64 42 acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_add_acquire(ptr %a) { ; O0-LABEL: atomic64_add_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection331: ; O0-NEXT: lock addq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_add_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection298: ; O1-NEXT: lock addq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_add_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection298: ; O2-NEXT: lock addq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_add_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection298: ; O3-NEXT: lock addq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i64 42 acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_sub_acquire(ptr %a) { ; O0-LABEL: atomic64_sub_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection332: ; O0-NEXT: lock subq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_sub_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection299: ; O1-NEXT: lock subq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_sub_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection299: ; O2-NEXT: lock subq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_sub_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection299: ; O3-NEXT: lock subq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i64 42 acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_and_acquire(ptr %a) { ; O0-LABEL: atomic64_and_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection333: ; O0-NEXT: lock andq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_and_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection300: ; O1-NEXT: lock andq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_and_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection300: ; O2-NEXT: lock andq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_and_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection300: ; O3-NEXT: lock andq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i64 42 acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_or_acquire(ptr %a) { ; O0-LABEL: atomic64_or_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection334: ; O0-NEXT: lock orq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_or_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection301: ; O1-NEXT: lock orq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_or_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection301: ; O2-NEXT: lock orq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_or_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection301: ; O3-NEXT: lock orq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i64 42 acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xor_acquire(ptr %a) { ; O0-LABEL: atomic64_xor_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection335: ; O0-NEXT: lock xorq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xor_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection302: ; O1-NEXT: lock xorq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xor_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection302: ; O2-NEXT: lock xorq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xor_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection302: ; O3-NEXT: lock xorq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i64 42 acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_nand_acquire(ptr %a) { ; O0-LABEL: atomic64_nand_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection336: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .LBB169_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %esi ; O0-NEXT: .Lpcsection337: ; O0-NEXT: notl %esi ; O0-NEXT: .Lpcsection338: ; O0-NEXT: # implicit-def: $rdx ; O0-NEXT: movl %esi, %edx ; O0-NEXT: .Lpcsection339: ; O0-NEXT: orq $-43, %rdx ; O0-NEXT: .Lpcsection340: ; O0-NEXT: lock cmpxchgq %rdx, (%rcx) ; O0-NEXT: .Lpcsection341: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection342: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection343: ; O0-NEXT: jne .LBB169_2 ; O0-NEXT: jmp .LBB169_1 ; O0-NEXT: .LBB169_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_nand_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection303: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB169_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection304: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection305: ; O1-NEXT: orq $-43, %rcx ; O1-NEXT: .Lpcsection306: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection307: ; O1-NEXT: jne .LBB169_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_nand_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection303: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB169_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection304: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection305: ; O2-NEXT: orq $-43, %rcx ; O2-NEXT: .Lpcsection306: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection307: ; O2-NEXT: jne .LBB169_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_nand_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection303: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB169_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection304: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection305: ; O3-NEXT: orq $-43, %rcx ; O3-NEXT: .Lpcsection306: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection307: ; O3-NEXT: jne .LBB169_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i64 42 acquire, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xchg_release(ptr %a) { ; O0-LABEL: atomic64_xchg_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection344: ; O0-NEXT: xchgq %rax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xchg_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection308: ; O1-NEXT: xchgq %rax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xchg_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection308: ; O2-NEXT: xchgq %rax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xchg_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection308: ; O3-NEXT: xchgq %rax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i64 42 release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_add_release(ptr %a) { ; O0-LABEL: atomic64_add_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection345: ; O0-NEXT: lock addq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_add_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection309: ; O1-NEXT: lock addq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_add_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection309: ; O2-NEXT: lock addq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_add_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection309: ; O3-NEXT: lock addq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i64 42 release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_sub_release(ptr %a) { ; O0-LABEL: atomic64_sub_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection346: ; O0-NEXT: lock subq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_sub_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection310: ; O1-NEXT: lock subq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_sub_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection310: ; O2-NEXT: lock subq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_sub_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection310: ; O3-NEXT: lock subq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i64 42 release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_and_release(ptr %a) { ; O0-LABEL: atomic64_and_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection347: ; O0-NEXT: lock andq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_and_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection311: ; O1-NEXT: lock andq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_and_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection311: ; O2-NEXT: lock andq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_and_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection311: ; O3-NEXT: lock andq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i64 42 release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_or_release(ptr %a) { ; O0-LABEL: atomic64_or_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection348: ; O0-NEXT: lock orq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_or_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection312: ; O1-NEXT: lock orq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_or_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection312: ; O2-NEXT: lock orq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_or_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection312: ; O3-NEXT: lock orq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i64 42 release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xor_release(ptr %a) { ; O0-LABEL: atomic64_xor_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection349: ; O0-NEXT: lock xorq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xor_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection313: ; O1-NEXT: lock xorq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xor_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection313: ; O2-NEXT: lock xorq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xor_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection313: ; O3-NEXT: lock xorq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i64 42 release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_nand_release(ptr %a) { ; O0-LABEL: atomic64_nand_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection350: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .LBB176_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %esi ; O0-NEXT: .Lpcsection351: ; O0-NEXT: notl %esi ; O0-NEXT: .Lpcsection352: ; O0-NEXT: # implicit-def: $rdx ; O0-NEXT: movl %esi, %edx ; O0-NEXT: .Lpcsection353: ; O0-NEXT: orq $-43, %rdx ; O0-NEXT: .Lpcsection354: ; O0-NEXT: lock cmpxchgq %rdx, (%rcx) ; O0-NEXT: .Lpcsection355: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection356: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection357: ; O0-NEXT: jne .LBB176_2 ; O0-NEXT: jmp .LBB176_1 ; O0-NEXT: .LBB176_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_nand_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection314: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB176_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection315: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection316: ; O1-NEXT: orq $-43, %rcx ; O1-NEXT: .Lpcsection317: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection318: ; O1-NEXT: jne .LBB176_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_nand_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection314: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB176_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection315: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection316: ; O2-NEXT: orq $-43, %rcx ; O2-NEXT: .Lpcsection317: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection318: ; O2-NEXT: jne .LBB176_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_nand_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection314: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB176_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection315: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection316: ; O3-NEXT: orq $-43, %rcx ; O3-NEXT: .Lpcsection317: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection318: ; O3-NEXT: jne .LBB176_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i64 42 release, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xchg_acq_rel(ptr %a) { ; O0-LABEL: atomic64_xchg_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection358: ; O0-NEXT: xchgq %rax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xchg_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection319: ; O1-NEXT: xchgq %rax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xchg_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection319: ; O2-NEXT: xchgq %rax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xchg_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection319: ; O3-NEXT: xchgq %rax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i64 42 acq_rel, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_add_acq_rel(ptr %a) { ; O0-LABEL: atomic64_add_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection359: ; O0-NEXT: lock addq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_add_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection320: ; O1-NEXT: lock addq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_add_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection320: ; O2-NEXT: lock addq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_add_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection320: ; O3-NEXT: lock addq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i64 42 acq_rel, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_sub_acq_rel(ptr %a) { ; O0-LABEL: atomic64_sub_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection360: ; O0-NEXT: lock subq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_sub_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection321: ; O1-NEXT: lock subq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_sub_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection321: ; O2-NEXT: lock subq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_sub_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection321: ; O3-NEXT: lock subq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i64 42 acq_rel, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_and_acq_rel(ptr %a) { ; O0-LABEL: atomic64_and_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection361: ; O0-NEXT: lock andq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_and_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection322: ; O1-NEXT: lock andq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_and_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection322: ; O2-NEXT: lock andq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_and_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection322: ; O3-NEXT: lock andq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i64 42 acq_rel, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_or_acq_rel(ptr %a) { ; O0-LABEL: atomic64_or_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection362: ; O0-NEXT: lock orq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_or_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection323: ; O1-NEXT: lock orq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_or_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection323: ; O2-NEXT: lock orq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_or_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection323: ; O3-NEXT: lock orq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i64 42 acq_rel, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xor_acq_rel(ptr %a) { ; O0-LABEL: atomic64_xor_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection363: ; O0-NEXT: lock xorq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xor_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection324: ; O1-NEXT: lock xorq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xor_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection324: ; O2-NEXT: lock xorq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xor_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection324: ; O3-NEXT: lock xorq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i64 42 acq_rel, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_nand_acq_rel(ptr %a) { ; O0-LABEL: atomic64_nand_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection364: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .LBB183_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %esi ; O0-NEXT: .Lpcsection365: ; O0-NEXT: notl %esi ; O0-NEXT: .Lpcsection366: ; O0-NEXT: # implicit-def: $rdx ; O0-NEXT: movl %esi, %edx ; O0-NEXT: .Lpcsection367: ; O0-NEXT: orq $-43, %rdx ; O0-NEXT: .Lpcsection368: ; O0-NEXT: lock cmpxchgq %rdx, (%rcx) ; O0-NEXT: .Lpcsection369: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection370: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection371: ; O0-NEXT: jne .LBB183_2 ; O0-NEXT: jmp .LBB183_1 ; O0-NEXT: .LBB183_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_nand_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection325: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB183_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection326: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection327: ; O1-NEXT: orq $-43, %rcx ; O1-NEXT: .Lpcsection328: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection329: ; O1-NEXT: jne .LBB183_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_nand_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection325: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB183_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection326: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection327: ; O2-NEXT: orq $-43, %rcx ; O2-NEXT: .Lpcsection328: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection329: ; O2-NEXT: jne .LBB183_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_nand_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection325: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB183_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection326: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection327: ; O3-NEXT: orq $-43, %rcx ; O3-NEXT: .Lpcsection328: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection329: ; O3-NEXT: jne .LBB183_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i64 42 acq_rel, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xchg_seq_cst(ptr %a) { ; O0-LABEL: atomic64_xchg_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: .Lpcsection372: ; O0-NEXT: xchgq %rax, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xchg_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection330: ; O1-NEXT: xchgq %rax, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xchg_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection330: ; O2-NEXT: xchgq %rax, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xchg_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection330: ; O3-NEXT: xchgq %rax, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i64 42 seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_add_seq_cst(ptr %a) { ; O0-LABEL: atomic64_add_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection373: ; O0-NEXT: lock addq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_add_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection331: ; O1-NEXT: lock addq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_add_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection331: ; O2-NEXT: lock addq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_add_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection331: ; O3-NEXT: lock addq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i64 42 seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_sub_seq_cst(ptr %a) { ; O0-LABEL: atomic64_sub_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection374: ; O0-NEXT: lock subq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_sub_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection332: ; O1-NEXT: lock subq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_sub_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection332: ; O2-NEXT: lock subq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_sub_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection332: ; O3-NEXT: lock subq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i64 42 seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_and_seq_cst(ptr %a) { ; O0-LABEL: atomic64_and_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection375: ; O0-NEXT: lock andq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_and_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection333: ; O1-NEXT: lock andq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_and_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection333: ; O2-NEXT: lock andq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_and_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection333: ; O3-NEXT: lock andq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i64 42 seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_or_seq_cst(ptr %a) { ; O0-LABEL: atomic64_or_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection376: ; O0-NEXT: lock orq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_or_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection334: ; O1-NEXT: lock orq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_or_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection334: ; O2-NEXT: lock orq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_or_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection334: ; O3-NEXT: lock orq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i64 42 seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_xor_seq_cst(ptr %a) { ; O0-LABEL: atomic64_xor_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection377: ; O0-NEXT: lock xorq $42, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_xor_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection335: ; O1-NEXT: lock xorq $42, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_xor_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection335: ; O2-NEXT: lock xorq $42, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_xor_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection335: ; O3-NEXT: lock xorq $42, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i64 42 seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_nand_seq_cst(ptr %a) { ; O0-LABEL: atomic64_nand_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo, %rax ; O0-NEXT: .Lpcsection378: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .LBB190_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movl %eax, %esi ; O0-NEXT: .Lpcsection379: ; O0-NEXT: notl %esi ; O0-NEXT: .Lpcsection380: ; O0-NEXT: # implicit-def: $rdx ; O0-NEXT: movl %esi, %edx ; O0-NEXT: .Lpcsection381: ; O0-NEXT: orq $-43, %rdx ; O0-NEXT: .Lpcsection382: ; O0-NEXT: lock cmpxchgq %rdx, (%rcx) ; O0-NEXT: .Lpcsection383: ; O0-NEXT: sete %cl ; O0-NEXT: .Lpcsection384: ; O0-NEXT: testb $1, %cl ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection385: ; O0-NEXT: jne .LBB190_2 ; O0-NEXT: jmp .LBB190_1 ; O0-NEXT: .LBB190_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_nand_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection336: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB190_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ecx ; O1-NEXT: .Lpcsection337: ; O1-NEXT: notl %ecx ; O1-NEXT: .Lpcsection338: ; O1-NEXT: orq $-43, %rcx ; O1-NEXT: .Lpcsection339: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection340: ; O1-NEXT: jne .LBB190_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_nand_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection336: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB190_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ecx ; O2-NEXT: .Lpcsection337: ; O2-NEXT: notl %ecx ; O2-NEXT: .Lpcsection338: ; O2-NEXT: orq $-43, %rcx ; O2-NEXT: .Lpcsection339: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection340: ; O2-NEXT: jne .LBB190_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_nand_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection336: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB190_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ecx ; O3-NEXT: .Lpcsection337: ; O3-NEXT: notl %ecx ; O3-NEXT: .Lpcsection338: ; O3-NEXT: orq $-43, %rcx ; O3-NEXT: .Lpcsection339: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection340: ; O3-NEXT: jne .LBB190_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i64 42 seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_cas_monotonic(ptr %a) { ; O0-LABEL: atomic64_cas_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection386: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection387: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection388: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection389: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection390: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_cas_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection341: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection342: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection343: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection344: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection345: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection346: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_cas_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection341: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection342: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection343: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection344: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection345: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection346: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_cas_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection341: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection342: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection343: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection344: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection345: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection346: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i64 42, i64 1 monotonic monotonic, align 8, !pcsections !0 %y = cmpxchg ptr %a, i64 42, i64 1 monotonic acquire, align 8, !pcsections !0 %z = cmpxchg ptr %a, i64 42, i64 1 monotonic seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_cas_acquire(ptr %a) { ; O0-LABEL: atomic64_cas_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection391: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection392: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection393: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection394: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection395: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_cas_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection347: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection348: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection349: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection350: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection351: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection352: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_cas_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection347: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection348: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection349: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection350: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection351: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection352: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_cas_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection347: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection348: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection349: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection350: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection351: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection352: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i64 42, i64 1 acquire monotonic, align 8, !pcsections !0 %y = cmpxchg ptr %a, i64 42, i64 1 acquire acquire, align 8, !pcsections !0 %z = cmpxchg ptr %a, i64 42, i64 1 acquire seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_cas_release(ptr %a) { ; O0-LABEL: atomic64_cas_release: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection396: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection397: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection398: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection399: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection400: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_cas_release: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection353: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection354: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection355: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection356: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection357: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection358: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_cas_release: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection353: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection354: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection355: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection356: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection357: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection358: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_cas_release: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection353: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection354: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection355: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection356: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection357: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection358: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i64 42, i64 1 release monotonic, align 8, !pcsections !0 %y = cmpxchg ptr %a, i64 42, i64 1 release acquire, align 8, !pcsections !0 %z = cmpxchg ptr %a, i64 42, i64 1 release seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_cas_acq_rel(ptr %a) { ; O0-LABEL: atomic64_cas_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection401: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection402: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection403: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection404: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection405: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_cas_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection359: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection360: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection361: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection362: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection363: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection364: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_cas_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection359: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection360: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection361: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection362: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection363: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection364: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_cas_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection359: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection360: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection361: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection362: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection363: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection364: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i64 42, i64 1 acq_rel monotonic, align 8, !pcsections !0 %y = cmpxchg ptr %a, i64 42, i64 1 acq_rel acquire, align 8, !pcsections !0 %z = cmpxchg ptr %a, i64 42, i64 1 acq_rel seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic64_cas_seq_cst(ptr %a) { ; O0-LABEL: atomic64_cas_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movl $1, %ecx ; O0-NEXT: .Lpcsection406: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection407: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection408: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: .Lpcsection409: ; O0-NEXT: # kill: def $rdx killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: .Lpcsection410: ; O0-NEXT: lock cmpxchgq %rcx, (%rdi) ; O0-NEXT: movq $3, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_cas_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: movl $1, %ecx ; O1-NEXT: .Lpcsection365: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection366: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection367: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection368: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: .Lpcsection369: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection370: ; O1-NEXT: lock cmpxchgq %rcx, (%rdi) ; O1-NEXT: movq $3, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_cas_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: movl $1, %ecx ; O2-NEXT: .Lpcsection365: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection366: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection367: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection368: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: .Lpcsection369: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection370: ; O2-NEXT: lock cmpxchgq %rcx, (%rdi) ; O2-NEXT: movq $3, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_cas_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: movl $1, %ecx ; O3-NEXT: .Lpcsection365: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection366: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection367: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection368: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: .Lpcsection369: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection370: ; O3-NEXT: lock cmpxchgq %rcx, (%rdi) ; O3-NEXT: movq $3, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i64 42, i64 1 seq_cst monotonic, align 8, !pcsections !0 %y = cmpxchg ptr %a, i64 42, i64 1 seq_cst acquire, align 8, !pcsections !0 %z = cmpxchg ptr %a, i64 42, i64 1 seq_cst seq_cst, align 8, !pcsections !0 store volatile i64 3, ptr @foo, align 8 ret void } define void @atomic64_cas_seq_cst_ptr_ty(ptr %a, ptr %v1, ptr %v2) { ; O0-LABEL: atomic64_cas_seq_cst_ptr_ty: ; O0: # %bb.0: # %entry ; O0-NEXT: movq %rsi, %rax ; O0-NEXT: movq foo(%rip), %rcx ; O0-NEXT: .Lpcsection411: ; O0-NEXT: lock cmpxchgq %rdx, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic64_cas_seq_cst_ptr_ty: ; O1: # %bb.0: # %entry ; O1-NEXT: movq %rsi, %rax ; O1-NEXT: movq foo(%rip), %rcx ; O1-NEXT: .Lpcsection371: ; O1-NEXT: lock cmpxchgq %rdx, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic64_cas_seq_cst_ptr_ty: ; O2: # %bb.0: # %entry ; O2-NEXT: movq %rsi, %rax ; O2-NEXT: movq foo(%rip), %rcx ; O2-NEXT: .Lpcsection371: ; O2-NEXT: lock cmpxchgq %rdx, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic64_cas_seq_cst_ptr_ty: ; O3: # %bb.0: # %entry ; O3-NEXT: movq %rsi, %rax ; O3-NEXT: movq foo(%rip), %rcx ; O3-NEXT: .Lpcsection371: ; O3-NEXT: lock cmpxchgq %rdx, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, ptr %v1, ptr %v2 seq_cst seq_cst, align 8, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define i64 @atomic_use_cond(ptr %a) { ; O0-LABEL: atomic_use_cond: ; O0: # %bb.0: # %entry ; O0-NEXT: .Lpcsection412: ; O0-NEXT: lock decq (%rdi) ; O0-NEXT: .Lpcsection413: ; O0-NEXT: sete %al ; O0-NEXT: testb $1, %al ; O0-NEXT: je .LBB197_2 ; O0-NEXT: # %bb.1: # %then ; O0-NEXT: movl $1, %eax ; O0-NEXT: retq ; O0-NEXT: .LBB197_2: # %else ; O0-NEXT: movl $2, %eax ; O0-NEXT: retq ; ; O1-LABEL: atomic_use_cond: ; O1: # %bb.0: # %entry ; O1-NEXT: .Lpcsection372: ; O1-NEXT: lock decq (%rdi) ; O1-NEXT: jne .LBB197_2 ; O1-NEXT: # %bb.1: # %then ; O1-NEXT: movl $1, %eax ; O1-NEXT: retq ; O1-NEXT: .LBB197_2: # %else ; O1-NEXT: movl $2, %eax ; O1-NEXT: retq ; ; O2-LABEL: atomic_use_cond: ; O2: # %bb.0: # %entry ; O2-NEXT: .Lpcsection372: ; O2-NEXT: lock decq (%rdi) ; O2-NEXT: jne .LBB197_2 ; O2-NEXT: # %bb.1: # %then ; O2-NEXT: movl $1, %eax ; O2-NEXT: retq ; O2-NEXT: .LBB197_2: # %else ; O2-NEXT: movl $2, %eax ; O2-NEXT: retq ; ; O3-LABEL: atomic_use_cond: ; O3: # %bb.0: # %entry ; O3-NEXT: .Lpcsection372: ; O3-NEXT: lock decq (%rdi) ; O3-NEXT: jne .LBB197_2 ; O3-NEXT: # %bb.1: # %then ; O3-NEXT: movl $1, %eax ; O3-NEXT: retq ; O3-NEXT: .LBB197_2: # %else ; O3-NEXT: movl $2, %eax ; O3-NEXT: retq entry: %x = atomicrmw sub ptr %a, i64 1 seq_cst, align 8, !pcsections !0 %y = icmp eq i64 %x, 1 br i1 %y, label %then, label %else then: ret i64 1 else: ret i64 2 } define i128 @atomic128_load_unordered(ptr %a) { ; O0-LABEL: atomic128_load_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection414: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ebx ; O0-NEXT: movq %rbx, %rax ; O0-NEXT: movq %rbx, %rdx ; O0-NEXT: movq %rbx, %rcx ; O0-NEXT: .Lpcsection415: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo(%rip) ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_load_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection373: ; O1-NEXT: xorl %eax, %eax ; O1-NEXT: .Lpcsection374: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection375: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection376: ; O1-NEXT: xorl %ebx, %ebx ; O1-NEXT: .Lpcsection377: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_load_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection373: ; O2-NEXT: xorl %eax, %eax ; O2-NEXT: .Lpcsection374: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection375: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection376: ; O2-NEXT: xorl %ebx, %ebx ; O2-NEXT: .Lpcsection377: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_load_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection373: ; O3-NEXT: xorl %eax, %eax ; O3-NEXT: .Lpcsection374: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection375: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection376: ; O3-NEXT: xorl %ebx, %ebx ; O3-NEXT: .Lpcsection377: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i128, ptr %a unordered, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i128 %x } define i128 @atomic128_load_monotonic(ptr %a) { ; O0-LABEL: atomic128_load_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection416: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ebx ; O0-NEXT: movq %rbx, %rax ; O0-NEXT: movq %rbx, %rdx ; O0-NEXT: movq %rbx, %rcx ; O0-NEXT: .Lpcsection417: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo(%rip) ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_load_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection378: ; O1-NEXT: xorl %eax, %eax ; O1-NEXT: .Lpcsection379: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection380: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection381: ; O1-NEXT: xorl %ebx, %ebx ; O1-NEXT: .Lpcsection382: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_load_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection378: ; O2-NEXT: xorl %eax, %eax ; O2-NEXT: .Lpcsection379: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection380: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection381: ; O2-NEXT: xorl %ebx, %ebx ; O2-NEXT: .Lpcsection382: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_load_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection378: ; O3-NEXT: xorl %eax, %eax ; O3-NEXT: .Lpcsection379: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection380: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection381: ; O3-NEXT: xorl %ebx, %ebx ; O3-NEXT: .Lpcsection382: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i128, ptr %a monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i128 %x } define i128 @atomic128_load_acquire(ptr %a) { ; O0-LABEL: atomic128_load_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection418: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ebx ; O0-NEXT: movq %rbx, %rax ; O0-NEXT: movq %rbx, %rdx ; O0-NEXT: movq %rbx, %rcx ; O0-NEXT: .Lpcsection419: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo(%rip) ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_load_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection383: ; O1-NEXT: xorl %eax, %eax ; O1-NEXT: .Lpcsection384: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection385: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection386: ; O1-NEXT: xorl %ebx, %ebx ; O1-NEXT: .Lpcsection387: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_load_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection383: ; O2-NEXT: xorl %eax, %eax ; O2-NEXT: .Lpcsection384: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection385: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection386: ; O2-NEXT: xorl %ebx, %ebx ; O2-NEXT: .Lpcsection387: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_load_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection383: ; O3-NEXT: xorl %eax, %eax ; O3-NEXT: .Lpcsection384: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection385: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection386: ; O3-NEXT: xorl %ebx, %ebx ; O3-NEXT: .Lpcsection387: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i128, ptr %a acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i128 %x } define i128 @atomic128_load_seq_cst(ptr %a) { ; O0-LABEL: atomic128_load_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection420: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ebx ; O0-NEXT: movq %rbx, %rax ; O0-NEXT: movq %rbx, %rdx ; O0-NEXT: movq %rbx, %rcx ; O0-NEXT: .Lpcsection421: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo(%rip) ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_load_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection388: ; O1-NEXT: xorl %eax, %eax ; O1-NEXT: .Lpcsection389: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection390: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection391: ; O1-NEXT: xorl %ebx, %ebx ; O1-NEXT: .Lpcsection392: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_load_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection388: ; O2-NEXT: xorl %eax, %eax ; O2-NEXT: .Lpcsection389: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection390: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection391: ; O2-NEXT: xorl %ebx, %ebx ; O2-NEXT: .Lpcsection392: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_load_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection388: ; O3-NEXT: xorl %eax, %eax ; O3-NEXT: .Lpcsection389: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection390: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection391: ; O3-NEXT: xorl %ebx, %ebx ; O3-NEXT: .Lpcsection392: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic i128, ptr %a seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret i128 %x } define ptr @atomic128_load_seq_cst_ptr_ty(ptr %a) { ; O0-LABEL: atomic128_load_seq_cst_ptr_ty: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection422: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic128_load_seq_cst_ptr_ty: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection393: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic128_load_seq_cst_ptr_ty: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection393: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic128_load_seq_cst_ptr_ty: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection393: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = load atomic ptr, ptr %a seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret ptr %x } define void @atomic128_store_unordered(ptr %a) { ; O0-LABEL: atomic128_store_unordered: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection423: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection424: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection425: ; O0-NEXT: jmp .LBB203_1 ; O0-NEXT: .LBB203_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection426: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection427: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection428: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection429: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection430: ; O0-NEXT: jne .LBB203_1 ; O0-NEXT: jmp .LBB203_2 ; O0-NEXT: .LBB203_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_store_unordered: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection394: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection395: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection396: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB203_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection397: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection398: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection399: ; O1-NEXT: jne .LBB203_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_store_unordered: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection394: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection395: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection396: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB203_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection397: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection398: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection399: ; O2-NEXT: jne .LBB203_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_store_unordered: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection394: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection395: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection396: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB203_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection397: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection398: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection399: ; O3-NEXT: jne .LBB203_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i128 42, ptr %a unordered, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_store_monotonic(ptr %a) { ; O0-LABEL: atomic128_store_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection431: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection432: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection433: ; O0-NEXT: jmp .LBB204_1 ; O0-NEXT: .LBB204_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection434: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection435: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection436: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection437: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection438: ; O0-NEXT: jne .LBB204_1 ; O0-NEXT: jmp .LBB204_2 ; O0-NEXT: .LBB204_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_store_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection400: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection401: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection402: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB204_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection403: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection404: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection405: ; O1-NEXT: jne .LBB204_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_store_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection400: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection401: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection402: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB204_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection403: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection404: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection405: ; O2-NEXT: jne .LBB204_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_store_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection400: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection401: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection402: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB204_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection403: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection404: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection405: ; O3-NEXT: jne .LBB204_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i128 42, ptr %a monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_store_release(ptr %a) { ; O0-LABEL: atomic128_store_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection439: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection440: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection441: ; O0-NEXT: jmp .LBB205_1 ; O0-NEXT: .LBB205_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection442: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection443: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection444: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection445: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection446: ; O0-NEXT: jne .LBB205_1 ; O0-NEXT: jmp .LBB205_2 ; O0-NEXT: .LBB205_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_store_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection406: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection407: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection408: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB205_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection409: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection410: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection411: ; O1-NEXT: jne .LBB205_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_store_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection406: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection407: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection408: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB205_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection409: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection410: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection411: ; O2-NEXT: jne .LBB205_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_store_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection406: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection407: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection408: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB205_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection409: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection410: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection411: ; O3-NEXT: jne .LBB205_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i128 42, ptr %a release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_store_seq_cst(ptr %a) { ; O0-LABEL: atomic128_store_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection447: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection448: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection449: ; O0-NEXT: jmp .LBB206_1 ; O0-NEXT: .LBB206_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection450: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection451: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection452: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection453: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection454: ; O0-NEXT: jne .LBB206_1 ; O0-NEXT: jmp .LBB206_2 ; O0-NEXT: .LBB206_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_store_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection412: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection413: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection414: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB206_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection415: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection416: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection417: ; O1-NEXT: jne .LBB206_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_store_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection412: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection413: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection414: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB206_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection415: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection416: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection417: ; O2-NEXT: jne .LBB206_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_store_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection412: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection413: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection414: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB206_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection415: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection416: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection417: ; O3-NEXT: jne .LBB206_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic i128 42, ptr %a seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_store_seq_cst_ptr_ty(ptr %a, ptr %v) { ; O0-LABEL: atomic128_store_seq_cst_ptr_ty: ; O0: # %bb.0: # %entry ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection455: ; O0-NEXT: xchgq %rsi, (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: retq ; ; O1-LABEL: atomic128_store_seq_cst_ptr_ty: ; O1: # %bb.0: # %entry ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection418: ; O1-NEXT: xchgq %rsi, (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: retq ; ; O2-LABEL: atomic128_store_seq_cst_ptr_ty: ; O2: # %bb.0: # %entry ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection418: ; O2-NEXT: xchgq %rsi, (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: retq ; ; O3-LABEL: atomic128_store_seq_cst_ptr_ty: ; O3: # %bb.0: # %entry ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection418: ; O3-NEXT: xchgq %rsi, (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 store atomic ptr %v, ptr %a seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xchg_monotonic(ptr %a) { ; O0-LABEL: atomic128_xchg_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection456: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection457: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection458: ; O0-NEXT: jmp .LBB208_1 ; O0-NEXT: .LBB208_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection459: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection460: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection461: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection462: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection463: ; O0-NEXT: jne .LBB208_1 ; O0-NEXT: jmp .LBB208_2 ; O0-NEXT: .LBB208_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xchg_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection419: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection420: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection421: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB208_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection422: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection423: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection424: ; O1-NEXT: jne .LBB208_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xchg_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection419: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection420: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection421: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB208_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection422: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection423: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection424: ; O2-NEXT: jne .LBB208_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xchg_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection419: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection420: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection421: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB208_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection422: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection423: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection424: ; O3-NEXT: jne .LBB208_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i128 42 monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_add_monotonic(ptr %a) { ; O0-LABEL: atomic128_add_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection464: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection465: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection466: ; O0-NEXT: jmp .LBB209_1 ; O0-NEXT: .LBB209_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection467: ; O0-NEXT: addq $42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection468: ; O0-NEXT: adcq $0, %rcx ; O0-NEXT: .Lpcsection469: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection470: ; O0-NEXT: jne .LBB209_1 ; O0-NEXT: jmp .LBB209_2 ; O0-NEXT: .LBB209_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_add_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection425: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection426: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB209_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection427: ; O1-NEXT: addq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection428: ; O1-NEXT: adcq $0, %rcx ; O1-NEXT: .Lpcsection429: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection430: ; O1-NEXT: jne .LBB209_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_add_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection425: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection426: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB209_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection427: ; O2-NEXT: addq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection428: ; O2-NEXT: adcq $0, %rcx ; O2-NEXT: .Lpcsection429: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection430: ; O2-NEXT: jne .LBB209_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_add_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection425: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection426: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB209_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection427: ; O3-NEXT: addq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection428: ; O3-NEXT: adcq $0, %rcx ; O3-NEXT: .Lpcsection429: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection430: ; O3-NEXT: jne .LBB209_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i128 42 monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_sub_monotonic(ptr %a) { ; O0-LABEL: atomic128_sub_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection471: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection472: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection473: ; O0-NEXT: jmp .LBB210_1 ; O0-NEXT: .LBB210_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection474: ; O0-NEXT: addq $-42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection475: ; O0-NEXT: adcq $-1, %rcx ; O0-NEXT: .Lpcsection476: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection477: ; O0-NEXT: jne .LBB210_1 ; O0-NEXT: jmp .LBB210_2 ; O0-NEXT: .LBB210_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_sub_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection431: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection432: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB210_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection433: ; O1-NEXT: addq $-42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection434: ; O1-NEXT: adcq $-1, %rcx ; O1-NEXT: .Lpcsection435: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection436: ; O1-NEXT: jne .LBB210_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_sub_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection431: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection432: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB210_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection433: ; O2-NEXT: addq $-42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection434: ; O2-NEXT: adcq $-1, %rcx ; O2-NEXT: .Lpcsection435: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection436: ; O2-NEXT: jne .LBB210_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_sub_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection431: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection432: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB210_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection433: ; O3-NEXT: addq $-42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection434: ; O3-NEXT: adcq $-1, %rcx ; O3-NEXT: .Lpcsection435: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection436: ; O3-NEXT: jne .LBB210_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i128 42 monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_and_monotonic(ptr %a) { ; O0-LABEL: atomic128_and_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection478: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection479: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection480: ; O0-NEXT: jmp .LBB211_1 ; O0-NEXT: .LBB211_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection481: ; O0-NEXT: andl $42, %ecx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection482: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection483: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection484: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection485: ; O0-NEXT: jne .LBB211_1 ; O0-NEXT: jmp .LBB211_2 ; O0-NEXT: .LBB211_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_and_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection437: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection438: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB211_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection439: ; O1-NEXT: andl $42, %ebx ; O1-NEXT: .Lpcsection440: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection441: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection442: ; O1-NEXT: jne .LBB211_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_and_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection437: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection438: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB211_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection439: ; O2-NEXT: andl $42, %ebx ; O2-NEXT: .Lpcsection440: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection441: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection442: ; O2-NEXT: jne .LBB211_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_and_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection437: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection438: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB211_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection439: ; O3-NEXT: andl $42, %ebx ; O3-NEXT: .Lpcsection440: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection441: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection442: ; O3-NEXT: jne .LBB211_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i128 42 monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_or_monotonic(ptr %a) { ; O0-LABEL: atomic128_or_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection486: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection487: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection488: ; O0-NEXT: jmp .LBB212_1 ; O0-NEXT: .LBB212_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection489: ; O0-NEXT: orq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection490: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection491: ; O0-NEXT: jne .LBB212_1 ; O0-NEXT: jmp .LBB212_2 ; O0-NEXT: .LBB212_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_or_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection443: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection444: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB212_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection445: ; O1-NEXT: orq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection446: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection447: ; O1-NEXT: jne .LBB212_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_or_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection443: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection444: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB212_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection445: ; O2-NEXT: orq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection446: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection447: ; O2-NEXT: jne .LBB212_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_or_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection443: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection444: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB212_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection445: ; O3-NEXT: orq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection446: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection447: ; O3-NEXT: jne .LBB212_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i128 42 monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xor_monotonic(ptr %a) { ; O0-LABEL: atomic128_xor_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection492: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection493: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection494: ; O0-NEXT: jmp .LBB213_1 ; O0-NEXT: .LBB213_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection495: ; O0-NEXT: xorq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection496: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection497: ; O0-NEXT: jne .LBB213_1 ; O0-NEXT: jmp .LBB213_2 ; O0-NEXT: .LBB213_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xor_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection448: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection449: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB213_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection450: ; O1-NEXT: xorq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection451: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection452: ; O1-NEXT: jne .LBB213_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xor_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection448: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection449: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB213_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection450: ; O2-NEXT: xorq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection451: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection452: ; O2-NEXT: jne .LBB213_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xor_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection448: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection449: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB213_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection450: ; O3-NEXT: xorq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection451: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection452: ; O3-NEXT: jne .LBB213_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i128 42 monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_nand_monotonic(ptr %a) { ; O0-LABEL: atomic128_nand_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection498: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection499: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection500: ; O0-NEXT: jmp .LBB214_1 ; O0-NEXT: .LBB214_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection501: ; O0-NEXT: notl %ecx ; O0-NEXT: .Lpcsection502: ; O0-NEXT: # implicit-def: $rbx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection503: ; O0-NEXT: orq $-43, %rbx ; O0-NEXT: .Lpcsection504: ; O0-NEXT: movq $-1, %rcx ; O0-NEXT: .Lpcsection505: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection506: ; O0-NEXT: jne .LBB214_1 ; O0-NEXT: jmp .LBB214_2 ; O0-NEXT: .LBB214_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_nand_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection453: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection454: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection455: ; O1-NEXT: movq $-1, %rcx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB214_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection456: ; O1-NEXT: notl %ebx ; O1-NEXT: .Lpcsection457: ; O1-NEXT: orq $-43, %rbx ; O1-NEXT: .Lpcsection458: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection459: ; O1-NEXT: jne .LBB214_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_nand_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection453: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection454: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection455: ; O2-NEXT: movq $-1, %rcx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB214_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection456: ; O2-NEXT: notl %ebx ; O2-NEXT: .Lpcsection457: ; O2-NEXT: orq $-43, %rbx ; O2-NEXT: .Lpcsection458: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection459: ; O2-NEXT: jne .LBB214_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_nand_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection453: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection454: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection455: ; O3-NEXT: movq $-1, %rcx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB214_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection456: ; O3-NEXT: notl %ebx ; O3-NEXT: .Lpcsection457: ; O3-NEXT: orq $-43, %rbx ; O3-NEXT: .Lpcsection458: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection459: ; O3-NEXT: jne .LBB214_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i128 42 monotonic, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xchg_acquire(ptr %a) { ; O0-LABEL: atomic128_xchg_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection507: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection508: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection509: ; O0-NEXT: jmp .LBB215_1 ; O0-NEXT: .LBB215_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection510: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection511: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection512: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection513: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection514: ; O0-NEXT: jne .LBB215_1 ; O0-NEXT: jmp .LBB215_2 ; O0-NEXT: .LBB215_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xchg_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection460: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection461: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection462: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB215_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection463: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection464: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection465: ; O1-NEXT: jne .LBB215_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xchg_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection460: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection461: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection462: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB215_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection463: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection464: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection465: ; O2-NEXT: jne .LBB215_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xchg_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection460: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection461: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection462: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB215_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection463: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection464: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection465: ; O3-NEXT: jne .LBB215_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i128 42 acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_add_acquire(ptr %a) { ; O0-LABEL: atomic128_add_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection515: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection516: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection517: ; O0-NEXT: jmp .LBB216_1 ; O0-NEXT: .LBB216_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection518: ; O0-NEXT: addq $42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection519: ; O0-NEXT: adcq $0, %rcx ; O0-NEXT: .Lpcsection520: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection521: ; O0-NEXT: jne .LBB216_1 ; O0-NEXT: jmp .LBB216_2 ; O0-NEXT: .LBB216_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_add_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection466: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection467: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB216_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection468: ; O1-NEXT: addq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection469: ; O1-NEXT: adcq $0, %rcx ; O1-NEXT: .Lpcsection470: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection471: ; O1-NEXT: jne .LBB216_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_add_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection466: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection467: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB216_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection468: ; O2-NEXT: addq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection469: ; O2-NEXT: adcq $0, %rcx ; O2-NEXT: .Lpcsection470: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection471: ; O2-NEXT: jne .LBB216_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_add_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection466: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection467: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB216_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection468: ; O3-NEXT: addq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection469: ; O3-NEXT: adcq $0, %rcx ; O3-NEXT: .Lpcsection470: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection471: ; O3-NEXT: jne .LBB216_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i128 42 acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_sub_acquire(ptr %a) { ; O0-LABEL: atomic128_sub_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection522: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection523: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection524: ; O0-NEXT: jmp .LBB217_1 ; O0-NEXT: .LBB217_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection525: ; O0-NEXT: addq $-42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection526: ; O0-NEXT: adcq $-1, %rcx ; O0-NEXT: .Lpcsection527: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection528: ; O0-NEXT: jne .LBB217_1 ; O0-NEXT: jmp .LBB217_2 ; O0-NEXT: .LBB217_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_sub_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection472: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection473: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB217_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection474: ; O1-NEXT: addq $-42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection475: ; O1-NEXT: adcq $-1, %rcx ; O1-NEXT: .Lpcsection476: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection477: ; O1-NEXT: jne .LBB217_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_sub_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection472: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection473: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB217_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection474: ; O2-NEXT: addq $-42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection475: ; O2-NEXT: adcq $-1, %rcx ; O2-NEXT: .Lpcsection476: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection477: ; O2-NEXT: jne .LBB217_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_sub_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection472: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection473: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB217_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection474: ; O3-NEXT: addq $-42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection475: ; O3-NEXT: adcq $-1, %rcx ; O3-NEXT: .Lpcsection476: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection477: ; O3-NEXT: jne .LBB217_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i128 42 acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_and_acquire(ptr %a) { ; O0-LABEL: atomic128_and_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection529: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection530: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection531: ; O0-NEXT: jmp .LBB218_1 ; O0-NEXT: .LBB218_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection532: ; O0-NEXT: andl $42, %ecx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection533: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection534: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection535: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection536: ; O0-NEXT: jne .LBB218_1 ; O0-NEXT: jmp .LBB218_2 ; O0-NEXT: .LBB218_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_and_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection478: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection479: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB218_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection480: ; O1-NEXT: andl $42, %ebx ; O1-NEXT: .Lpcsection481: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection482: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection483: ; O1-NEXT: jne .LBB218_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_and_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection478: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection479: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB218_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection480: ; O2-NEXT: andl $42, %ebx ; O2-NEXT: .Lpcsection481: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection482: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection483: ; O2-NEXT: jne .LBB218_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_and_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection478: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection479: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB218_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection480: ; O3-NEXT: andl $42, %ebx ; O3-NEXT: .Lpcsection481: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection482: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection483: ; O3-NEXT: jne .LBB218_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i128 42 acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_or_acquire(ptr %a) { ; O0-LABEL: atomic128_or_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection537: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection538: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection539: ; O0-NEXT: jmp .LBB219_1 ; O0-NEXT: .LBB219_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection540: ; O0-NEXT: orq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection541: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection542: ; O0-NEXT: jne .LBB219_1 ; O0-NEXT: jmp .LBB219_2 ; O0-NEXT: .LBB219_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_or_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection484: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection485: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB219_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection486: ; O1-NEXT: orq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection487: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection488: ; O1-NEXT: jne .LBB219_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_or_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection484: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection485: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB219_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection486: ; O2-NEXT: orq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection487: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection488: ; O2-NEXT: jne .LBB219_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_or_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection484: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection485: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB219_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection486: ; O3-NEXT: orq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection487: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection488: ; O3-NEXT: jne .LBB219_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i128 42 acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xor_acquire(ptr %a) { ; O0-LABEL: atomic128_xor_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection543: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection544: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection545: ; O0-NEXT: jmp .LBB220_1 ; O0-NEXT: .LBB220_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection546: ; O0-NEXT: xorq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection547: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection548: ; O0-NEXT: jne .LBB220_1 ; O0-NEXT: jmp .LBB220_2 ; O0-NEXT: .LBB220_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xor_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection489: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection490: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB220_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection491: ; O1-NEXT: xorq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection492: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection493: ; O1-NEXT: jne .LBB220_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xor_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection489: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection490: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB220_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection491: ; O2-NEXT: xorq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection492: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection493: ; O2-NEXT: jne .LBB220_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xor_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection489: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection490: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB220_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection491: ; O3-NEXT: xorq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection492: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection493: ; O3-NEXT: jne .LBB220_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i128 42 acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_nand_acquire(ptr %a) { ; O0-LABEL: atomic128_nand_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection549: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection550: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection551: ; O0-NEXT: jmp .LBB221_1 ; O0-NEXT: .LBB221_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection552: ; O0-NEXT: notl %ecx ; O0-NEXT: .Lpcsection553: ; O0-NEXT: # implicit-def: $rbx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection554: ; O0-NEXT: orq $-43, %rbx ; O0-NEXT: .Lpcsection555: ; O0-NEXT: movq $-1, %rcx ; O0-NEXT: .Lpcsection556: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection557: ; O0-NEXT: jne .LBB221_1 ; O0-NEXT: jmp .LBB221_2 ; O0-NEXT: .LBB221_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_nand_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection494: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection495: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection496: ; O1-NEXT: movq $-1, %rcx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB221_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection497: ; O1-NEXT: notl %ebx ; O1-NEXT: .Lpcsection498: ; O1-NEXT: orq $-43, %rbx ; O1-NEXT: .Lpcsection499: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection500: ; O1-NEXT: jne .LBB221_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_nand_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection494: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection495: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection496: ; O2-NEXT: movq $-1, %rcx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB221_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection497: ; O2-NEXT: notl %ebx ; O2-NEXT: .Lpcsection498: ; O2-NEXT: orq $-43, %rbx ; O2-NEXT: .Lpcsection499: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection500: ; O2-NEXT: jne .LBB221_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_nand_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection494: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection495: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection496: ; O3-NEXT: movq $-1, %rcx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB221_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection497: ; O3-NEXT: notl %ebx ; O3-NEXT: .Lpcsection498: ; O3-NEXT: orq $-43, %rbx ; O3-NEXT: .Lpcsection499: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection500: ; O3-NEXT: jne .LBB221_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i128 42 acquire, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xchg_release(ptr %a) { ; O0-LABEL: atomic128_xchg_release: ; O0: # %bb.0: ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection558: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection559: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection560: ; O0-NEXT: jmp .LBB222_1 ; O0-NEXT: .LBB222_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection561: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection562: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection563: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection564: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection565: ; O0-NEXT: jne .LBB222_1 ; O0-NEXT: jmp .LBB222_2 ; O0-NEXT: .LBB222_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xchg_release: ; O1: # %bb.0: ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection501: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection502: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection503: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB222_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection504: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection505: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection506: ; O1-NEXT: jne .LBB222_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xchg_release: ; O2: # %bb.0: ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection501: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection502: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection503: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB222_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection504: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection505: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection506: ; O2-NEXT: jne .LBB222_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xchg_release: ; O3: # %bb.0: ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection501: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection502: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection503: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB222_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection504: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection505: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection506: ; O3-NEXT: jne .LBB222_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i128 42 release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_add_release(ptr %a) { ; O0-LABEL: atomic128_add_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection566: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection567: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection568: ; O0-NEXT: jmp .LBB223_1 ; O0-NEXT: .LBB223_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection569: ; O0-NEXT: addq $42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection570: ; O0-NEXT: adcq $0, %rcx ; O0-NEXT: .Lpcsection571: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection572: ; O0-NEXT: jne .LBB223_1 ; O0-NEXT: jmp .LBB223_2 ; O0-NEXT: .LBB223_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_add_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection507: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection508: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB223_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection509: ; O1-NEXT: addq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection510: ; O1-NEXT: adcq $0, %rcx ; O1-NEXT: .Lpcsection511: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection512: ; O1-NEXT: jne .LBB223_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_add_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection507: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection508: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB223_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection509: ; O2-NEXT: addq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection510: ; O2-NEXT: adcq $0, %rcx ; O2-NEXT: .Lpcsection511: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection512: ; O2-NEXT: jne .LBB223_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_add_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection507: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection508: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB223_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection509: ; O3-NEXT: addq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection510: ; O3-NEXT: adcq $0, %rcx ; O3-NEXT: .Lpcsection511: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection512: ; O3-NEXT: jne .LBB223_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i128 42 release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_sub_release(ptr %a) { ; O0-LABEL: atomic128_sub_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection573: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection574: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection575: ; O0-NEXT: jmp .LBB224_1 ; O0-NEXT: .LBB224_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection576: ; O0-NEXT: addq $-42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection577: ; O0-NEXT: adcq $-1, %rcx ; O0-NEXT: .Lpcsection578: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection579: ; O0-NEXT: jne .LBB224_1 ; O0-NEXT: jmp .LBB224_2 ; O0-NEXT: .LBB224_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_sub_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection513: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection514: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB224_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection515: ; O1-NEXT: addq $-42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection516: ; O1-NEXT: adcq $-1, %rcx ; O1-NEXT: .Lpcsection517: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection518: ; O1-NEXT: jne .LBB224_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_sub_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection513: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection514: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB224_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection515: ; O2-NEXT: addq $-42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection516: ; O2-NEXT: adcq $-1, %rcx ; O2-NEXT: .Lpcsection517: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection518: ; O2-NEXT: jne .LBB224_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_sub_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection513: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection514: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB224_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection515: ; O3-NEXT: addq $-42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection516: ; O3-NEXT: adcq $-1, %rcx ; O3-NEXT: .Lpcsection517: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection518: ; O3-NEXT: jne .LBB224_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i128 42 release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_and_release(ptr %a) { ; O0-LABEL: atomic128_and_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection580: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection581: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection582: ; O0-NEXT: jmp .LBB225_1 ; O0-NEXT: .LBB225_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection583: ; O0-NEXT: andl $42, %ecx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection584: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection585: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection586: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection587: ; O0-NEXT: jne .LBB225_1 ; O0-NEXT: jmp .LBB225_2 ; O0-NEXT: .LBB225_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_and_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection519: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection520: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB225_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection521: ; O1-NEXT: andl $42, %ebx ; O1-NEXT: .Lpcsection522: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection523: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection524: ; O1-NEXT: jne .LBB225_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_and_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection519: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection520: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB225_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection521: ; O2-NEXT: andl $42, %ebx ; O2-NEXT: .Lpcsection522: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection523: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection524: ; O2-NEXT: jne .LBB225_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_and_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection519: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection520: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB225_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection521: ; O3-NEXT: andl $42, %ebx ; O3-NEXT: .Lpcsection522: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection523: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection524: ; O3-NEXT: jne .LBB225_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i128 42 release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_or_release(ptr %a) { ; O0-LABEL: atomic128_or_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection588: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection589: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection590: ; O0-NEXT: jmp .LBB226_1 ; O0-NEXT: .LBB226_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection591: ; O0-NEXT: orq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection592: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection593: ; O0-NEXT: jne .LBB226_1 ; O0-NEXT: jmp .LBB226_2 ; O0-NEXT: .LBB226_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_or_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection525: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection526: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB226_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection527: ; O1-NEXT: orq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection528: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection529: ; O1-NEXT: jne .LBB226_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_or_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection525: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection526: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB226_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection527: ; O2-NEXT: orq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection528: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection529: ; O2-NEXT: jne .LBB226_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_or_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection525: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection526: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB226_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection527: ; O3-NEXT: orq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection528: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection529: ; O3-NEXT: jne .LBB226_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i128 42 release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xor_release(ptr %a) { ; O0-LABEL: atomic128_xor_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection594: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection595: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection596: ; O0-NEXT: jmp .LBB227_1 ; O0-NEXT: .LBB227_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection597: ; O0-NEXT: xorq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection598: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection599: ; O0-NEXT: jne .LBB227_1 ; O0-NEXT: jmp .LBB227_2 ; O0-NEXT: .LBB227_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xor_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection530: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection531: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB227_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection532: ; O1-NEXT: xorq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection533: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection534: ; O1-NEXT: jne .LBB227_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xor_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection530: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection531: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB227_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection532: ; O2-NEXT: xorq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection533: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection534: ; O2-NEXT: jne .LBB227_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xor_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection530: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection531: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB227_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection532: ; O3-NEXT: xorq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection533: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection534: ; O3-NEXT: jne .LBB227_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i128 42 release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_nand_release(ptr %a) { ; O0-LABEL: atomic128_nand_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection600: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection601: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection602: ; O0-NEXT: jmp .LBB228_1 ; O0-NEXT: .LBB228_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection603: ; O0-NEXT: notl %ecx ; O0-NEXT: .Lpcsection604: ; O0-NEXT: # implicit-def: $rbx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection605: ; O0-NEXT: orq $-43, %rbx ; O0-NEXT: .Lpcsection606: ; O0-NEXT: movq $-1, %rcx ; O0-NEXT: .Lpcsection607: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection608: ; O0-NEXT: jne .LBB228_1 ; O0-NEXT: jmp .LBB228_2 ; O0-NEXT: .LBB228_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_nand_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection535: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection536: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection537: ; O1-NEXT: movq $-1, %rcx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB228_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection538: ; O1-NEXT: notl %ebx ; O1-NEXT: .Lpcsection539: ; O1-NEXT: orq $-43, %rbx ; O1-NEXT: .Lpcsection540: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection541: ; O1-NEXT: jne .LBB228_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_nand_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection535: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection536: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection537: ; O2-NEXT: movq $-1, %rcx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB228_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection538: ; O2-NEXT: notl %ebx ; O2-NEXT: .Lpcsection539: ; O2-NEXT: orq $-43, %rbx ; O2-NEXT: .Lpcsection540: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection541: ; O2-NEXT: jne .LBB228_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_nand_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection535: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection536: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection537: ; O3-NEXT: movq $-1, %rcx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB228_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection538: ; O3-NEXT: notl %ebx ; O3-NEXT: .Lpcsection539: ; O3-NEXT: orq $-43, %rbx ; O3-NEXT: .Lpcsection540: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection541: ; O3-NEXT: jne .LBB228_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i128 42 release, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xchg_acq_rel(ptr %a) { ; O0-LABEL: atomic128_xchg_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection609: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection610: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection611: ; O0-NEXT: jmp .LBB229_1 ; O0-NEXT: .LBB229_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection612: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection613: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection614: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection615: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection616: ; O0-NEXT: jne .LBB229_1 ; O0-NEXT: jmp .LBB229_2 ; O0-NEXT: .LBB229_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xchg_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection542: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection543: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection544: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB229_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection545: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection546: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection547: ; O1-NEXT: jne .LBB229_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xchg_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection542: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection543: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection544: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB229_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection545: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection546: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection547: ; O2-NEXT: jne .LBB229_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xchg_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection542: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection543: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection544: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB229_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection545: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection546: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection547: ; O3-NEXT: jne .LBB229_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i128 42 acq_rel, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_add_acq_rel(ptr %a) { ; O0-LABEL: atomic128_add_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection617: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection618: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection619: ; O0-NEXT: jmp .LBB230_1 ; O0-NEXT: .LBB230_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection620: ; O0-NEXT: addq $42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection621: ; O0-NEXT: adcq $0, %rcx ; O0-NEXT: .Lpcsection622: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection623: ; O0-NEXT: jne .LBB230_1 ; O0-NEXT: jmp .LBB230_2 ; O0-NEXT: .LBB230_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_add_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection548: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection549: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB230_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection550: ; O1-NEXT: addq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection551: ; O1-NEXT: adcq $0, %rcx ; O1-NEXT: .Lpcsection552: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection553: ; O1-NEXT: jne .LBB230_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_add_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection548: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection549: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB230_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection550: ; O2-NEXT: addq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection551: ; O2-NEXT: adcq $0, %rcx ; O2-NEXT: .Lpcsection552: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection553: ; O2-NEXT: jne .LBB230_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_add_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection548: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection549: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB230_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection550: ; O3-NEXT: addq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection551: ; O3-NEXT: adcq $0, %rcx ; O3-NEXT: .Lpcsection552: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection553: ; O3-NEXT: jne .LBB230_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i128 42 acq_rel, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_sub_acq_rel(ptr %a) { ; O0-LABEL: atomic128_sub_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection624: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection625: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection626: ; O0-NEXT: jmp .LBB231_1 ; O0-NEXT: .LBB231_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection627: ; O0-NEXT: addq $-42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection628: ; O0-NEXT: adcq $-1, %rcx ; O0-NEXT: .Lpcsection629: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection630: ; O0-NEXT: jne .LBB231_1 ; O0-NEXT: jmp .LBB231_2 ; O0-NEXT: .LBB231_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_sub_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection554: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection555: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB231_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection556: ; O1-NEXT: addq $-42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection557: ; O1-NEXT: adcq $-1, %rcx ; O1-NEXT: .Lpcsection558: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection559: ; O1-NEXT: jne .LBB231_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_sub_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection554: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection555: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB231_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection556: ; O2-NEXT: addq $-42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection557: ; O2-NEXT: adcq $-1, %rcx ; O2-NEXT: .Lpcsection558: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection559: ; O2-NEXT: jne .LBB231_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_sub_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection554: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection555: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB231_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection556: ; O3-NEXT: addq $-42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection557: ; O3-NEXT: adcq $-1, %rcx ; O3-NEXT: .Lpcsection558: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection559: ; O3-NEXT: jne .LBB231_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i128 42 acq_rel, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_and_acq_rel(ptr %a) { ; O0-LABEL: atomic128_and_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection631: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection632: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection633: ; O0-NEXT: jmp .LBB232_1 ; O0-NEXT: .LBB232_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection634: ; O0-NEXT: andl $42, %ecx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection635: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection636: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection637: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection638: ; O0-NEXT: jne .LBB232_1 ; O0-NEXT: jmp .LBB232_2 ; O0-NEXT: .LBB232_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_and_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection560: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection561: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB232_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection562: ; O1-NEXT: andl $42, %ebx ; O1-NEXT: .Lpcsection563: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection564: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection565: ; O1-NEXT: jne .LBB232_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_and_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection560: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection561: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB232_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection562: ; O2-NEXT: andl $42, %ebx ; O2-NEXT: .Lpcsection563: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection564: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection565: ; O2-NEXT: jne .LBB232_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_and_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection560: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection561: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB232_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection562: ; O3-NEXT: andl $42, %ebx ; O3-NEXT: .Lpcsection563: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection564: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection565: ; O3-NEXT: jne .LBB232_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i128 42 acq_rel, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_or_acq_rel(ptr %a) { ; O0-LABEL: atomic128_or_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection639: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection640: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection641: ; O0-NEXT: jmp .LBB233_1 ; O0-NEXT: .LBB233_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection642: ; O0-NEXT: orq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection643: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection644: ; O0-NEXT: jne .LBB233_1 ; O0-NEXT: jmp .LBB233_2 ; O0-NEXT: .LBB233_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_or_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection566: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection567: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB233_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection568: ; O1-NEXT: orq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection569: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection570: ; O1-NEXT: jne .LBB233_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_or_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection566: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection567: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB233_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection568: ; O2-NEXT: orq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection569: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection570: ; O2-NEXT: jne .LBB233_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_or_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection566: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection567: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB233_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection568: ; O3-NEXT: orq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection569: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection570: ; O3-NEXT: jne .LBB233_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i128 42 acq_rel, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xor_acq_rel(ptr %a) { ; O0-LABEL: atomic128_xor_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection645: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection646: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection647: ; O0-NEXT: jmp .LBB234_1 ; O0-NEXT: .LBB234_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection648: ; O0-NEXT: xorq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection649: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection650: ; O0-NEXT: jne .LBB234_1 ; O0-NEXT: jmp .LBB234_2 ; O0-NEXT: .LBB234_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xor_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection571: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection572: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB234_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection573: ; O1-NEXT: xorq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection574: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection575: ; O1-NEXT: jne .LBB234_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xor_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection571: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection572: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB234_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection573: ; O2-NEXT: xorq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection574: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection575: ; O2-NEXT: jne .LBB234_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xor_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection571: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection572: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB234_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection573: ; O3-NEXT: xorq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection574: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection575: ; O3-NEXT: jne .LBB234_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i128 42 acq_rel, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_nand_acq_rel(ptr %a) { ; O0-LABEL: atomic128_nand_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection651: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection652: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection653: ; O0-NEXT: jmp .LBB235_1 ; O0-NEXT: .LBB235_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection654: ; O0-NEXT: notl %ecx ; O0-NEXT: .Lpcsection655: ; O0-NEXT: # implicit-def: $rbx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection656: ; O0-NEXT: orq $-43, %rbx ; O0-NEXT: .Lpcsection657: ; O0-NEXT: movq $-1, %rcx ; O0-NEXT: .Lpcsection658: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection659: ; O0-NEXT: jne .LBB235_1 ; O0-NEXT: jmp .LBB235_2 ; O0-NEXT: .LBB235_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_nand_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection576: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection577: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection578: ; O1-NEXT: movq $-1, %rcx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB235_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection579: ; O1-NEXT: notl %ebx ; O1-NEXT: .Lpcsection580: ; O1-NEXT: orq $-43, %rbx ; O1-NEXT: .Lpcsection581: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection582: ; O1-NEXT: jne .LBB235_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_nand_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection576: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection577: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection578: ; O2-NEXT: movq $-1, %rcx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB235_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection579: ; O2-NEXT: notl %ebx ; O2-NEXT: .Lpcsection580: ; O2-NEXT: orq $-43, %rbx ; O2-NEXT: .Lpcsection581: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection582: ; O2-NEXT: jne .LBB235_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_nand_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection576: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection577: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection578: ; O3-NEXT: movq $-1, %rcx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB235_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection579: ; O3-NEXT: notl %ebx ; O3-NEXT: .Lpcsection580: ; O3-NEXT: orq $-43, %rbx ; O3-NEXT: .Lpcsection581: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection582: ; O3-NEXT: jne .LBB235_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i128 42 acq_rel, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xchg_seq_cst(ptr %a) { ; O0-LABEL: atomic128_xchg_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection660: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection661: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection662: ; O0-NEXT: jmp .LBB236_1 ; O0-NEXT: .LBB236_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: .Lpcsection663: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection664: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection665: ; O0-NEXT: movl $42, %ebx ; O0-NEXT: .Lpcsection666: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection667: ; O0-NEXT: jne .LBB236_1 ; O0-NEXT: jmp .LBB236_2 ; O0-NEXT: .LBB236_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xchg_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection583: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection584: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection585: ; O1-NEXT: movl $42, %ebx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB236_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: .Lpcsection586: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection587: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection588: ; O1-NEXT: jne .LBB236_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xchg_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection583: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection584: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection585: ; O2-NEXT: movl $42, %ebx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB236_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: .Lpcsection586: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection587: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection588: ; O2-NEXT: jne .LBB236_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xchg_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection583: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection584: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection585: ; O3-NEXT: movl $42, %ebx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB236_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: .Lpcsection586: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection587: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection588: ; O3-NEXT: jne .LBB236_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xchg ptr %a, i128 42 seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_add_seq_cst(ptr %a) { ; O0-LABEL: atomic128_add_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection668: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection669: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection670: ; O0-NEXT: jmp .LBB237_1 ; O0-NEXT: .LBB237_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection671: ; O0-NEXT: addq $42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection672: ; O0-NEXT: adcq $0, %rcx ; O0-NEXT: .Lpcsection673: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection674: ; O0-NEXT: jne .LBB237_1 ; O0-NEXT: jmp .LBB237_2 ; O0-NEXT: .LBB237_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_add_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection589: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection590: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB237_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection591: ; O1-NEXT: addq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection592: ; O1-NEXT: adcq $0, %rcx ; O1-NEXT: .Lpcsection593: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection594: ; O1-NEXT: jne .LBB237_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_add_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection589: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection590: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB237_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection591: ; O2-NEXT: addq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection592: ; O2-NEXT: adcq $0, %rcx ; O2-NEXT: .Lpcsection593: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection594: ; O2-NEXT: jne .LBB237_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_add_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection589: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection590: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB237_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection591: ; O3-NEXT: addq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection592: ; O3-NEXT: adcq $0, %rcx ; O3-NEXT: .Lpcsection593: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection594: ; O3-NEXT: jne .LBB237_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw add ptr %a, i128 42 seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_sub_seq_cst(ptr %a) { ; O0-LABEL: atomic128_sub_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection675: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection676: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection677: ; O0-NEXT: jmp .LBB238_1 ; O0-NEXT: .LBB238_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection678: ; O0-NEXT: addq $-42, %rbx ; O0-NEXT: movq %rdx, %rcx ; O0-NEXT: .Lpcsection679: ; O0-NEXT: adcq $-1, %rcx ; O0-NEXT: .Lpcsection680: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection681: ; O0-NEXT: jne .LBB238_1 ; O0-NEXT: jmp .LBB238_2 ; O0-NEXT: .LBB238_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_sub_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection595: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection596: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB238_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection597: ; O1-NEXT: addq $-42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection598: ; O1-NEXT: adcq $-1, %rcx ; O1-NEXT: .Lpcsection599: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection600: ; O1-NEXT: jne .LBB238_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_sub_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection595: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection596: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB238_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection597: ; O2-NEXT: addq $-42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection598: ; O2-NEXT: adcq $-1, %rcx ; O2-NEXT: .Lpcsection599: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection600: ; O2-NEXT: jne .LBB238_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_sub_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection595: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection596: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB238_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection597: ; O3-NEXT: addq $-42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection598: ; O3-NEXT: adcq $-1, %rcx ; O3-NEXT: .Lpcsection599: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection600: ; O3-NEXT: jne .LBB238_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw sub ptr %a, i128 42 seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_and_seq_cst(ptr %a) { ; O0-LABEL: atomic128_and_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection682: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection683: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection684: ; O0-NEXT: jmp .LBB239_1 ; O0-NEXT: .LBB239_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection685: ; O0-NEXT: andl $42, %ecx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection686: ; O0-NEXT: xorl %ecx, %ecx ; O0-NEXT: .Lpcsection687: ; O0-NEXT: # kill: def $rcx killed $ecx ; O0-NEXT: .Lpcsection688: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection689: ; O0-NEXT: jne .LBB239_1 ; O0-NEXT: jmp .LBB239_2 ; O0-NEXT: .LBB239_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_and_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection601: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection602: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB239_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection603: ; O1-NEXT: andl $42, %ebx ; O1-NEXT: .Lpcsection604: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection605: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection606: ; O1-NEXT: jne .LBB239_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_and_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection601: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection602: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB239_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection603: ; O2-NEXT: andl $42, %ebx ; O2-NEXT: .Lpcsection604: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection605: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection606: ; O2-NEXT: jne .LBB239_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_and_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection601: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection602: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB239_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection603: ; O3-NEXT: andl $42, %ebx ; O3-NEXT: .Lpcsection604: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection605: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection606: ; O3-NEXT: jne .LBB239_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw and ptr %a, i128 42 seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_or_seq_cst(ptr %a) { ; O0-LABEL: atomic128_or_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection690: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection691: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection692: ; O0-NEXT: jmp .LBB240_1 ; O0-NEXT: .LBB240_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection693: ; O0-NEXT: orq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection694: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection695: ; O0-NEXT: jne .LBB240_1 ; O0-NEXT: jmp .LBB240_2 ; O0-NEXT: .LBB240_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_or_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection607: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection608: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB240_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection609: ; O1-NEXT: orq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection610: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection611: ; O1-NEXT: jne .LBB240_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_or_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection607: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection608: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB240_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection609: ; O2-NEXT: orq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection610: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection611: ; O2-NEXT: jne .LBB240_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_or_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection607: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection608: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB240_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection609: ; O3-NEXT: orq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection610: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection611: ; O3-NEXT: jne .LBB240_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw or ptr %a, i128 42 seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_xor_seq_cst(ptr %a) { ; O0-LABEL: atomic128_xor_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection696: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection697: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection698: ; O0-NEXT: jmp .LBB241_1 ; O0-NEXT: .LBB241_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movq %rax, %rbx ; O0-NEXT: .Lpcsection699: ; O0-NEXT: xorq $42, %rbx ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection700: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection701: ; O0-NEXT: jne .LBB241_1 ; O0-NEXT: jmp .LBB241_2 ; O0-NEXT: .LBB241_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_xor_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection612: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection613: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB241_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movq %rax, %rbx ; O1-NEXT: .Lpcsection614: ; O1-NEXT: xorq $42, %rbx ; O1-NEXT: movq %rdx, %rcx ; O1-NEXT: .Lpcsection615: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection616: ; O1-NEXT: jne .LBB241_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_xor_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection612: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection613: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB241_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movq %rax, %rbx ; O2-NEXT: .Lpcsection614: ; O2-NEXT: xorq $42, %rbx ; O2-NEXT: movq %rdx, %rcx ; O2-NEXT: .Lpcsection615: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection616: ; O2-NEXT: jne .LBB241_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_xor_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection612: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection613: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB241_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movq %rax, %rbx ; O3-NEXT: .Lpcsection614: ; O3-NEXT: xorq $42, %rbx ; O3-NEXT: movq %rdx, %rcx ; O3-NEXT: .Lpcsection615: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection616: ; O3-NEXT: jne .LBB241_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw xor ptr %a, i128 42 seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_nand_seq_cst(ptr %a) { ; O0-LABEL: atomic128_nand_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection702: ; O0-NEXT: movq (%rdi), %rax ; O0-NEXT: .Lpcsection703: ; O0-NEXT: movq 8(%rdi), %rdx ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection704: ; O0-NEXT: jmp .LBB242_1 ; O0-NEXT: .LBB242_1: # %atomicrmw.start ; O0-NEXT: # =>This Inner Loop Header: Depth=1 ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: .Lpcsection705: ; O0-NEXT: notl %ecx ; O0-NEXT: .Lpcsection706: ; O0-NEXT: # implicit-def: $rbx ; O0-NEXT: movl %ecx, %ebx ; O0-NEXT: .Lpcsection707: ; O0-NEXT: orq $-43, %rbx ; O0-NEXT: .Lpcsection708: ; O0-NEXT: movq $-1, %rcx ; O0-NEXT: .Lpcsection709: ; O0-NEXT: lock cmpxchg16b (%rsi) ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection710: ; O0-NEXT: jne .LBB242_1 ; O0-NEXT: jmp .LBB242_2 ; O0-NEXT: .LBB242_2: # %atomicrmw.end ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_nand_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection617: ; O1-NEXT: movq (%rdi), %rax ; O1-NEXT: .Lpcsection618: ; O1-NEXT: movq 8(%rdi), %rdx ; O1-NEXT: .Lpcsection619: ; O1-NEXT: movq $-1, %rcx ; O1-NEXT: .p2align 4, 0x90 ; O1-NEXT: .LBB242_1: # %atomicrmw.start ; O1-NEXT: # =>This Inner Loop Header: Depth=1 ; O1-NEXT: movl %eax, %ebx ; O1-NEXT: .Lpcsection620: ; O1-NEXT: notl %ebx ; O1-NEXT: .Lpcsection621: ; O1-NEXT: orq $-43, %rbx ; O1-NEXT: .Lpcsection622: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection623: ; O1-NEXT: jne .LBB242_1 ; O1-NEXT: # %bb.2: # %atomicrmw.end ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_nand_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection617: ; O2-NEXT: movq (%rdi), %rax ; O2-NEXT: .Lpcsection618: ; O2-NEXT: movq 8(%rdi), %rdx ; O2-NEXT: .Lpcsection619: ; O2-NEXT: movq $-1, %rcx ; O2-NEXT: .p2align 4, 0x90 ; O2-NEXT: .LBB242_1: # %atomicrmw.start ; O2-NEXT: # =>This Inner Loop Header: Depth=1 ; O2-NEXT: movl %eax, %ebx ; O2-NEXT: .Lpcsection620: ; O2-NEXT: notl %ebx ; O2-NEXT: .Lpcsection621: ; O2-NEXT: orq $-43, %rbx ; O2-NEXT: .Lpcsection622: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection623: ; O2-NEXT: jne .LBB242_1 ; O2-NEXT: # %bb.2: # %atomicrmw.end ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_nand_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection617: ; O3-NEXT: movq (%rdi), %rax ; O3-NEXT: .Lpcsection618: ; O3-NEXT: movq 8(%rdi), %rdx ; O3-NEXT: .Lpcsection619: ; O3-NEXT: movq $-1, %rcx ; O3-NEXT: .p2align 4, 0x90 ; O3-NEXT: .LBB242_1: # %atomicrmw.start ; O3-NEXT: # =>This Inner Loop Header: Depth=1 ; O3-NEXT: movl %eax, %ebx ; O3-NEXT: .Lpcsection620: ; O3-NEXT: notl %ebx ; O3-NEXT: .Lpcsection621: ; O3-NEXT: orq $-43, %rbx ; O3-NEXT: .Lpcsection622: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection623: ; O3-NEXT: jne .LBB242_1 ; O3-NEXT: # %bb.2: # %atomicrmw.end ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = atomicrmw nand ptr %a, i128 42 seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_cas_monotonic(ptr %a) { ; O0-LABEL: atomic128_cas_monotonic: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection711: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection712: ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection713: ; O0-NEXT: movl $1, %ebx ; O0-NEXT: movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection714: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection715: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection716: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection717: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection718: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_cas_monotonic: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection624: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection625: ; O1-NEXT: movl $1, %ebx ; O1-NEXT: .Lpcsection626: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection627: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection628: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection629: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection630: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection631: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection632: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection633: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection634: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection635: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection636: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_cas_monotonic: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection624: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection625: ; O2-NEXT: movl $1, %ebx ; O2-NEXT: .Lpcsection626: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection627: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection628: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection629: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection630: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection631: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection632: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection633: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection634: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection635: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection636: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_cas_monotonic: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection624: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection625: ; O3-NEXT: movl $1, %ebx ; O3-NEXT: .Lpcsection626: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection627: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection628: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection629: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection630: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection631: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection632: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection633: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection634: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection635: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection636: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i128 42, i128 1 monotonic monotonic, align 16, !pcsections !0 %y = cmpxchg ptr %a, i128 42, i128 1 monotonic acquire, align 16, !pcsections !0 %z = cmpxchg ptr %a, i128 42, i128 1 monotonic seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_cas_acquire(ptr %a) { ; O0-LABEL: atomic128_cas_acquire: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection719: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection720: ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection721: ; O0-NEXT: movl $1, %ebx ; O0-NEXT: movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection722: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection723: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection724: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection725: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection726: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_cas_acquire: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection637: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection638: ; O1-NEXT: movl $1, %ebx ; O1-NEXT: .Lpcsection639: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection640: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection641: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection642: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection643: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection644: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection645: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection646: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection647: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection648: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection649: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_cas_acquire: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection637: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection638: ; O2-NEXT: movl $1, %ebx ; O2-NEXT: .Lpcsection639: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection640: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection641: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection642: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection643: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection644: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection645: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection646: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection647: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection648: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection649: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_cas_acquire: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection637: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection638: ; O3-NEXT: movl $1, %ebx ; O3-NEXT: .Lpcsection639: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection640: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection641: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection642: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection643: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection644: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection645: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection646: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection647: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection648: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection649: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i128 42, i128 1 acquire monotonic, align 16, !pcsections !0 %y = cmpxchg ptr %a, i128 42, i128 1 acquire acquire, align 16, !pcsections !0 %z = cmpxchg ptr %a, i128 42, i128 1 acquire seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_cas_release(ptr %a) { ; O0-LABEL: atomic128_cas_release: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection727: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection728: ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection729: ; O0-NEXT: movl $1, %ebx ; O0-NEXT: movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection730: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection731: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection732: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection733: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection734: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_cas_release: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection650: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection651: ; O1-NEXT: movl $1, %ebx ; O1-NEXT: .Lpcsection652: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection653: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection654: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection655: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection656: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection657: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection658: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection659: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection660: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection661: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection662: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_cas_release: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection650: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection651: ; O2-NEXT: movl $1, %ebx ; O2-NEXT: .Lpcsection652: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection653: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection654: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection655: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection656: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection657: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection658: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection659: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection660: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection661: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection662: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_cas_release: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection650: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection651: ; O3-NEXT: movl $1, %ebx ; O3-NEXT: .Lpcsection652: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection653: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection654: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection655: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection656: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection657: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection658: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection659: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection660: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection661: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection662: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i128 42, i128 1 release monotonic, align 16, !pcsections !0 %y = cmpxchg ptr %a, i128 42, i128 1 release acquire, align 16, !pcsections !0 %z = cmpxchg ptr %a, i128 42, i128 1 release seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_cas_acq_rel(ptr %a) { ; O0-LABEL: atomic128_cas_acq_rel: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection735: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection736: ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection737: ; O0-NEXT: movl $1, %ebx ; O0-NEXT: movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection738: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection739: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection740: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection741: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection742: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $1, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_cas_acq_rel: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection663: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection664: ; O1-NEXT: movl $1, %ebx ; O1-NEXT: .Lpcsection665: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection666: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection667: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection668: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection669: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection670: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection671: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection672: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection673: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection674: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection675: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $1, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_cas_acq_rel: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection663: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection664: ; O2-NEXT: movl $1, %ebx ; O2-NEXT: .Lpcsection665: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection666: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection667: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection668: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection669: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection670: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection671: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection672: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection673: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection674: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection675: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $1, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_cas_acq_rel: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection663: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection664: ; O3-NEXT: movl $1, %ebx ; O3-NEXT: .Lpcsection665: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection666: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection667: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection668: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection669: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection670: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection671: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection672: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection673: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection674: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection675: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $1, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i128 42, i128 1 acq_rel monotonic, align 16, !pcsections !0 %y = cmpxchg ptr %a, i128 42, i128 1 acq_rel acquire, align 16, !pcsections !0 %z = cmpxchg ptr %a, i128 42, i128 1 acq_rel seq_cst, align 16, !pcsections !0 store volatile i64 1, ptr @foo, align 8 ret void } define void @atomic128_cas_seq_cst(ptr %a) { ; O0-LABEL: atomic128_cas_seq_cst: ; O0: # %bb.0: # %entry ; O0-NEXT: pushq %rbx ; O0-NEXT: .cfi_def_cfa_offset 16 ; O0-NEXT: .cfi_offset %rbx, -16 ; O0-NEXT: movq foo(%rip), %rax ; O0-NEXT: .Lpcsection743: ; O0-NEXT: xorl %eax, %eax ; O0-NEXT: movl %eax, %ecx ; O0-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection744: ; O0-NEXT: movl $42, %eax ; O0-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: .Lpcsection745: ; O0-NEXT: movl $1, %ebx ; O0-NEXT: movq %rbx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection746: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection747: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection748: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload ; O0-NEXT: .Lpcsection749: ; O0-NEXT: # kill: def $rsi killed $rax ; O0-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload ; O0-NEXT: movq %rcx, %rdx ; O0-NEXT: .Lpcsection750: ; O0-NEXT: lock cmpxchg16b (%rdi) ; O0-NEXT: movq $3, foo ; O0-NEXT: popq %rbx ; O0-NEXT: .cfi_def_cfa_offset 8 ; O0-NEXT: retq ; ; O1-LABEL: atomic128_cas_seq_cst: ; O1: # %bb.0: # %entry ; O1-NEXT: pushq %rbx ; O1-NEXT: .cfi_def_cfa_offset 16 ; O1-NEXT: .cfi_offset %rbx, -16 ; O1-NEXT: movq foo(%rip), %rax ; O1-NEXT: .Lpcsection676: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection677: ; O1-NEXT: movl $1, %ebx ; O1-NEXT: .Lpcsection678: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection679: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection680: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection681: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection682: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection683: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection684: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: .Lpcsection685: ; O1-NEXT: movl $42, %eax ; O1-NEXT: .Lpcsection686: ; O1-NEXT: xorl %edx, %edx ; O1-NEXT: .Lpcsection687: ; O1-NEXT: xorl %ecx, %ecx ; O1-NEXT: .Lpcsection688: ; O1-NEXT: lock cmpxchg16b (%rdi) ; O1-NEXT: movq $3, foo(%rip) ; O1-NEXT: popq %rbx ; O1-NEXT: .cfi_def_cfa_offset 8 ; O1-NEXT: retq ; ; O2-LABEL: atomic128_cas_seq_cst: ; O2: # %bb.0: # %entry ; O2-NEXT: pushq %rbx ; O2-NEXT: .cfi_def_cfa_offset 16 ; O2-NEXT: .cfi_offset %rbx, -16 ; O2-NEXT: movq foo(%rip), %rax ; O2-NEXT: .Lpcsection676: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection677: ; O2-NEXT: movl $1, %ebx ; O2-NEXT: .Lpcsection678: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection679: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection680: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection681: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection682: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection683: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection684: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: .Lpcsection685: ; O2-NEXT: movl $42, %eax ; O2-NEXT: .Lpcsection686: ; O2-NEXT: xorl %edx, %edx ; O2-NEXT: .Lpcsection687: ; O2-NEXT: xorl %ecx, %ecx ; O2-NEXT: .Lpcsection688: ; O2-NEXT: lock cmpxchg16b (%rdi) ; O2-NEXT: movq $3, foo(%rip) ; O2-NEXT: popq %rbx ; O2-NEXT: .cfi_def_cfa_offset 8 ; O2-NEXT: retq ; ; O3-LABEL: atomic128_cas_seq_cst: ; O3: # %bb.0: # %entry ; O3-NEXT: pushq %rbx ; O3-NEXT: .cfi_def_cfa_offset 16 ; O3-NEXT: .cfi_offset %rbx, -16 ; O3-NEXT: movq foo(%rip), %rax ; O3-NEXT: .Lpcsection676: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection677: ; O3-NEXT: movl $1, %ebx ; O3-NEXT: .Lpcsection678: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection679: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection680: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection681: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection682: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection683: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection684: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: .Lpcsection685: ; O3-NEXT: movl $42, %eax ; O3-NEXT: .Lpcsection686: ; O3-NEXT: xorl %edx, %edx ; O3-NEXT: .Lpcsection687: ; O3-NEXT: xorl %ecx, %ecx ; O3-NEXT: .Lpcsection688: ; O3-NEXT: lock cmpxchg16b (%rdi) ; O3-NEXT: movq $3, foo(%rip) ; O3-NEXT: popq %rbx ; O3-NEXT: .cfi_def_cfa_offset 8 ; O3-NEXT: retq entry: load volatile i64, ptr @foo, align 8 %x = cmpxchg ptr %a, i128 42, i128 1 seq_cst monotonic, align 16, !pcsections !0 %y = cmpxchg ptr %a, i128 42, i128 1 seq_cst acquire, align 16, !pcsections !0 %z = cmpxchg ptr %a, i128 42, i128 1 seq_cst seq_cst, align 16, !pcsections !0 store volatile i64 3, ptr @foo, align 8 ret void } !0 = !{!"somesection"}