1 ; RUN: llc < %s -O0 -march=x86-64 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X64
2 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -verify-machineinstrs | FileCheck %s --check-prefix X32
3 ; RUN: llc < %s -O0 -march=x86 -mcpu=corei7 -mattr=-cmov -verify-machineinstrs | FileCheck %s --check-prefix NOCMOV
5 ; XFAIL: cygwin,mingw32,win32
7 @sc32 = external global i32
9 define void @atomic_fetch_add32() nounwind {
10 ; X64: atomic_fetch_add32
11 ; X32: atomic_fetch_add32
14 %t1 = atomicrmw add i32* @sc32, i32 1 acquire
19 %t2 = atomicrmw add i32* @sc32, i32 3 acquire
24 %t3 = atomicrmw add i32* @sc32, i32 5 acquire
29 %t4 = atomicrmw add i32* @sc32, i32 %t3 acquire
39 define void @atomic_fetch_sub32() nounwind {
40 ; X64: atomic_fetch_sub32
41 ; X32: atomic_fetch_sub32
42 %t1 = atomicrmw sub i32* @sc32, i32 1 acquire
47 %t2 = atomicrmw sub i32* @sc32, i32 3 acquire
52 %t3 = atomicrmw sub i32* @sc32, i32 5 acquire
57 %t4 = atomicrmw sub i32* @sc32, i32 %t3 acquire
67 define void @atomic_fetch_and32() nounwind {
68 ; X64: atomic_fetch_and32
69 ; X32: atomic_fetch_and32
70 %t1 = atomicrmw and i32* @sc32, i32 3 acquire
75 %t2 = atomicrmw and i32* @sc32, i32 5 acquire
82 %t3 = atomicrmw and i32* @sc32, i32 %t2 acquire
92 define void @atomic_fetch_or32() nounwind {
93 ; X64: atomic_fetch_or32
94 ; X32: atomic_fetch_or32
95 %t1 = atomicrmw or i32* @sc32, i32 3 acquire
100 %t2 = atomicrmw or i32* @sc32, i32 5 acquire
107 %t3 = atomicrmw or i32* @sc32, i32 %t2 acquire
117 define void @atomic_fetch_xor32() nounwind {
118 ; X64: atomic_fetch_xor32
119 ; X32: atomic_fetch_xor32
120 %t1 = atomicrmw xor i32* @sc32, i32 3 acquire
125 %t2 = atomicrmw xor i32* @sc32, i32 5 acquire
132 %t3 = atomicrmw xor i32* @sc32, i32 %t2 acquire
142 define void @atomic_fetch_nand32(i32 %x) nounwind {
143 ; X64: atomic_fetch_nand32
144 ; X32: atomic_fetch_nand32
145 %t1 = atomicrmw nand i32* @sc32, i32 %x acquire
159 define void @atomic_fetch_max32(i32 %x) nounwind {
160 %t1 = atomicrmw max i32* @sc32, i32 %x acquire
181 define void @atomic_fetch_min32(i32 %x) nounwind {
182 %t1 = atomicrmw min i32* @sc32, i32 %x acquire
203 define void @atomic_fetch_umax32(i32 %x) nounwind {
204 %t1 = atomicrmw umax i32* @sc32, i32 %x acquire
225 define void @atomic_fetch_umin32(i32 %x) nounwind {
226 %t1 = atomicrmw umin i32* @sc32, i32 %x acquire
247 define void @atomic_fetch_cmpxchg32() nounwind {
248 %t1 = cmpxchg i32* @sc32, i32 0, i32 1 acquire
258 define void @atomic_fetch_store32(i32 %x) nounwind {
259 store atomic i32 %x, i32* @sc32 release, align 4
269 define void @atomic_fetch_swap32(i32 %x) nounwind {
270 %t1 = atomicrmw xchg i32* @sc32, i32 %x acquire