xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-shuffle-vslide1down.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV32
3; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zvfh,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH,RV64
4; RUN: llc -mtriple=riscv32 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV32
5; RUN: llc -mtriple=riscv64 -mattr=+m,+v,+f,+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN,RV64
6
7target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
8
9define <2 x i8> @vslide1down_2xi8(<2 x i8> %v, i8 %b) {
10; CHECK-LABEL: vslide1down_2xi8:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
13; CHECK-NEXT:    vslide1down.vx v8, v8, a0
14; CHECK-NEXT:    ret
15  %vb = insertelement <2 x i8> poison, i8 %b, i64 0
16  %v1 = shufflevector <2 x i8> %v, <2 x i8> %vb, <2 x i32> <i32 1, i32 2>
17  ret <2 x i8> %v1
18}
19
20define <4 x i8> @vslide1down_4xi8(<4 x i8> %v, i8 %b) {
21; CHECK-LABEL: vslide1down_4xi8:
22; CHECK:       # %bb.0:
23; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
24; CHECK-NEXT:    vslide1down.vx v8, v8, a0
25; CHECK-NEXT:    ret
26  %vb = insertelement <4 x i8> poison, i8 %b, i64 0
27  %v1 = shufflevector <4 x i8> %v, <4 x i8> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
28  ret <4 x i8> %v1
29}
30
31define <4 x i8> @vslide1down_4xi8_swapped(<4 x i8> %v, i8 %b) {
32; CHECK-LABEL: vslide1down_4xi8_swapped:
33; CHECK:       # %bb.0:
34; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
35; CHECK-NEXT:    vslide1down.vx v8, v8, a0
36; CHECK-NEXT:    ret
37  %vb = insertelement <4 x i8> poison, i8 %b, i64 0
38  %v1 = shufflevector <4 x i8> %vb, <4 x i8> %v, <4 x i32> <i32 5, i32 6, i32 7, i32 0>
39  ret <4 x i8> %v1
40}
41
42define <2 x i16> @vslide1down_2xi16(<2 x i16> %v, i16 %b) {
43; CHECK-LABEL: vslide1down_2xi16:
44; CHECK:       # %bb.0:
45; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
46; CHECK-NEXT:    vslide1down.vx v8, v8, a0
47; CHECK-NEXT:    ret
48  %vb = insertelement <2 x i16> poison, i16 %b, i64 0
49  %v1 = shufflevector <2 x i16> %v, <2 x i16> %vb, <2 x i32> <i32 1, i32 2>
50  ret <2 x i16> %v1
51}
52
53define <4 x i16> @vslide1down_4xi16(<4 x i16> %v, i16 %b) {
54; CHECK-LABEL: vslide1down_4xi16:
55; CHECK:       # %bb.0:
56; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
57; CHECK-NEXT:    vslide1down.vx v8, v8, a0
58; CHECK-NEXT:    ret
59  %vb = insertelement <4 x i16> poison, i16 %b, i64 0
60  %v1 = shufflevector <4 x i16> %v, <4 x i16> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
61  ret <4 x i16> %v1
62}
63
64define <2 x i32> @vslide1down_2xi32(<2 x i32> %v, i32 %b) {
65; CHECK-LABEL: vslide1down_2xi32:
66; CHECK:       # %bb.0:
67; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
68; CHECK-NEXT:    vslide1down.vx v8, v8, a0
69; CHECK-NEXT:    ret
70  %vb = insertelement <2 x i32> poison, i32 %b, i64 0
71  %v1 = shufflevector <2 x i32> %v, <2 x i32> %vb, <2 x i32> <i32 1, i32 2>
72  ret <2 x i32> %v1
73}
74
75define <4 x i32> @vslide1down_4xi32(<4 x i32> %v, i32 %b) {
76; CHECK-LABEL: vslide1down_4xi32:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
79; CHECK-NEXT:    vslide1down.vx v8, v8, a0
80; CHECK-NEXT:    ret
81  %vb = insertelement <4 x i32> poison, i32 %b, i64 0
82  %v1 = shufflevector <4 x i32> %v, <4 x i32> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
83  ret <4 x i32> %v1
84}
85
86define <2 x i64> @vslide1down_2xi64(<2 x i64> %v, i64 %b) {
87; RV32-LABEL: vslide1down_2xi64:
88; RV32:       # %bb.0:
89; RV32-NEXT:    addi sp, sp, -16
90; RV32-NEXT:    .cfi_def_cfa_offset 16
91; RV32-NEXT:    sw a0, 8(sp)
92; RV32-NEXT:    sw a1, 12(sp)
93; RV32-NEXT:    addi a0, sp, 8
94; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
95; RV32-NEXT:    vlse64.v v9, (a0), zero
96; RV32-NEXT:    vslidedown.vi v8, v8, 1
97; RV32-NEXT:    vslideup.vi v8, v9, 1
98; RV32-NEXT:    addi sp, sp, 16
99; RV32-NEXT:    .cfi_def_cfa_offset 0
100; RV32-NEXT:    ret
101;
102; RV64-LABEL: vslide1down_2xi64:
103; RV64:       # %bb.0:
104; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
105; RV64-NEXT:    vslide1down.vx v8, v8, a0
106; RV64-NEXT:    ret
107  %vb = insertelement <2 x i64> poison, i64 %b, i64 0
108  %v1 = shufflevector <2 x i64> %v, <2 x i64> %vb, <2 x i32> <i32 1, i32 2>
109  ret <2 x i64> %v1
110}
111
112define <4 x i64> @vslide1down_4xi64(<4 x i64> %v, i64 %b) {
113; RV32-LABEL: vslide1down_4xi64:
114; RV32:       # %bb.0:
115; RV32-NEXT:    addi sp, sp, -16
116; RV32-NEXT:    .cfi_def_cfa_offset 16
117; RV32-NEXT:    sw a0, 8(sp)
118; RV32-NEXT:    sw a1, 12(sp)
119; RV32-NEXT:    addi a0, sp, 8
120; RV32-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
121; RV32-NEXT:    vlse64.v v10, (a0), zero
122; RV32-NEXT:    vslidedown.vi v8, v8, 1
123; RV32-NEXT:    vslideup.vi v8, v10, 3
124; RV32-NEXT:    addi sp, sp, 16
125; RV32-NEXT:    .cfi_def_cfa_offset 0
126; RV32-NEXT:    ret
127;
128; RV64-LABEL: vslide1down_4xi64:
129; RV64:       # %bb.0:
130; RV64-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
131; RV64-NEXT:    vslide1down.vx v8, v8, a0
132; RV64-NEXT:    ret
133  %vb = insertelement <4 x i64> poison, i64 %b, i64 0
134  %v1 = shufflevector <4 x i64> %v, <4 x i64> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
135  ret <4 x i64> %v1
136}
137
138define <2 x bfloat> @vslide1down_2xbf16(<2 x bfloat> %v, bfloat %b) {
139; CHECK-LABEL: vslide1down_2xbf16:
140; CHECK:       # %bb.0:
141; CHECK-NEXT:    fmv.x.h a0, fa0
142; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
143; CHECK-NEXT:    vslide1down.vx v8, v8, a0
144; CHECK-NEXT:    ret
145  %vb = insertelement <2 x bfloat> poison, bfloat %b, i64 0
146  %v1 = shufflevector <2 x bfloat> %v, <2 x bfloat> %vb, <2 x i32> <i32 1, i32 2>
147  ret <2 x bfloat> %v1
148}
149
150define <4 x bfloat> @vslide1down_4xbf16(<4 x bfloat> %v, bfloat %b) {
151; CHECK-LABEL: vslide1down_4xbf16:
152; CHECK:       # %bb.0:
153; CHECK-NEXT:    fmv.x.h a0, fa0
154; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
155; CHECK-NEXT:    vslide1down.vx v8, v8, a0
156; CHECK-NEXT:    ret
157  %vb = insertelement <4 x bfloat> poison, bfloat %b, i64 0
158  %v1 = shufflevector <4 x bfloat> %v, <4 x bfloat> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
159  ret <4 x bfloat> %v1
160}
161
162define <2 x half> @vslide1down_2xf16(<2 x half> %v, half %b) {
163; ZVFH-LABEL: vslide1down_2xf16:
164; ZVFH:       # %bb.0:
165; ZVFH-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
166; ZVFH-NEXT:    vfslide1down.vf v8, v8, fa0
167; ZVFH-NEXT:    ret
168;
169; ZVFHMIN-LABEL: vslide1down_2xf16:
170; ZVFHMIN:       # %bb.0:
171; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
172; ZVFHMIN-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
173; ZVFHMIN-NEXT:    vslide1down.vx v8, v8, a0
174; ZVFHMIN-NEXT:    ret
175  %vb = insertelement <2 x half> poison, half %b, i64 0
176  %v1 = shufflevector <2 x half> %v, <2 x half> %vb, <2 x i32> <i32 1, i32 2>
177  ret <2 x half> %v1
178}
179
180define <4 x half> @vslide1down_4xf16(<4 x half> %v, half %b) {
181; ZVFH-LABEL: vslide1down_4xf16:
182; ZVFH:       # %bb.0:
183; ZVFH-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
184; ZVFH-NEXT:    vfslide1down.vf v8, v8, fa0
185; ZVFH-NEXT:    ret
186;
187; ZVFHMIN-LABEL: vslide1down_4xf16:
188; ZVFHMIN:       # %bb.0:
189; ZVFHMIN-NEXT:    fmv.x.h a0, fa0
190; ZVFHMIN-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
191; ZVFHMIN-NEXT:    vslide1down.vx v8, v8, a0
192; ZVFHMIN-NEXT:    ret
193  %vb = insertelement <4 x half> poison, half %b, i64 0
194  %v1 = shufflevector <4 x half> %v, <4 x half> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
195  ret <4 x half> %v1
196}
197
198define <2 x float> @vslide1down_2xf32(<2 x float> %v, float %b) {
199; CHECK-LABEL: vslide1down_2xf32:
200; CHECK:       # %bb.0:
201; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
202; CHECK-NEXT:    vfslide1down.vf v8, v8, fa0
203; CHECK-NEXT:    ret
204  %vb = insertelement <2 x float> poison, float %b, i64 0
205  %v1 = shufflevector <2 x float> %v, <2 x float> %vb, <2 x i32> <i32 1, i32 2>
206  ret <2 x float> %v1
207}
208
209define <4 x float> @vslide1down_4xf32(<4 x float> %v, float %b) {
210; CHECK-LABEL: vslide1down_4xf32:
211; CHECK:       # %bb.0:
212; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
213; CHECK-NEXT:    vfslide1down.vf v8, v8, fa0
214; CHECK-NEXT:    ret
215  %vb = insertelement <4 x float> poison, float %b, i64 0
216  %v1 = shufflevector <4 x float> %v, <4 x float> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
217  ret <4 x float> %v1
218}
219
220define <2 x double> @vslide1down_2xf64(<2 x double> %v, double %b) {
221; CHECK-LABEL: vslide1down_2xf64:
222; CHECK:       # %bb.0:
223; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
224; CHECK-NEXT:    vfslide1down.vf v8, v8, fa0
225; CHECK-NEXT:    ret
226  %vb = insertelement <2 x double> poison, double %b, i64 0
227  %v1 = shufflevector <2 x double> %v, <2 x double> %vb, <2 x i32> <i32 1, i32 2>
228  ret <2 x double> %v1
229}
230
231define <4 x double> @vslide1down_4xf64(<4 x double> %v, double %b) {
232; CHECK-LABEL: vslide1down_4xf64:
233; CHECK:       # %bb.0:
234; CHECK-NEXT:    vsetivli zero, 4, e64, m2, ta, ma
235; CHECK-NEXT:    vfslide1down.vf v8, v8, fa0
236; CHECK-NEXT:    ret
237  %vb = insertelement <4 x double> poison, double %b, i64 0
238  %v1 = shufflevector <4 x double> %v, <4 x double> %vb, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
239  ret <4 x double> %v1
240}
241
242define <4 x i8> @vslide1down_4xi8_with_splat(<4 x i8> %v, i8 %b) {
243; CHECK-LABEL: vslide1down_4xi8_with_splat:
244; CHECK:       # %bb.0:
245; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
246; CHECK-NEXT:    vslide1down.vx v8, v8, a0
247; CHECK-NEXT:    ret
248  %vb = insertelement <4 x i8> poison, i8 %b, i64 0
249  %v1 = shufflevector <4 x i8> %vb, <4 x i8> poison, <4 x i32> zeroinitializer
250  %v2 = shufflevector <4 x i8> %v1, <4 x i8> %v, <4 x i32> <i32 5, i32 6, i32 7, i32 1>
251  ret <4 x i8> %v2
252}
253
254define <2 x double> @vslide1down_v2f64_inverted(<2 x double> %v, double %b) {
255; CHECK-LABEL: vslide1down_v2f64_inverted:
256; CHECK:       # %bb.0:
257; CHECK-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
258; CHECK-NEXT:    vrgather.vi v9, v8, 0
259; CHECK-NEXT:    vfmv.s.f v8, fa0
260; CHECK-NEXT:    vslideup.vi v9, v8, 1
261; CHECK-NEXT:    vmv.v.v v8, v9
262; CHECK-NEXT:    ret
263  %v1 = shufflevector <2 x double> %v, <2 x double> poison, <2 x i32> <i32 0, i32 0>
264  %v2 = insertelement <2 x double> %v1, double %b, i64 1
265  ret <2 x double> %v2
266}
267
268define <4 x i8> @vslide1down_4xi8_inverted(<4 x i8> %v, i8 %b) {
269; CHECK-LABEL: vslide1down_4xi8_inverted:
270; CHECK:       # %bb.0:
271; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
272; CHECK-NEXT:    vslideup.vi v9, v8, 1
273; CHECK-NEXT:    vmv.s.x v8, a0
274; CHECK-NEXT:    vsetivli zero, 2, e8, mf4, tu, ma
275; CHECK-NEXT:    vslideup.vi v9, v8, 1
276; CHECK-NEXT:    vmv1r.v v8, v9
277; CHECK-NEXT:    ret
278  %v1 = shufflevector <4 x i8> %v, <4 x i8> poison, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>
279  %v2 = insertelement <4 x i8> %v1, i8 %b, i64 1
280  ret <4 x i8> %v2
281}
282