[OptTable] Fix typo VALUE => VALUES (NFCI) (#121523)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / narrow-shift-extend.ll
blob3fbe635576c9b39f8cbf80d4ab7d1100936dd2ef
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
4 declare <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
5   <vscale x 4 x i32>,
6   ptr,
7   <vscale x 4 x i64>,
8   i64);
10 define <vscale x 4 x i32> @test_vloxei(ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
11 ; CHECK-LABEL: test_vloxei:
12 ; CHECK:       # %bb.0: # %entry
13 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
14 ; CHECK-NEXT:    vzext.vf8 v12, v8
15 ; CHECK-NEXT:    vsll.vi v12, v12, 4
16 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
17 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
18 ; CHECK-NEXT:    ret
19 entry:
20   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
21   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
22   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
23     <vscale x 4 x i32> undef,
24     ptr %ptr,
25     <vscale x 4 x i64> %shl,
26     i64 %vl)
27   ret <vscale x 4 x i32> %res
30 define <vscale x 4 x i32> @test_vloxei2(ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
31 ; CHECK-LABEL: test_vloxei2:
32 ; CHECK:       # %bb.0: # %entry
33 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
34 ; CHECK-NEXT:    vzext.vf8 v12, v8
35 ; CHECK-NEXT:    vsll.vi v12, v12, 14
36 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
37 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
38 ; CHECK-NEXT:    ret
39 entry:
40   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
41   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 14)
42   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
43     <vscale x 4 x i32> undef,
44     ptr %ptr,
45     <vscale x 4 x i64> %shl,
46     i64 %vl)
47   ret <vscale x 4 x i32> %res
50 define <vscale x 4 x i32> @test_vloxei3(ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
51 ; CHECK-LABEL: test_vloxei3:
52 ; CHECK:       # %bb.0: # %entry
53 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
54 ; CHECK-NEXT:    vzext.vf8 v12, v8
55 ; CHECK-NEXT:    vsll.vi v12, v12, 26
56 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
57 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
58 ; CHECK-NEXT:    ret
59 entry:
60   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
61   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 26)
62   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
63     <vscale x 4 x i32> undef,
64     ptr %ptr,
65     <vscale x 4 x i64> %shl,
66     i64 %vl)
67   ret <vscale x 4 x i32> %res
70 ; Test use vp.zext to extend.
71 declare <vscale x 4 x i64> @llvm.vp.zext.nxvi64.nxv1i8(<vscale x 4 x i8>, <vscale x 4 x i1>, i32)
72 define <vscale x 4 x i32> @test_vloxei4(ptr %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i32 zeroext %vl) {
73 ; CHECK-LABEL: test_vloxei4:
74 ; CHECK:       # %bb.0: # %entry
75 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
76 ; CHECK-NEXT:    vzext.vf8 v12, v8, v0.t
77 ; CHECK-NEXT:    vsll.vi v12, v12, 4
78 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
79 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
80 ; CHECK-NEXT:    ret
81 entry:
82   %offset.ext = call <vscale x 4 x i64> @llvm.vp.zext.nxvi64.nxv1i8(<vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i32 %vl)
83   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
84   %vl.i64 = zext i32 %vl to i64
85   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
86     <vscale x 4 x i32> undef,
87     ptr %ptr,
88     <vscale x 4 x i64> %shl,
89     i64 %vl.i64)
90   ret <vscale x 4 x i32> %res
93 ; Test orignal extnened type is enough narrow.
94 declare <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i16(
95   <vscale x 4 x i32>,
96   ptr,
97   <vscale x 4 x i16>,
98   i64);
99 define <vscale x 4 x i32> @test_vloxei5(ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
100 ; CHECK-LABEL: test_vloxei5:
101 ; CHECK:       # %bb.0: # %entry
102 ; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
103 ; CHECK-NEXT:    vzext.vf2 v9, v8
104 ; CHECK-NEXT:    vsll.vi v10, v9, 12
105 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
106 ; CHECK-NEXT:    vloxei16.v v8, (a0), v10
107 ; CHECK-NEXT:    ret
108 entry:
109   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i16>
110   %shl = shl <vscale x 4 x i16> %offset.ext, splat (i16 12)
111   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i16(
112     <vscale x 4 x i32> undef,
113     ptr %ptr,
114     <vscale x 4 x i16> %shl,
115     i64 %vl)
116   ret <vscale x 4 x i32> %res
119 define <vscale x 4 x i32> @test_vloxei6(ptr %ptr, <vscale x 4 x i7> %offset, i64 %vl) {
120 ; CHECK-LABEL: test_vloxei6:
121 ; CHECK:       # %bb.0: # %entry
122 ; CHECK-NEXT:    li a2, 127
123 ; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
124 ; CHECK-NEXT:    vand.vx v8, v8, a2
125 ; CHECK-NEXT:    vsetvli zero, zero, e64, m4, ta, ma
126 ; CHECK-NEXT:    vzext.vf8 v12, v8
127 ; CHECK-NEXT:    vsll.vi v12, v12, 4
128 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
129 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
130 ; CHECK-NEXT:    ret
131 entry:
132   %offset.ext = zext <vscale x 4 x i7> %offset to <vscale x 4 x i64>
133   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
134   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
135     <vscale x 4 x i32> undef,
136     ptr %ptr,
137     <vscale x 4 x i64> %shl,
138     i64 %vl)
139   ret <vscale x 4 x i32> %res
142 define <vscale x 4 x i32> @test_vloxei7(ptr %ptr, <vscale x 4 x i1> %offset, i64 %vl) {
143 ; CHECK-LABEL: test_vloxei7:
144 ; CHECK:       # %bb.0: # %entry
145 ; CHECK-NEXT:    vsetvli a2, zero, e64, m4, ta, ma
146 ; CHECK-NEXT:    vmv.v.i v8, 0
147 ; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
148 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
149 ; CHECK-NEXT:    vsll.vi v12, v8, 2
150 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
151 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12
152 ; CHECK-NEXT:    ret
153 entry:
154   %offset.ext = zext <vscale x 4 x i1> %offset to <vscale x 4 x i64>
155   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 2)
156   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
157     <vscale x 4 x i32> undef,
158     ptr %ptr,
159     <vscale x 4 x i64> %shl,
160     i64 %vl)
161   ret <vscale x 4 x i32> %res
164 declare <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
165   <vscale x 4 x i32>,
166   ptr,
167   <vscale x 4 x i64>,
168   <vscale x 4 x i1>,
169   i64,
170   i64);
172 define <vscale x 4 x i32> @test_vloxei_mask(ptr %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
173 ; CHECK-LABEL: test_vloxei_mask:
174 ; CHECK:       # %bb.0: # %entry
175 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
176 ; CHECK-NEXT:    vzext.vf8 v12, v8
177 ; CHECK-NEXT:    vsll.vi v12, v12, 4
178 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
179 ; CHECK-NEXT:    vloxei64.v v8, (a0), v12, v0.t
180 ; CHECK-NEXT:    ret
181 entry:
182   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
183   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
184   %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
185     <vscale x 4 x i32> undef,
186     ptr %ptr,
187     <vscale x 4 x i64> %shl,
188     <vscale x 4 x i1> %m,
189     i64 %vl, i64 1)
190   ret <vscale x 4 x i32> %res
193 declare <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
194   <vscale x 4 x i32>,
195   ptr,
196   <vscale x 4 x i64>,
197   i64);
199 define <vscale x 4 x i32> @test_vluxei(ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
200 ; CHECK-LABEL: test_vluxei:
201 ; CHECK:       # %bb.0: # %entry
202 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
203 ; CHECK-NEXT:    vzext.vf8 v12, v8
204 ; CHECK-NEXT:    vsll.vi v12, v12, 4
205 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
206 ; CHECK-NEXT:    vluxei64.v v8, (a0), v12
207 ; CHECK-NEXT:    ret
208 entry:
209   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
210   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
211   %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
212     <vscale x 4 x i32> undef,
213     ptr %ptr,
214     <vscale x 4 x i64> %shl,
215     i64 %vl)
216   ret <vscale x 4 x i32> %res
219 declare <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
220   <vscale x 4 x i32>,
221   ptr,
222   <vscale x 4 x i64>,
223   <vscale x 4 x i1>,
224   i64,
225   i64);
227 define <vscale x 4 x i32> @test_vluxei_mask(ptr %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
228 ; CHECK-LABEL: test_vluxei_mask:
229 ; CHECK:       # %bb.0: # %entry
230 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
231 ; CHECK-NEXT:    vzext.vf8 v12, v8
232 ; CHECK-NEXT:    vsll.vi v12, v12, 4
233 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
234 ; CHECK-NEXT:    vluxei64.v v8, (a0), v12, v0.t
235 ; CHECK-NEXT:    ret
236 entry:
237   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
238   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
239   %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
240     <vscale x 4 x i32> undef,
241     ptr %ptr,
242     <vscale x 4 x i64> %shl,
243     <vscale x 4 x i1> %m,
244     i64 %vl, i64 1)
245   ret <vscale x 4 x i32> %res
248 declare void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
249   <vscale x 4 x i32>,
250   ptr,
251   <vscale x 4 x i64>,
252   i64);
254 define void @test_vsoxei(<vscale x 4 x i32> %val, ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
255 ; CHECK-LABEL: test_vsoxei:
256 ; CHECK:       # %bb.0: # %entry
257 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
258 ; CHECK-NEXT:    vzext.vf8 v12, v10
259 ; CHECK-NEXT:    vsll.vi v12, v12, 4
260 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
261 ; CHECK-NEXT:    vsoxei64.v v8, (a0), v12
262 ; CHECK-NEXT:    ret
263 entry:
264   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
265   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
266   call void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
267     <vscale x 4 x i32> %val,
268     ptr %ptr,
269     <vscale x 4 x i64> %shl,
270     i64 %vl)
271   ret void
274 declare void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
275   <vscale x 4 x i32>,
276   ptr,
277   <vscale x 4 x i64>,
278   <vscale x 4 x i1>,
279   i64);
281 define void @test_vsoxei_mask(<vscale x 4 x i32> %val, ptr %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
282 ; CHECK-LABEL: test_vsoxei_mask:
283 ; CHECK:       # %bb.0: # %entry
284 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
285 ; CHECK-NEXT:    vzext.vf8 v12, v10
286 ; CHECK-NEXT:    vsll.vi v12, v12, 4
287 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
288 ; CHECK-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
289 ; CHECK-NEXT:    ret
290 entry:
291   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
292   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
293   call void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
294     <vscale x 4 x i32> %val,
295     ptr %ptr,
296     <vscale x 4 x i64> %shl,
297     <vscale x 4 x i1> %m,
298     i64 %vl)
299   ret void
302 declare void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
303   <vscale x 4 x i32>,
304   ptr,
305   <vscale x 4 x i64>,
306   i64);
308 define void @test_vsuxei(<vscale x 4 x i32> %val, ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
309 ; CHECK-LABEL: test_vsuxei:
310 ; CHECK:       # %bb.0: # %entry
311 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
312 ; CHECK-NEXT:    vzext.vf8 v12, v10
313 ; CHECK-NEXT:    vsll.vi v12, v12, 4
314 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
315 ; CHECK-NEXT:    vsuxei64.v v8, (a0), v12
316 ; CHECK-NEXT:    ret
317 entry:
318   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
319   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
320   call void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
321     <vscale x 4 x i32> %val,
322     ptr %ptr,
323     <vscale x 4 x i64> %shl,
324     i64 %vl)
325   ret void
328 declare void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
329   <vscale x 4 x i32>,
330   ptr,
331   <vscale x 4 x i64>,
332   <vscale x 4 x i1>,
333   i64);
335 define void @test_vsuxei_mask(<vscale x 4 x i32> %val, ptr %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
336 ; CHECK-LABEL: test_vsuxei_mask:
337 ; CHECK:       # %bb.0: # %entry
338 ; CHECK-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
339 ; CHECK-NEXT:    vzext.vf8 v12, v10
340 ; CHECK-NEXT:    vsll.vi v12, v12, 4
341 ; CHECK-NEXT:    vsetvli zero, zero, e32, m2, ta, ma
342 ; CHECK-NEXT:    vsuxei64.v v8, (a0), v12, v0.t
343 ; CHECK-NEXT:    ret
344 entry:
345   %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
346   %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
347   call void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
348     <vscale x 4 x i32> %val,
349     ptr %ptr,
350     <vscale x 4 x i64> %shl,
351     <vscale x 4 x i1> %m,
352     i64 %vl)
353   ret void