16433 lines
489 KiB
LLVM
16433 lines
489 KiB
LLVM
; 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"}
|