Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vp-splice-mask-fixed-vectors.ll
blob9496cd82947d4bfd5055144d06cd229e449ff287
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs -riscv-v-vector-bits-min=128 \
3 ; RUN:   < %s | FileCheck %s
5 declare <2 x i1> @llvm.experimental.vp.splice.v2i1(<2 x i1>, <2 x i1>, i32, <2 x i1>, i32, i32)
6 declare <4 x i1> @llvm.experimental.vp.splice.v4i1(<4 x i1>, <4 x i1>, i32, <4 x i1>, i32, i32)
7 declare <8 x i1> @llvm.experimental.vp.splice.v8i1(<8 x i1>, <8 x i1>, i32, <8 x i1>, i32, i32)
8 declare <16 x i1> @llvm.experimental.vp.splice.v16i1(<16 x i1>, <16 x i1>, i32, <16 x i1>, i32, i32)
10 define <2 x i1> @test_vp_splice_v2i1(<2 x i1> %va, <2 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
11 ; CHECK-LABEL: test_vp_splice_v2i1:
12 ; CHECK:       # %bb.0:
13 ; CHECK-NEXT:    vmv1r.v v9, v0
14 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
15 ; CHECK-NEXT:    vmv.v.i v10, 0
16 ; CHECK-NEXT:    vmv1r.v v0, v8
17 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
18 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
19 ; CHECK-NEXT:    vmv.v.i v10, 0
20 ; CHECK-NEXT:    vmv1r.v v0, v9
21 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
22 ; CHECK-NEXT:    addi a0, a0, -5
23 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
24 ; CHECK-NEXT:    vslidedown.vi v9, v9, 5
25 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
26 ; CHECK-NEXT:    vslideup.vx v9, v8, a0
27 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
28 ; CHECK-NEXT:    ret
30   %v = call <2 x i1> @llvm.experimental.vp.splice.v2i1(<2 x i1> %va, <2 x i1> %vb, i32 5, <2 x i1> splat (i1 1), i32 %evla, i32 %evlb)
31   ret <2 x i1> %v
34 define <2 x i1> @test_vp_splice_v2i1_negative_offset(<2 x i1> %va, <2 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
35 ; CHECK-LABEL: test_vp_splice_v2i1_negative_offset:
36 ; CHECK:       # %bb.0:
37 ; CHECK-NEXT:    vmv1r.v v9, v0
38 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
39 ; CHECK-NEXT:    vmv.v.i v10, 0
40 ; CHECK-NEXT:    vmv1r.v v0, v8
41 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
42 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
43 ; CHECK-NEXT:    vmv.v.i v10, 0
44 ; CHECK-NEXT:    vmv1r.v v0, v9
45 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
46 ; CHECK-NEXT:    addi a0, a0, -5
47 ; CHECK-NEXT:    vsetivli zero, 5, e8, mf8, ta, ma
48 ; CHECK-NEXT:    vslidedown.vx v9, v9, a0
49 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
50 ; CHECK-NEXT:    vslideup.vi v9, v8, 5
51 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
52 ; CHECK-NEXT:    ret
54   %v = call <2 x i1> @llvm.experimental.vp.splice.v2i1(<2 x i1> %va, <2 x i1> %vb, i32 -5, <2 x i1> splat (i1 1), i32 %evla, i32 %evlb)
55   ret <2 x i1> %v
58 define <2 x i1> @test_vp_splice_v2i1_masked(<2 x i1> %va, <2 x i1> %vb, <2 x i1> %mask, i32 zeroext %evla, i32 zeroext %evlb) {
59 ; CHECK-LABEL: test_vp_splice_v2i1_masked:
60 ; CHECK:       # %bb.0:
61 ; CHECK-NEXT:    vmv1r.v v10, v0
62 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
63 ; CHECK-NEXT:    vmv.v.i v11, 0
64 ; CHECK-NEXT:    vmv1r.v v0, v8
65 ; CHECK-NEXT:    vmerge.vim v8, v11, 1, v0
66 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
67 ; CHECK-NEXT:    vmv.v.i v11, 0
68 ; CHECK-NEXT:    vmv1r.v v0, v10
69 ; CHECK-NEXT:    vmerge.vim v10, v11, 1, v0
70 ; CHECK-NEXT:    addi a0, a0, -5
71 ; CHECK-NEXT:    vmv1r.v v0, v9
72 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
73 ; CHECK-NEXT:    vslidedown.vi v10, v10, 5, v0.t
74 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, mu
75 ; CHECK-NEXT:    vslideup.vx v10, v8, a0, v0.t
76 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
77 ; CHECK-NEXT:    vmsne.vi v0, v10, 0, v0.t
78 ; CHECK-NEXT:    ret
79   %v = call <2 x i1> @llvm.experimental.vp.splice.v2i1(<2 x i1> %va, <2 x i1> %vb, i32 5, <2 x i1> %mask, i32 %evla, i32 %evlb)
80   ret <2 x i1> %v
83 define <4 x i1> @test_vp_splice_v4i1(<4 x i1> %va, <4 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
84 ; CHECK-LABEL: test_vp_splice_v4i1:
85 ; CHECK:       # %bb.0:
86 ; CHECK-NEXT:    vmv1r.v v9, v0
87 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
88 ; CHECK-NEXT:    vmv.v.i v10, 0
89 ; CHECK-NEXT:    vmv1r.v v0, v8
90 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
91 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
92 ; CHECK-NEXT:    vmv.v.i v10, 0
93 ; CHECK-NEXT:    vmv1r.v v0, v9
94 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
95 ; CHECK-NEXT:    addi a0, a0, -5
96 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
97 ; CHECK-NEXT:    vslidedown.vi v9, v9, 5
98 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
99 ; CHECK-NEXT:    vslideup.vx v9, v8, a0
100 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
101 ; CHECK-NEXT:    ret
103   %v = call <4 x i1> @llvm.experimental.vp.splice.v4i1(<4 x i1> %va, <4 x i1> %vb, i32 5, <4 x i1> splat (i1 1), i32 %evla, i32 %evlb)
104   ret <4 x i1> %v
107 define <4 x i1> @test_vp_splice_v4i1_negative_offset(<4 x i1> %va, <4 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
108 ; CHECK-LABEL: test_vp_splice_v4i1_negative_offset:
109 ; CHECK:       # %bb.0:
110 ; CHECK-NEXT:    vmv1r.v v9, v0
111 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
112 ; CHECK-NEXT:    vmv.v.i v10, 0
113 ; CHECK-NEXT:    vmv1r.v v0, v8
114 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
115 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
116 ; CHECK-NEXT:    vmv.v.i v10, 0
117 ; CHECK-NEXT:    vmv1r.v v0, v9
118 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
119 ; CHECK-NEXT:    addi a0, a0, -5
120 ; CHECK-NEXT:    vsetivli zero, 5, e8, mf4, ta, ma
121 ; CHECK-NEXT:    vslidedown.vx v9, v9, a0
122 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
123 ; CHECK-NEXT:    vslideup.vi v9, v8, 5
124 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
125 ; CHECK-NEXT:    ret
127   %v = call <4 x i1> @llvm.experimental.vp.splice.v4i1(<4 x i1> %va, <4 x i1> %vb, i32 -5, <4 x i1> splat (i1 1), i32 %evla, i32 %evlb)
128   ret <4 x i1> %v
131 define <4 x i1> @test_vp_splice_v4i1_masked(<4 x i1> %va, <4 x i1> %vb, <4 x i1> %mask, i32 zeroext %evla, i32 zeroext %evlb) {
132 ; CHECK-LABEL: test_vp_splice_v4i1_masked:
133 ; CHECK:       # %bb.0:
134 ; CHECK-NEXT:    vmv1r.v v10, v0
135 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
136 ; CHECK-NEXT:    vmv.v.i v11, 0
137 ; CHECK-NEXT:    vmv1r.v v0, v8
138 ; CHECK-NEXT:    vmerge.vim v8, v11, 1, v0
139 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
140 ; CHECK-NEXT:    vmv.v.i v11, 0
141 ; CHECK-NEXT:    vmv1r.v v0, v10
142 ; CHECK-NEXT:    vmerge.vim v10, v11, 1, v0
143 ; CHECK-NEXT:    addi a0, a0, -5
144 ; CHECK-NEXT:    vmv1r.v v0, v9
145 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
146 ; CHECK-NEXT:    vslidedown.vi v10, v10, 5, v0.t
147 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, mu
148 ; CHECK-NEXT:    vslideup.vx v10, v8, a0, v0.t
149 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
150 ; CHECK-NEXT:    vmsne.vi v0, v10, 0, v0.t
151 ; CHECK-NEXT:    ret
152   %v = call <4 x i1> @llvm.experimental.vp.splice.v4i1(<4 x i1> %va, <4 x i1> %vb, i32 5, <4 x i1> %mask, i32 %evla, i32 %evlb)
153   ret <4 x i1> %v
156 define <8 x i1> @test_vp_splice_v8i1(<8 x i1> %va, <8 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
157 ; CHECK-LABEL: test_vp_splice_v8i1:
158 ; CHECK:       # %bb.0:
159 ; CHECK-NEXT:    vmv1r.v v9, v0
160 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
161 ; CHECK-NEXT:    vmv.v.i v10, 0
162 ; CHECK-NEXT:    vmv1r.v v0, v8
163 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
164 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
165 ; CHECK-NEXT:    vmv.v.i v10, 0
166 ; CHECK-NEXT:    vmv1r.v v0, v9
167 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
168 ; CHECK-NEXT:    addi a0, a0, -5
169 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
170 ; CHECK-NEXT:    vslidedown.vi v9, v9, 5
171 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
172 ; CHECK-NEXT:    vslideup.vx v9, v8, a0
173 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
174 ; CHECK-NEXT:    ret
176   %v = call <8 x i1> @llvm.experimental.vp.splice.v8i1(<8 x i1> %va, <8 x i1> %vb, i32 5, <8 x i1> splat (i1 1), i32 %evla, i32 %evlb)
177   ret <8 x i1> %v
180 define <8 x i1> @test_vp_splice_v8i1_negative_offset(<8 x i1> %va, <8 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
181 ; CHECK-LABEL: test_vp_splice_v8i1_negative_offset:
182 ; CHECK:       # %bb.0:
183 ; CHECK-NEXT:    vmv1r.v v9, v0
184 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
185 ; CHECK-NEXT:    vmv.v.i v10, 0
186 ; CHECK-NEXT:    vmv1r.v v0, v8
187 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
188 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
189 ; CHECK-NEXT:    vmv.v.i v10, 0
190 ; CHECK-NEXT:    vmv1r.v v0, v9
191 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
192 ; CHECK-NEXT:    addi a0, a0, -5
193 ; CHECK-NEXT:    vsetivli zero, 5, e8, mf2, ta, ma
194 ; CHECK-NEXT:    vslidedown.vx v9, v9, a0
195 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
196 ; CHECK-NEXT:    vslideup.vi v9, v8, 5
197 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
198 ; CHECK-NEXT:    ret
200   %v = call <8 x i1> @llvm.experimental.vp.splice.v8i1(<8 x i1> %va, <8 x i1> %vb, i32 -5, <8 x i1> splat (i1 1), i32 %evla, i32 %evlb)
201   ret <8 x i1> %v
204 define <8 x i1> @test_vp_splice_v8i1_masked(<8 x i1> %va, <8 x i1> %vb, <8 x i1> %mask, i32 zeroext %evla, i32 zeroext %evlb) {
205 ; CHECK-LABEL: test_vp_splice_v8i1_masked:
206 ; CHECK:       # %bb.0:
207 ; CHECK-NEXT:    vmv1r.v v10, v0
208 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
209 ; CHECK-NEXT:    vmv.v.i v11, 0
210 ; CHECK-NEXT:    vmv1r.v v0, v8
211 ; CHECK-NEXT:    vmerge.vim v8, v11, 1, v0
212 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
213 ; CHECK-NEXT:    vmv.v.i v11, 0
214 ; CHECK-NEXT:    vmv1r.v v0, v10
215 ; CHECK-NEXT:    vmerge.vim v10, v11, 1, v0
216 ; CHECK-NEXT:    addi a0, a0, -5
217 ; CHECK-NEXT:    vmv1r.v v0, v9
218 ; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
219 ; CHECK-NEXT:    vslidedown.vi v10, v10, 5, v0.t
220 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, mu
221 ; CHECK-NEXT:    vslideup.vx v10, v8, a0, v0.t
222 ; CHECK-NEXT:    vsetvli zero, zero, e8, mf2, ta, ma
223 ; CHECK-NEXT:    vmsne.vi v0, v10, 0, v0.t
224 ; CHECK-NEXT:    ret
225   %v = call <8 x i1> @llvm.experimental.vp.splice.v8i1(<8 x i1> %va, <8 x i1> %vb, i32 5, <8 x i1> %mask, i32 %evla, i32 %evlb)
226   ret <8 x i1> %v
229 define <16 x i1> @test_vp_splice_v16i1(<16 x i1> %va, <16 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
230 ; CHECK-LABEL: test_vp_splice_v16i1:
231 ; CHECK:       # %bb.0:
232 ; CHECK-NEXT:    vmv1r.v v9, v0
233 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
234 ; CHECK-NEXT:    vmv.v.i v10, 0
235 ; CHECK-NEXT:    vmv1r.v v0, v8
236 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
237 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
238 ; CHECK-NEXT:    vmv.v.i v10, 0
239 ; CHECK-NEXT:    vmv1r.v v0, v9
240 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
241 ; CHECK-NEXT:    addi a0, a0, -5
242 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
243 ; CHECK-NEXT:    vslidedown.vi v9, v9, 5
244 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
245 ; CHECK-NEXT:    vslideup.vx v9, v8, a0
246 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
247 ; CHECK-NEXT:    ret
249   %v = call <16 x i1> @llvm.experimental.vp.splice.v16i1(<16 x i1> %va, <16 x i1> %vb, i32 5, <16 x i1> splat (i1 1), i32 %evla, i32 %evlb)
250   ret <16 x i1> %v
253 define <16 x i1> @test_vp_splice_v16i1_negative_offset(<16 x i1> %va, <16 x i1> %vb, i32 zeroext %evla, i32 zeroext %evlb) {
254 ; CHECK-LABEL: test_vp_splice_v16i1_negative_offset:
255 ; CHECK:       # %bb.0:
256 ; CHECK-NEXT:    vmv1r.v v9, v0
257 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
258 ; CHECK-NEXT:    vmv.v.i v10, 0
259 ; CHECK-NEXT:    vmv1r.v v0, v8
260 ; CHECK-NEXT:    vmerge.vim v8, v10, 1, v0
261 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
262 ; CHECK-NEXT:    vmv.v.i v10, 0
263 ; CHECK-NEXT:    vmv1r.v v0, v9
264 ; CHECK-NEXT:    vmerge.vim v9, v10, 1, v0
265 ; CHECK-NEXT:    addi a0, a0, -5
266 ; CHECK-NEXT:    vsetivli zero, 5, e8, m1, ta, ma
267 ; CHECK-NEXT:    vslidedown.vx v9, v9, a0
268 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
269 ; CHECK-NEXT:    vslideup.vi v9, v8, 5
270 ; CHECK-NEXT:    vmsne.vi v0, v9, 0
271 ; CHECK-NEXT:    ret
273   %v = call <16 x i1> @llvm.experimental.vp.splice.v16i1(<16 x i1> %va, <16 x i1> %vb, i32 -5, <16 x i1> splat (i1 1), i32 %evla, i32 %evlb)
274   ret <16 x i1> %v
277 define <16 x i1> @test_vp_splice_v16i1_masked(<16 x i1> %va, <16 x i1> %vb, <16 x i1> %mask, i32 zeroext %evla, i32 zeroext %evlb) {
278 ; CHECK-LABEL: test_vp_splice_v16i1_masked:
279 ; CHECK:       # %bb.0:
280 ; CHECK-NEXT:    vmv1r.v v10, v0
281 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
282 ; CHECK-NEXT:    vmv.v.i v11, 0
283 ; CHECK-NEXT:    vmv1r.v v0, v8
284 ; CHECK-NEXT:    vmerge.vim v8, v11, 1, v0
285 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
286 ; CHECK-NEXT:    vmv.v.i v11, 0
287 ; CHECK-NEXT:    vmv1r.v v0, v10
288 ; CHECK-NEXT:    vmerge.vim v10, v11, 1, v0
289 ; CHECK-NEXT:    addi a0, a0, -5
290 ; CHECK-NEXT:    vmv1r.v v0, v9
291 ; CHECK-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
292 ; CHECK-NEXT:    vslidedown.vi v10, v10, 5, v0.t
293 ; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, mu
294 ; CHECK-NEXT:    vslideup.vx v10, v8, a0, v0.t
295 ; CHECK-NEXT:    vsetvli zero, zero, e8, m1, ta, ma
296 ; CHECK-NEXT:    vmsne.vi v0, v10, 0, v0.t
297 ; CHECK-NEXT:    ret
298   %v = call <16 x i1> @llvm.experimental.vp.splice.v16i1(<16 x i1> %va, <16 x i1> %vb, i32 5, <16 x i1> %mask, i32 %evla, i32 %evlb)
299   ret <16 x i1> %v