Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-vnsra-vnsrl.ll
blob678d2524c75d711ef01b54b30453cfa76969f23f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
3 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
5 define <8 x i8> @vnsra_v8i16_v8i8_scalar(<8 x i16> %x, i16 %y) {
6 ; CHECK-LABEL: vnsra_v8i16_v8i8_scalar:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
9 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
10 ; CHECK-NEXT:    ret
11   %insert = insertelement <8 x i16> poison, i16 %y, i16 0
12   %splat = shufflevector <8 x i16> %insert, <8 x i16> poison, <8 x i32> zeroinitializer
13   %a = ashr <8 x i16> %x, %splat
14   %b = trunc <8 x i16> %a to <8 x i8>
15   ret <8 x i8> %b
18 define <8 x i8> @vnsra_v8i16_v8i8_scalar_sext(<8 x i16> %x, i8 %y) {
19 ; CHECK-LABEL: vnsra_v8i16_v8i8_scalar_sext:
20 ; CHECK:       # %bb.0:
21 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
22 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
23 ; CHECK-NEXT:    ret
24   %insert = insertelement <8 x i8> poison, i8 %y, i8 0
25   %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer
26   %sext = sext <8 x i8> %splat to <8 x i16>
27   %a = ashr <8 x i16> %x, %sext
28   %b = trunc <8 x i16> %a to <8 x i8>
29   ret <8 x i8> %b
32 define <8 x i8> @vnsra_v8i16_v8i8_scalar_zext(<8 x i16> %x, i8 %y) {
33 ; CHECK-LABEL: vnsra_v8i16_v8i8_scalar_zext:
34 ; CHECK:       # %bb.0:
35 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
36 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
37 ; CHECK-NEXT:    ret
38   %insert = insertelement <8 x i8> poison, i8 %y, i8 0
39   %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer
40   %zext = zext <8 x i8> %splat to <8 x i16>
41   %a = ashr <8 x i16> %x, %zext
42   %b = trunc <8 x i16> %a to <8 x i8>
43   ret <8 x i8> %b
46 define <4 x i16> @vnsra_v4i32_v4i16_scalar(<4 x i32> %x, i32 %y) {
47 ; CHECK-LABEL: vnsra_v4i32_v4i16_scalar:
48 ; CHECK:       # %bb.0:
49 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
50 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
51 ; CHECK-NEXT:    ret
52   %insert = insertelement <4 x i32> poison, i32 %y, i32 0
53   %splat = shufflevector <4 x i32> %insert, <4 x i32> poison, <4 x i32> zeroinitializer
54   %a = ashr <4 x i32> %x, %splat
55   %b = trunc <4 x i32> %a to <4 x i16>
56   ret <4 x i16> %b
59 define <4 x i16> @vnsra_v4i32_v4i16_scalar_sext(<4 x i32> %x, i16 %y) {
60 ; CHECK-LABEL: vnsra_v4i32_v4i16_scalar_sext:
61 ; CHECK:       # %bb.0:
62 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
63 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
64 ; CHECK-NEXT:    ret
65   %insert = insertelement <4 x i16> poison, i16 %y, i16 0
66   %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer
67   %sext = sext <4 x i16> %splat to <4 x i32>
68   %a = ashr <4 x i32> %x, %sext
69   %b = trunc <4 x i32> %a to <4 x i16>
70   ret <4 x i16> %b
73 define <4 x i16> @vnsra_v4i32_v4i16_scalar_zext(<4 x i32> %x, i16 %y) {
74 ; CHECK-LABEL: vnsra_v4i32_v4i16_scalar_zext:
75 ; CHECK:       # %bb.0:
76 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
77 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
78 ; CHECK-NEXT:    ret
79   %insert = insertelement <4 x i16> poison, i16 %y, i16 0
80   %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer
81   %zext = zext <4 x i16> %splat to <4 x i32>
82   %a = ashr <4 x i32> %x, %zext
83   %b = trunc <4 x i32> %a to <4 x i16>
84   ret <4 x i16> %b
87 define <2 x i32> @vnsra_v2i64_v2i32_scalar(<2 x i64> %x, i64 %y) {
88 ; CHECK-LABEL: vnsra_v2i64_v2i32_scalar:
89 ; CHECK:       # %bb.0:
90 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
91 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
92 ; CHECK-NEXT:    ret
93   %insert = insertelement <2 x i64> poison, i64 %y, i32 0
94   %splat = shufflevector <2 x i64> %insert, <2 x i64> poison, <2 x i32> zeroinitializer
95   %a = ashr <2 x i64> %x, %splat
96   %b = trunc <2 x i64> %a to <2 x i32>
97   ret <2 x i32> %b
100 define <2 x i32> @vnsra_v2i64_v2i32_scalar_sext(<2 x i64> %x, i32 %y) {
101 ; CHECK-LABEL: vnsra_v2i64_v2i32_scalar_sext:
102 ; CHECK:       # %bb.0:
103 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
104 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
105 ; CHECK-NEXT:    ret
106   %insert = insertelement <2 x i32> poison, i32 %y, i32 0
107   %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer
108   %sext = sext <2 x i32> %splat to <2 x i64>
109   %a = ashr <2 x i64> %x, %sext
110   %b = trunc <2 x i64> %a to <2 x i32>
111   ret <2 x i32> %b
114 define <2 x i32> @vnsra_v2i64_v2i32_scalar_zext(<2 x i64> %x, i32 %y) {
115 ; CHECK-LABEL: vnsra_v2i64_v2i32_scalar_zext:
116 ; CHECK:       # %bb.0:
117 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
118 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
119 ; CHECK-NEXT:    ret
120   %insert = insertelement <2 x i32> poison, i32 %y, i32 0
121   %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer
122   %zext = zext <2 x i32> %splat to <2 x i64>
123   %a = ashr <2 x i64> %x, %zext
124   %b = trunc <2 x i64> %a to <2 x i32>
125   ret <2 x i32> %b
128 define <8 x i8> @vnsra_v8i16_v8i8_imm(<8 x i16> %x) {
129 ; CHECK-LABEL: vnsra_v8i16_v8i8_imm:
130 ; CHECK:       # %bb.0:
131 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
132 ; CHECK-NEXT:    vnsrl.wi v8, v8, 8
133 ; CHECK-NEXT:    ret
134   %a = ashr <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8,i16 8, i16 8, i16 8, i16 8>
135   %b = trunc <8 x i16> %a to <8 x i8>
136   ret <8 x i8> %b
139 define <4 x i16> @vnsra_v4i32_v4i16_imm(<4 x i32> %x) {
140 ; CHECK-LABEL: vnsra_v4i32_v4i16_imm:
141 ; CHECK:       # %bb.0:
142 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
143 ; CHECK-NEXT:    vnsrl.wi v8, v8, 16
144 ; CHECK-NEXT:    ret
145   %a = ashr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16>
146   %b = trunc <4 x i32> %a to <4 x i16>
147   ret <4 x i16> %b
150 define <2 x i32> @vnsra_v2i64_v2i32_imm(<2 x i64> %x) {
151 ; CHECK-LABEL: vnsra_v2i64_v2i32_imm:
152 ; CHECK:       # %bb.0:
153 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
154 ; CHECK-NEXT:    vnsrl.wi v8, v8, 31
155 ; CHECK-NEXT:    ret
156   %a = ashr <2 x i64> %x, <i64 31, i64 31>
157   %b = trunc <2 x i64> %a to <2 x i32>
158   ret <2 x i32> %b
161 define <8 x i8> @vnsra_v8i16_v8i8_sext(<8 x i16> %x, <8 x i8> %y) {
162 ; CHECK-LABEL: vnsra_v8i16_v8i8_sext:
163 ; CHECK:       # %bb.0:
164 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
165 ; CHECK-NEXT:    vnsra.wv v8, v8, v9
166 ; CHECK-NEXT:    ret
167   %sext = sext <8 x i8> %y to <8 x i16>
168   %a = ashr <8 x i16> %x, %sext
169   %b = trunc <8 x i16> %a to <8 x i8>
170   ret <8 x i8> %b
173 define <8 x i8> @vnsra_v8i16_v8i8_zext(<8 x i16> %x, <8 x i8> %y) {
174 ; CHECK-LABEL: vnsra_v8i16_v8i8_zext:
175 ; CHECK:       # %bb.0:
176 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
177 ; CHECK-NEXT:    vnsra.wv v8, v8, v9
178 ; CHECK-NEXT:    ret
179   %sext = zext <8 x i8> %y to <8 x i16>
180   %a = ashr <8 x i16> %x, %sext
181   %b = trunc <8 x i16> %a to <8 x i8>
182   ret <8 x i8> %b
185 define <8 x i8> @vnsrl_v8i16_v8i8_scalar(<8 x i16> %x, i16 %y) {
186 ; CHECK-LABEL: vnsrl_v8i16_v8i8_scalar:
187 ; CHECK:       # %bb.0:
188 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
189 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
190 ; CHECK-NEXT:    ret
191   %insert = insertelement <8 x i16> poison, i16 %y, i16 0
192   %splat = shufflevector <8 x i16> %insert, <8 x i16> poison, <8 x i32> zeroinitializer
193   %a = lshr <8 x i16> %x, %splat
194   %b = trunc <8 x i16> %a to <8 x i8>
195   ret <8 x i8> %b
198 define <8 x i8> @vnsrl_v8i16_v8i8_scalar_sext(<8 x i16> %x, i8 %y) {
199 ; CHECK-LABEL: vnsrl_v8i16_v8i8_scalar_sext:
200 ; CHECK:       # %bb.0:
201 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
202 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
203 ; CHECK-NEXT:    ret
204   %insert = insertelement <8 x i8> poison, i8 %y, i16 0
205   %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer
206   %sext = sext <8 x i8> %splat to <8 x i16>
207   %a = lshr <8 x i16> %x, %sext
208   %b = trunc <8 x i16> %a to <8 x i8>
209   ret <8 x i8> %b
212 define <8 x i8> @vnsrl_v8i16_v8i8_scalar_zext(<8 x i16> %x, i8 %y) {
213 ; CHECK-LABEL: vnsrl_v8i16_v8i8_scalar_zext:
214 ; CHECK:       # %bb.0:
215 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
216 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
217 ; CHECK-NEXT:    ret
218   %insert = insertelement <8 x i8> poison, i8 %y, i16 0
219   %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer
220   %zext = zext <8 x i8> %splat to <8 x i16>
221   %a = lshr <8 x i16> %x, %zext
222   %b = trunc <8 x i16> %a to <8 x i8>
223   ret <8 x i8> %b
226 define <4 x i16> @vnsrl_v4i32_v4i16_scalar(<4 x i32> %x, i32 %y) {
227 ; CHECK-LABEL: vnsrl_v4i32_v4i16_scalar:
228 ; CHECK:       # %bb.0:
229 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
230 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
231 ; CHECK-NEXT:    ret
232   %insert = insertelement <4 x i32> poison, i32 %y, i32 0
233   %splat = shufflevector <4 x i32> %insert, <4 x i32> poison, <4 x i32> zeroinitializer
234   %a = lshr <4 x i32> %x, %splat
235   %b = trunc <4 x i32> %a to <4 x i16>
236   ret <4 x i16> %b
239 define <4 x i16> @vnsrl_v4i32_v4i16_scalar_sext(<4 x i32> %x, i16 %y) {
240 ; CHECK-LABEL: vnsrl_v4i32_v4i16_scalar_sext:
241 ; CHECK:       # %bb.0:
242 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
243 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
244 ; CHECK-NEXT:    ret
245   %insert = insertelement <4 x i16> poison, i16 %y, i16 0
246   %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer
247   %sext = sext <4 x i16> %splat to <4 x i32>
248   %a = lshr <4 x i32> %x, %sext
249   %b = trunc <4 x i32> %a to <4 x i16>
250   ret <4 x i16> %b
253 define <4 x i16> @vnsrl_v4i32_v4i16_scalar_zext(<4 x i32> %x, i16 %y) {
254 ; CHECK-LABEL: vnsrl_v4i32_v4i16_scalar_zext:
255 ; CHECK:       # %bb.0:
256 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
257 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
258 ; CHECK-NEXT:    ret
259   %insert = insertelement <4 x i16> poison, i16 %y, i16 0
260   %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer
261   %zext = zext <4 x i16> %splat to <4 x i32>
262   %a = lshr <4 x i32> %x, %zext
263   %b = trunc <4 x i32> %a to <4 x i16>
264   ret <4 x i16> %b
267 define <2 x i32> @vnsrl_v2i64_v2i32_scalar(<2 x i64> %x, i64 %y) {
268 ; CHECK-LABEL: vnsrl_v2i64_v2i32_scalar:
269 ; CHECK:       # %bb.0:
270 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
271 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
272 ; CHECK-NEXT:    ret
273   %insert = insertelement <2 x i64> poison, i64 %y, i32 0
274   %splat = shufflevector <2 x i64> %insert, <2 x i64> poison, <2 x i32> zeroinitializer
275   %a = lshr <2 x i64> %x, %splat
276   %b = trunc <2 x i64> %a to <2 x i32>
277   ret <2 x i32> %b
280 define <2 x i32> @vnsrl_v2i64_v2i32_scalar_sext(<2 x i64> %x, i32 %y) {
281 ; CHECK-LABEL: vnsrl_v2i64_v2i32_scalar_sext:
282 ; CHECK:       # %bb.0:
283 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
284 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
285 ; CHECK-NEXT:    ret
286   %insert = insertelement <2 x i32> poison, i32 %y, i32 0
287   %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer
288   %sext = sext <2 x i32> %splat to <2 x i64>
289   %a = lshr <2 x i64> %x, %sext
290   %b = trunc <2 x i64> %a to <2 x i32>
291   ret <2 x i32> %b
294 define <2 x i32> @vnsrl_v2i64_v2i32_scalar_zext(<2 x i64> %x, i32 %y) {
295 ; CHECK-LABEL: vnsrl_v2i64_v2i32_scalar_zext:
296 ; CHECK:       # %bb.0:
297 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
298 ; CHECK-NEXT:    vnsrl.wx v8, v8, a0
299 ; CHECK-NEXT:    ret
300   %insert = insertelement <2 x i32> poison, i32 %y, i32 0
301   %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer
302   %zext = zext <2 x i32> %splat to <2 x i64>
303   %a = lshr <2 x i64> %x, %zext
304   %b = trunc <2 x i64> %a to <2 x i32>
305   ret <2 x i32> %b
308 define <8 x i8> @vnsrl_v8i16_v8i8_imm(<8 x i16> %x) {
309 ; CHECK-LABEL: vnsrl_v8i16_v8i8_imm:
310 ; CHECK:       # %bb.0:
311 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
312 ; CHECK-NEXT:    vnsrl.wi v8, v8, 8
313 ; CHECK-NEXT:    ret
314   %a = lshr <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8,i16 8, i16 8, i16 8, i16 8>
315   %b = trunc <8 x i16> %a to <8 x i8>
316   ret <8 x i8> %b
319 define <4 x i16> @vnsrl_v4i32_v4i16_imm(<4 x i32> %x) {
320 ; CHECK-LABEL: vnsrl_v4i32_v4i16_imm:
321 ; CHECK:       # %bb.0:
322 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
323 ; CHECK-NEXT:    vnsrl.wi v8, v8, 16
324 ; CHECK-NEXT:    ret
325   %a = lshr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16>
326   %b = trunc <4 x i32> %a to <4 x i16>
327   ret <4 x i16> %b
330 define <2 x i32> @vnsrl_v2i64_v2i32_imm(<2 x i64> %x) {
331 ; CHECK-LABEL: vnsrl_v2i64_v2i32_imm:
332 ; CHECK:       # %bb.0:
333 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
334 ; CHECK-NEXT:    vnsrl.wi v8, v8, 31
335 ; CHECK-NEXT:    ret
336   %a = lshr <2 x i64> %x, <i64 31, i64 31>
337   %b = trunc <2 x i64> %a to <2 x i32>
338   ret <2 x i32> %b
341 define <4 x i16> @vnsrl_v4i32_v4i16_sext(<4 x i32> %x, <4 x i16> %y) {
342 ; CHECK-LABEL: vnsrl_v4i32_v4i16_sext:
343 ; CHECK:       # %bb.0:
344 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
345 ; CHECK-NEXT:    vnsrl.wv v8, v8, v9
346 ; CHECK-NEXT:    ret
347   %sext = sext <4 x i16> %y to <4 x i32>
348   %a = lshr <4 x i32> %x, %sext
349   %b = trunc <4 x i32> %a to <4 x i16>
350   ret <4 x i16> %b
353 define <4 x i16> @vnsrl_v4i32_v4i16_zext(<4 x i32> %x, <4 x i16> %y) {
354 ; CHECK-LABEL: vnsrl_v4i32_v4i16_zext:
355 ; CHECK:       # %bb.0:
356 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
357 ; CHECK-NEXT:    vnsrl.wv v8, v8, v9
358 ; CHECK-NEXT:    ret
359   %zext = zext <4 x i16> %y to <4 x i32>
360   %a = lshr <4 x i32> %x, %zext
361   %b = trunc <4 x i32> %a to <4 x i16>
362   ret <4 x i16> %b
365 define <2 x i32> @vnsrl_v2i64_v2i32_sext(<2 x i64> %x, <2 x i32> %y) {
366 ; CHECK-LABEL: vnsrl_v2i64_v2i32_sext:
367 ; CHECK:       # %bb.0:
368 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
369 ; CHECK-NEXT:    vnsrl.wv v8, v8, v9
370 ; CHECK-NEXT:    ret
371   %sext = sext <2 x i32> %y to <2 x i64>
372   %a = lshr <2 x i64> %x, %sext
373   %b = trunc <2 x i64> %a to <2 x i32>
374   ret <2 x i32> %b
377 define <2 x i32> @vnsrl_v2i64_v2i32_zext(<2 x i64> %x, <2 x i32> %y) {
378 ; CHECK-LABEL: vnsrl_v2i64_v2i32_zext:
379 ; CHECK:       # %bb.0:
380 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
381 ; CHECK-NEXT:    vnsrl.wv v8, v8, v9
382 ; CHECK-NEXT:    ret
383   %zext = zext <2 x i32> %y to <2 x i64>
384   %a = lshr <2 x i64> %x, %zext
385   %b = trunc <2 x i64> %a to <2 x i32>
386   ret <2 x i32> %b