xref: /llvm-project/llvm/test/CodeGen/SystemZ/vec-reduce-add-01.ll (revision 922992a22f7c87c192cf96606038df3cf20d6404)
1b794dc23SDominik Steenken; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2*922992a2SJay Foad; Test vector add reduction intrinsic
3b794dc23SDominik Steenken;
4b794dc23SDominik Steenken; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z16 | FileCheck %s
5b794dc23SDominik Steenken
6b794dc23SDominik Steenken; 1 vector length
7b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %a)
8b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %a)
9b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %a)
10b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %a)
11b794dc23SDominik Steenkendeclare i128 @llvm.vector.reduce.add.v1i128(<1 x i128> %a)
12b794dc23SDominik Steenken; 2 vector lengths
13b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v32i8(<32 x i8> %a)
14b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %a)
15b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %a)
16b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %a)
17b794dc23SDominik Steenkendeclare i128 @llvm.vector.reduce.add.v2i128(<2 x i128> %a)
18b794dc23SDominik Steenken; ; TODO
19b794dc23SDominik Steenken; ; 4 vector lengths
20b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v64i8(<64 x i8> %a)
21b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v32i16(<32 x i16> %a)
22b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %a)
23b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %a)
24b794dc23SDominik Steenkendeclare i128 @llvm.vector.reduce.add.v4i128(<4 x i128> %a)
25b794dc23SDominik Steenken; ; Subvector lengths
26b794dc23SDominik Steenkendeclare i8 @llvm.vector.reduce.add.v8i8(<8 x i8> %a)
27b794dc23SDominik Steenkendeclare i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %a)
28b794dc23SDominik Steenkendeclare i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %a)
29b794dc23SDominik Steenkendeclare i64 @llvm.vector.reduce.add.v1i64(<1 x i64> %a)
30b794dc23SDominik Steenken
31b794dc23SDominik Steenkendefine i8 @f1_1(<16 x i8> %a) {
32b794dc23SDominik Steenken; CHECK-LABEL: f1_1:
33b794dc23SDominik Steenken; CHECK:       # %bb.0:
34b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v0, 0
35b794dc23SDominik Steenken; CHECK-NEXT:    vsumb %v1, %v24, %v0
36b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v1, %v0
37b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
38b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
39b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
40b794dc23SDominik Steenken  %redadd = call i8 @llvm.vector.reduce.add.v16i8(<16 x i8> %a)
41b794dc23SDominik Steenken  ret i8 %redadd
42b794dc23SDominik Steenken}
43b794dc23SDominik Steenken
44b794dc23SDominik Steenkendefine i16 @f1_2(<8 x i16> %a) {
45b794dc23SDominik Steenken; CHECK-LABEL: f1_2:
46b794dc23SDominik Steenken; CHECK:       # %bb.0:
47b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v0, 0
48b794dc23SDominik Steenken; CHECK-NEXT:    vsumh %v1, %v24, %v0
49b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v1, %v0
50b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
51b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
52b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
53b794dc23SDominik Steenken  %redadd = call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %a)
54b794dc23SDominik Steenken  ret i16 %redadd
55b794dc23SDominik Steenken}
56b794dc23SDominik Steenken
57b794dc23SDominik Steenkendefine i32 @f1_3(<4 x i32> %a) {
58b794dc23SDominik Steenken; CHECK-LABEL: f1_3:
59b794dc23SDominik Steenken; CHECK:       # %bb.0:
60b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v0, 0
61b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v24, %v0
62b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
63b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
64b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
65b794dc23SDominik Steenken
66b794dc23SDominik Steenken  %redadd = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %a)
67b794dc23SDominik Steenken  ret i32 %redadd
68b794dc23SDominik Steenken}
69b794dc23SDominik Steenken
70b794dc23SDominik Steenkendefine i64 @f1_4(<2 x i64> %a) {
71b794dc23SDominik Steenken; CHECK-LABEL: f1_4:
72b794dc23SDominik Steenken; CHECK:       # %bb.0:
73b794dc23SDominik Steenken; CHECK-NEXT:    vrepg %v0, %v24, 1
74b794dc23SDominik Steenken; CHECK-NEXT:    vag %v0, %v24, %v0
75b794dc23SDominik Steenken; CHECK-NEXT:    vlgvg %r2, %v0, 0
76b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
77b794dc23SDominik Steenken
78b794dc23SDominik Steenken  %redadd = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %a)
79b794dc23SDominik Steenken  ret i64 %redadd
80b794dc23SDominik Steenken}
81b794dc23SDominik Steenken
82b794dc23SDominik Steenkendefine i128 @f1_5(<1 x i128> %a) {
83b794dc23SDominik Steenken; CHECK-LABEL: f1_5:
84b794dc23SDominik Steenken; CHECK:       # %bb.0:
85b794dc23SDominik Steenken; CHECK-NEXT:    vst %v24, 0(%r2), 3
86b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
87b794dc23SDominik Steenken  %redadd = call i128 @llvm.vector.reduce.add.v1i128(<1 x i128> %a)
88b794dc23SDominik Steenken  ret i128 %redadd
89b794dc23SDominik Steenken}
90b794dc23SDominik Steenken
91b794dc23SDominik Steenkendefine i8 @f2_1(<32 x i8> %a) {
92b794dc23SDominik Steenken; CHECK-LABEL: f2_1:
93b794dc23SDominik Steenken; CHECK:       # %bb.0:
94b794dc23SDominik Steenken; CHECK-NEXT:    vab %v0, %v24, %v26
95b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v1, 0
96b794dc23SDominik Steenken; CHECK-NEXT:    vsumb %v0, %v0, %v1
97b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v0, %v1
98b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
99b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
100b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
101b794dc23SDominik Steenken  %redadd = call i8 @llvm.vector.reduce.add.v32i8(<32 x i8> %a)
102b794dc23SDominik Steenken  ret i8 %redadd
103b794dc23SDominik Steenken}
104b794dc23SDominik Steenken
105b794dc23SDominik Steenkendefine i16 @f2_2(<16 x i16> %a) {
106b794dc23SDominik Steenken; CHECK-LABEL: f2_2:
107b794dc23SDominik Steenken; CHECK:       # %bb.0:
108b794dc23SDominik Steenken; CHECK-NEXT:    vah %v0, %v24, %v26
109b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v1, 0
110b794dc23SDominik Steenken; CHECK-NEXT:    vsumh %v0, %v0, %v1
111b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v0, %v1
112b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
113b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
114b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
115b794dc23SDominik Steenken  %redadd = call i16 @llvm.vector.reduce.add.v16i16(<16 x i16> %a)
116b794dc23SDominik Steenken  ret i16 %redadd
117b794dc23SDominik Steenken}
118b794dc23SDominik Steenken
119b794dc23SDominik Steenkendefine i32 @f2_3(<8 x i32> %a) {
120b794dc23SDominik Steenken; CHECK-LABEL: f2_3:
121b794dc23SDominik Steenken; CHECK:       # %bb.0:
122b794dc23SDominik Steenken; CHECK-NEXT:    vaf %v0, %v24, %v26
123b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v1, 0
124b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v0, %v1
125b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
126b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
127b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
128b794dc23SDominik Steenken
129b794dc23SDominik Steenken  %redadd = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %a)
130b794dc23SDominik Steenken  ret i32 %redadd
131b794dc23SDominik Steenken}
132b794dc23SDominik Steenken
133b794dc23SDominik Steenkendefine i64 @f2_4(<4 x i64> %a) {
134b794dc23SDominik Steenken; CHECK-LABEL: f2_4:
135b794dc23SDominik Steenken; CHECK:       # %bb.0:
136b794dc23SDominik Steenken; CHECK-NEXT:    vag %v0, %v24, %v26
137b794dc23SDominik Steenken; CHECK-NEXT:    vrepg %v1, %v0, 1
138b794dc23SDominik Steenken; CHECK-NEXT:    vag %v0, %v0, %v1
139b794dc23SDominik Steenken; CHECK-NEXT:    vlgvg %r2, %v0, 0
140b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
141b794dc23SDominik Steenken
142b794dc23SDominik Steenken  %redadd = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> %a)
143b794dc23SDominik Steenken  ret i64 %redadd
144b794dc23SDominik Steenken}
145b794dc23SDominik Steenken
146b794dc23SDominik Steenkendefine i128 @f2_5(<2 x i128> %a) {
147b794dc23SDominik Steenken; CHECK-LABEL: f2_5:
148b794dc23SDominik Steenken; CHECK:       # %bb.0:
149b794dc23SDominik Steenken; CHECK-NEXT:    vl %v0, 16(%r3), 3
150b794dc23SDominik Steenken; CHECK-NEXT:    vl %v1, 0(%r3), 3
151b794dc23SDominik Steenken; CHECK-NEXT:    vaq %v0, %v1, %v0
152b794dc23SDominik Steenken; CHECK-NEXT:    vst %v0, 0(%r2), 3
153b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
154b794dc23SDominik Steenken  %redadd = call i128 @llvm.vector.reduce.add.v2i128(<2 x i128> %a)
155b794dc23SDominik Steenken  ret i128 %redadd
156b794dc23SDominik Steenken}
157b794dc23SDominik Steenken
158b794dc23SDominik Steenkendefine i8 @f3_1(<64 x i8> %a) {
159b794dc23SDominik Steenken; CHECK-LABEL: f3_1:
160b794dc23SDominik Steenken; CHECK:       # %bb.0:
161b794dc23SDominik Steenken; CHECK-NEXT:    vab %v0, %v26, %v30
162b794dc23SDominik Steenken; CHECK-NEXT:    vab %v1, %v24, %v28
163b794dc23SDominik Steenken; CHECK-NEXT:    vab %v0, %v1, %v0
164b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v1, 0
165b794dc23SDominik Steenken; CHECK-NEXT:    vsumb %v0, %v0, %v1
166b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v0, %v1
167b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
168b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
169b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
170b794dc23SDominik Steenken  %redadd = call i8 @llvm.vector.reduce.add.v64i8(<64 x i8> %a)
171b794dc23SDominik Steenken  ret i8 %redadd
172b794dc23SDominik Steenken}
173b794dc23SDominik Steenken
174b794dc23SDominik Steenkendefine i16 @f3_2(<32 x i16> %a) {
175b794dc23SDominik Steenken; CHECK-LABEL: f3_2:
176b794dc23SDominik Steenken; CHECK:       # %bb.0:
177b794dc23SDominik Steenken; CHECK-NEXT:    vah %v0, %v26, %v30
178b794dc23SDominik Steenken; CHECK-NEXT:    vah %v1, %v24, %v28
179b794dc23SDominik Steenken; CHECK-NEXT:    vah %v0, %v1, %v0
180b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v1, 0
181b794dc23SDominik Steenken; CHECK-NEXT:    vsumh %v0, %v0, %v1
182b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v0, %v1
183b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
184b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
185b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
186b794dc23SDominik Steenken  %redadd = call i16 @llvm.vector.reduce.add.v32i16(<32 x i16> %a)
187b794dc23SDominik Steenken  ret i16 %redadd
188b794dc23SDominik Steenken}
189b794dc23SDominik Steenken
190b794dc23SDominik Steenkendefine i32 @f3_3(<16 x i32> %a) {
191b794dc23SDominik Steenken; CHECK-LABEL: f3_3:
192b794dc23SDominik Steenken; CHECK:       # %bb.0:
193b794dc23SDominik Steenken; CHECK-NEXT:    vaf %v0, %v26, %v30
194b794dc23SDominik Steenken; CHECK-NEXT:    vaf %v1, %v24, %v28
195b794dc23SDominik Steenken; CHECK-NEXT:    vaf %v0, %v1, %v0
196b794dc23SDominik Steenken; CHECK-NEXT:    vgbm %v1, 0
197b794dc23SDominik Steenken; CHECK-NEXT:    vsumqf %v0, %v0, %v1
198b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 3
199b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
200b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
201b794dc23SDominik Steenken
202b794dc23SDominik Steenken  %redadd = call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %a)
203b794dc23SDominik Steenken  ret i32 %redadd
204b794dc23SDominik Steenken}
205b794dc23SDominik Steenken
206b794dc23SDominik Steenkendefine i64 @f3_4(<8 x i64> %a) {
207b794dc23SDominik Steenken; CHECK-LABEL: f3_4:
208b794dc23SDominik Steenken; CHECK:       # %bb.0:
209b794dc23SDominik Steenken; CHECK-NEXT:    vag %v0, %v26, %v30
210b794dc23SDominik Steenken; CHECK-NEXT:    vag %v1, %v24, %v28
211b794dc23SDominik Steenken; CHECK-NEXT:    vag %v0, %v1, %v0
212b794dc23SDominik Steenken; CHECK-NEXT:    vrepg %v1, %v0, 1
213b794dc23SDominik Steenken; CHECK-NEXT:    vag %v0, %v0, %v1
214b794dc23SDominik Steenken; CHECK-NEXT:    vlgvg %r2, %v0, 0
215b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
216b794dc23SDominik Steenken
217b794dc23SDominik Steenken  %redadd = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> %a)
218b794dc23SDominik Steenken  ret i64 %redadd
219b794dc23SDominik Steenken}
220b794dc23SDominik Steenken
221b794dc23SDominik Steenkendefine i128 @f3_5(<4 x i128> %a) {
222b794dc23SDominik Steenken; CHECK-LABEL: f3_5:
223b794dc23SDominik Steenken; CHECK:       # %bb.0:
224b794dc23SDominik Steenken; CHECK-NEXT:    vl %v0, 32(%r3), 3
225b794dc23SDominik Steenken; CHECK-NEXT:    vl %v1, 0(%r3), 3
226b794dc23SDominik Steenken; CHECK-NEXT:    vl %v2, 48(%r3), 3
227b794dc23SDominik Steenken; CHECK-NEXT:    vl %v3, 16(%r3), 3
228b794dc23SDominik Steenken; CHECK-NEXT:    vaq %v2, %v3, %v2
229b794dc23SDominik Steenken; CHECK-NEXT:    vaq %v0, %v1, %v0
230b794dc23SDominik Steenken; CHECK-NEXT:    vaq %v0, %v0, %v2
231b794dc23SDominik Steenken; CHECK-NEXT:    vst %v0, 0(%r2), 3
232b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
233b794dc23SDominik Steenken  %redadd = call i128 @llvm.vector.reduce.add.v4i128(<4 x i128> %a)
234b794dc23SDominik Steenken  ret i128 %redadd
235b794dc23SDominik Steenken}
236b794dc23SDominik Steenken
237b794dc23SDominik Steenken
238b794dc23SDominik Steenkendefine i8 @f4_1(<8 x i8> %a) {
239b794dc23SDominik Steenken; CHECK-LABEL: f4_1:
240b794dc23SDominik Steenken; CHECK:       # %bb.0:
241b794dc23SDominik Steenken; CHECK-NEXT:    vpkg %v0, %v24, %v24
242b794dc23SDominik Steenken; CHECK-NEXT:    vab %v0, %v24, %v0
243b794dc23SDominik Steenken; CHECK-NEXT:    vpkf %v1, %v0, %v0
244b794dc23SDominik Steenken; CHECK-NEXT:    vab %v0, %v0, %v1
245b794dc23SDominik Steenken; CHECK-NEXT:    vrepb %v1, %v0, 1
246b794dc23SDominik Steenken; CHECK-NEXT:    vab %v0, %v0, %v1
247b794dc23SDominik Steenken; CHECK-NEXT:    vlgvb %r2, %v0, 0
248b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
249b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
250b794dc23SDominik Steenken  %redadd = call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> %a)
251b794dc23SDominik Steenken  ret i8 %redadd
252b794dc23SDominik Steenken}
253b794dc23SDominik Steenken
254b794dc23SDominik Steenkendefine i16 @f4_2(<4 x i16> %a) {
255b794dc23SDominik Steenken; CHECK-LABEL: f4_2:
256b794dc23SDominik Steenken; CHECK:       # %bb.0:
257b794dc23SDominik Steenken; CHECK-NEXT:    vpkg %v0, %v24, %v24
258b794dc23SDominik Steenken; CHECK-NEXT:    vah %v0, %v24, %v0
259b794dc23SDominik Steenken; CHECK-NEXT:    vreph %v1, %v0, 1
260b794dc23SDominik Steenken; CHECK-NEXT:    vah %v0, %v0, %v1
261b794dc23SDominik Steenken; CHECK-NEXT:    vlgvh %r2, %v0, 0
262b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
263b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
264b794dc23SDominik Steenken  %redadd = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> %a)
265b794dc23SDominik Steenken  ret i16 %redadd
266b794dc23SDominik Steenken}
267b794dc23SDominik Steenken
268b794dc23SDominik Steenkendefine i32 @f4_3(<2 x i32> %a) {
269b794dc23SDominik Steenken; CHECK-LABEL: f4_3:
270b794dc23SDominik Steenken; CHECK:       # %bb.0:
271b794dc23SDominik Steenken; CHECK-NEXT:    vrepf %v0, %v24, 1
272b794dc23SDominik Steenken; CHECK-NEXT:    vaf %v0, %v24, %v0
273b794dc23SDominik Steenken; CHECK-NEXT:    vlgvf %r2, %v0, 0
274b794dc23SDominik Steenken; CHECK-NEXT:    # kill: def $r2l killed $r2l killed $r2d
275b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
276b794dc23SDominik Steenken
277b794dc23SDominik Steenken  %redadd = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %a)
278b794dc23SDominik Steenken  ret i32 %redadd
279b794dc23SDominik Steenken}
280b794dc23SDominik Steenken
281b794dc23SDominik Steenkendefine i64 @f4_4(<1 x i64> %a) {
282b794dc23SDominik Steenken; CHECK-LABEL: f4_4:
283b794dc23SDominik Steenken; CHECK:       # %bb.0:
284b794dc23SDominik Steenken; CHECK-NEXT:    vlgvg %r2, %v24, 0
285b794dc23SDominik Steenken; CHECK-NEXT:    br %r14
286b794dc23SDominik Steenken
287b794dc23SDominik Steenken  %redadd = call i64 @llvm.vector.reduce.add.v1i64(<1 x i64> %a)
288b794dc23SDominik Steenken  ret i64 %redadd
289b794dc23SDominik Steenken}
290