Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vnsra-sdnode.ll
blob13b7a8e1991accd84e386ceb8b1d8c8b0625cee3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -target-abi=ilp32 \
3 ; RUN:     -verify-machineinstrs < %s | FileCheck %s
4 ; RUN: llc -mtriple=riscv64 -mattr=+v -target-abi=lp64 \
5 ; RUN:     -verify-machineinstrs < %s | FileCheck %s
7 define <vscale x 1 x i32> @vnsra_wx_i64_nxv1i32(<vscale x 1 x i64> %va, i64 %b) {
8 ; CHECK-LABEL: vnsra_wx_i64_nxv1i32:
9 ; CHECK:       # %bb.0:
10 ; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
11 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
12 ; CHECK-NEXT:    ret
13   %head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0
14   %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
15   %x = ashr <vscale x 1 x i64> %va, %splat
16   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
17   ret <vscale x 1 x i32> %y
20 define <vscale x 2 x i32> @vnsra_wx_i64_nxv2i32(<vscale x 2 x i64> %va, i64 %b) {
21 ; CHECK-LABEL: vnsra_wx_i64_nxv2i32:
22 ; CHECK:       # %bb.0:
23 ; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
24 ; CHECK-NEXT:    vnsra.wx v10, v8, a0
25 ; CHECK-NEXT:    vmv.v.v v8, v10
26 ; CHECK-NEXT:    ret
27   %head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0
28   %splat = shufflevector <vscale x 2 x i64> %head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
29   %x = ashr <vscale x 2 x i64> %va, %splat
30   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
31   ret <vscale x 2 x i32> %y
34 define <vscale x 4 x i32> @vnsra_wx_i64_nxv4i32(<vscale x 4 x i64> %va, i64 %b) {
35 ; CHECK-LABEL: vnsra_wx_i64_nxv4i32:
36 ; CHECK:       # %bb.0:
37 ; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
38 ; CHECK-NEXT:    vnsra.wx v12, v8, a0
39 ; CHECK-NEXT:    vmv.v.v v8, v12
40 ; CHECK-NEXT:    ret
41   %head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0
42   %splat = shufflevector <vscale x 4 x i64> %head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
43   %x = ashr <vscale x 4 x i64> %va, %splat
44   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
45   ret <vscale x 4 x i32> %y
48 define <vscale x 8 x i32> @vnsra_wx_i64_nxv8i32(<vscale x 8 x i64> %va, i64 %b) {
49 ; CHECK-LABEL: vnsra_wx_i64_nxv8i32:
50 ; CHECK:       # %bb.0:
51 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
52 ; CHECK-NEXT:    vnsra.wx v16, v8, a0
53 ; CHECK-NEXT:    vmv.v.v v8, v16
54 ; CHECK-NEXT:    ret
55   %head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0
56   %splat = shufflevector <vscale x 8 x i64> %head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
57   %x = ashr <vscale x 8 x i64> %va, %splat
58   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
59   ret <vscale x 8 x i32> %y
62 define <vscale x 1 x i32> @vnsra_wv_nxv1i32_sext(<vscale x 1 x i64> %va, <vscale x 1 x i32> %vb) {
63 ; CHECK-LABEL: vnsra_wv_nxv1i32_sext:
64 ; CHECK:       # %bb.0:
65 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
66 ; CHECK-NEXT:    vnsra.wv v8, v8, v9
67 ; CHECK-NEXT:    ret
68   %vc = sext <vscale x 1 x i32> %vb to <vscale x 1 x i64>
69   %x = ashr <vscale x 1 x i64> %va, %vc
70   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
71   ret <vscale x 1 x i32> %y
74 define <vscale x 1 x i32> @vnsra_wx_i32_nxv1i32_sext(<vscale x 1 x i64> %va, i32 %b) {
75 ; CHECK-LABEL: vnsra_wx_i32_nxv1i32_sext:
76 ; CHECK:       # %bb.0:
77 ; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
78 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
79 ; CHECK-NEXT:    ret
80   %head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0
81   %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
82   %vb = sext <vscale x 1 x i32> %splat to <vscale x 1 x i64>
83   %x = ashr <vscale x 1 x i64> %va, %vb
84   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
85   ret <vscale x 1 x i32> %y
88 define <vscale x 1 x i32> @vnsra_wx_i16_nxv1i32_sext(<vscale x 1 x i64> %va, i16 %b) {
89 ; CHECK-LABEL: vnsra_wx_i16_nxv1i32_sext:
90 ; CHECK:       # %bb.0:
91 ; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
92 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
93 ; CHECK-NEXT:    ret
94   %head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0
95   %splat = shufflevector <vscale x 1 x i16> %head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
96   %vb = sext <vscale x 1 x i16> %splat to <vscale x 1 x i64>
97   %x = ashr <vscale x 1 x i64> %va, %vb
98   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
99   ret <vscale x 1 x i32> %y
102 define <vscale x 1 x i32> @vnsra_wx_i8_nxv1i32_sext(<vscale x 1 x i64> %va, i8 %b) {
103 ; CHECK-LABEL: vnsra_wx_i8_nxv1i32_sext:
104 ; CHECK:       # %bb.0:
105 ; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
106 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
107 ; CHECK-NEXT:    ret
108   %head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0
109   %splat = shufflevector <vscale x 1 x i8> %head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
110   %vb = sext <vscale x 1 x i8> %splat to <vscale x 1 x i64>
111   %x = ashr <vscale x 1 x i64> %va, %vb
112   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
113   ret <vscale x 1 x i32> %y
116 define <vscale x 1 x i32> @vnsra_wi_i32_nxv1i32_sext(<vscale x 1 x i64> %va) {
117 ; CHECK-LABEL: vnsra_wi_i32_nxv1i32_sext:
118 ; CHECK:       # %bb.0:
119 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
120 ; CHECK-NEXT:    vnsrl.wi v8, v8, 15
121 ; CHECK-NEXT:    ret
122   %head = insertelement <vscale x 1 x i32> poison, i32 15, i32 0
123   %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
124   %vb = sext <vscale x 1 x i32> %splat to <vscale x 1 x i64>
125   %x = ashr <vscale x 1 x i64> %va, %vb
126   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
127   ret <vscale x 1 x i32> %y
130 define <vscale x 2 x i32> @vnsra_wv_nxv2i32_sext(<vscale x 2 x i64> %va, <vscale x 2 x i32> %vb) {
131 ; CHECK-LABEL: vnsra_wv_nxv2i32_sext:
132 ; CHECK:       # %bb.0:
133 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
134 ; CHECK-NEXT:    vnsra.wv v11, v8, v10
135 ; CHECK-NEXT:    vmv.v.v v8, v11
136 ; CHECK-NEXT:    ret
137   %vc = sext <vscale x 2 x i32> %vb to <vscale x 2 x i64>
138   %x = ashr <vscale x 2 x i64> %va, %vc
139   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
140   ret <vscale x 2 x i32> %y
143 define <vscale x 2 x i32> @vnsra_wx_i32_nxv2i32_sext(<vscale x 2 x i64> %va, i32 %b) {
144 ; CHECK-LABEL: vnsra_wx_i32_nxv2i32_sext:
145 ; CHECK:       # %bb.0:
146 ; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
147 ; CHECK-NEXT:    vnsra.wx v10, v8, a0
148 ; CHECK-NEXT:    vmv.v.v v8, v10
149 ; CHECK-NEXT:    ret
150   %head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0
151   %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
152   %vb = sext <vscale x 2 x i32> %splat to <vscale x 2 x i64>
153   %x = ashr <vscale x 2 x i64> %va, %vb
154   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
155   ret <vscale x 2 x i32> %y
158 define <vscale x 2 x i32> @vnsra_wx_i16_nxv2i32_sext(<vscale x 2 x i64> %va, i16 %b) {
159 ; CHECK-LABEL: vnsra_wx_i16_nxv2i32_sext:
160 ; CHECK:       # %bb.0:
161 ; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
162 ; CHECK-NEXT:    vnsra.wx v10, v8, a0
163 ; CHECK-NEXT:    vmv.v.v v8, v10
164 ; CHECK-NEXT:    ret
165   %head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0
166   %splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
167   %vb = sext <vscale x 2 x i16> %splat to <vscale x 2 x i64>
168   %x = ashr <vscale x 2 x i64> %va, %vb
169   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
170   ret <vscale x 2 x i32> %y
173 define <vscale x 2 x i32> @vnsra_wx_i8_nxv2i32_sext(<vscale x 2 x i64> %va, i8 %b) {
174 ; CHECK-LABEL: vnsra_wx_i8_nxv2i32_sext:
175 ; CHECK:       # %bb.0:
176 ; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
177 ; CHECK-NEXT:    vnsra.wx v10, v8, a0
178 ; CHECK-NEXT:    vmv.v.v v8, v10
179 ; CHECK-NEXT:    ret
180   %head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0
181   %splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
182   %vb = sext <vscale x 2 x i8> %splat to <vscale x 2 x i64>
183   %x = ashr <vscale x 2 x i64> %va, %vb
184   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
185   ret <vscale x 2 x i32> %y
188 define <vscale x 2 x i32> @vnsra_wi_i32_nxv2i32_sext(<vscale x 2 x i64> %va) {
189 ; CHECK-LABEL: vnsra_wi_i32_nxv2i32_sext:
190 ; CHECK:       # %bb.0:
191 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
192 ; CHECK-NEXT:    vnsrl.wi v10, v8, 15
193 ; CHECK-NEXT:    vmv.v.v v8, v10
194 ; CHECK-NEXT:    ret
195   %head = insertelement <vscale x 2 x i32> poison, i32 15, i32 0
196   %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
197   %vb = sext <vscale x 2 x i32> %splat to <vscale x 2 x i64>
198   %x = ashr <vscale x 2 x i64> %va, %vb
199   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
200   ret <vscale x 2 x i32> %y
203 define <vscale x 4 x i32> @vnsra_wv_nxv4i32_sext(<vscale x 4 x i64> %va, <vscale x 4 x i32> %vb) {
204 ; CHECK-LABEL: vnsra_wv_nxv4i32_sext:
205 ; CHECK:       # %bb.0:
206 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
207 ; CHECK-NEXT:    vnsra.wv v14, v8, v12
208 ; CHECK-NEXT:    vmv.v.v v8, v14
209 ; CHECK-NEXT:    ret
210   %vc = sext <vscale x 4 x i32> %vb to <vscale x 4 x i64>
211   %x = ashr <vscale x 4 x i64> %va, %vc
212   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
213   ret <vscale x 4 x i32> %y
216 define <vscale x 4 x i32> @vnsra_wx_i32_nxv4i32_sext(<vscale x 4 x i64> %va, i32 %b) {
217 ; CHECK-LABEL: vnsra_wx_i32_nxv4i32_sext:
218 ; CHECK:       # %bb.0:
219 ; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
220 ; CHECK-NEXT:    vnsra.wx v12, v8, a0
221 ; CHECK-NEXT:    vmv.v.v v8, v12
222 ; CHECK-NEXT:    ret
223   %head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0
224   %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
225   %vb = sext <vscale x 4 x i32> %splat to <vscale x 4 x i64>
226   %x = ashr <vscale x 4 x i64> %va, %vb
227   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
228   ret <vscale x 4 x i32> %y
231 define <vscale x 4 x i32> @vnsra_wx_i16_nxv4i32_sext(<vscale x 4 x i64> %va, i16 %b) {
232 ; CHECK-LABEL: vnsra_wx_i16_nxv4i32_sext:
233 ; CHECK:       # %bb.0:
234 ; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
235 ; CHECK-NEXT:    vnsra.wx v12, v8, a0
236 ; CHECK-NEXT:    vmv.v.v v8, v12
237 ; CHECK-NEXT:    ret
238   %head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0
239   %splat = shufflevector <vscale x 4 x i16> %head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
240   %vb = sext <vscale x 4 x i16> %splat to <vscale x 4 x i64>
241   %x = ashr <vscale x 4 x i64> %va, %vb
242   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
243   ret <vscale x 4 x i32> %y
246 define <vscale x 4 x i32> @vnsra_wx_i8_nxv4i32_sext(<vscale x 4 x i64> %va, i8 %b) {
247 ; CHECK-LABEL: vnsra_wx_i8_nxv4i32_sext:
248 ; CHECK:       # %bb.0:
249 ; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
250 ; CHECK-NEXT:    vnsra.wx v12, v8, a0
251 ; CHECK-NEXT:    vmv.v.v v8, v12
252 ; CHECK-NEXT:    ret
253   %head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0
254   %splat = shufflevector <vscale x 4 x i8> %head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
255   %vb = sext <vscale x 4 x i8> %splat to <vscale x 4 x i64>
256   %x = ashr <vscale x 4 x i64> %va, %vb
257   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
258   ret <vscale x 4 x i32> %y
261 define <vscale x 4 x i32> @vnsra_wi_i32_nxv4i32_sext(<vscale x 4 x i64> %va) {
262 ; CHECK-LABEL: vnsra_wi_i32_nxv4i32_sext:
263 ; CHECK:       # %bb.0:
264 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
265 ; CHECK-NEXT:    vnsrl.wi v12, v8, 15
266 ; CHECK-NEXT:    vmv.v.v v8, v12
267 ; CHECK-NEXT:    ret
268   %head = insertelement <vscale x 4 x i32> poison, i32 15, i32 0
269   %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
270   %vb = sext <vscale x 4 x i32> %splat to <vscale x 4 x i64>
271   %x = ashr <vscale x 4 x i64> %va, %vb
272   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
273   ret <vscale x 4 x i32> %y
276 define <vscale x 8 x i32> @vnsra_wv_nxv8i32_sext(<vscale x 8 x i64> %va, <vscale x 8 x i32> %vb) {
277 ; CHECK-LABEL: vnsra_wv_nxv8i32_sext:
278 ; CHECK:       # %bb.0:
279 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
280 ; CHECK-NEXT:    vnsra.wv v20, v8, v16
281 ; CHECK-NEXT:    vmv.v.v v8, v20
282 ; CHECK-NEXT:    ret
283   %vc = sext <vscale x 8 x i32> %vb to <vscale x 8 x i64>
284   %x = ashr <vscale x 8 x i64> %va, %vc
285   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
286   ret <vscale x 8 x i32> %y
289 define <vscale x 8 x i32> @vnsra_wx_i32_nxv8i32_sext(<vscale x 8 x i64> %va, i32 %b) {
290 ; CHECK-LABEL: vnsra_wx_i32_nxv8i32_sext:
291 ; CHECK:       # %bb.0:
292 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
293 ; CHECK-NEXT:    vnsra.wx v16, v8, a0
294 ; CHECK-NEXT:    vmv.v.v v8, v16
295 ; CHECK-NEXT:    ret
296   %head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0
297   %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
298   %vb = sext <vscale x 8 x i32> %splat to <vscale x 8 x i64>
299   %x = ashr <vscale x 8 x i64> %va, %vb
300   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
301   ret <vscale x 8 x i32> %y
304 define <vscale x 8 x i32> @vnsra_wx_i16_nxv8i32_sext(<vscale x 8 x i64> %va, i16 %b) {
305 ; CHECK-LABEL: vnsra_wx_i16_nxv8i32_sext:
306 ; CHECK:       # %bb.0:
307 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
308 ; CHECK-NEXT:    vnsra.wx v16, v8, a0
309 ; CHECK-NEXT:    vmv.v.v v8, v16
310 ; CHECK-NEXT:    ret
311   %head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0
312   %splat = shufflevector <vscale x 8 x i16> %head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
313   %vb = sext <vscale x 8 x i16> %splat to <vscale x 8 x i64>
314   %x = ashr <vscale x 8 x i64> %va, %vb
315   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
316   ret <vscale x 8 x i32> %y
319 define <vscale x 8 x i32> @vnsra_wx_i8_nxv8i32_sext(<vscale x 8 x i64> %va, i8 %b) {
320 ; CHECK-LABEL: vnsra_wx_i8_nxv8i32_sext:
321 ; CHECK:       # %bb.0:
322 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
323 ; CHECK-NEXT:    vnsra.wx v16, v8, a0
324 ; CHECK-NEXT:    vmv.v.v v8, v16
325 ; CHECK-NEXT:    ret
326   %head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0
327   %splat = shufflevector <vscale x 8 x i8> %head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
328   %vb = sext <vscale x 8 x i8> %splat to <vscale x 8 x i64>
329   %x = ashr <vscale x 8 x i64> %va, %vb
330   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
331   ret <vscale x 8 x i32> %y
334 define <vscale x 8 x i32> @vnsra_wi_i32_nxv8i32_sext(<vscale x 8 x i64> %va) {
335 ; CHECK-LABEL: vnsra_wi_i32_nxv8i32_sext:
336 ; CHECK:       # %bb.0:
337 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
338 ; CHECK-NEXT:    vnsrl.wi v16, v8, 15
339 ; CHECK-NEXT:    vmv.v.v v8, v16
340 ; CHECK-NEXT:    ret
341   %head = insertelement <vscale x 8 x i32> poison, i32 15, i32 0
342   %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
343   %vb = sext <vscale x 8 x i32> %splat to <vscale x 8 x i64>
344   %x = ashr <vscale x 8 x i64> %va, %vb
345   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
346   ret <vscale x 8 x i32> %y
349 define <vscale x 1 x i32> @vnsra_wv_nxv1i32_zext(<vscale x 1 x i64> %va, <vscale x 1 x i32> %vb) {
350 ; CHECK-LABEL: vnsra_wv_nxv1i32_zext:
351 ; CHECK:       # %bb.0:
352 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
353 ; CHECK-NEXT:    vnsra.wv v8, v8, v9
354 ; CHECK-NEXT:    ret
355   %vc = zext <vscale x 1 x i32> %vb to <vscale x 1 x i64>
356   %x = ashr <vscale x 1 x i64> %va, %vc
357   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
358   ret <vscale x 1 x i32> %y
361 define <vscale x 1 x i32> @vnsra_wx_i32_nxv1i32_zext(<vscale x 1 x i64> %va, i32 %b) {
362 ; CHECK-LABEL: vnsra_wx_i32_nxv1i32_zext:
363 ; CHECK:       # %bb.0:
364 ; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
365 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
366 ; CHECK-NEXT:    ret
367   %head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0
368   %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
369   %vb = zext <vscale x 1 x i32> %splat to <vscale x 1 x i64>
370   %x = ashr <vscale x 1 x i64> %va, %vb
371   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
372   ret <vscale x 1 x i32> %y
375 define <vscale x 1 x i32> @vnsra_wx_i16_nxv1i32_zext(<vscale x 1 x i64> %va, i16 %b) {
376 ; CHECK-LABEL: vnsra_wx_i16_nxv1i32_zext:
377 ; CHECK:       # %bb.0:
378 ; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
379 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
380 ; CHECK-NEXT:    ret
381   %head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0
382   %splat = shufflevector <vscale x 1 x i16> %head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
383   %vb = zext <vscale x 1 x i16> %splat to <vscale x 1 x i64>
384   %x = ashr <vscale x 1 x i64> %va, %vb
385   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
386   ret <vscale x 1 x i32> %y
389 define <vscale x 1 x i32> @vnsra_wx_i8_nxv1i32_zext(<vscale x 1 x i64> %va, i8 %b) {
390 ; CHECK-LABEL: vnsra_wx_i8_nxv1i32_zext:
391 ; CHECK:       # %bb.0:
392 ; CHECK-NEXT:    vsetvli a1, zero, e32, mf2, ta, ma
393 ; CHECK-NEXT:    vnsra.wx v8, v8, a0
394 ; CHECK-NEXT:    ret
395   %head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0
396   %splat = shufflevector <vscale x 1 x i8> %head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
397   %vb = zext <vscale x 1 x i8> %splat to <vscale x 1 x i64>
398   %x = ashr <vscale x 1 x i64> %va, %vb
399   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
400   ret <vscale x 1 x i32> %y
403 define <vscale x 1 x i32> @vnsra_wi_i32_nxv1i32_zext(<vscale x 1 x i64> %va) {
404 ; CHECK-LABEL: vnsra_wi_i32_nxv1i32_zext:
405 ; CHECK:       # %bb.0:
406 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
407 ; CHECK-NEXT:    vnsrl.wi v8, v8, 15
408 ; CHECK-NEXT:    ret
409   %head = insertelement <vscale x 1 x i32> poison, i32 15, i32 0
410   %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
411   %vb = zext <vscale x 1 x i32> %splat to <vscale x 1 x i64>
412   %x = ashr <vscale x 1 x i64> %va, %vb
413   %y = trunc <vscale x 1 x i64> %x to <vscale x 1 x i32>
414   ret <vscale x 1 x i32> %y
417 define <vscale x 2 x i32> @vnsra_wv_nxv2i32_zext(<vscale x 2 x i64> %va, <vscale x 2 x i32> %vb) {
418 ; CHECK-LABEL: vnsra_wv_nxv2i32_zext:
419 ; CHECK:       # %bb.0:
420 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
421 ; CHECK-NEXT:    vnsra.wv v11, v8, v10
422 ; CHECK-NEXT:    vmv.v.v v8, v11
423 ; CHECK-NEXT:    ret
424   %vc = zext <vscale x 2 x i32> %vb to <vscale x 2 x i64>
425   %x = ashr <vscale x 2 x i64> %va, %vc
426   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
427   ret <vscale x 2 x i32> %y
430 define <vscale x 2 x i32> @vnsra_wx_i32_nxv2i32_zext(<vscale x 2 x i64> %va, i32 %b) {
431 ; CHECK-LABEL: vnsra_wx_i32_nxv2i32_zext:
432 ; CHECK:       # %bb.0:
433 ; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
434 ; CHECK-NEXT:    vnsra.wx v10, v8, a0
435 ; CHECK-NEXT:    vmv.v.v v8, v10
436 ; CHECK-NEXT:    ret
437   %head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0
438   %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
439   %vb = zext <vscale x 2 x i32> %splat to <vscale x 2 x i64>
440   %x = ashr <vscale x 2 x i64> %va, %vb
441   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
442   ret <vscale x 2 x i32> %y
445 define <vscale x 2 x i32> @vnsra_wx_i16_nxv2i32_zext(<vscale x 2 x i64> %va, i16 %b) {
446 ; CHECK-LABEL: vnsra_wx_i16_nxv2i32_zext:
447 ; CHECK:       # %bb.0:
448 ; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
449 ; CHECK-NEXT:    vnsra.wx v10, v8, a0
450 ; CHECK-NEXT:    vmv.v.v v8, v10
451 ; CHECK-NEXT:    ret
452   %head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0
453   %splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
454   %vb = zext <vscale x 2 x i16> %splat to <vscale x 2 x i64>
455   %x = ashr <vscale x 2 x i64> %va, %vb
456   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
457   ret <vscale x 2 x i32> %y
460 define <vscale x 2 x i32> @vnsra_wx_i8_nxv2i32_zext(<vscale x 2 x i64> %va, i8 %b) {
461 ; CHECK-LABEL: vnsra_wx_i8_nxv2i32_zext:
462 ; CHECK:       # %bb.0:
463 ; CHECK-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
464 ; CHECK-NEXT:    vnsra.wx v10, v8, a0
465 ; CHECK-NEXT:    vmv.v.v v8, v10
466 ; CHECK-NEXT:    ret
467   %head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0
468   %splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
469   %vb = zext <vscale x 2 x i8> %splat to <vscale x 2 x i64>
470   %x = ashr <vscale x 2 x i64> %va, %vb
471   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
472   ret <vscale x 2 x i32> %y
475 define <vscale x 2 x i32> @vnsra_wi_i32_nxv2i32_zext(<vscale x 2 x i64> %va) {
476 ; CHECK-LABEL: vnsra_wi_i32_nxv2i32_zext:
477 ; CHECK:       # %bb.0:
478 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
479 ; CHECK-NEXT:    vnsrl.wi v10, v8, 15
480 ; CHECK-NEXT:    vmv.v.v v8, v10
481 ; CHECK-NEXT:    ret
482   %head = insertelement <vscale x 2 x i32> poison, i32 15, i32 0
483   %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
484   %vb = zext <vscale x 2 x i32> %splat to <vscale x 2 x i64>
485   %x = ashr <vscale x 2 x i64> %va, %vb
486   %y = trunc <vscale x 2 x i64> %x to <vscale x 2 x i32>
487   ret <vscale x 2 x i32> %y
490 define <vscale x 4 x i32> @vnsra_wv_nxv4i32_zext(<vscale x 4 x i64> %va, <vscale x 4 x i32> %vb) {
491 ; CHECK-LABEL: vnsra_wv_nxv4i32_zext:
492 ; CHECK:       # %bb.0:
493 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
494 ; CHECK-NEXT:    vnsra.wv v14, v8, v12
495 ; CHECK-NEXT:    vmv.v.v v8, v14
496 ; CHECK-NEXT:    ret
497   %vc = zext <vscale x 4 x i32> %vb to <vscale x 4 x i64>
498   %x = ashr <vscale x 4 x i64> %va, %vc
499   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
500   ret <vscale x 4 x i32> %y
503 define <vscale x 4 x i32> @vnsra_wx_i32_nxv4i32_zext(<vscale x 4 x i64> %va, i32 %b) {
504 ; CHECK-LABEL: vnsra_wx_i32_nxv4i32_zext:
505 ; CHECK:       # %bb.0:
506 ; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
507 ; CHECK-NEXT:    vnsra.wx v12, v8, a0
508 ; CHECK-NEXT:    vmv.v.v v8, v12
509 ; CHECK-NEXT:    ret
510   %head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0
511   %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
512   %vb = zext <vscale x 4 x i32> %splat to <vscale x 4 x i64>
513   %x = ashr <vscale x 4 x i64> %va, %vb
514   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
515   ret <vscale x 4 x i32> %y
518 define <vscale x 4 x i32> @vnsra_wx_i16_nxv4i32_zext(<vscale x 4 x i64> %va, i16 %b) {
519 ; CHECK-LABEL: vnsra_wx_i16_nxv4i32_zext:
520 ; CHECK:       # %bb.0:
521 ; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
522 ; CHECK-NEXT:    vnsra.wx v12, v8, a0
523 ; CHECK-NEXT:    vmv.v.v v8, v12
524 ; CHECK-NEXT:    ret
525   %head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0
526   %splat = shufflevector <vscale x 4 x i16> %head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
527   %vb = zext <vscale x 4 x i16> %splat to <vscale x 4 x i64>
528   %x = ashr <vscale x 4 x i64> %va, %vb
529   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
530   ret <vscale x 4 x i32> %y
533 define <vscale x 4 x i32> @vnsra_wx_i8_nxv4i32_zext(<vscale x 4 x i64> %va, i8 %b) {
534 ; CHECK-LABEL: vnsra_wx_i8_nxv4i32_zext:
535 ; CHECK:       # %bb.0:
536 ; CHECK-NEXT:    vsetvli a1, zero, e32, m2, ta, ma
537 ; CHECK-NEXT:    vnsra.wx v12, v8, a0
538 ; CHECK-NEXT:    vmv.v.v v8, v12
539 ; CHECK-NEXT:    ret
540   %head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0
541   %splat = shufflevector <vscale x 4 x i8> %head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
542   %vb = zext <vscale x 4 x i8> %splat to <vscale x 4 x i64>
543   %x = ashr <vscale x 4 x i64> %va, %vb
544   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
545   ret <vscale x 4 x i32> %y
548 define <vscale x 4 x i32> @vnsra_wi_i32_nxv4i32_zext(<vscale x 4 x i64> %va) {
549 ; CHECK-LABEL: vnsra_wi_i32_nxv4i32_zext:
550 ; CHECK:       # %bb.0:
551 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
552 ; CHECK-NEXT:    vnsrl.wi v12, v8, 15
553 ; CHECK-NEXT:    vmv.v.v v8, v12
554 ; CHECK-NEXT:    ret
555   %head = insertelement <vscale x 4 x i32> poison, i32 15, i32 0
556   %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
557   %vb = zext <vscale x 4 x i32> %splat to <vscale x 4 x i64>
558   %x = ashr <vscale x 4 x i64> %va, %vb
559   %y = trunc <vscale x 4 x i64> %x to <vscale x 4 x i32>
560   ret <vscale x 4 x i32> %y
563 define <vscale x 8 x i32> @vnsra_wv_nxv8i32_zext(<vscale x 8 x i64> %va, <vscale x 8 x i32> %vb) {
564 ; CHECK-LABEL: vnsra_wv_nxv8i32_zext:
565 ; CHECK:       # %bb.0:
566 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
567 ; CHECK-NEXT:    vnsra.wv v20, v8, v16
568 ; CHECK-NEXT:    vmv.v.v v8, v20
569 ; CHECK-NEXT:    ret
570   %vc = zext <vscale x 8 x i32> %vb to <vscale x 8 x i64>
571   %x = ashr <vscale x 8 x i64> %va, %vc
572   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
573   ret <vscale x 8 x i32> %y
576 define <vscale x 8 x i32> @vnsra_wx_i32_nxv8i32_zext(<vscale x 8 x i64> %va, i32 %b) {
577 ; CHECK-LABEL: vnsra_wx_i32_nxv8i32_zext:
578 ; CHECK:       # %bb.0:
579 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
580 ; CHECK-NEXT:    vnsra.wx v16, v8, a0
581 ; CHECK-NEXT:    vmv.v.v v8, v16
582 ; CHECK-NEXT:    ret
583   %head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0
584   %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
585   %vb = zext <vscale x 8 x i32> %splat to <vscale x 8 x i64>
586   %x = ashr <vscale x 8 x i64> %va, %vb
587   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
588   ret <vscale x 8 x i32> %y
591 define <vscale x 8 x i32> @vnsra_wx_i16_nxv8i32_zext(<vscale x 8 x i64> %va, i16 %b) {
592 ; CHECK-LABEL: vnsra_wx_i16_nxv8i32_zext:
593 ; CHECK:       # %bb.0:
594 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
595 ; CHECK-NEXT:    vnsra.wx v16, v8, a0
596 ; CHECK-NEXT:    vmv.v.v v8, v16
597 ; CHECK-NEXT:    ret
598   %head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0
599   %splat = shufflevector <vscale x 8 x i16> %head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
600   %vb = zext <vscale x 8 x i16> %splat to <vscale x 8 x i64>
601   %x = ashr <vscale x 8 x i64> %va, %vb
602   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
603   ret <vscale x 8 x i32> %y
606 define <vscale x 8 x i32> @vnsra_wx_i8_nxv8i32_zext(<vscale x 8 x i64> %va, i8 %b) {
607 ; CHECK-LABEL: vnsra_wx_i8_nxv8i32_zext:
608 ; CHECK:       # %bb.0:
609 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
610 ; CHECK-NEXT:    vnsra.wx v16, v8, a0
611 ; CHECK-NEXT:    vmv.v.v v8, v16
612 ; CHECK-NEXT:    ret
613   %head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0
614   %splat = shufflevector <vscale x 8 x i8> %head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
615   %vb = zext <vscale x 8 x i8> %splat to <vscale x 8 x i64>
616   %x = ashr <vscale x 8 x i64> %va, %vb
617   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
618   ret <vscale x 8 x i32> %y
621 define <vscale x 8 x i32> @vnsra_wi_i32_nxv8i32_zext(<vscale x 8 x i64> %va) {
622 ; CHECK-LABEL: vnsra_wi_i32_nxv8i32_zext:
623 ; CHECK:       # %bb.0:
624 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
625 ; CHECK-NEXT:    vnsrl.wi v16, v8, 15
626 ; CHECK-NEXT:    vmv.v.v v8, v16
627 ; CHECK-NEXT:    ret
628   %head = insertelement <vscale x 8 x i32> poison, i32 15, i32 0
629   %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
630   %vb = zext <vscale x 8 x i32> %splat to <vscale x 8 x i64>
631   %x = ashr <vscale x 8 x i64> %va, %vb
632   %y = trunc <vscale x 8 x i64> %x to <vscale x 8 x i32>
633   ret <vscale x 8 x i32> %y