xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/atomic.ll (revision 7b3bbd83c0c24087072ec5b22a76799ab31f87d5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
3
4;;; Test atomicrmw operations
5
6@c = common global i8 0, align 4
7@s = common global i16 0, align 4
8@i = common global i32 0, align 4
9@l = common global i64 0, align 4
10
11; Function Attrs: norecurse nounwind
12define signext i8 @test_atomic_fetch_add_1() {
13; CHECK-LABEL: test_atomic_fetch_add_1:
14; CHECK:       # %bb.0: # %entry
15; CHECK-NEXT:    fencem 3
16; CHECK-NEXT:    lea %s0, c@lo
17; CHECK-NEXT:    and %s0, %s0, (32)0
18; CHECK-NEXT:    lea.sl %s0, c@hi(, %s0)
19; CHECK-NEXT:    and %s0, -4, %s0
20; CHECK-NEXT:    ldl.sx %s2, (, %s0)
21; CHECK-NEXT:    lea %s1, -256
22; CHECK-NEXT:    and %s1, %s1, (32)0
23; CHECK-NEXT:  .LBB0_1: # %atomicrmw.start
24; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
25; CHECK-NEXT:    or %s3, 0, %s2
26; CHECK-NEXT:    adds.w.sx %s2, 1, %s2
27; CHECK-NEXT:    and %s2, %s2, (56)0
28; CHECK-NEXT:    and %s4, %s3, %s1
29; CHECK-NEXT:    or %s2, %s4, %s2
30; CHECK-NEXT:    cas.w %s2, (%s0), %s3
31; CHECK-NEXT:    brne.w %s2, %s3, .LBB0_1
32; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
33; CHECK-NEXT:    sll %s0, %s2, 56
34; CHECK-NEXT:    sra.l %s0, %s0, 56
35; CHECK-NEXT:    fencem 3
36; CHECK-NEXT:    b.l.t (, %s10)
37entry:
38  %0 = atomicrmw add ptr @c, i8 1 seq_cst
39  ret i8 %0
40}
41
42; Function Attrs: norecurse nounwind
43define signext i16 @test_atomic_fetch_sub_2() {
44; CHECK-LABEL: test_atomic_fetch_sub_2:
45; CHECK:       # %bb.0: # %entry
46; CHECK-NEXT:    fencem 3
47; CHECK-NEXT:    lea %s0, s@lo
48; CHECK-NEXT:    and %s0, %s0, (32)0
49; CHECK-NEXT:    lea.sl %s0, s@hi(, %s0)
50; CHECK-NEXT:    and %s0, -4, %s0
51; CHECK-NEXT:    ldl.sx %s2, (, %s0)
52; CHECK-NEXT:    lea %s1, -65536
53; CHECK-NEXT:    and %s1, %s1, (32)0
54; CHECK-NEXT:  .LBB1_1: # %atomicrmw.start
55; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
56; CHECK-NEXT:    or %s3, 0, %s2
57; CHECK-NEXT:    adds.w.sx %s2, -1, %s2
58; CHECK-NEXT:    and %s2, %s2, (48)0
59; CHECK-NEXT:    and %s4, %s3, %s1
60; CHECK-NEXT:    or %s2, %s4, %s2
61; CHECK-NEXT:    cas.w %s2, (%s0), %s3
62; CHECK-NEXT:    brne.w %s2, %s3, .LBB1_1
63; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
64; CHECK-NEXT:    sll %s0, %s2, 48
65; CHECK-NEXT:    sra.l %s0, %s0, 48
66; CHECK-NEXT:    fencem 3
67; CHECK-NEXT:    b.l.t (, %s10)
68entry:
69  %0 = atomicrmw sub ptr @s, i16 1 seq_cst
70  ret i16 %0
71}
72
73; Function Attrs: norecurse nounwind
74define signext i32 @test_atomic_fetch_and_4() {
75; CHECK-LABEL: test_atomic_fetch_and_4:
76; CHECK:       # %bb.0: # %entry
77; CHECK-NEXT:    fencem 3
78; CHECK-NEXT:    lea %s0, i@lo
79; CHECK-NEXT:    and %s0, %s0, (32)0
80; CHECK-NEXT:    lea.sl %s0, i@hi(, %s0)
81; CHECK-NEXT:    ldl.sx %s1, (, %s0)
82; CHECK-NEXT:  .LBB2_1: # %atomicrmw.start
83; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
84; CHECK-NEXT:    or %s2, 0, %s1
85; CHECK-NEXT:    and %s1, 1, %s2
86; CHECK-NEXT:    cas.w %s1, (%s0), %s2
87; CHECK-NEXT:    brne.w %s1, %s2, .LBB2_1
88; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
89; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
90; CHECK-NEXT:    fencem 3
91; CHECK-NEXT:    b.l.t (, %s10)
92entry:
93  %0 = atomicrmw and ptr @i, i32 1 seq_cst
94  ret i32 %0
95}
96; Function Attrs: norecurse nounwind
97define i64 @test_atomic_fetch_or_8() {
98; CHECK-LABEL: test_atomic_fetch_or_8:
99; CHECK:       # %bb.0: # %entry
100; CHECK-NEXT:    fencem 3
101; CHECK-NEXT:    lea %s0, l@lo
102; CHECK-NEXT:    and %s0, %s0, (32)0
103; CHECK-NEXT:    lea.sl %s1, l@hi(, %s0)
104; CHECK-NEXT:    ld %s0, (, %s1)
105; CHECK-NEXT:  .LBB3_1: # %atomicrmw.start
106; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
107; CHECK-NEXT:    or %s2, 0, %s0
108; CHECK-NEXT:    or %s0, 1, %s0
109; CHECK-NEXT:    cas.l %s0, (%s1), %s2
110; CHECK-NEXT:    brne.l %s0, %s2, .LBB3_1
111; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
112; CHECK-NEXT:    fencem 3
113; CHECK-NEXT:    b.l.t (, %s10)
114entry:
115  %0 = atomicrmw or ptr @l, i64 1 seq_cst
116  ret i64 %0
117}
118
119; Function Attrs: norecurse nounwind
120define signext i8 @test_atomic_fetch_xor_1() {
121; CHECK-LABEL: test_atomic_fetch_xor_1:
122; CHECK:       # %bb.0: # %entry
123; CHECK-NEXT:    fencem 3
124; CHECK-NEXT:    lea %s0, c@lo
125; CHECK-NEXT:    and %s0, %s0, (32)0
126; CHECK-NEXT:    lea.sl %s0, c@hi(, %s0)
127; CHECK-NEXT:    and %s1, -4, %s0
128; CHECK-NEXT:    ldl.sx %s0, (, %s1)
129; CHECK-NEXT:  .LBB4_1: # %atomicrmw.start
130; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
131; CHECK-NEXT:    or %s2, 0, %s0
132; CHECK-NEXT:    xor %s0, 1, %s2
133; CHECK-NEXT:    cas.w %s0, (%s1), %s2
134; CHECK-NEXT:    brne.w %s0, %s2, .LBB4_1
135; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
136; CHECK-NEXT:    sll %s0, %s0, 56
137; CHECK-NEXT:    sra.l %s0, %s0, 56
138; CHECK-NEXT:    fencem 3
139; CHECK-NEXT:    b.l.t (, %s10)
140entry:
141  %0 = atomicrmw xor ptr @c, i8 1 seq_cst
142  ret i8 %0
143}
144
145; Function Attrs: norecurse nounwind
146define signext i16 @test_atomic_fetch_nand_2() {
147; CHECK-LABEL: test_atomic_fetch_nand_2:
148; CHECK:       # %bb.0: # %entry
149; CHECK-NEXT:    fencem 3
150; CHECK-NEXT:    lea %s0, s@lo
151; CHECK-NEXT:    and %s0, %s0, (32)0
152; CHECK-NEXT:    lea.sl %s0, s@hi(, %s0)
153; CHECK-NEXT:    and %s0, -4, %s0
154; CHECK-NEXT:    ldl.sx %s2, (, %s0)
155; CHECK-NEXT:    lea %s1, 65534
156; CHECK-NEXT:    lea %s3, -65536
157; CHECK-NEXT:    and %s3, %s3, (32)0
158; CHECK-NEXT:  .LBB5_1: # %atomicrmw.start
159; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
160; CHECK-NEXT:    or %s4, 0, %s2
161; CHECK-NEXT:    xor %s2, -1, %s4
162; CHECK-NEXT:    or %s2, %s2, %s1
163; CHECK-NEXT:    and %s2, %s2, (48)0
164; CHECK-NEXT:    and %s5, %s4, %s3
165; CHECK-NEXT:    or %s2, %s5, %s2
166; CHECK-NEXT:    cas.w %s2, (%s0), %s4
167; CHECK-NEXT:    brne.w %s2, %s4, .LBB5_1
168; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
169; CHECK-NEXT:    sll %s0, %s2, 48
170; CHECK-NEXT:    sra.l %s0, %s0, 48
171; CHECK-NEXT:    fencem 3
172; CHECK-NEXT:    b.l.t (, %s10)
173entry:
174  %0 = atomicrmw nand ptr @s, i16 1 seq_cst
175  ret i16 %0
176}
177
178; Function Attrs: norecurse nounwind
179define signext i32 @test_atomic_fetch_max_4() {
180; CHECK-LABEL: test_atomic_fetch_max_4:
181; CHECK:       # %bb.0: # %entry
182; CHECK-NEXT:    fencem 3
183; CHECK-NEXT:    lea %s0, i@lo
184; CHECK-NEXT:    and %s0, %s0, (32)0
185; CHECK-NEXT:    lea.sl %s1, i@hi(, %s0)
186; CHECK-NEXT:    ldl.sx %s0, (, %s1)
187; CHECK-NEXT:  .LBB6_1: # %atomicrmw.start
188; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
189; CHECK-NEXT:    or %s2, 0, %s0
190; CHECK-NEXT:    maxs.w.sx %s0, 1, %s0
191; CHECK-NEXT:    cas.w %s0, (%s1), %s2
192; CHECK-NEXT:    brne.w %s0, %s2, .LBB6_1
193; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
194; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
195; CHECK-NEXT:    fencem 3
196; CHECK-NEXT:    b.l.t (, %s10)
197entry:
198  %0 = atomicrmw max ptr @i, i32 1 seq_cst
199  ret i32 %0
200}
201
202; Function Attrs: norecurse nounwind
203define signext i32 @test_atomic_fetch_min_4() {
204; CHECK-LABEL: test_atomic_fetch_min_4:
205; CHECK:       # %bb.0: # %entry
206; CHECK-NEXT:    fencem 3
207; CHECK-NEXT:    lea %s0, i@lo
208; CHECK-NEXT:    and %s0, %s0, (32)0
209; CHECK-NEXT:    lea.sl %s1, i@hi(, %s0)
210; CHECK-NEXT:    ldl.sx %s0, (, %s1)
211; CHECK-NEXT:  .LBB7_1: # %atomicrmw.start
212; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
213; CHECK-NEXT:    or %s2, 0, %s0
214; CHECK-NEXT:    mins.w.sx %s0, 1, %s0
215; CHECK-NEXT:    cas.w %s0, (%s1), %s2
216; CHECK-NEXT:    brne.w %s0, %s2, .LBB7_1
217; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
218; CHECK-NEXT:    adds.w.sx %s0, %s0, (0)1
219; CHECK-NEXT:    fencem 3
220; CHECK-NEXT:    b.l.t (, %s10)
221entry:
222  %0 = atomicrmw min ptr @i, i32 1 seq_cst
223  ret i32 %0
224}
225
226; Function Attrs: norecurse nounwind
227define signext i32 @test_atomic_fetch_umax_4() {
228; CHECK-LABEL: test_atomic_fetch_umax_4:
229; CHECK:       # %bb.0: # %entry
230; CHECK-NEXT:    fencem 3
231; CHECK-NEXT:    lea %s0, i@lo
232; CHECK-NEXT:    and %s0, %s0, (32)0
233; CHECK-NEXT:    lea.sl %s0, i@hi(, %s0)
234; CHECK-NEXT:    ldl.sx %s1, (, %s0)
235; CHECK-NEXT:  .LBB8_1: # %atomicrmw.start
236; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
237; CHECK-NEXT:    or %s2, 0, %s1
238; CHECK-NEXT:    cmpu.w %s3, %s1, (63)0
239; CHECK-NEXT:    or %s1, 0, %s2
240; CHECK-NEXT:    cmov.w.le %s1, (63)0, %s3
241; CHECK-NEXT:    cas.w %s1, (%s0), %s2
242; CHECK-NEXT:    brne.w %s1, %s2, .LBB8_1
243; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
244; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
245; CHECK-NEXT:    fencem 3
246; CHECK-NEXT:    b.l.t (, %s10)
247entry:
248  %0 = atomicrmw umax ptr @i, i32 1 seq_cst
249  ret i32 %0
250}
251
252; Function Attrs: norecurse nounwind
253define signext i32 @test_atomic_fetch_umin_4() {
254; CHECK-LABEL: test_atomic_fetch_umin_4:
255; CHECK:       # %bb.0: # %entry
256; CHECK-NEXT:    fencem 3
257; CHECK-NEXT:    lea %s0, i@lo
258; CHECK-NEXT:    and %s0, %s0, (32)0
259; CHECK-NEXT:    lea.sl %s0, i@hi(, %s0)
260; CHECK-NEXT:    ldl.sx %s1, (, %s0)
261; CHECK-NEXT:  .LBB9_1: # %atomicrmw.start
262; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
263; CHECK-NEXT:    or %s2, 0, %s1
264; CHECK-NEXT:    cmpu.w %s3, 2, %s1
265; CHECK-NEXT:    or %s1, 0, %s2
266; CHECK-NEXT:    cmov.w.le %s1, (63)0, %s3
267; CHECK-NEXT:    cas.w %s1, (%s0), %s2
268; CHECK-NEXT:    brne.w %s1, %s2, .LBB9_1
269; CHECK-NEXT:  # %bb.2: # %atomicrmw.end
270; CHECK-NEXT:    adds.w.sx %s0, %s1, (0)1
271; CHECK-NEXT:    fencem 3
272; CHECK-NEXT:    b.l.t (, %s10)
273entry:
274  %0 = atomicrmw umin ptr @i, i32 1 seq_cst
275  ret i32 %0
276}
277