blob: 6fe333a4be8ee7d59cc6c44958308ecf5e57ce10 [file] [log] [blame]
Jakob Stoklund Olesen05ae2d62014-01-24 06:23:31 +00001; RUN: llc < %s -march=sparcv9 -verify-machineinstrs | FileCheck %s
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +00002
James Y Knightfdcc7272016-05-23 20:33:00 +00003; CHECK-LABEL: test_atomic_i8
4; CHECK: ldub [%o0]
5; CHECK: membar
6; CHECK: ldub [%o1]
7; CHECK: membar
8; CHECK: membar
9; CHECK: stb {{.+}}, [%o2]
10define i8 @test_atomic_i8(i8* %ptr1, i8* %ptr2, i8* %ptr3) {
11entry:
12 %0 = load atomic i8, i8* %ptr1 acquire, align 1
13 %1 = load atomic i8, i8* %ptr2 acquire, align 1
14 %2 = add i8 %0, %1
15 store atomic i8 %2, i8* %ptr3 release, align 1
16 ret i8 %2
17}
18
19; CHECK-LABEL: test_atomic_i16
20; CHECK: lduh [%o0]
21; CHECK: membar
22; CHECK: lduh [%o1]
23; CHECK: membar
24; CHECK: membar
25; CHECK: sth {{.+}}, [%o2]
26define i16 @test_atomic_i16(i16* %ptr1, i16* %ptr2, i16* %ptr3) {
27entry:
28 %0 = load atomic i16, i16* %ptr1 acquire, align 2
29 %1 = load atomic i16, i16* %ptr2 acquire, align 2
30 %2 = add i16 %0, %1
31 store atomic i16 %2, i16* %ptr3 release, align 2
32 ret i16 %2
33}
34
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000035; CHECK-LABEL: test_atomic_i32
36; CHECK: ld [%o0]
37; CHECK: membar
38; CHECK: ld [%o1]
39; CHECK: membar
40; CHECK: membar
41; CHECK: st {{.+}}, [%o2]
42define i32 @test_atomic_i32(i32* %ptr1, i32* %ptr2, i32* %ptr3) {
43entry:
James Y Knightfdcc7272016-05-23 20:33:00 +000044 %0 = load atomic i32, i32* %ptr1 acquire, align 4
45 %1 = load atomic i32, i32* %ptr2 acquire, align 4
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000046 %2 = add i32 %0, %1
James Y Knightfdcc7272016-05-23 20:33:00 +000047 store atomic i32 %2, i32* %ptr3 release, align 4
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000048 ret i32 %2
49}
50
51; CHECK-LABEL: test_atomic_i64
52; CHECK: ldx [%o0]
53; CHECK: membar
54; CHECK: ldx [%o1]
55; CHECK: membar
56; CHECK: membar
57; CHECK: stx {{.+}}, [%o2]
58define i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) {
59entry:
David Blaikiea79ac142015-02-27 21:17:42 +000060 %0 = load atomic i64, i64* %ptr1 acquire, align 8
61 %1 = load atomic i64, i64* %ptr2 acquire, align 8
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000062 %2 = add i64 %0, %1
63 store atomic i64 %2, i64* %ptr3 release, align 8
64 ret i64 %2
65}
66
67; CHECK-LABEL: test_cmpxchg_i32
Tim Northover5896b062014-05-16 09:42:04 +000068; CHECK: mov 123, [[R:%[gilo][0-7]]]
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000069; CHECK: cas [%o1], %o0, [[R]]
70
71define i32 @test_cmpxchg_i32(i32 %a, i32* %ptr) {
72entry:
Tim Northover420a2162014-06-13 14:24:07 +000073 %pair = cmpxchg i32* %ptr, i32 %a, i32 123 monotonic monotonic
74 %b = extractvalue { i32, i1 } %pair, 0
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000075 ret i32 %b
76}
77
78; CHECK-LABEL: test_cmpxchg_i64
Tim Northover5896b062014-05-16 09:42:04 +000079; CHECK: mov 123, [[R:%[gilo][0-7]]]
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000080; CHECK: casx [%o1], %o0, [[R]]
81
82define i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) {
83entry:
Tim Northover420a2162014-06-13 14:24:07 +000084 %pair = cmpxchg i64* %ptr, i64 %a, i64 123 monotonic monotonic
85 %b = extractvalue { i64, i1 } %pair, 0
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000086 ret i64 %b
87}
88
89; CHECK-LABEL: test_swap_i32
Tim Northover5896b062014-05-16 09:42:04 +000090; CHECK: mov 42, [[R:%[gilo][0-7]]]
Venkatraman Govindaraju9a3da522014-01-01 22:11:54 +000091; CHECK: swap [%o1], [[R]]
92
93define i32 @test_swap_i32(i32 %a, i32* %ptr) {
94entry:
95 %b = atomicrmw xchg i32* %ptr, i32 42 monotonic
96 ret i32 %b
97}
Jakob Stoklund Olesen05ae2d62014-01-24 06:23:31 +000098
Jakob Stoklund Olesenef1d59a2014-01-30 04:48:46 +000099; CHECK-LABEL: test_swap_i64
100; CHECK: casx [%o1],
101
102define i64 @test_swap_i64(i64 %a, i64* %ptr) {
103entry:
104 %b = atomicrmw xchg i64* %ptr, i64 42 monotonic
105 ret i64 %b
106}
107
Jakob Stoklund Olesen05ae2d62014-01-24 06:23:31 +0000108; CHECK-LABEL: test_load_add_32
109; CHECK: membar
Jakob Stoklund Olesen39f08332014-01-26 06:09:54 +0000110; CHECK: add [[V:%[gilo][0-7]]], %o1, [[U:%[gilo][0-7]]]
111; CHECK: cas [%o0], [[V]], [[U]]
Jakob Stoklund Olesen05ae2d62014-01-24 06:23:31 +0000112; CHECK: membar
113define zeroext i32 @test_load_add_32(i32* %p, i32 zeroext %v) {
114entry:
115 %0 = atomicrmw add i32* %p, i32 %v seq_cst
116 ret i32 %0
117}
118
119; CHECK-LABEL: test_load_sub_64
120; CHECK: membar
121; CHECK: sub
122; CHECK: casx [%o0]
123; CHECK: membar
124define zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) {
125entry:
126 %0 = atomicrmw sub i64* %p, i64 %v seq_cst
127 ret i64 %0
128}
129
130; CHECK-LABEL: test_load_xor_32
131; CHECK: membar
132; CHECK: xor
133; CHECK: cas [%o0]
134; CHECK: membar
135define zeroext i32 @test_load_xor_32(i32* %p, i32 zeroext %v) {
136entry:
137 %0 = atomicrmw xor i32* %p, i32 %v seq_cst
138 ret i32 %0
139}
140
141; CHECK-LABEL: test_load_and_32
142; CHECK: membar
143; CHECK: and
144; CHECK-NOT: xor
145; CHECK: cas [%o0]
146; CHECK: membar
147define zeroext i32 @test_load_and_32(i32* %p, i32 zeroext %v) {
148entry:
149 %0 = atomicrmw and i32* %p, i32 %v seq_cst
150 ret i32 %0
151}
152
153; CHECK-LABEL: test_load_nand_32
154; CHECK: membar
155; CHECK: and
156; CHECK: xor
157; CHECK: cas [%o0]
158; CHECK: membar
159define zeroext i32 @test_load_nand_32(i32* %p, i32 zeroext %v) {
160entry:
161 %0 = atomicrmw nand i32* %p, i32 %v seq_cst
162 ret i32 %0
163}
164
165; CHECK-LABEL: test_load_max_64
166; CHECK: membar
167; CHECK: cmp
168; CHECK: movg %xcc
169; CHECK: casx [%o0]
170; CHECK: membar
171define zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) {
172entry:
173 %0 = atomicrmw max i64* %p, i64 %v seq_cst
174 ret i64 %0
175}
176
177; CHECK-LABEL: test_load_umin_32
178; CHECK: membar
179; CHECK: cmp
180; CHECK: movleu %icc
181; CHECK: cas [%o0]
182; CHECK: membar
183define zeroext i32 @test_load_umin_32(i32* %p, i32 zeroext %v) {
184entry:
185 %0 = atomicrmw umin i32* %p, i32 %v seq_cst
186 ret i32 %0
187}