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