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(
10 define <vscale x 4 x i32> @test_vloxei(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
11 ; CHECK-LABEL: test_vloxei:
12 ; CHECK: # %bb.0: # %entry
13 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
14 ; CHECK-NEXT: vzext.vf8 v12, v8
15 ; CHECK-NEXT: vsll.vi v12, v12, 4
16 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
17 ; CHECK-NEXT: vloxei64.v v8, (a0), v12
20 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
21 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
22 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
23 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
24 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
25 <vscale x 4 x i32> undef,
26 <vscale x 4 x i32>* %ptr,
27 <vscale x 4 x i64> %shl,
29 ret <vscale x 4 x i32> %res
32 define <vscale x 4 x i32> @test_vloxei2(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
33 ; CHECK-LABEL: test_vloxei2:
34 ; CHECK: # %bb.0: # %entry
35 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
36 ; CHECK-NEXT: vzext.vf8 v12, v8
37 ; CHECK-NEXT: vsll.vi v12, v12, 14
38 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
39 ; CHECK-NEXT: vloxei64.v v8, (a0), v12
42 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
43 %shamt = insertelement <vscale x 4 x i64> undef, i64 14, i32 0
44 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
45 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
46 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
47 <vscale x 4 x i32> undef,
48 <vscale x 4 x i32>* %ptr,
49 <vscale x 4 x i64> %shl,
51 ret <vscale x 4 x i32> %res
54 define <vscale x 4 x i32> @test_vloxei3(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
55 ; CHECK-LABEL: test_vloxei3:
56 ; CHECK: # %bb.0: # %entry
57 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
58 ; CHECK-NEXT: vzext.vf8 v12, v8
59 ; CHECK-NEXT: vsll.vi v12, v12, 26
60 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
61 ; CHECK-NEXT: vloxei64.v v8, (a0), v12
64 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
65 %shamt = insertelement <vscale x 4 x i64> undef, i64 26, i32 0
66 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
67 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
68 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
69 <vscale x 4 x i32> undef,
70 <vscale x 4 x i32>* %ptr,
71 <vscale x 4 x i64> %shl,
73 ret <vscale x 4 x i32> %res
76 ; Test use vp.zext to extend.
77 declare <vscale x 4 x i64> @llvm.vp.zext.nxvi64.nxv1i8(<vscale x 4 x i8>, <vscale x 4 x i1>, i32)
78 define <vscale x 4 x i32> @test_vloxei4(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i32 zeroext %vl) {
79 ; CHECK-LABEL: test_vloxei4:
80 ; CHECK: # %bb.0: # %entry
81 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
82 ; CHECK-NEXT: vzext.vf8 v12, v8, v0.t
83 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
84 ; CHECK-NEXT: vsll.vi v12, v12, 4
85 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
86 ; CHECK-NEXT: vloxei64.v v8, (a0), v12
89 %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)
90 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
91 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
92 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
93 %vl.i64 = zext i32 %vl to i64
94 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
95 <vscale x 4 x i32> undef,
96 <vscale x 4 x i32>* %ptr,
97 <vscale x 4 x i64> %shl,
99 ret <vscale x 4 x i32> %res
102 ; Test orignal extnened type is enough narrow.
103 declare <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i16(
108 define <vscale x 4 x i32> @test_vloxei5(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
109 ; CHECK-LABEL: test_vloxei5:
110 ; CHECK: # %bb.0: # %entry
111 ; CHECK-NEXT: vsetvli a2, zero, e16, m1, ta, ma
112 ; CHECK-NEXT: vzext.vf2 v9, v8
113 ; CHECK-NEXT: vsll.vi v10, v9, 12
114 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
115 ; CHECK-NEXT: vloxei16.v v8, (a0), v10
118 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i16>
119 %shamt = insertelement <vscale x 4 x i16> undef, i16 12, i32 0
120 %shamt.vec = shufflevector <vscale x 4 x i16> %shamt, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
121 %shl = shl <vscale x 4 x i16> %offset.ext, %shamt.vec
122 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i16(
123 <vscale x 4 x i32> undef,
124 <vscale x 4 x i32>* %ptr,
125 <vscale x 4 x i16> %shl,
127 ret <vscale x 4 x i32> %res
130 define <vscale x 4 x i32> @test_vloxei6(<vscale x 4 x i32>* %ptr, <vscale x 4 x i7> %offset, i64 %vl) {
131 ; CHECK-LABEL: test_vloxei6:
132 ; CHECK: # %bb.0: # %entry
133 ; CHECK-NEXT: li a2, 127
134 ; CHECK-NEXT: vsetvli a3, zero, e8, mf2, ta, ma
135 ; CHECK-NEXT: vand.vx v8, v8, a2
136 ; CHECK-NEXT: vsetvli zero, zero, e64, m4, ta, ma
137 ; CHECK-NEXT: vzext.vf8 v12, v8
138 ; CHECK-NEXT: vsll.vi v12, v12, 4
139 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
140 ; CHECK-NEXT: vloxei64.v v8, (a0), v12
143 %offset.ext = zext <vscale x 4 x i7> %offset to <vscale x 4 x i64>
144 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
145 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
146 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
147 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
148 <vscale x 4 x i32> undef,
149 <vscale x 4 x i32>* %ptr,
150 <vscale x 4 x i64> %shl,
152 ret <vscale x 4 x i32> %res
155 define <vscale x 4 x i32> @test_vloxei7(<vscale x 4 x i32>* %ptr, <vscale x 4 x i1> %offset, i64 %vl) {
156 ; CHECK-LABEL: test_vloxei7:
157 ; CHECK: # %bb.0: # %entry
158 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
159 ; CHECK-NEXT: vmv.v.i v8, 0
160 ; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
161 ; CHECK-NEXT: vsll.vi v12, v8, 2
162 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
163 ; CHECK-NEXT: vloxei64.v v8, (a0), v12
166 %offset.ext = zext <vscale x 4 x i1> %offset to <vscale x 4 x i64>
167 %shamt = insertelement <vscale x 4 x i64> undef, i64 2, i32 0
168 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
169 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
170 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
171 <vscale x 4 x i32> undef,
172 <vscale x 4 x i32>* %ptr,
173 <vscale x 4 x i64> %shl,
175 ret <vscale x 4 x i32> %res
178 declare <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
186 define <vscale x 4 x i32> @test_vloxei_mask(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
187 ; CHECK-LABEL: test_vloxei_mask:
188 ; CHECK: # %bb.0: # %entry
189 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
190 ; CHECK-NEXT: vzext.vf8 v12, v8
191 ; CHECK-NEXT: vsll.vi v12, v12, 4
192 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
193 ; CHECK-NEXT: vloxei64.v v8, (a0), v12, v0.t
196 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
197 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
198 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
199 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
200 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
201 <vscale x 4 x i32> undef,
202 <vscale x 4 x i32>* %ptr,
203 <vscale x 4 x i64> %shl,
204 <vscale x 4 x i1> %m,
206 ret <vscale x 4 x i32> %res
209 declare <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
215 define <vscale x 4 x i32> @test_vluxei(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
216 ; CHECK-LABEL: test_vluxei:
217 ; CHECK: # %bb.0: # %entry
218 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
219 ; CHECK-NEXT: vzext.vf8 v12, v8
220 ; CHECK-NEXT: vsll.vi v12, v12, 4
221 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
222 ; CHECK-NEXT: vluxei64.v v8, (a0), v12
225 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
226 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
227 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
228 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
229 %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
230 <vscale x 4 x i32> undef,
231 <vscale x 4 x i32>* %ptr,
232 <vscale x 4 x i64> %shl,
234 ret <vscale x 4 x i32> %res
237 declare <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
245 define <vscale x 4 x i32> @test_vluxei_mask(<vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
246 ; CHECK-LABEL: test_vluxei_mask:
247 ; CHECK: # %bb.0: # %entry
248 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
249 ; CHECK-NEXT: vzext.vf8 v12, v8
250 ; CHECK-NEXT: vsll.vi v12, v12, 4
251 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
252 ; CHECK-NEXT: vluxei64.v v8, (a0), v12, v0.t
255 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
256 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
257 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
258 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
259 %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
260 <vscale x 4 x i32> undef,
261 <vscale x 4 x i32>* %ptr,
262 <vscale x 4 x i64> %shl,
263 <vscale x 4 x i1> %m,
265 ret <vscale x 4 x i32> %res
268 declare void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
274 define void @test_vsoxei(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
275 ; CHECK-LABEL: test_vsoxei:
276 ; CHECK: # %bb.0: # %entry
277 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
278 ; CHECK-NEXT: vzext.vf8 v12, v10
279 ; CHECK-NEXT: vsll.vi v12, v12, 4
280 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
281 ; CHECK-NEXT: vsoxei64.v v8, (a0), v12
284 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
285 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
286 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
287 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
288 call void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
289 <vscale x 4 x i32> %val,
290 <vscale x 4 x i32>* %ptr,
291 <vscale x 4 x i64> %shl,
296 declare void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
303 define void @test_vsoxei_mask(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
304 ; CHECK-LABEL: test_vsoxei_mask:
305 ; CHECK: # %bb.0: # %entry
306 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
307 ; CHECK-NEXT: vzext.vf8 v12, v10
308 ; CHECK-NEXT: vsll.vi v12, v12, 4
309 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
310 ; CHECK-NEXT: vsoxei64.v v8, (a0), v12, v0.t
313 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
314 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
315 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
316 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
317 call void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
318 <vscale x 4 x i32> %val,
319 <vscale x 4 x i32>* %ptr,
320 <vscale x 4 x i64> %shl,
321 <vscale x 4 x i1> %m,
326 declare void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
332 define void @test_vsuxei(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
333 ; CHECK-LABEL: test_vsuxei:
334 ; CHECK: # %bb.0: # %entry
335 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
336 ; CHECK-NEXT: vzext.vf8 v12, v10
337 ; CHECK-NEXT: vsll.vi v12, v12, 4
338 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
339 ; CHECK-NEXT: vsuxei64.v v8, (a0), v12
342 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
343 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
344 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
345 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
346 call void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
347 <vscale x 4 x i32> %val,
348 <vscale x 4 x i32>* %ptr,
349 <vscale x 4 x i64> %shl,
354 declare void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
361 define void @test_vsuxei_mask(<vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr, <vscale x 4 x i8> %offset, <vscale x 4 x i1> %m, i64 %vl) {
362 ; CHECK-LABEL: test_vsuxei_mask:
363 ; CHECK: # %bb.0: # %entry
364 ; CHECK-NEXT: vsetvli a2, zero, e64, m4, ta, ma
365 ; CHECK-NEXT: vzext.vf8 v12, v10
366 ; CHECK-NEXT: vsll.vi v12, v12, 4
367 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma
368 ; CHECK-NEXT: vsuxei64.v v8, (a0), v12, v0.t
371 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
372 %shamt = insertelement <vscale x 4 x i64> undef, i64 4, i32 0
373 %shamt.vec = shufflevector <vscale x 4 x i64> %shamt, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
374 %shl = shl <vscale x 4 x i64> %offset.ext, %shamt.vec
375 call void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
376 <vscale x 4 x i32> %val,
377 <vscale x 4 x i32>* %ptr,
378 <vscale x 4 x i64> %shl,
379 <vscale x 4 x i1> %m,