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(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
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,
25 <vscale x 4 x i64> %shl,
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
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,
45 <vscale x 4 x i64> %shl,
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
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,
65 <vscale x 4 x i64> %shl,
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
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,
88 <vscale x 4 x i64> %shl,
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(
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
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,
114 <vscale x 4 x i16> %shl,
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
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,
137 <vscale x 4 x i64> %shl,
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 zero, a1, e64, m4, ta, ma
146 ; CHECK-NEXT: vmv.v.i v8, 0
147 ; CHECK-NEXT: vmerge.vim v8, v8, 1, v0
148 ; CHECK-NEXT: vsll.vi v12, v8, 2
149 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
150 ; CHECK-NEXT: vloxei64.v v8, (a0), v12
153 %offset.ext = zext <vscale x 4 x i1> %offset to <vscale x 4 x i64>
154 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 2)
155 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.nxv4i32.nxv4i64(
156 <vscale x 4 x i32> undef,
158 <vscale x 4 x i64> %shl,
160 ret <vscale x 4 x i32> %res
163 declare <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
171 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) {
172 ; CHECK-LABEL: test_vloxei_mask:
173 ; CHECK: # %bb.0: # %entry
174 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
175 ; CHECK-NEXT: vzext.vf8 v12, v8
176 ; CHECK-NEXT: vsll.vi v12, v12, 4
177 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
178 ; CHECK-NEXT: vloxei64.v v8, (a0), v12, v0.t
181 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
182 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
183 %res = call <vscale x 4 x i32> @llvm.riscv.vloxei.mask.nxv4i32.nxv4i64(
184 <vscale x 4 x i32> undef,
186 <vscale x 4 x i64> %shl,
187 <vscale x 4 x i1> %m,
189 ret <vscale x 4 x i32> %res
192 declare <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
198 define <vscale x 4 x i32> @test_vluxei(ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
199 ; CHECK-LABEL: test_vluxei:
200 ; CHECK: # %bb.0: # %entry
201 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
202 ; CHECK-NEXT: vzext.vf8 v12, v8
203 ; CHECK-NEXT: vsll.vi v12, v12, 4
204 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
205 ; CHECK-NEXT: vluxei64.v v8, (a0), v12
208 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
209 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
210 %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.nxv4i32.nxv4i64(
211 <vscale x 4 x i32> undef,
213 <vscale x 4 x i64> %shl,
215 ret <vscale x 4 x i32> %res
218 declare <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
226 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) {
227 ; CHECK-LABEL: test_vluxei_mask:
228 ; CHECK: # %bb.0: # %entry
229 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
230 ; CHECK-NEXT: vzext.vf8 v12, v8
231 ; CHECK-NEXT: vsll.vi v12, v12, 4
232 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
233 ; CHECK-NEXT: vluxei64.v v8, (a0), v12, v0.t
236 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
237 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
238 %res = call <vscale x 4 x i32> @llvm.riscv.vluxei.mask.nxv4i32.nxv4i64(
239 <vscale x 4 x i32> undef,
241 <vscale x 4 x i64> %shl,
242 <vscale x 4 x i1> %m,
244 ret <vscale x 4 x i32> %res
247 declare void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
253 define void @test_vsoxei(<vscale x 4 x i32> %val, ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
254 ; CHECK-LABEL: test_vsoxei:
255 ; CHECK: # %bb.0: # %entry
256 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
257 ; CHECK-NEXT: vzext.vf8 v12, v10
258 ; CHECK-NEXT: vsll.vi v12, v12, 4
259 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
260 ; CHECK-NEXT: vsoxei64.v v8, (a0), v12
263 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
264 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
265 call void @llvm.riscv.vsoxei.nxv4i32.nxv4i64(
266 <vscale x 4 x i32> %val,
268 <vscale x 4 x i64> %shl,
273 declare void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
280 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) {
281 ; CHECK-LABEL: test_vsoxei_mask:
282 ; CHECK: # %bb.0: # %entry
283 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
284 ; CHECK-NEXT: vzext.vf8 v12, v10
285 ; CHECK-NEXT: vsll.vi v12, v12, 4
286 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
287 ; CHECK-NEXT: vsoxei64.v v8, (a0), v12, v0.t
290 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
291 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
292 call void @llvm.riscv.vsoxei.mask.nxv4i32.nxv4i64(
293 <vscale x 4 x i32> %val,
295 <vscale x 4 x i64> %shl,
296 <vscale x 4 x i1> %m,
301 declare void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
307 define void @test_vsuxei(<vscale x 4 x i32> %val, ptr %ptr, <vscale x 4 x i8> %offset, i64 %vl) {
308 ; CHECK-LABEL: test_vsuxei:
309 ; CHECK: # %bb.0: # %entry
310 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
311 ; CHECK-NEXT: vzext.vf8 v12, v10
312 ; CHECK-NEXT: vsll.vi v12, v12, 4
313 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
314 ; CHECK-NEXT: vsuxei64.v v8, (a0), v12
317 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
318 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
319 call void @llvm.riscv.vsuxei.nxv4i32.nxv4i64(
320 <vscale x 4 x i32> %val,
322 <vscale x 4 x i64> %shl,
327 declare void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
334 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) {
335 ; CHECK-LABEL: test_vsuxei_mask:
336 ; CHECK: # %bb.0: # %entry
337 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, ma
338 ; CHECK-NEXT: vzext.vf8 v12, v10
339 ; CHECK-NEXT: vsll.vi v12, v12, 4
340 ; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma
341 ; CHECK-NEXT: vsuxei64.v v8, (a0), v12, v0.t
344 %offset.ext = zext <vscale x 4 x i8> %offset to <vscale x 4 x i64>
345 %shl = shl <vscale x 4 x i64> %offset.ext, splat (i64 4)
346 call void @llvm.riscv.vsuxei.mask.nxv4i32.nxv4i64(
347 <vscale x 4 x i32> %val,
349 <vscale x 4 x i64> %shl,
350 <vscale x 4 x i1> %m,