6d2b48287ca58cae28e9118dfe6b3e88aaa7727b
[oota-llvm.git] / test / CodeGen / SPARC / atomics.ll
1 ; RUN: llc < %s -march=sparcv9 -verify-machineinstrs | FileCheck %s
2
3 ; CHECK-LABEL: test_atomic_i32
4 ; CHECK:       ld [%o0]
5 ; CHECK:       membar
6 ; CHECK:       ld [%o1]
7 ; CHECK:       membar
8 ; CHECK:       membar
9 ; CHECK:       st {{.+}}, [%o2]
10 define i32 @test_atomic_i32(i32* %ptr1, i32* %ptr2, i32* %ptr3) {
11 entry:
12   %0 = load atomic i32* %ptr1 acquire, align 8
13   %1 = load atomic i32* %ptr2 acquire, align 8
14   %2 = add i32 %0, %1
15   store atomic i32 %2, i32* %ptr3 release, align 8
16   ret i32 %2
17 }
18
19 ; CHECK-LABEL: test_atomic_i64
20 ; CHECK:       ldx [%o0]
21 ; CHECK:       membar
22 ; CHECK:       ldx [%o1]
23 ; CHECK:       membar
24 ; CHECK:       membar
25 ; CHECK:       stx {{.+}}, [%o2]
26 define i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) {
27 entry:
28   %0 = load atomic i64* %ptr1 acquire, align 8
29   %1 = load atomic i64* %ptr2 acquire, align 8
30   %2 = add i64 %0, %1
31   store atomic i64 %2, i64* %ptr3 release, align 8
32   ret i64 %2
33 }
34
35 ; CHECK-LABEL: test_cmpxchg_i32
36 ; CHECK:       or  %g0, 123, [[R:%[gilo][0-7]]]
37 ; CHECK:       cas [%o1], %o0, [[R]]
38
39 define i32 @test_cmpxchg_i32(i32 %a, i32* %ptr) {
40 entry:
41   %b = cmpxchg i32* %ptr, i32 %a, i32 123 monotonic
42   ret i32 %b
43 }
44
45 ; CHECK-LABEL: test_cmpxchg_i64
46 ; CHECK:       or  %g0, 123, [[R:%[gilo][0-7]]]
47 ; CHECK:       casx [%o1], %o0, [[R]]
48
49 define i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) {
50 entry:
51   %b = cmpxchg i64* %ptr, i64 %a, i64 123 monotonic
52   ret i64 %b
53 }
54
55 ; CHECK-LABEL: test_swap_i32
56 ; CHECK:       or  %g0, 42, [[R:%[gilo][0-7]]]
57 ; CHECK:       swap [%o1], [[R]]
58
59 define i32 @test_swap_i32(i32 %a, i32* %ptr) {
60 entry:
61   %b = atomicrmw xchg i32* %ptr, i32 42 monotonic
62   ret i32 %b
63 }
64
65 ; CHECK-LABEL: test_load_add_32
66 ; CHECK: membar
67 ; CHECK: add [[V:%[gilo][0-7]]], %o1, [[U:%[gilo][0-7]]]
68 ; CHECK: cas [%o0], [[V]], [[U]]
69 ; CHECK: membar
70 define zeroext i32 @test_load_add_32(i32* %p, i32 zeroext %v) {
71 entry:
72   %0 = atomicrmw add i32* %p, i32 %v seq_cst
73   ret i32 %0
74 }
75
76 ; CHECK-LABEL: test_load_sub_64
77 ; CHECK: membar
78 ; CHECK: sub
79 ; CHECK: casx [%o0]
80 ; CHECK: membar
81 define zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) {
82 entry:
83   %0 = atomicrmw sub i64* %p, i64 %v seq_cst
84   ret i64 %0
85 }
86
87 ; CHECK-LABEL: test_load_xor_32
88 ; CHECK: membar
89 ; CHECK: xor
90 ; CHECK: cas [%o0]
91 ; CHECK: membar
92 define zeroext i32 @test_load_xor_32(i32* %p, i32 zeroext %v) {
93 entry:
94   %0 = atomicrmw xor i32* %p, i32 %v seq_cst
95   ret i32 %0
96 }
97
98 ; CHECK-LABEL: test_load_and_32
99 ; CHECK: membar
100 ; CHECK: and
101 ; CHECK-NOT: xor
102 ; CHECK: cas [%o0]
103 ; CHECK: membar
104 define zeroext i32 @test_load_and_32(i32* %p, i32 zeroext %v) {
105 entry:
106   %0 = atomicrmw and i32* %p, i32 %v seq_cst
107   ret i32 %0
108 }
109
110 ; CHECK-LABEL: test_load_nand_32
111 ; CHECK: membar
112 ; CHECK: and
113 ; CHECK: xor
114 ; CHECK: cas [%o0]
115 ; CHECK: membar
116 define zeroext i32 @test_load_nand_32(i32* %p, i32 zeroext %v) {
117 entry:
118   %0 = atomicrmw nand i32* %p, i32 %v seq_cst
119   ret i32 %0
120 }
121
122 ; CHECK-LABEL: test_load_max_64
123 ; CHECK: membar
124 ; CHECK: cmp
125 ; CHECK: movg %xcc
126 ; CHECK: casx [%o0]
127 ; CHECK: membar
128 define zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) {
129 entry:
130   %0 = atomicrmw max i64* %p, i64 %v seq_cst
131   ret i64 %0
132 }
133
134 ; CHECK-LABEL: test_load_umin_32
135 ; CHECK: membar
136 ; CHECK: cmp
137 ; CHECK: movleu %icc
138 ; CHECK: cas [%o0]
139 ; CHECK: membar
140 define zeroext i32 @test_load_umin_32(i32* %p, i32 zeroext %v) {
141 entry:
142   %0 = atomicrmw umin i32* %p, i32 %v seq_cst
143   ret i32 %0
144 }