blob: 6d2b48287ca58cae28e9118dfe6b3e88aaa7727b [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
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]
10define i32 @test_atomic_i32(i32* %ptr1, i32* %ptr2, i32* %ptr3) {
11entry:
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]
26define i64 @test_atomic_i64(i64* %ptr1, i64* %ptr2, i64* %ptr3) {
27entry:
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
39define i32 @test_cmpxchg_i32(i32 %a, i32* %ptr) {
40entry:
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
49define i64 @test_cmpxchg_i64(i64 %a, i64* %ptr) {
50entry:
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
59define i32 @test_swap_i32(i32 %a, i32* %ptr) {
60entry:
61 %b = atomicrmw xchg i32* %ptr, i32 42 monotonic
62 ret i32 %b
63}
Jakob Stoklund Olesen05ae2d62014-01-24 06:23:31 +000064
65; CHECK-LABEL: test_load_add_32
66; CHECK: membar
Jakob Stoklund Olesen39f08332014-01-26 06:09:54 +000067; CHECK: add [[V:%[gilo][0-7]]], %o1, [[U:%[gilo][0-7]]]
68; CHECK: cas [%o0], [[V]], [[U]]
Jakob Stoklund Olesen05ae2d62014-01-24 06:23:31 +000069; CHECK: membar
70define zeroext i32 @test_load_add_32(i32* %p, i32 zeroext %v) {
71entry:
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
81define zeroext i64 @test_load_sub_64(i64* %p, i64 zeroext %v) {
82entry:
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
92define zeroext i32 @test_load_xor_32(i32* %p, i32 zeroext %v) {
93entry:
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
104define zeroext i32 @test_load_and_32(i32* %p, i32 zeroext %v) {
105entry:
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
116define zeroext i32 @test_load_nand_32(i32* %p, i32 zeroext %v) {
117entry:
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
128define zeroext i64 @test_load_max_64(i64* %p, i64 zeroext %v) {
129entry:
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
140define zeroext i32 @test_load_umin_32(i32* %p, i32 zeroext %v) {
141entry:
142 %0 = atomicrmw umin i32* %p, i32 %v seq_cst
143 ret i32 %0
144}