Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-shufflevector-vnsrl.ll
blobff6a9dc38999c2a44fd7226af4d8485d7bb5c322
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zfh,+zvfh,+zvl256b \
3 ; RUN:   -lower-interleaved-accesses=false -verify-machineinstrs \
4 ; RUN:   | FileCheck %s --check-prefixes=CHECK,V
5 ; RUN: llc < %s -mtriple=riscv64 -mattr=+f,+zve32f,+zfh,+zvfh,+zvl256b \
6 ; RUN:   -lower-interleaved-accesses=false -verify-machineinstrs \
7 ; RUN:   | FileCheck %s --check-prefixes=CHECK,ZVE32F
9 define void @vnsrl_0_i8(ptr %in, ptr %out) {
10 ; CHECK-LABEL: vnsrl_0_i8:
11 ; CHECK:       # %bb.0: # %entry
12 ; CHECK-NEXT:    vsetivli zero, 16, e8, mf2, ta, ma
13 ; CHECK-NEXT:    vle8.v v8, (a0)
14 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf4, ta, ma
15 ; CHECK-NEXT:    vnsrl.wi v8, v8, 0
16 ; CHECK-NEXT:    vse8.v v8, (a1)
17 ; CHECK-NEXT:    ret
18 entry:
19   %0 = load <16 x i8>, ptr %in, align 1
20   %shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14>
21   store <8 x i8> %shuffle.i5, ptr %out, align 1
22   ret void
25 define void @vnsrl_8_i8(ptr %in, ptr %out) {
26 ; CHECK-LABEL: vnsrl_8_i8:
27 ; CHECK:       # %bb.0: # %entry
28 ; CHECK-NEXT:    vsetivli zero, 16, e8, mf2, ta, ma
29 ; CHECK-NEXT:    vle8.v v8, (a0)
30 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf4, ta, ma
31 ; CHECK-NEXT:    vnsrl.wi v8, v8, 8
32 ; CHECK-NEXT:    vse8.v v8, (a1)
33 ; CHECK-NEXT:    ret
34 entry:
35   %0 = load <16 x i8>, ptr %in, align 1
36   %shuffle.i5 = shufflevector <16 x i8> %0, <16 x i8> poison, <8 x i32> <i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
37   store <8 x i8> %shuffle.i5, ptr %out, align 1
38   ret void
41 define void @vnsrl_0_i16(ptr %in, ptr %out) {
42 ; V-LABEL: vnsrl_0_i16:
43 ; V:       # %bb.0: # %entry
44 ; V-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
45 ; V-NEXT:    vle16.v v8, (a0)
46 ; V-NEXT:    vsetivli zero, 4, e16, mf4, ta, ma
47 ; V-NEXT:    vnsrl.wi v8, v8, 0
48 ; V-NEXT:    vse16.v v8, (a1)
49 ; V-NEXT:    ret
51 ; ZVE32F-LABEL: vnsrl_0_i16:
52 ; ZVE32F:       # %bb.0: # %entry
53 ; ZVE32F-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
54 ; ZVE32F-NEXT:    vle16.v v8, (a0)
55 ; ZVE32F-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
56 ; ZVE32F-NEXT:    vnsrl.wi v8, v8, 0
57 ; ZVE32F-NEXT:    vse16.v v8, (a1)
58 ; ZVE32F-NEXT:    ret
59 entry:
60   %0 = load <8 x i16>, ptr %in, align 2
61   %shuffle.i5 = shufflevector <8 x i16> %0, <8 x i16> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
62   store <4 x i16> %shuffle.i5, ptr %out, align 2
63   ret void
66 define void @vnsrl_16_i16(ptr %in, ptr %out) {
67 ; V-LABEL: vnsrl_16_i16:
68 ; V:       # %bb.0: # %entry
69 ; V-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
70 ; V-NEXT:    vle16.v v8, (a0)
71 ; V-NEXT:    vsetivli zero, 4, e16, mf4, ta, ma
72 ; V-NEXT:    vnsrl.wi v8, v8, 16
73 ; V-NEXT:    vse16.v v8, (a1)
74 ; V-NEXT:    ret
76 ; ZVE32F-LABEL: vnsrl_16_i16:
77 ; ZVE32F:       # %bb.0: # %entry
78 ; ZVE32F-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
79 ; ZVE32F-NEXT:    vle16.v v8, (a0)
80 ; ZVE32F-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
81 ; ZVE32F-NEXT:    vnsrl.wi v8, v8, 16
82 ; ZVE32F-NEXT:    vse16.v v8, (a1)
83 ; ZVE32F-NEXT:    ret
84 entry:
85   %0 = load <8 x i16>, ptr %in, align 2
86   %shuffle.i5 = shufflevector <8 x i16> %0, <8 x i16> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
87   store <4 x i16> %shuffle.i5, ptr %out, align 2
88   ret void
91 define void @vnsrl_0_half(ptr %in, ptr %out) {
92 ; V-LABEL: vnsrl_0_half:
93 ; V:       # %bb.0: # %entry
94 ; V-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
95 ; V-NEXT:    vle16.v v8, (a0)
96 ; V-NEXT:    vsetivli zero, 4, e16, mf4, ta, ma
97 ; V-NEXT:    vnsrl.wi v8, v8, 0
98 ; V-NEXT:    vse16.v v8, (a1)
99 ; V-NEXT:    ret
101 ; ZVE32F-LABEL: vnsrl_0_half:
102 ; ZVE32F:       # %bb.0: # %entry
103 ; ZVE32F-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
104 ; ZVE32F-NEXT:    vle16.v v8, (a0)
105 ; ZVE32F-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
106 ; ZVE32F-NEXT:    vnsrl.wi v8, v8, 0
107 ; ZVE32F-NEXT:    vse16.v v8, (a1)
108 ; ZVE32F-NEXT:    ret
109 entry:
110   %0 = load <8 x half>, ptr %in, align 2
111   %shuffle.i5 = shufflevector <8 x half> %0, <8 x half> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
112   store <4 x half> %shuffle.i5, ptr %out, align 2
113   ret void
116 define void @vnsrl_16_half(ptr %in, ptr %out) {
117 ; V-LABEL: vnsrl_16_half:
118 ; V:       # %bb.0: # %entry
119 ; V-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
120 ; V-NEXT:    vle16.v v8, (a0)
121 ; V-NEXT:    vsetivli zero, 4, e16, mf4, ta, ma
122 ; V-NEXT:    vnsrl.wi v8, v8, 16
123 ; V-NEXT:    vse16.v v8, (a1)
124 ; V-NEXT:    ret
126 ; ZVE32F-LABEL: vnsrl_16_half:
127 ; ZVE32F:       # %bb.0: # %entry
128 ; ZVE32F-NEXT:    vsetivli zero, 8, e16, mf2, ta, ma
129 ; ZVE32F-NEXT:    vle16.v v8, (a0)
130 ; ZVE32F-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
131 ; ZVE32F-NEXT:    vnsrl.wi v8, v8, 16
132 ; ZVE32F-NEXT:    vse16.v v8, (a1)
133 ; ZVE32F-NEXT:    ret
134 entry:
135   %0 = load <8 x half>, ptr %in, align 2
136   %shuffle.i5 = shufflevector <8 x half> %0, <8 x half> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>
137   store <4 x half> %shuffle.i5, ptr %out, align 2
138   ret void
141 define void @vnsrl_0_i32(ptr %in, ptr %out) {
142 ; V-LABEL: vnsrl_0_i32:
143 ; V:       # %bb.0: # %entry
144 ; V-NEXT:    vsetivli zero, 4, e32, mf2, ta, ma
145 ; V-NEXT:    vle32.v v8, (a0)
146 ; V-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
147 ; V-NEXT:    vnsrl.wi v8, v8, 0
148 ; V-NEXT:    vse32.v v8, (a1)
149 ; V-NEXT:    ret
151 ; ZVE32F-LABEL: vnsrl_0_i32:
152 ; ZVE32F:       # %bb.0: # %entry
153 ; ZVE32F-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
154 ; ZVE32F-NEXT:    vle32.v v8, (a0)
155 ; ZVE32F-NEXT:    vsetivli zero, 2, e32, m1, ta, ma
156 ; ZVE32F-NEXT:    vslidedown.vi v9, v8, 2
157 ; ZVE32F-NEXT:    vslideup.vi v8, v9, 1
158 ; ZVE32F-NEXT:    vse32.v v8, (a1)
159 ; ZVE32F-NEXT:    ret
160 entry:
161   %0 = load <4 x i32>, ptr %in, align 4
162   %shuffle.i5 = shufflevector <4 x i32> %0, <4 x i32> poison, <2 x i32> <i32 0, i32 2>
163   store <2 x i32> %shuffle.i5, ptr %out, align 4
164   ret void
167 define void @vnsrl_32_i32(ptr %in, ptr %out) {
168 ; V-LABEL: vnsrl_32_i32:
169 ; V:       # %bb.0: # %entry
170 ; V-NEXT:    vsetivli zero, 4, e32, mf2, ta, ma
171 ; V-NEXT:    vle32.v v8, (a0)
172 ; V-NEXT:    li a0, 32
173 ; V-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
174 ; V-NEXT:    vnsrl.wx v8, v8, a0
175 ; V-NEXT:    vse32.v v8, (a1)
176 ; V-NEXT:    ret
178 ; ZVE32F-LABEL: vnsrl_32_i32:
179 ; ZVE32F:       # %bb.0: # %entry
180 ; ZVE32F-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
181 ; ZVE32F-NEXT:    vle32.v v8, (a0)
182 ; ZVE32F-NEXT:    vsetivli zero, 2, e32, m1, ta, mu
183 ; ZVE32F-NEXT:    vslidedown.vi v9, v8, 2
184 ; ZVE32F-NEXT:    vmv.v.i v0, 2
185 ; ZVE32F-NEXT:    vrgather.vi v10, v8, 1
186 ; ZVE32F-NEXT:    vrgather.vi v10, v9, 1, v0.t
187 ; ZVE32F-NEXT:    vse32.v v10, (a1)
188 ; ZVE32F-NEXT:    ret
189 entry:
190   %0 = load <4 x i32>, ptr %in, align 4
191   %shuffle.i5 = shufflevector <4 x i32> %0, <4 x i32> poison, <2 x i32> <i32 1, i32 3>
192   store <2 x i32> %shuffle.i5, ptr %out, align 4
193   ret void
196 define void @vnsrl_0_float(ptr %in, ptr %out) {
197 ; V-LABEL: vnsrl_0_float:
198 ; V:       # %bb.0: # %entry
199 ; V-NEXT:    vsetivli zero, 4, e32, mf2, ta, ma
200 ; V-NEXT:    vle32.v v8, (a0)
201 ; V-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
202 ; V-NEXT:    vnsrl.wi v8, v8, 0
203 ; V-NEXT:    vse32.v v8, (a1)
204 ; V-NEXT:    ret
206 ; ZVE32F-LABEL: vnsrl_0_float:
207 ; ZVE32F:       # %bb.0: # %entry
208 ; ZVE32F-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
209 ; ZVE32F-NEXT:    vle32.v v8, (a0)
210 ; ZVE32F-NEXT:    vsetivli zero, 2, e32, m1, ta, ma
211 ; ZVE32F-NEXT:    vslidedown.vi v9, v8, 2
212 ; ZVE32F-NEXT:    vslideup.vi v8, v9, 1
213 ; ZVE32F-NEXT:    vse32.v v8, (a1)
214 ; ZVE32F-NEXT:    ret
215 entry:
216   %0 = load <4 x float>, ptr %in, align 4
217   %shuffle.i5 = shufflevector <4 x float> %0, <4 x float> poison, <2 x i32> <i32 0, i32 2>
218   store <2 x float> %shuffle.i5, ptr %out, align 4
219   ret void
222 define void @vnsrl_32_float(ptr %in, ptr %out) {
223 ; V-LABEL: vnsrl_32_float:
224 ; V:       # %bb.0: # %entry
225 ; V-NEXT:    vsetivli zero, 4, e32, mf2, ta, ma
226 ; V-NEXT:    vle32.v v8, (a0)
227 ; V-NEXT:    li a0, 32
228 ; V-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
229 ; V-NEXT:    vnsrl.wx v8, v8, a0
230 ; V-NEXT:    vse32.v v8, (a1)
231 ; V-NEXT:    ret
233 ; ZVE32F-LABEL: vnsrl_32_float:
234 ; ZVE32F:       # %bb.0: # %entry
235 ; ZVE32F-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
236 ; ZVE32F-NEXT:    vle32.v v8, (a0)
237 ; ZVE32F-NEXT:    vsetivli zero, 2, e32, m1, ta, mu
238 ; ZVE32F-NEXT:    vslidedown.vi v9, v8, 2
239 ; ZVE32F-NEXT:    vmv.v.i v0, 2
240 ; ZVE32F-NEXT:    vrgather.vi v10, v8, 1
241 ; ZVE32F-NEXT:    vrgather.vi v10, v9, 1, v0.t
242 ; ZVE32F-NEXT:    vse32.v v10, (a1)
243 ; ZVE32F-NEXT:    ret
244 entry:
245   %0 = load <4 x float>, ptr %in, align 4
246   %shuffle.i5 = shufflevector <4 x float> %0, <4 x float> poison, <2 x i32> <i32 1, i32 3>
247   store <2 x float> %shuffle.i5, ptr %out, align 4
248   ret void
251 define void @vnsrl_0_i64(ptr %in, ptr %out) {
252 ; V-LABEL: vnsrl_0_i64:
253 ; V:       # %bb.0: # %entry
254 ; V-NEXT:    vsetivli zero, 4, e64, m1, ta, ma
255 ; V-NEXT:    vle64.v v8, (a0)
256 ; V-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
257 ; V-NEXT:    vslidedown.vi v9, v8, 2
258 ; V-NEXT:    vslideup.vi v8, v9, 1
259 ; V-NEXT:    vse64.v v8, (a1)
260 ; V-NEXT:    ret
262 ; ZVE32F-LABEL: vnsrl_0_i64:
263 ; ZVE32F:       # %bb.0: # %entry
264 ; ZVE32F-NEXT:    ld a2, 16(a0)
265 ; ZVE32F-NEXT:    ld a0, 0(a0)
266 ; ZVE32F-NEXT:    sd a2, 8(a1)
267 ; ZVE32F-NEXT:    sd a0, 0(a1)
268 ; ZVE32F-NEXT:    ret
269 entry:
270   %0 = load <4 x i64>, ptr %in, align 8
271   %shuffle.i5 = shufflevector <4 x i64> %0, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
272   store <2 x i64> %shuffle.i5, ptr %out, align 8
273   ret void
276 define void @vnsrl_64_i64(ptr %in, ptr %out) {
277 ; V-LABEL: vnsrl_64_i64:
278 ; V:       # %bb.0: # %entry
279 ; V-NEXT:    vsetivli zero, 4, e64, m1, ta, ma
280 ; V-NEXT:    vle64.v v8, (a0)
281 ; V-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
282 ; V-NEXT:    vslidedown.vi v9, v8, 2
283 ; V-NEXT:    vmv.v.i v0, 2
284 ; V-NEXT:    vrgather.vi v10, v8, 1
285 ; V-NEXT:    vrgather.vi v10, v9, 1, v0.t
286 ; V-NEXT:    vse64.v v10, (a1)
287 ; V-NEXT:    ret
289 ; ZVE32F-LABEL: vnsrl_64_i64:
290 ; ZVE32F:       # %bb.0: # %entry
291 ; ZVE32F-NEXT:    ld a2, 24(a0)
292 ; ZVE32F-NEXT:    ld a0, 8(a0)
293 ; ZVE32F-NEXT:    sd a2, 8(a1)
294 ; ZVE32F-NEXT:    sd a0, 0(a1)
295 ; ZVE32F-NEXT:    ret
296 entry:
297   %0 = load <4 x i64>, ptr %in, align 8
298   %shuffle.i5 = shufflevector <4 x i64> %0, <4 x i64> poison, <2 x i32> <i32 1, i32 3>
299   store <2 x i64> %shuffle.i5, ptr %out, align 8
300   ret void
303 define void @vnsrl_0_double(ptr %in, ptr %out) {
304 ; V-LABEL: vnsrl_0_double:
305 ; V:       # %bb.0: # %entry
306 ; V-NEXT:    vsetivli zero, 4, e64, m1, ta, ma
307 ; V-NEXT:    vle64.v v8, (a0)
308 ; V-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
309 ; V-NEXT:    vslidedown.vi v9, v8, 2
310 ; V-NEXT:    vslideup.vi v8, v9, 1
311 ; V-NEXT:    vse64.v v8, (a1)
312 ; V-NEXT:    ret
314 ; ZVE32F-LABEL: vnsrl_0_double:
315 ; ZVE32F:       # %bb.0: # %entry
316 ; ZVE32F-NEXT:    ld a2, 16(a0)
317 ; ZVE32F-NEXT:    ld a0, 0(a0)
318 ; ZVE32F-NEXT:    sd a2, 8(a1)
319 ; ZVE32F-NEXT:    sd a0, 0(a1)
320 ; ZVE32F-NEXT:    ret
321 entry:
322   %0 = load <4 x double>, ptr %in, align 8
323   %shuffle.i5 = shufflevector <4 x double> %0, <4 x double> poison, <2 x i32> <i32 0, i32 2>
324   store <2 x double> %shuffle.i5, ptr %out, align 8
325   ret void
328 define void @vnsrl_64_double(ptr %in, ptr %out) {
329 ; V-LABEL: vnsrl_64_double:
330 ; V:       # %bb.0: # %entry
331 ; V-NEXT:    vsetivli zero, 4, e64, m1, ta, ma
332 ; V-NEXT:    vle64.v v8, (a0)
333 ; V-NEXT:    vsetivli zero, 2, e64, m1, ta, mu
334 ; V-NEXT:    vslidedown.vi v9, v8, 2
335 ; V-NEXT:    vmv.v.i v0, 2
336 ; V-NEXT:    vrgather.vi v10, v8, 1
337 ; V-NEXT:    vrgather.vi v10, v9, 1, v0.t
338 ; V-NEXT:    vse64.v v10, (a1)
339 ; V-NEXT:    ret
341 ; ZVE32F-LABEL: vnsrl_64_double:
342 ; ZVE32F:       # %bb.0: # %entry
343 ; ZVE32F-NEXT:    ld a2, 24(a0)
344 ; ZVE32F-NEXT:    ld a0, 8(a0)
345 ; ZVE32F-NEXT:    sd a2, 8(a1)
346 ; ZVE32F-NEXT:    sd a0, 0(a1)
347 ; ZVE32F-NEXT:    ret
348 entry:
349   %0 = load <4 x double>, ptr %in, align 8
350   %shuffle.i5 = shufflevector <4 x double> %0, <4 x double> poison, <2 x i32> <i32 1, i32 3>
351   store <2 x double> %shuffle.i5, ptr %out, align 8
352   ret void