xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/binop-splats.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zfh,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV32
3; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zfh,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV64
4
5define <vscale x 1 x i1> @nxv1i1(i1 %x, i1 %y) {
6; CHECK-LABEL: nxv1i1:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    xor a0, a0, a1
9; CHECK-NEXT:    andi a0, a0, 1
10; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, ma
11; CHECK-NEXT:    vmv.v.x v8, a0
12; CHECK-NEXT:    vmsne.vi v0, v8, 0
13; CHECK-NEXT:    ret
14  %head.x = insertelement <vscale x 1 x i1> poison, i1 %x, i32 0
15  %splat.x = shufflevector <vscale x 1 x i1> %head.x, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
16  %head.y = insertelement <vscale x 1 x i1> poison, i1 %y, i32 0
17  %splat.y = shufflevector <vscale x 1 x i1> %head.y, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
18  %v = add <vscale x 1 x i1> %splat.x, %splat.y
19  ret <vscale x 1 x i1> %v
20}
21
22define <vscale x 2 x i1> @nxv2i1(i1 %x, i1 %y) {
23; CHECK-LABEL: nxv2i1:
24; CHECK:       # %bb.0:
25; CHECK-NEXT:    xor a0, a0, a1
26; CHECK-NEXT:    andi a0, a0, 1
27; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma
28; CHECK-NEXT:    vmv.v.x v8, a0
29; CHECK-NEXT:    vmsne.vi v0, v8, 0
30; CHECK-NEXT:    ret
31  %head.x = insertelement <vscale x 2 x i1> poison, i1 %x, i32 0
32  %splat.x = shufflevector <vscale x 2 x i1> %head.x, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
33  %head.y = insertelement <vscale x 2 x i1> poison, i1 %y, i32 0
34  %splat.y = shufflevector <vscale x 2 x i1> %head.y, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
35  %v = add <vscale x 2 x i1> %splat.x, %splat.y
36  ret <vscale x 2 x i1> %v
37}
38
39define <vscale x 4 x i1> @nxv4i1(i1 %x, i1 %y) {
40; CHECK-LABEL: nxv4i1:
41; CHECK:       # %bb.0:
42; CHECK-NEXT:    xor a0, a0, a1
43; CHECK-NEXT:    andi a0, a0, 1
44; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, ma
45; CHECK-NEXT:    vmv.v.x v8, a0
46; CHECK-NEXT:    vmsne.vi v0, v8, 0
47; CHECK-NEXT:    ret
48  %head.x = insertelement <vscale x 4 x i1> poison, i1 %x, i32 0
49  %splat.x = shufflevector <vscale x 4 x i1> %head.x, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
50  %head.y = insertelement <vscale x 4 x i1> poison, i1 %y, i32 0
51  %splat.y = shufflevector <vscale x 4 x i1> %head.y, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
52  %v = add <vscale x 4 x i1> %splat.x, %splat.y
53  ret <vscale x 4 x i1> %v
54}
55
56define <vscale x 8 x i1> @nxv8i1(i1 %x, i1 %y) {
57; CHECK-LABEL: nxv8i1:
58; CHECK:       # %bb.0:
59; CHECK-NEXT:    xor a0, a0, a1
60; CHECK-NEXT:    andi a0, a0, 1
61; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma
62; CHECK-NEXT:    vmv.v.x v8, a0
63; CHECK-NEXT:    vmsne.vi v0, v8, 0
64; CHECK-NEXT:    ret
65  %head.x = insertelement <vscale x 8 x i1> poison, i1 %x, i32 0
66  %splat.x = shufflevector <vscale x 8 x i1> %head.x, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
67  %head.y = insertelement <vscale x 8 x i1> poison, i1 %y, i32 0
68  %splat.y = shufflevector <vscale x 8 x i1> %head.y, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
69  %v = add <vscale x 8 x i1> %splat.x, %splat.y
70  ret <vscale x 8 x i1> %v
71}
72
73define <vscale x 16 x i1> @nxv16i1(i1 %x, i1 %y) {
74; CHECK-LABEL: nxv16i1:
75; CHECK:       # %bb.0:
76; CHECK-NEXT:    xor a0, a0, a1
77; CHECK-NEXT:    andi a0, a0, 1
78; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma
79; CHECK-NEXT:    vmv.v.x v8, a0
80; CHECK-NEXT:    vmsne.vi v0, v8, 0
81; CHECK-NEXT:    ret
82  %head.x = insertelement <vscale x 16 x i1> poison, i1 %x, i32 0
83  %splat.x = shufflevector <vscale x 16 x i1> %head.x, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
84  %head.y = insertelement <vscale x 16 x i1> poison, i1 %y, i32 0
85  %splat.y = shufflevector <vscale x 16 x i1> %head.y, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
86  %v = add <vscale x 16 x i1> %splat.x, %splat.y
87  ret <vscale x 16 x i1> %v
88}
89
90define <vscale x 32 x i1> @nxv32i1(i1 %x, i1 %y) {
91; CHECK-LABEL: nxv32i1:
92; CHECK:       # %bb.0:
93; CHECK-NEXT:    xor a0, a0, a1
94; CHECK-NEXT:    andi a0, a0, 1
95; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, ma
96; CHECK-NEXT:    vmv.v.x v8, a0
97; CHECK-NEXT:    vmsne.vi v0, v8, 0
98; CHECK-NEXT:    ret
99  %head.x = insertelement <vscale x 32 x i1> poison, i1 %x, i32 0
100  %splat.x = shufflevector <vscale x 32 x i1> %head.x, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
101  %head.y = insertelement <vscale x 32 x i1> poison, i1 %y, i32 0
102  %splat.y = shufflevector <vscale x 32 x i1> %head.y, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer
103  %v = add <vscale x 32 x i1> %splat.x, %splat.y
104  ret <vscale x 32 x i1> %v
105}
106
107define <vscale x 64 x i1> @nxv64i1(i1 %x, i1 %y) {
108; CHECK-LABEL: nxv64i1:
109; CHECK:       # %bb.0:
110; CHECK-NEXT:    xor a0, a0, a1
111; CHECK-NEXT:    andi a0, a0, 1
112; CHECK-NEXT:    vsetvli a1, zero, e8, m8, ta, ma
113; CHECK-NEXT:    vmv.v.x v8, a0
114; CHECK-NEXT:    vmsne.vi v0, v8, 0
115; CHECK-NEXT:    ret
116  %head.x = insertelement <vscale x 64 x i1> poison, i1 %x, i32 0
117  %splat.x = shufflevector <vscale x 64 x i1> %head.x, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer
118  %head.y = insertelement <vscale x 64 x i1> poison, i1 %y, i32 0
119  %splat.y = shufflevector <vscale x 64 x i1> %head.y, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer
120  %v = add <vscale x 64 x i1> %splat.x, %splat.y
121  ret <vscale x 64 x i1> %v
122}
123
124define <vscale x 1 x i8> @nxv1i8(i8 %x, i8 %y) {
125; CHECK-LABEL: nxv1i8:
126; CHECK:       # %bb.0:
127; CHECK-NEXT:    add a0, a0, a1
128; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, ma
129; CHECK-NEXT:    vmv.v.x v8, a0
130; CHECK-NEXT:    ret
131  %head.x = insertelement <vscale x 1 x i8> poison, i8 %x, i32 0
132  %splat.x = shufflevector <vscale x 1 x i8> %head.x, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
133  %head.y = insertelement <vscale x 1 x i8> poison, i8 %y, i32 0
134  %splat.y = shufflevector <vscale x 1 x i8> %head.y, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
135  %v = add <vscale x 1 x i8> %splat.x, %splat.y
136  ret <vscale x 1 x i8> %v
137}
138
139define <vscale x 2 x i8> @nxv2i8(i8 %x, i8 %y) {
140; CHECK-LABEL: nxv2i8:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    add a0, a0, a1
143; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma
144; CHECK-NEXT:    vmv.v.x v8, a0
145; CHECK-NEXT:    ret
146  %head.x = insertelement <vscale x 2 x i8> poison, i8 %x, i32 0
147  %splat.x = shufflevector <vscale x 2 x i8> %head.x, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
148  %head.y = insertelement <vscale x 2 x i8> poison, i8 %y, i32 0
149  %splat.y = shufflevector <vscale x 2 x i8> %head.y, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
150  %v = add <vscale x 2 x i8> %splat.x, %splat.y
151  ret <vscale x 2 x i8> %v
152}
153
154define <vscale x 4 x i8> @nxv4i8(i8 %x, i8 %y) {
155; CHECK-LABEL: nxv4i8:
156; CHECK:       # %bb.0:
157; CHECK-NEXT:    add a0, a0, a1
158; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, ma
159; CHECK-NEXT:    vmv.v.x v8, a0
160; CHECK-NEXT:    ret
161  %head.x = insertelement <vscale x 4 x i8> poison, i8 %x, i32 0
162  %splat.x = shufflevector <vscale x 4 x i8> %head.x, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
163  %head.y = insertelement <vscale x 4 x i8> poison, i8 %y, i32 0
164  %splat.y = shufflevector <vscale x 4 x i8> %head.y, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
165  %v = add <vscale x 4 x i8> %splat.x, %splat.y
166  ret <vscale x 4 x i8> %v
167}
168
169define <vscale x 8 x i8> @nxv8i8(i8 %x, i8 %y) {
170; CHECK-LABEL: nxv8i8:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    add a0, a0, a1
173; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma
174; CHECK-NEXT:    vmv.v.x v8, a0
175; CHECK-NEXT:    ret
176  %head.x = insertelement <vscale x 8 x i8> poison, i8 %x, i32 0
177  %splat.x = shufflevector <vscale x 8 x i8> %head.x, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
178  %head.y = insertelement <vscale x 8 x i8> poison, i8 %y, i32 0
179  %splat.y = shufflevector <vscale x 8 x i8> %head.y, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
180  %v = add <vscale x 8 x i8> %splat.x, %splat.y
181  ret <vscale x 8 x i8> %v
182}
183
184define <vscale x 16 x i8> @nxv16i8(i8 %x, i8 %y) {
185; CHECK-LABEL: nxv16i8:
186; CHECK:       # %bb.0:
187; CHECK-NEXT:    add a0, a0, a1
188; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma
189; CHECK-NEXT:    vmv.v.x v8, a0
190; CHECK-NEXT:    ret
191  %head.x = insertelement <vscale x 16 x i8> poison, i8 %x, i32 0
192  %splat.x = shufflevector <vscale x 16 x i8> %head.x, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
193  %head.y = insertelement <vscale x 16 x i8> poison, i8 %y, i32 0
194  %splat.y = shufflevector <vscale x 16 x i8> %head.y, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
195  %v = add <vscale x 16 x i8> %splat.x, %splat.y
196  ret <vscale x 16 x i8> %v
197}
198
199define <vscale x 32 x i8> @nxv32i8(i8 %x, i8 %y) {
200; CHECK-LABEL: nxv32i8:
201; CHECK:       # %bb.0:
202; CHECK-NEXT:    add a0, a0, a1
203; CHECK-NEXT:    vsetvli a1, zero, e8, m4, ta, ma
204; CHECK-NEXT:    vmv.v.x v8, a0
205; CHECK-NEXT:    ret
206  %head.x = insertelement <vscale x 32 x i8> poison, i8 %x, i32 0
207  %splat.x = shufflevector <vscale x 32 x i8> %head.x, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
208  %head.y = insertelement <vscale x 32 x i8> poison, i8 %y, i32 0
209  %splat.y = shufflevector <vscale x 32 x i8> %head.y, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
210  %v = add <vscale x 32 x i8> %splat.x, %splat.y
211  ret <vscale x 32 x i8> %v
212}
213
214define <vscale x 64 x i8> @nxv64i8(i8 %x, i8 %y) {
215; CHECK-LABEL: nxv64i8:
216; CHECK:       # %bb.0:
217; CHECK-NEXT:    add a0, a0, a1
218; CHECK-NEXT:    vsetvli a1, zero, e8, m8, ta, ma
219; CHECK-NEXT:    vmv.v.x v8, a0
220; CHECK-NEXT:    ret
221  %head.x = insertelement <vscale x 64 x i8> poison, i8 %x, i32 0
222  %splat.x = shufflevector <vscale x 64 x i8> %head.x, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
223  %head.y = insertelement <vscale x 64 x i8> poison, i8 %y, i32 0
224  %splat.y = shufflevector <vscale x 64 x i8> %head.y, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
225  %v = add <vscale x 64 x i8> %splat.x, %splat.y
226  ret <vscale x 64 x i8> %v
227}
228
229define <vscale x 1 x i16> @nxv1i16(i16 %x, i16 %y) {
230; CHECK-LABEL: nxv1i16:
231; CHECK:       # %bb.0:
232; CHECK-NEXT:    add a0, a0, a1
233; CHECK-NEXT:    vsetvli a1, zero, e16, mf4, ta, ma
234; CHECK-NEXT:    vmv.v.x v8, a0
235; CHECK-NEXT:    ret
236  %head.x = insertelement <vscale x 1 x i16> poison, i16 %x, i32 0
237  %splat.x = shufflevector <vscale x 1 x i16> %head.x, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
238  %head.y = insertelement <vscale x 1 x i16> poison, i16 %y, i32 0
239  %splat.y = shufflevector <vscale x 1 x i16> %head.y, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
240  %v = add <vscale x 1 x i16> %splat.x, %splat.y
241  ret <vscale x 1 x i16> %v
242}
243
244define <vscale x 2 x i16> @nxv2i16(i16 %x, i16 %y) {
245; CHECK-LABEL: nxv2i16:
246; CHECK:       # %bb.0:
247; CHECK-NEXT:    add a0, a0, a1
248; CHECK-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
249; CHECK-NEXT:    vmv.v.x v8, a0
250; CHECK-NEXT:    ret
251  %head.x = insertelement <vscale x 2 x i16> poison, i16 %x, i32 0
252  %splat.x = shufflevector <vscale x 2 x i16> %head.x, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
253  %head.y = insertelement <vscale x 2 x i16> poison, i16 %y, i32 0
254  %splat.y = shufflevector <vscale x 2 x i16> %head.y, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
255  %v = add <vscale x 2 x i16> %splat.x, %splat.y
256  ret <vscale x 2 x i16> %v
257}
258
259define <vscale x 4 x i16> @nxv4i16(i16 %x, i16 %y) {
260; CHECK-LABEL: nxv4i16:
261; CHECK:       # %bb.0:
262; CHECK-NEXT:    add a0, a0, a1
263; CHECK-NEXT:    vsetvli a1, zero, e16, m1, ta, ma
264; CHECK-NEXT:    vmv.v.x v8, a0
265; CHECK-NEXT:    ret
266  %head.x = insertelement <vscale x 4 x i16> poison, i16 %x, i32 0
267  %splat.x = shufflevector <vscale x 4 x i16> %head.x, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
268  %head.y = insertelement <vscale x 4 x i16> poison, i16 %y, i32 0
269  %splat.y = shufflevector <vscale x 4 x i16> %head.y, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
270  %v = add <vscale x 4 x i16> %splat.x, %splat.y
271  ret <vscale x 4 x i16> %v
272}
273
274define <vscale x 8 x i16> @nxv8i16(i16 %x, i16 %y) {
275; CHECK-LABEL: nxv8i16:
276; CHECK:       # %bb.0:
277; CHECK-NEXT:    add a0, a0, a1
278; CHECK-NEXT:    vsetvli a1, zero, e16, m2, ta, ma
279; CHECK-NEXT:    vmv.v.x v8, a0
280; CHECK-NEXT:    ret
281  %head.x = insertelement <vscale x 8 x i16> poison, i16 %x, i32 0
282  %splat.x = shufflevector <vscale x 8 x i16> %head.x, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
283  %head.y = insertelement <vscale x 8 x i16> poison, i16 %y, i32 0
284  %splat.y = shufflevector <vscale x 8 x i16> %head.y, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
285  %v = add <vscale x 8 x i16> %splat.x, %splat.y
286  ret <vscale x 8 x i16> %v
287}
288
289define <vscale x 16 x i16> @nxv16i16(i16 %x, i16 %y) {
290; CHECK-LABEL: nxv16i16:
291; CHECK:       # %bb.0:
292; CHECK-NEXT:    add a0, a0, a1
293; CHECK-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
294; CHECK-NEXT:    vmv.v.x v8, a0
295; CHECK-NEXT:    ret
296  %head.x = insertelement <vscale x 16 x i16> poison, i16 %x, i32 0
297  %splat.x = shufflevector <vscale x 16 x i16> %head.x, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
298  %head.y = insertelement <vscale x 16 x i16> poison, i16 %y, i32 0
299  %splat.y = shufflevector <vscale x 16 x i16> %head.y, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
300  %v = add <vscale x 16 x i16> %splat.x, %splat.y
301  ret <vscale x 16 x i16> %v
302}
303
304define <vscale x 32 x i16> @nxv32i16(i16 %x, i16 %y) {
305; CHECK-LABEL: nxv32i16:
306; CHECK:       # %bb.0:
307; CHECK-NEXT:    add a0, a0, a1
308; CHECK-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
309; CHECK-NEXT:    vmv.v.x v8, a0
310; CHECK-NEXT:    ret
311  %head.x = insertelement <vscale x 32 x i16> poison, i16 %x, i32 0
312  %splat.x = shufflevector <vscale x 32 x i16> %head.x, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
313  %head.y = insertelement <vscale x 32 x i16> poison, i16 %y, i32 0
314  %splat.y = shufflevector <vscale x 32 x i16> %head.y, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
315  %v = add <vscale x 32 x i16> %splat.x, %splat.y
316  ret <vscale x 32 x i16> %v
317}
318
319define <vscale x 1 x i32> @nxv1i32(i32 %x, i32 %y) {
320; CHECK-LABEL: nxv1i32:
321; CHECK:       # %bb.0:
322; CHECK-NEXT:    add a0, a0, a1
323; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
324; CHECK-NEXT:    vmv.v.x v8, a0
325; CHECK-NEXT:    ret
326  %head.x = insertelement <vscale x 1 x i32> poison, i32 %x, i32 0
327  %splat.x = shufflevector <vscale x 1 x i32> %head.x, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
328  %head.y = insertelement <vscale x 1 x i32> poison, i32 %y, i32 0
329  %splat.y = shufflevector <vscale x 1 x i32> %head.y, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
330  %v = add <vscale x 1 x i32> %splat.x, %splat.y
331  ret <vscale x 1 x i32> %v
332}
333
334define <vscale x 2 x i32> @nxv2i32(i32 %x, i32 %y) {
335; CHECK-LABEL: nxv2i32:
336; CHECK:       # %bb.0:
337; CHECK-NEXT:    add a0, a0, a1
338; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
339; CHECK-NEXT:    vmv.v.x v8, a0
340; CHECK-NEXT:    ret
341  %head.x = insertelement <vscale x 2 x i32> poison, i32 %x, i32 0
342  %splat.x = shufflevector <vscale x 2 x i32> %head.x, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
343  %head.y = insertelement <vscale x 2 x i32> poison, i32 %y, i32 0
344  %splat.y = shufflevector <vscale x 2 x i32> %head.y, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
345  %v = add <vscale x 2 x i32> %splat.x, %splat.y
346  ret <vscale x 2 x i32> %v
347}
348
349define <vscale x 4 x i32> @nxv4i32(i32 %x, i32 %y) {
350; CHECK-LABEL: nxv4i32:
351; CHECK:       # %bb.0:
352; CHECK-NEXT:    add a0, a0, a1
353; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
354; CHECK-NEXT:    vmv.v.x v8, a0
355; CHECK-NEXT:    ret
356  %head.x = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0
357  %splat.x = shufflevector <vscale x 4 x i32> %head.x, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
358  %head.y = insertelement <vscale x 4 x i32> poison, i32 %y, i32 0
359  %splat.y = shufflevector <vscale x 4 x i32> %head.y, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
360  %v = add <vscale x 4 x i32> %splat.x, %splat.y
361  ret <vscale x 4 x i32> %v
362}
363
364define <vscale x 8 x i32> @nxv8i32(i32 %x, i32 %y) {
365; CHECK-LABEL: nxv8i32:
366; CHECK:       # %bb.0:
367; CHECK-NEXT:    add a0, a0, a1
368; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
369; CHECK-NEXT:    vmv.v.x v8, a0
370; CHECK-NEXT:    ret
371  %head.x = insertelement <vscale x 8 x i32> poison, i32 %x, i32 0
372  %splat.x = shufflevector <vscale x 8 x i32> %head.x, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
373  %head.y = insertelement <vscale x 8 x i32> poison, i32 %y, i32 0
374  %splat.y = shufflevector <vscale x 8 x i32> %head.y, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
375  %v = add <vscale x 8 x i32> %splat.x, %splat.y
376  ret <vscale x 8 x i32> %v
377}
378
379define <vscale x 16 x i32> @nxv16i32(i32 %x, i32 %y) {
380; CHECK-LABEL: nxv16i32:
381; CHECK:       # %bb.0:
382; CHECK-NEXT:    add a0, a0, a1
383; CHECK-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
384; CHECK-NEXT:    vmv.v.x v8, a0
385; CHECK-NEXT:    ret
386  %head.x = insertelement <vscale x 16 x i32> poison, i32 %x, i32 0
387  %splat.x = shufflevector <vscale x 16 x i32> %head.x, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
388  %head.y = insertelement <vscale x 16 x i32> poison, i32 %y, i32 0
389  %splat.y = shufflevector <vscale x 16 x i32> %head.y, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
390  %v = add <vscale x 16 x i32> %splat.x, %splat.y
391  ret <vscale x 16 x i32> %v
392}
393
394define <vscale x 1 x i64> @nxv1i64(i64 %x, i64 %y) {
395; RV32-LABEL: nxv1i64:
396; RV32:       # %bb.0:
397; RV32-NEXT:    addi sp, sp, -16
398; RV32-NEXT:    .cfi_def_cfa_offset 16
399; RV32-NEXT:    add a2, a0, a2
400; RV32-NEXT:    add a1, a1, a3
401; RV32-NEXT:    sltu a0, a2, a0
402; RV32-NEXT:    add a0, a1, a0
403; RV32-NEXT:    sw a2, 8(sp)
404; RV32-NEXT:    sw a0, 12(sp)
405; RV32-NEXT:    addi a0, sp, 8
406; RV32-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
407; RV32-NEXT:    vlse64.v v8, (a0), zero
408; RV32-NEXT:    addi sp, sp, 16
409; RV32-NEXT:    .cfi_def_cfa_offset 0
410; RV32-NEXT:    ret
411;
412; RV64-LABEL: nxv1i64:
413; RV64:       # %bb.0:
414; RV64-NEXT:    add a0, a0, a1
415; RV64-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
416; RV64-NEXT:    vmv.v.x v8, a0
417; RV64-NEXT:    ret
418  %head.x = insertelement <vscale x 1 x i64> poison, i64 %x, i32 0
419  %splat.x = shufflevector <vscale x 1 x i64> %head.x, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
420  %head.y = insertelement <vscale x 1 x i64> poison, i64 %y, i32 0
421  %splat.y = shufflevector <vscale x 1 x i64> %head.y, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
422  %v = add <vscale x 1 x i64> %splat.x, %splat.y
423  ret <vscale x 1 x i64> %v
424}
425
426define <vscale x 2 x i64> @nxv2i64(i64 %x, i64 %y) {
427; RV32-LABEL: nxv2i64:
428; RV32:       # %bb.0:
429; RV32-NEXT:    addi sp, sp, -16
430; RV32-NEXT:    .cfi_def_cfa_offset 16
431; RV32-NEXT:    add a2, a0, a2
432; RV32-NEXT:    add a1, a1, a3
433; RV32-NEXT:    sltu a0, a2, a0
434; RV32-NEXT:    add a0, a1, a0
435; RV32-NEXT:    sw a2, 8(sp)
436; RV32-NEXT:    sw a0, 12(sp)
437; RV32-NEXT:    addi a0, sp, 8
438; RV32-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
439; RV32-NEXT:    vlse64.v v8, (a0), zero
440; RV32-NEXT:    addi sp, sp, 16
441; RV32-NEXT:    .cfi_def_cfa_offset 0
442; RV32-NEXT:    ret
443;
444; RV64-LABEL: nxv2i64:
445; RV64:       # %bb.0:
446; RV64-NEXT:    add a0, a0, a1
447; RV64-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
448; RV64-NEXT:    vmv.v.x v8, a0
449; RV64-NEXT:    ret
450  %head.x = insertelement <vscale x 2 x i64> poison, i64 %x, i32 0
451  %splat.x = shufflevector <vscale x 2 x i64> %head.x, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
452  %head.y = insertelement <vscale x 2 x i64> poison, i64 %y, i32 0
453  %splat.y = shufflevector <vscale x 2 x i64> %head.y, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
454  %v = add <vscale x 2 x i64> %splat.x, %splat.y
455  ret <vscale x 2 x i64> %v
456}
457
458define <vscale x 4 x i64> @nxv4i64(i64 %x, i64 %y) {
459; RV32-LABEL: nxv4i64:
460; RV32:       # %bb.0:
461; RV32-NEXT:    addi sp, sp, -16
462; RV32-NEXT:    .cfi_def_cfa_offset 16
463; RV32-NEXT:    add a2, a0, a2
464; RV32-NEXT:    add a1, a1, a3
465; RV32-NEXT:    sltu a0, a2, a0
466; RV32-NEXT:    add a0, a1, a0
467; RV32-NEXT:    sw a2, 8(sp)
468; RV32-NEXT:    sw a0, 12(sp)
469; RV32-NEXT:    addi a0, sp, 8
470; RV32-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
471; RV32-NEXT:    vlse64.v v8, (a0), zero
472; RV32-NEXT:    addi sp, sp, 16
473; RV32-NEXT:    .cfi_def_cfa_offset 0
474; RV32-NEXT:    ret
475;
476; RV64-LABEL: nxv4i64:
477; RV64:       # %bb.0:
478; RV64-NEXT:    add a0, a0, a1
479; RV64-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
480; RV64-NEXT:    vmv.v.x v8, a0
481; RV64-NEXT:    ret
482  %head.x = insertelement <vscale x 4 x i64> poison, i64 %x, i32 0
483  %splat.x = shufflevector <vscale x 4 x i64> %head.x, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
484  %head.y = insertelement <vscale x 4 x i64> poison, i64 %y, i32 0
485  %splat.y = shufflevector <vscale x 4 x i64> %head.y, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
486  %v = add <vscale x 4 x i64> %splat.x, %splat.y
487  ret <vscale x 4 x i64> %v
488}
489
490define <vscale x 8 x i64> @nxv8i64(i64 %x, i64 %y) {
491; RV32-LABEL: nxv8i64:
492; RV32:       # %bb.0:
493; RV32-NEXT:    addi sp, sp, -16
494; RV32-NEXT:    .cfi_def_cfa_offset 16
495; RV32-NEXT:    add a2, a0, a2
496; RV32-NEXT:    add a1, a1, a3
497; RV32-NEXT:    sltu a0, a2, a0
498; RV32-NEXT:    add a0, a1, a0
499; RV32-NEXT:    sw a2, 8(sp)
500; RV32-NEXT:    sw a0, 12(sp)
501; RV32-NEXT:    addi a0, sp, 8
502; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
503; RV32-NEXT:    vlse64.v v8, (a0), zero
504; RV32-NEXT:    addi sp, sp, 16
505; RV32-NEXT:    .cfi_def_cfa_offset 0
506; RV32-NEXT:    ret
507;
508; RV64-LABEL: nxv8i64:
509; RV64:       # %bb.0:
510; RV64-NEXT:    add a0, a0, a1
511; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
512; RV64-NEXT:    vmv.v.x v8, a0
513; RV64-NEXT:    ret
514  %head.x = insertelement <vscale x 8 x i64> poison, i64 %x, i32 0
515  %splat.x = shufflevector <vscale x 8 x i64> %head.x, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
516  %head.y = insertelement <vscale x 8 x i64> poison, i64 %y, i32 0
517  %splat.y = shufflevector <vscale x 8 x i64> %head.y, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
518  %v = add <vscale x 8 x i64> %splat.x, %splat.y
519  ret <vscale x 8 x i64> %v
520}
521
522define <vscale x 4 x half> @nxv4f16(half %x, half %y) {
523; CHECK-LABEL: nxv4f16:
524; CHECK:       # %bb.0:
525; CHECK-NEXT:    fadd.h fa5, fa0, fa1
526; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
527; CHECK-NEXT:    vfmv.v.f v8, fa5
528; CHECK-NEXT:    ret
529  %head.x = insertelement <vscale x 4 x half> poison, half %x, i32 0
530  %splat.x = shufflevector <vscale x 4 x half> %head.x, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
531  %head.y = insertelement <vscale x 4 x half> poison, half %y, i32 0
532  %splat.y = shufflevector <vscale x 4 x half> %head.y, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
533  %v = fadd <vscale x 4 x half> %splat.x, %splat.y
534  ret <vscale x 4 x half> %v
535}
536
537define <vscale x 2 x float> @nxv2f32(float %x, float %y) {
538; CHECK-LABEL: nxv2f32:
539; CHECK:       # %bb.0:
540; CHECK-NEXT:    fadd.s fa5, fa0, fa1
541; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
542; CHECK-NEXT:    vfmv.v.f v8, fa5
543; CHECK-NEXT:    ret
544  %head.x = insertelement <vscale x 2 x float> poison, float %x, i32 0
545  %splat.x = shufflevector <vscale x 2 x float> %head.x, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
546  %head.y = insertelement <vscale x 2 x float> poison, float %y, i32 0
547  %splat.y = shufflevector <vscale x 2 x float> %head.y, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
548  %v = fadd <vscale x 2 x float> %splat.x, %splat.y
549  ret <vscale x 2 x float> %v
550}
551
552define <vscale x 1 x double> @nxv2f64(double %x, double %y) {
553; CHECK-LABEL: nxv2f64:
554; CHECK:       # %bb.0:
555; CHECK-NEXT:    fadd.d fa5, fa0, fa1
556; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
557; CHECK-NEXT:    vfmv.v.f v8, fa5
558; CHECK-NEXT:    ret
559  %head.x = insertelement <vscale x 1 x double> poison, double %x, i32 0
560  %splat.x = shufflevector <vscale x 1 x double> %head.x, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
561  %head.y = insertelement <vscale x 1 x double> poison, double %y, i32 0
562  %splat.y = shufflevector <vscale x 1 x double> %head.y, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
563  %v = fadd <vscale x 1 x double> %splat.x, %splat.y
564  ret <vscale x 1 x double> %v
565}
566
567define <vscale x 4 x i8> @uaddsatnxv4i8(i8 %x, i8 %y) {
568; CHECK-LABEL: uaddsatnxv4i8:
569; CHECK:       # %bb.0:
570; CHECK-NEXT:    vsetvli a2, zero, e8, mf2, ta, ma
571; CHECK-NEXT:    vmv.v.x v8, a0
572; CHECK-NEXT:    vsaddu.vx v8, v8, a1
573; CHECK-NEXT:    ret
574  %head.x = insertelement <vscale x 4 x i8> poison, i8 %x, i32 0
575  %splat.x = shufflevector <vscale x 4 x i8> %head.x, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
576  %head.y = insertelement <vscale x 4 x i8> poison, i8 %y, i32 0
577  %splat.y = shufflevector <vscale x 4 x i8> %head.y, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
578  %v = call <vscale x 4 x i8> @llvm.uadd.sat.nxv4i8(<vscale x 4 x i8> %splat.x, <vscale x 4 x i8> %splat.y)
579  ret <vscale x 4 x i8> %v
580}
581
582define <vscale x 1 x i64> @uaddsatnxv1i64(i64 %x, i64 %y) {
583; RV32-LABEL: uaddsatnxv1i64:
584; RV32:       # %bb.0:
585; RV32-NEXT:    addi sp, sp, -16
586; RV32-NEXT:    .cfi_def_cfa_offset 16
587; RV32-NEXT:    sw a0, 8(sp)
588; RV32-NEXT:    sw a1, 12(sp)
589; RV32-NEXT:    addi a0, sp, 8
590; RV32-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
591; RV32-NEXT:    vlse64.v v8, (a0), zero
592; RV32-NEXT:    sw a2, 0(sp)
593; RV32-NEXT:    sw a3, 4(sp)
594; RV32-NEXT:    mv a0, sp
595; RV32-NEXT:    vlse64.v v9, (a0), zero
596; RV32-NEXT:    vsaddu.vv v8, v8, v9
597; RV32-NEXT:    addi sp, sp, 16
598; RV32-NEXT:    .cfi_def_cfa_offset 0
599; RV32-NEXT:    ret
600;
601; RV64-LABEL: uaddsatnxv1i64:
602; RV64:       # %bb.0:
603; RV64-NEXT:    vsetvli a2, zero, e64, m1, ta, ma
604; RV64-NEXT:    vmv.v.x v8, a0
605; RV64-NEXT:    vsaddu.vx v8, v8, a1
606; RV64-NEXT:    ret
607  %head.x = insertelement <vscale x 1 x i64> poison, i64 %x, i32 0
608  %splat.x = shufflevector <vscale x 1 x i64> %head.x, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
609  %head.y = insertelement <vscale x 1 x i64> poison, i64 %y, i32 0
610  %splat.y = shufflevector <vscale x 1 x i64> %head.y, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
611  %v = call <vscale x 1 x i64> @llvm.uadd.sat.nxv4i8(<vscale x 1 x i64> %splat.x, <vscale x 1 x i64> %splat.y)
612  ret <vscale x 1 x i64> %v
613}
614