Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-vpscatter.ll
blob0c180cd148b81378688a109498725606fef9948f
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m \
3 ; RUN:   -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV32
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m \
5 ; RUN:   -verify-machineinstrs < %s | FileCheck %s --check-prefixes=RV64
7 declare void @llvm.vp.scatter.v2i8.v2p0(<2 x i8>, <2 x ptr>, <2 x i1>, i32)
9 define void @vpscatter_v2i8(<2 x i8> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
10 ; RV32-LABEL: vpscatter_v2i8:
11 ; RV32:       # %bb.0:
12 ; RV32-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
13 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
14 ; RV32-NEXT:    ret
16 ; RV64-LABEL: vpscatter_v2i8:
17 ; RV64:       # %bb.0:
18 ; RV64-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
19 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
20 ; RV64-NEXT:    ret
21   call void @llvm.vp.scatter.v2i8.v2p0(<2 x i8> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
22   ret void
25 define void @vpscatter_v2i16_truncstore_v2i8(<2 x i16> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
26 ; RV32-LABEL: vpscatter_v2i16_truncstore_v2i8:
27 ; RV32:       # %bb.0:
28 ; RV32-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
29 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
30 ; RV32-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
31 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
32 ; RV32-NEXT:    ret
34 ; RV64-LABEL: vpscatter_v2i16_truncstore_v2i8:
35 ; RV64:       # %bb.0:
36 ; RV64-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
37 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
38 ; RV64-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
39 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
40 ; RV64-NEXT:    ret
41   %tval = trunc <2 x i16> %val to <2 x i8>
42   call void @llvm.vp.scatter.v2i8.v2p0(<2 x i8> %tval, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
43   ret void
46 define void @vpscatter_v2i32_truncstore_v2i8(<2 x i32> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
47 ; RV32-LABEL: vpscatter_v2i32_truncstore_v2i8:
48 ; RV32:       # %bb.0:
49 ; RV32-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
50 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
51 ; RV32-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
52 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
53 ; RV32-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
54 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
55 ; RV32-NEXT:    ret
57 ; RV64-LABEL: vpscatter_v2i32_truncstore_v2i8:
58 ; RV64:       # %bb.0:
59 ; RV64-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
60 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
61 ; RV64-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
62 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
63 ; RV64-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
64 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
65 ; RV64-NEXT:    ret
66   %tval = trunc <2 x i32> %val to <2 x i8>
67   call void @llvm.vp.scatter.v2i8.v2p0(<2 x i8> %tval, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
68   ret void
71 define void @vpscatter_v2i64_truncstore_v2i8(<2 x i64> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
72 ; RV32-LABEL: vpscatter_v2i64_truncstore_v2i8:
73 ; RV32:       # %bb.0:
74 ; RV32-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
75 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
76 ; RV32-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
77 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
78 ; RV32-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
79 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
80 ; RV32-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
81 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
82 ; RV32-NEXT:    ret
84 ; RV64-LABEL: vpscatter_v2i64_truncstore_v2i8:
85 ; RV64:       # %bb.0:
86 ; RV64-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
87 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
88 ; RV64-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
89 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
90 ; RV64-NEXT:    vsetvli zero, zero, e8, mf8, ta, ma
91 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
92 ; RV64-NEXT:    vsetvli zero, a0, e8, mf8, ta, ma
93 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
94 ; RV64-NEXT:    ret
95   %tval = trunc <2 x i64> %val to <2 x i8>
96   call void @llvm.vp.scatter.v2i8.v2p0(<2 x i8> %tval, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
97   ret void
100 declare void @llvm.vp.scatter.v4i8.v4p0(<4 x i8>, <4 x ptr>, <4 x i1>, i32)
102 define void @vpscatter_v4i8(<4 x i8> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 zeroext %evl) {
103 ; RV32-LABEL: vpscatter_v4i8:
104 ; RV32:       # %bb.0:
105 ; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
106 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
107 ; RV32-NEXT:    ret
109 ; RV64-LABEL: vpscatter_v4i8:
110 ; RV64:       # %bb.0:
111 ; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
112 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
113 ; RV64-NEXT:    ret
114   call void @llvm.vp.scatter.v4i8.v4p0(<4 x i8> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 %evl)
115   ret void
118 define void @vpscatter_truemask_v4i8(<4 x i8> %val, <4 x ptr> %ptrs, i32 zeroext %evl) {
119 ; RV32-LABEL: vpscatter_truemask_v4i8:
120 ; RV32:       # %bb.0:
121 ; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
122 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9
123 ; RV32-NEXT:    ret
125 ; RV64-LABEL: vpscatter_truemask_v4i8:
126 ; RV64:       # %bb.0:
127 ; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
128 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
129 ; RV64-NEXT:    ret
130   call void @llvm.vp.scatter.v4i8.v4p0(<4 x i8> %val, <4 x ptr> %ptrs, <4 x i1> splat (i1 1), i32 %evl)
131   ret void
134 declare void @llvm.vp.scatter.v8i8.v8p0(<8 x i8>, <8 x ptr>, <8 x i1>, i32)
136 define void @vpscatter_v8i8(<8 x i8> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 zeroext %evl) {
137 ; RV32-LABEL: vpscatter_v8i8:
138 ; RV32:       # %bb.0:
139 ; RV32-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
140 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
141 ; RV32-NEXT:    ret
143 ; RV64-LABEL: vpscatter_v8i8:
144 ; RV64:       # %bb.0:
145 ; RV64-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
146 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
147 ; RV64-NEXT:    ret
148   call void @llvm.vp.scatter.v8i8.v8p0(<8 x i8> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
149   ret void
152 define void @vpscatter_baseidx_v8i8(<8 x i8> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
153 ; RV32-LABEL: vpscatter_baseidx_v8i8:
154 ; RV32:       # %bb.0:
155 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
156 ; RV32-NEXT:    vsext.vf4 v10, v9
157 ; RV32-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
158 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
159 ; RV32-NEXT:    ret
161 ; RV64-LABEL: vpscatter_baseidx_v8i8:
162 ; RV64:       # %bb.0:
163 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
164 ; RV64-NEXT:    vsext.vf8 v12, v9
165 ; RV64-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
166 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
167 ; RV64-NEXT:    ret
168   %ptrs = getelementptr inbounds i8, ptr %base, <8 x i8> %idxs
169   call void @llvm.vp.scatter.v8i8.v8p0(<8 x i8> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
170   ret void
173 declare void @llvm.vp.scatter.v2i16.v2p0(<2 x i16>, <2 x ptr>, <2 x i1>, i32)
175 define void @vpscatter_v2i16(<2 x i16> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
176 ; RV32-LABEL: vpscatter_v2i16:
177 ; RV32:       # %bb.0:
178 ; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
179 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
180 ; RV32-NEXT:    ret
182 ; RV64-LABEL: vpscatter_v2i16:
183 ; RV64:       # %bb.0:
184 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
185 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
186 ; RV64-NEXT:    ret
187   call void @llvm.vp.scatter.v2i16.v2p0(<2 x i16> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
188   ret void
191 define void @vpscatter_v2i32_truncstore_v2i16(<2 x i32> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
192 ; RV32-LABEL: vpscatter_v2i32_truncstore_v2i16:
193 ; RV32:       # %bb.0:
194 ; RV32-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
195 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
196 ; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
197 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
198 ; RV32-NEXT:    ret
200 ; RV64-LABEL: vpscatter_v2i32_truncstore_v2i16:
201 ; RV64:       # %bb.0:
202 ; RV64-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
203 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
204 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
205 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
206 ; RV64-NEXT:    ret
207   %tval = trunc <2 x i32> %val to <2 x i16>
208   call void @llvm.vp.scatter.v2i16.v2p0(<2 x i16> %tval, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
209   ret void
212 define void @vpscatter_v2i64_truncstore_v2i16(<2 x i64> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
213 ; RV32-LABEL: vpscatter_v2i64_truncstore_v2i16:
214 ; RV32:       # %bb.0:
215 ; RV32-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
216 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
217 ; RV32-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
218 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
219 ; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
220 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
221 ; RV32-NEXT:    ret
223 ; RV64-LABEL: vpscatter_v2i64_truncstore_v2i16:
224 ; RV64:       # %bb.0:
225 ; RV64-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
226 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
227 ; RV64-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
228 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
229 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
230 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
231 ; RV64-NEXT:    ret
232   %tval = trunc <2 x i64> %val to <2 x i16>
233   call void @llvm.vp.scatter.v2i16.v2p0(<2 x i16> %tval, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
234   ret void
237 declare void @llvm.vp.scatter.v3i16.v3p0(<3 x i16>, <3 x ptr>, <3 x i1>, i32)
239 define void @vpscatter_v3i16(<3 x i16> %val, <3 x ptr> %ptrs, <3 x i1> %m, i32 zeroext %evl) {
240 ; RV32-LABEL: vpscatter_v3i16:
241 ; RV32:       # %bb.0:
242 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
243 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
244 ; RV32-NEXT:    ret
246 ; RV64-LABEL: vpscatter_v3i16:
247 ; RV64:       # %bb.0:
248 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
249 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
250 ; RV64-NEXT:    ret
251   call void @llvm.vp.scatter.v3i16.v3p0(<3 x i16> %val, <3 x ptr> %ptrs, <3 x i1> %m, i32 %evl)
252   ret void
255 define void @vpscatter_truemask_v3i16(<3 x i16> %val, <3 x ptr> %ptrs, i32 zeroext %evl) {
256 ; RV32-LABEL: vpscatter_truemask_v3i16:
257 ; RV32:       # %bb.0:
258 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
259 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9
260 ; RV32-NEXT:    ret
262 ; RV64-LABEL: vpscatter_truemask_v3i16:
263 ; RV64:       # %bb.0:
264 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
265 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
266 ; RV64-NEXT:    ret
267   call void @llvm.vp.scatter.v3i16.v3p0(<3 x i16> %val, <3 x ptr> %ptrs, <3 x i1> splat (i1 1), i32 %evl)
268   ret void
271 declare void @llvm.vp.scatter.v4i16.v4p0(<4 x i16>, <4 x ptr>, <4 x i1>, i32)
273 define void @vpscatter_v4i16(<4 x i16> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 zeroext %evl) {
274 ; RV32-LABEL: vpscatter_v4i16:
275 ; RV32:       # %bb.0:
276 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
277 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
278 ; RV32-NEXT:    ret
280 ; RV64-LABEL: vpscatter_v4i16:
281 ; RV64:       # %bb.0:
282 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
283 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
284 ; RV64-NEXT:    ret
285   call void @llvm.vp.scatter.v4i16.v4p0(<4 x i16> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 %evl)
286   ret void
289 define void @vpscatter_truemask_v4i16(<4 x i16> %val, <4 x ptr> %ptrs, i32 zeroext %evl) {
290 ; RV32-LABEL: vpscatter_truemask_v4i16:
291 ; RV32:       # %bb.0:
292 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
293 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9
294 ; RV32-NEXT:    ret
296 ; RV64-LABEL: vpscatter_truemask_v4i16:
297 ; RV64:       # %bb.0:
298 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
299 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
300 ; RV64-NEXT:    ret
301   call void @llvm.vp.scatter.v4i16.v4p0(<4 x i16> %val, <4 x ptr> %ptrs, <4 x i1> splat (i1 1), i32 %evl)
302   ret void
305 declare void @llvm.vp.scatter.v8i16.v8p0(<8 x i16>, <8 x ptr>, <8 x i1>, i32)
307 define void @vpscatter_v8i16(<8 x i16> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 zeroext %evl) {
308 ; RV32-LABEL: vpscatter_v8i16:
309 ; RV32:       # %bb.0:
310 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
311 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
312 ; RV32-NEXT:    ret
314 ; RV64-LABEL: vpscatter_v8i16:
315 ; RV64:       # %bb.0:
316 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
317 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
318 ; RV64-NEXT:    ret
319   call void @llvm.vp.scatter.v8i16.v8p0(<8 x i16> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
320   ret void
323 define void @vpscatter_baseidx_v8i8_v8i16(<8 x i16> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
324 ; RV32-LABEL: vpscatter_baseidx_v8i8_v8i16:
325 ; RV32:       # %bb.0:
326 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
327 ; RV32-NEXT:    vsext.vf4 v10, v9
328 ; RV32-NEXT:    vadd.vv v10, v10, v10
329 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
330 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
331 ; RV32-NEXT:    ret
333 ; RV64-LABEL: vpscatter_baseidx_v8i8_v8i16:
334 ; RV64:       # %bb.0:
335 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
336 ; RV64-NEXT:    vsext.vf8 v12, v9
337 ; RV64-NEXT:    vadd.vv v12, v12, v12
338 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
339 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
340 ; RV64-NEXT:    ret
341   %ptrs = getelementptr inbounds i16, ptr %base, <8 x i8> %idxs
342   call void @llvm.vp.scatter.v8i16.v8p0(<8 x i16> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
343   ret void
346 define void @vpscatter_baseidx_sext_v8i8_v8i16(<8 x i16> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
347 ; RV32-LABEL: vpscatter_baseidx_sext_v8i8_v8i16:
348 ; RV32:       # %bb.0:
349 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
350 ; RV32-NEXT:    vsext.vf4 v10, v9
351 ; RV32-NEXT:    vadd.vv v10, v10, v10
352 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
353 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
354 ; RV32-NEXT:    ret
356 ; RV64-LABEL: vpscatter_baseidx_sext_v8i8_v8i16:
357 ; RV64:       # %bb.0:
358 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
359 ; RV64-NEXT:    vsext.vf8 v12, v9
360 ; RV64-NEXT:    vadd.vv v12, v12, v12
361 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
362 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
363 ; RV64-NEXT:    ret
364   %eidxs = sext <8 x i8> %idxs to <8 x i16>
365   %ptrs = getelementptr inbounds i16, ptr %base, <8 x i16> %eidxs
366   call void @llvm.vp.scatter.v8i16.v8p0(<8 x i16> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
367   ret void
370 define void @vpscatter_baseidx_zext_v8i8_v8i16(<8 x i16> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
371 ; RV32-LABEL: vpscatter_baseidx_zext_v8i8_v8i16:
372 ; RV32:       # %bb.0:
373 ; RV32-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
374 ; RV32-NEXT:    vwaddu.vv v10, v9, v9
375 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
376 ; RV32-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
377 ; RV32-NEXT:    ret
379 ; RV64-LABEL: vpscatter_baseidx_zext_v8i8_v8i16:
380 ; RV64:       # %bb.0:
381 ; RV64-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
382 ; RV64-NEXT:    vwaddu.vv v10, v9, v9
383 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
384 ; RV64-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
385 ; RV64-NEXT:    ret
386   %eidxs = zext <8 x i8> %idxs to <8 x i16>
387   %ptrs = getelementptr inbounds i16, ptr %base, <8 x i16> %eidxs
388   call void @llvm.vp.scatter.v8i16.v8p0(<8 x i16> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
389   ret void
392 define void @vpscatter_baseidx_v8i16(<8 x i16> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
393 ; RV32-LABEL: vpscatter_baseidx_v8i16:
394 ; RV32:       # %bb.0:
395 ; RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
396 ; RV32-NEXT:    vwadd.vv v10, v9, v9
397 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
398 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
399 ; RV32-NEXT:    ret
401 ; RV64-LABEL: vpscatter_baseidx_v8i16:
402 ; RV64:       # %bb.0:
403 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
404 ; RV64-NEXT:    vsext.vf4 v12, v9
405 ; RV64-NEXT:    vadd.vv v12, v12, v12
406 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
407 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
408 ; RV64-NEXT:    ret
409   %ptrs = getelementptr inbounds i16, ptr %base, <8 x i16> %idxs
410   call void @llvm.vp.scatter.v8i16.v8p0(<8 x i16> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
411   ret void
414 declare void @llvm.vp.scatter.v2i32.v2p0(<2 x i32>, <2 x ptr>, <2 x i1>, i32)
416 define void @vpscatter_v2i32(<2 x i32> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
417 ; RV32-LABEL: vpscatter_v2i32:
418 ; RV32:       # %bb.0:
419 ; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
420 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
421 ; RV32-NEXT:    ret
423 ; RV64-LABEL: vpscatter_v2i32:
424 ; RV64:       # %bb.0:
425 ; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
426 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
427 ; RV64-NEXT:    ret
428   call void @llvm.vp.scatter.v2i32.v2p0(<2 x i32> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
429   ret void
432 define void @vpscatter_v2i64_truncstore_v2i32(<2 x i64> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
433 ; RV32-LABEL: vpscatter_v2i64_truncstore_v2i32:
434 ; RV32:       # %bb.0:
435 ; RV32-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
436 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
437 ; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
438 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
439 ; RV32-NEXT:    ret
441 ; RV64-LABEL: vpscatter_v2i64_truncstore_v2i32:
442 ; RV64:       # %bb.0:
443 ; RV64-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
444 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
445 ; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
446 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
447 ; RV64-NEXT:    ret
448   %tval = trunc <2 x i64> %val to <2 x i32>
449   call void @llvm.vp.scatter.v2i32.v2p0(<2 x i32> %tval, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
450   ret void
453 declare void @llvm.vp.scatter.v4i32.v4p0(<4 x i32>, <4 x ptr>, <4 x i1>, i32)
455 define void @vpscatter_v4i32(<4 x i32> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 zeroext %evl) {
456 ; RV32-LABEL: vpscatter_v4i32:
457 ; RV32:       # %bb.0:
458 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
459 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
460 ; RV32-NEXT:    ret
462 ; RV64-LABEL: vpscatter_v4i32:
463 ; RV64:       # %bb.0:
464 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
465 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
466 ; RV64-NEXT:    ret
467   call void @llvm.vp.scatter.v4i32.v4p0(<4 x i32> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 %evl)
468   ret void
471 define void @vpscatter_truemask_v4i32(<4 x i32> %val, <4 x ptr> %ptrs, i32 zeroext %evl) {
472 ; RV32-LABEL: vpscatter_truemask_v4i32:
473 ; RV32:       # %bb.0:
474 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
475 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9
476 ; RV32-NEXT:    ret
478 ; RV64-LABEL: vpscatter_truemask_v4i32:
479 ; RV64:       # %bb.0:
480 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
481 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
482 ; RV64-NEXT:    ret
483   call void @llvm.vp.scatter.v4i32.v4p0(<4 x i32> %val, <4 x ptr> %ptrs, <4 x i1> splat (i1 1), i32 %evl)
484   ret void
487 declare void @llvm.vp.scatter.v8i32.v8p0(<8 x i32>, <8 x ptr>, <8 x i1>, i32)
489 define void @vpscatter_v8i32(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 zeroext %evl) {
490 ; RV32-LABEL: vpscatter_v8i32:
491 ; RV32:       # %bb.0:
492 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
493 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
494 ; RV32-NEXT:    ret
496 ; RV64-LABEL: vpscatter_v8i32:
497 ; RV64:       # %bb.0:
498 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
499 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
500 ; RV64-NEXT:    ret
501   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
502   ret void
505 define void @vpscatter_baseidx_v8i8_v8i32(<8 x i32> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
506 ; RV32-LABEL: vpscatter_baseidx_v8i8_v8i32:
507 ; RV32:       # %bb.0:
508 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
509 ; RV32-NEXT:    vsext.vf4 v12, v10
510 ; RV32-NEXT:    vsll.vi v10, v12, 2
511 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
512 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
513 ; RV32-NEXT:    ret
515 ; RV64-LABEL: vpscatter_baseidx_v8i8_v8i32:
516 ; RV64:       # %bb.0:
517 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
518 ; RV64-NEXT:    vsext.vf8 v12, v10
519 ; RV64-NEXT:    vsll.vi v12, v12, 2
520 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
521 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
522 ; RV64-NEXT:    ret
523   %ptrs = getelementptr inbounds i32, ptr %base, <8 x i8> %idxs
524   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
525   ret void
528 define void @vpscatter_baseidx_sext_v8i8_v8i32(<8 x i32> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
529 ; RV32-LABEL: vpscatter_baseidx_sext_v8i8_v8i32:
530 ; RV32:       # %bb.0:
531 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
532 ; RV32-NEXT:    vsext.vf4 v12, v10
533 ; RV32-NEXT:    vsll.vi v10, v12, 2
534 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
535 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
536 ; RV32-NEXT:    ret
538 ; RV64-LABEL: vpscatter_baseidx_sext_v8i8_v8i32:
539 ; RV64:       # %bb.0:
540 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
541 ; RV64-NEXT:    vsext.vf8 v12, v10
542 ; RV64-NEXT:    vsll.vi v12, v12, 2
543 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
544 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
545 ; RV64-NEXT:    ret
546   %eidxs = sext <8 x i8> %idxs to <8 x i32>
547   %ptrs = getelementptr inbounds i32, ptr %base, <8 x i32> %eidxs
548   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
549   ret void
552 define void @vpscatter_baseidx_zext_v8i8_v8i32(<8 x i32> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
553 ; RV32-LABEL: vpscatter_baseidx_zext_v8i8_v8i32:
554 ; RV32:       # %bb.0:
555 ; RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
556 ; RV32-NEXT:    vzext.vf2 v11, v10
557 ; RV32-NEXT:    vsll.vi v10, v11, 2
558 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
559 ; RV32-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
560 ; RV32-NEXT:    ret
562 ; RV64-LABEL: vpscatter_baseidx_zext_v8i8_v8i32:
563 ; RV64:       # %bb.0:
564 ; RV64-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
565 ; RV64-NEXT:    vzext.vf2 v11, v10
566 ; RV64-NEXT:    vsll.vi v10, v11, 2
567 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
568 ; RV64-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
569 ; RV64-NEXT:    ret
570   %eidxs = zext <8 x i8> %idxs to <8 x i32>
571   %ptrs = getelementptr inbounds i32, ptr %base, <8 x i32> %eidxs
572   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
573   ret void
576 define void @vpscatter_baseidx_v8i16_v8i32(<8 x i32> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
577 ; RV32-LABEL: vpscatter_baseidx_v8i16_v8i32:
578 ; RV32:       # %bb.0:
579 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
580 ; RV32-NEXT:    vsext.vf2 v12, v10
581 ; RV32-NEXT:    vsll.vi v10, v12, 2
582 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
583 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
584 ; RV32-NEXT:    ret
586 ; RV64-LABEL: vpscatter_baseidx_v8i16_v8i32:
587 ; RV64:       # %bb.0:
588 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
589 ; RV64-NEXT:    vsext.vf4 v12, v10
590 ; RV64-NEXT:    vsll.vi v12, v12, 2
591 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
592 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
593 ; RV64-NEXT:    ret
594   %ptrs = getelementptr inbounds i32, ptr %base, <8 x i16> %idxs
595   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
596   ret void
599 define void @vpscatter_baseidx_sext_v8i16_v8i32(<8 x i32> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
600 ; RV32-LABEL: vpscatter_baseidx_sext_v8i16_v8i32:
601 ; RV32:       # %bb.0:
602 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
603 ; RV32-NEXT:    vsext.vf2 v12, v10
604 ; RV32-NEXT:    vsll.vi v10, v12, 2
605 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
606 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
607 ; RV32-NEXT:    ret
609 ; RV64-LABEL: vpscatter_baseidx_sext_v8i16_v8i32:
610 ; RV64:       # %bb.0:
611 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
612 ; RV64-NEXT:    vsext.vf4 v12, v10
613 ; RV64-NEXT:    vsll.vi v12, v12, 2
614 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
615 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
616 ; RV64-NEXT:    ret
617   %eidxs = sext <8 x i16> %idxs to <8 x i32>
618   %ptrs = getelementptr inbounds i32, ptr %base, <8 x i32> %eidxs
619   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
620   ret void
623 define void @vpscatter_baseidx_zext_v8i16_v8i32(<8 x i32> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
624 ; RV32-LABEL: vpscatter_baseidx_zext_v8i16_v8i32:
625 ; RV32:       # %bb.0:
626 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
627 ; RV32-NEXT:    vzext.vf2 v12, v10
628 ; RV32-NEXT:    vsll.vi v10, v12, 2
629 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
630 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
631 ; RV32-NEXT:    ret
633 ; RV64-LABEL: vpscatter_baseidx_zext_v8i16_v8i32:
634 ; RV64:       # %bb.0:
635 ; RV64-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
636 ; RV64-NEXT:    vzext.vf2 v12, v10
637 ; RV64-NEXT:    vsll.vi v10, v12, 2
638 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
639 ; RV64-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
640 ; RV64-NEXT:    ret
641   %eidxs = zext <8 x i16> %idxs to <8 x i32>
642   %ptrs = getelementptr inbounds i32, ptr %base, <8 x i32> %eidxs
643   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
644   ret void
647 define void @vpscatter_baseidx_v8i32(<8 x i32> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
648 ; RV32-LABEL: vpscatter_baseidx_v8i32:
649 ; RV32:       # %bb.0:
650 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
651 ; RV32-NEXT:    vsll.vi v10, v10, 2
652 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
653 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
654 ; RV32-NEXT:    ret
656 ; RV64-LABEL: vpscatter_baseidx_v8i32:
657 ; RV64:       # %bb.0:
658 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
659 ; RV64-NEXT:    vsext.vf2 v12, v10
660 ; RV64-NEXT:    vsll.vi v12, v12, 2
661 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
662 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
663 ; RV64-NEXT:    ret
664   %ptrs = getelementptr inbounds i32, ptr %base, <8 x i32> %idxs
665   call void @llvm.vp.scatter.v8i32.v8p0(<8 x i32> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
666   ret void
669 declare void @llvm.vp.scatter.v2i64.v2p0(<2 x i64>, <2 x ptr>, <2 x i1>, i32)
671 define void @vpscatter_v2i64(<2 x i64> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
672 ; RV32-LABEL: vpscatter_v2i64:
673 ; RV32:       # %bb.0:
674 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
675 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
676 ; RV32-NEXT:    ret
678 ; RV64-LABEL: vpscatter_v2i64:
679 ; RV64:       # %bb.0:
680 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
681 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
682 ; RV64-NEXT:    ret
683   call void @llvm.vp.scatter.v2i64.v2p0(<2 x i64> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
684   ret void
687 declare void @llvm.vp.scatter.v4i64.v4p0(<4 x i64>, <4 x ptr>, <4 x i1>, i32)
689 define void @vpscatter_v4i64(<4 x i64> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 zeroext %evl) {
690 ; RV32-LABEL: vpscatter_v4i64:
691 ; RV32:       # %bb.0:
692 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
693 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
694 ; RV32-NEXT:    ret
696 ; RV64-LABEL: vpscatter_v4i64:
697 ; RV64:       # %bb.0:
698 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
699 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
700 ; RV64-NEXT:    ret
701   call void @llvm.vp.scatter.v4i64.v4p0(<4 x i64> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 %evl)
702   ret void
705 define void @vpscatter_truemask_v4i64(<4 x i64> %val, <4 x ptr> %ptrs, i32 zeroext %evl) {
706 ; RV32-LABEL: vpscatter_truemask_v4i64:
707 ; RV32:       # %bb.0:
708 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
709 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
710 ; RV32-NEXT:    ret
712 ; RV64-LABEL: vpscatter_truemask_v4i64:
713 ; RV64:       # %bb.0:
714 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
715 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
716 ; RV64-NEXT:    ret
717   call void @llvm.vp.scatter.v4i64.v4p0(<4 x i64> %val, <4 x ptr> %ptrs, <4 x i1> splat (i1 1), i32 %evl)
718   ret void
721 declare void @llvm.vp.scatter.v8i64.v8p0(<8 x i64>, <8 x ptr>, <8 x i1>, i32)
723 define void @vpscatter_v8i64(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 zeroext %evl) {
724 ; RV32-LABEL: vpscatter_v8i64:
725 ; RV32:       # %bb.0:
726 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
727 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
728 ; RV32-NEXT:    ret
730 ; RV64-LABEL: vpscatter_v8i64:
731 ; RV64:       # %bb.0:
732 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
733 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
734 ; RV64-NEXT:    ret
735   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
736   ret void
739 define void @vpscatter_baseidx_v8i8_v8i64(<8 x i64> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
740 ; RV32-LABEL: vpscatter_baseidx_v8i8_v8i64:
741 ; RV32:       # %bb.0:
742 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
743 ; RV32-NEXT:    vsext.vf4 v14, v12
744 ; RV32-NEXT:    vsll.vi v12, v14, 3
745 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
746 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
747 ; RV32-NEXT:    ret
749 ; RV64-LABEL: vpscatter_baseidx_v8i8_v8i64:
750 ; RV64:       # %bb.0:
751 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
752 ; RV64-NEXT:    vsext.vf8 v16, v12
753 ; RV64-NEXT:    vsll.vi v12, v16, 3
754 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
755 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
756 ; RV64-NEXT:    ret
757   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i8> %idxs
758   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
759   ret void
762 define void @vpscatter_baseidx_sext_v8i8_v8i64(<8 x i64> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
763 ; RV32-LABEL: vpscatter_baseidx_sext_v8i8_v8i64:
764 ; RV32:       # %bb.0:
765 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
766 ; RV32-NEXT:    vsext.vf4 v14, v12
767 ; RV32-NEXT:    vsll.vi v12, v14, 3
768 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
769 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
770 ; RV32-NEXT:    ret
772 ; RV64-LABEL: vpscatter_baseidx_sext_v8i8_v8i64:
773 ; RV64:       # %bb.0:
774 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
775 ; RV64-NEXT:    vsext.vf8 v16, v12
776 ; RV64-NEXT:    vsll.vi v12, v16, 3
777 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
778 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
779 ; RV64-NEXT:    ret
780   %eidxs = sext <8 x i8> %idxs to <8 x i64>
781   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i64> %eidxs
782   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
783   ret void
786 define void @vpscatter_baseidx_zext_v8i8_v8i64(<8 x i64> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
787 ; RV32-LABEL: vpscatter_baseidx_zext_v8i8_v8i64:
788 ; RV32:       # %bb.0:
789 ; RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
790 ; RV32-NEXT:    vzext.vf2 v13, v12
791 ; RV32-NEXT:    vsll.vi v12, v13, 3
792 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
793 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
794 ; RV32-NEXT:    ret
796 ; RV64-LABEL: vpscatter_baseidx_zext_v8i8_v8i64:
797 ; RV64:       # %bb.0:
798 ; RV64-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
799 ; RV64-NEXT:    vzext.vf2 v13, v12
800 ; RV64-NEXT:    vsll.vi v12, v13, 3
801 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
802 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
803 ; RV64-NEXT:    ret
804   %eidxs = zext <8 x i8> %idxs to <8 x i64>
805   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i64> %eidxs
806   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
807   ret void
810 define void @vpscatter_baseidx_v8i16_v8i64(<8 x i64> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
811 ; RV32-LABEL: vpscatter_baseidx_v8i16_v8i64:
812 ; RV32:       # %bb.0:
813 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
814 ; RV32-NEXT:    vsext.vf2 v14, v12
815 ; RV32-NEXT:    vsll.vi v12, v14, 3
816 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
817 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
818 ; RV32-NEXT:    ret
820 ; RV64-LABEL: vpscatter_baseidx_v8i16_v8i64:
821 ; RV64:       # %bb.0:
822 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
823 ; RV64-NEXT:    vsext.vf4 v16, v12
824 ; RV64-NEXT:    vsll.vi v12, v16, 3
825 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
826 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
827 ; RV64-NEXT:    ret
828   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i16> %idxs
829   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
830   ret void
833 define void @vpscatter_baseidx_sext_v8i16_v8i64(<8 x i64> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
834 ; RV32-LABEL: vpscatter_baseidx_sext_v8i16_v8i64:
835 ; RV32:       # %bb.0:
836 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
837 ; RV32-NEXT:    vsext.vf2 v14, v12
838 ; RV32-NEXT:    vsll.vi v12, v14, 3
839 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
840 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
841 ; RV32-NEXT:    ret
843 ; RV64-LABEL: vpscatter_baseidx_sext_v8i16_v8i64:
844 ; RV64:       # %bb.0:
845 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
846 ; RV64-NEXT:    vsext.vf4 v16, v12
847 ; RV64-NEXT:    vsll.vi v12, v16, 3
848 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
849 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
850 ; RV64-NEXT:    ret
851   %eidxs = sext <8 x i16> %idxs to <8 x i64>
852   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i64> %eidxs
853   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
854   ret void
857 define void @vpscatter_baseidx_zext_v8i16_v8i64(<8 x i64> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
858 ; RV32-LABEL: vpscatter_baseidx_zext_v8i16_v8i64:
859 ; RV32:       # %bb.0:
860 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
861 ; RV32-NEXT:    vzext.vf2 v14, v12
862 ; RV32-NEXT:    vsll.vi v12, v14, 3
863 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
864 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
865 ; RV32-NEXT:    ret
867 ; RV64-LABEL: vpscatter_baseidx_zext_v8i16_v8i64:
868 ; RV64:       # %bb.0:
869 ; RV64-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
870 ; RV64-NEXT:    vzext.vf2 v14, v12
871 ; RV64-NEXT:    vsll.vi v12, v14, 3
872 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
873 ; RV64-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
874 ; RV64-NEXT:    ret
875   %eidxs = zext <8 x i16> %idxs to <8 x i64>
876   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i64> %eidxs
877   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
878   ret void
881 define void @vpscatter_baseidx_v8i32_v8i64(<8 x i64> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
882 ; RV32-LABEL: vpscatter_baseidx_v8i32_v8i64:
883 ; RV32:       # %bb.0:
884 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
885 ; RV32-NEXT:    vsll.vi v12, v12, 3
886 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
887 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
888 ; RV32-NEXT:    ret
890 ; RV64-LABEL: vpscatter_baseidx_v8i32_v8i64:
891 ; RV64:       # %bb.0:
892 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
893 ; RV64-NEXT:    vsext.vf2 v16, v12
894 ; RV64-NEXT:    vsll.vi v12, v16, 3
895 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
896 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
897 ; RV64-NEXT:    ret
898   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i32> %idxs
899   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
900   ret void
903 define void @vpscatter_baseidx_sext_v8i32_v8i64(<8 x i64> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
904 ; RV32-LABEL: vpscatter_baseidx_sext_v8i32_v8i64:
905 ; RV32:       # %bb.0:
906 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
907 ; RV32-NEXT:    vsll.vi v12, v12, 3
908 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
909 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
910 ; RV32-NEXT:    ret
912 ; RV64-LABEL: vpscatter_baseidx_sext_v8i32_v8i64:
913 ; RV64:       # %bb.0:
914 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
915 ; RV64-NEXT:    vsext.vf2 v16, v12
916 ; RV64-NEXT:    vsll.vi v12, v16, 3
917 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
918 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
919 ; RV64-NEXT:    ret
920   %eidxs = sext <8 x i32> %idxs to <8 x i64>
921   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i64> %eidxs
922   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
923   ret void
926 define void @vpscatter_baseidx_zext_v8i32_v8i64(<8 x i64> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
927 ; RV32-LABEL: vpscatter_baseidx_zext_v8i32_v8i64:
928 ; RV32:       # %bb.0:
929 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
930 ; RV32-NEXT:    vsll.vi v12, v12, 3
931 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
932 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
933 ; RV32-NEXT:    ret
935 ; RV64-LABEL: vpscatter_baseidx_zext_v8i32_v8i64:
936 ; RV64:       # %bb.0:
937 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
938 ; RV64-NEXT:    vzext.vf2 v16, v12
939 ; RV64-NEXT:    vsll.vi v12, v16, 3
940 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
941 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
942 ; RV64-NEXT:    ret
943   %eidxs = zext <8 x i32> %idxs to <8 x i64>
944   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i64> %eidxs
945   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
946   ret void
949 define void @vpscatter_baseidx_v8i64(<8 x i64> %val, ptr %base, <8 x i64> %idxs, <8 x i1> %m, i32 zeroext %evl) {
950 ; RV32-LABEL: vpscatter_baseidx_v8i64:
951 ; RV32:       # %bb.0:
952 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
953 ; RV32-NEXT:    vnsrl.wi v16, v12, 0
954 ; RV32-NEXT:    vsll.vi v12, v16, 3
955 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
956 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
957 ; RV32-NEXT:    ret
959 ; RV64-LABEL: vpscatter_baseidx_v8i64:
960 ; RV64:       # %bb.0:
961 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
962 ; RV64-NEXT:    vsll.vi v12, v12, 3
963 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
964 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
965 ; RV64-NEXT:    ret
966   %ptrs = getelementptr inbounds i64, ptr %base, <8 x i64> %idxs
967   call void @llvm.vp.scatter.v8i64.v8p0(<8 x i64> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
968   ret void
971 declare void @llvm.vp.scatter.v2f16.v2p0(<2 x half>, <2 x ptr>, <2 x i1>, i32)
973 define void @vpscatter_v2f16(<2 x half> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
974 ; RV32-LABEL: vpscatter_v2f16:
975 ; RV32:       # %bb.0:
976 ; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
977 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
978 ; RV32-NEXT:    ret
980 ; RV64-LABEL: vpscatter_v2f16:
981 ; RV64:       # %bb.0:
982 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
983 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
984 ; RV64-NEXT:    ret
985   call void @llvm.vp.scatter.v2f16.v2p0(<2 x half> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
986   ret void
989 declare void @llvm.vp.scatter.v4f16.v4p0(<4 x half>, <4 x ptr>, <4 x i1>, i32)
991 define void @vpscatter_v4f16(<4 x half> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 zeroext %evl) {
992 ; RV32-LABEL: vpscatter_v4f16:
993 ; RV32:       # %bb.0:
994 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
995 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
996 ; RV32-NEXT:    ret
998 ; RV64-LABEL: vpscatter_v4f16:
999 ; RV64:       # %bb.0:
1000 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1001 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1002 ; RV64-NEXT:    ret
1003   call void @llvm.vp.scatter.v4f16.v4p0(<4 x half> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 %evl)
1004   ret void
1007 define void @vpscatter_truemask_v4f16(<4 x half> %val, <4 x ptr> %ptrs, i32 zeroext %evl) {
1008 ; RV32-LABEL: vpscatter_truemask_v4f16:
1009 ; RV32:       # %bb.0:
1010 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1011 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9
1012 ; RV32-NEXT:    ret
1014 ; RV64-LABEL: vpscatter_truemask_v4f16:
1015 ; RV64:       # %bb.0:
1016 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1017 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
1018 ; RV64-NEXT:    ret
1019   call void @llvm.vp.scatter.v4f16.v4p0(<4 x half> %val, <4 x ptr> %ptrs, <4 x i1> splat (i1 1), i32 %evl)
1020   ret void
1023 declare void @llvm.vp.scatter.v8f16.v8p0(<8 x half>, <8 x ptr>, <8 x i1>, i32)
1025 define void @vpscatter_v8f16(<8 x half> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 zeroext %evl) {
1026 ; RV32-LABEL: vpscatter_v8f16:
1027 ; RV32:       # %bb.0:
1028 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1029 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1030 ; RV32-NEXT:    ret
1032 ; RV64-LABEL: vpscatter_v8f16:
1033 ; RV64:       # %bb.0:
1034 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1035 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1036 ; RV64-NEXT:    ret
1037   call void @llvm.vp.scatter.v8f16.v8p0(<8 x half> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1038   ret void
1041 define void @vpscatter_baseidx_v8i8_v8f16(<8 x half> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1042 ; RV32-LABEL: vpscatter_baseidx_v8i8_v8f16:
1043 ; RV32:       # %bb.0:
1044 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1045 ; RV32-NEXT:    vsext.vf4 v10, v9
1046 ; RV32-NEXT:    vadd.vv v10, v10, v10
1047 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1048 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1049 ; RV32-NEXT:    ret
1051 ; RV64-LABEL: vpscatter_baseidx_v8i8_v8f16:
1052 ; RV64:       # %bb.0:
1053 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1054 ; RV64-NEXT:    vsext.vf8 v12, v9
1055 ; RV64-NEXT:    vadd.vv v12, v12, v12
1056 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1057 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1058 ; RV64-NEXT:    ret
1059   %ptrs = getelementptr inbounds half, ptr %base, <8 x i8> %idxs
1060   call void @llvm.vp.scatter.v8f16.v8p0(<8 x half> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1061   ret void
1064 define void @vpscatter_baseidx_sext_v8i8_v8f16(<8 x half> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1065 ; RV32-LABEL: vpscatter_baseidx_sext_v8i8_v8f16:
1066 ; RV32:       # %bb.0:
1067 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1068 ; RV32-NEXT:    vsext.vf4 v10, v9
1069 ; RV32-NEXT:    vadd.vv v10, v10, v10
1070 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1071 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1072 ; RV32-NEXT:    ret
1074 ; RV64-LABEL: vpscatter_baseidx_sext_v8i8_v8f16:
1075 ; RV64:       # %bb.0:
1076 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1077 ; RV64-NEXT:    vsext.vf8 v12, v9
1078 ; RV64-NEXT:    vadd.vv v12, v12, v12
1079 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1080 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1081 ; RV64-NEXT:    ret
1082   %eidxs = sext <8 x i8> %idxs to <8 x i16>
1083   %ptrs = getelementptr inbounds half, ptr %base, <8 x i16> %eidxs
1084   call void @llvm.vp.scatter.v8f16.v8p0(<8 x half> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1085   ret void
1088 define void @vpscatter_baseidx_zext_v8i8_v8f16(<8 x half> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1089 ; RV32-LABEL: vpscatter_baseidx_zext_v8i8_v8f16:
1090 ; RV32:       # %bb.0:
1091 ; RV32-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
1092 ; RV32-NEXT:    vwaddu.vv v10, v9, v9
1093 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1094 ; RV32-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
1095 ; RV32-NEXT:    ret
1097 ; RV64-LABEL: vpscatter_baseidx_zext_v8i8_v8f16:
1098 ; RV64:       # %bb.0:
1099 ; RV64-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
1100 ; RV64-NEXT:    vwaddu.vv v10, v9, v9
1101 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1102 ; RV64-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
1103 ; RV64-NEXT:    ret
1104   %eidxs = zext <8 x i8> %idxs to <8 x i16>
1105   %ptrs = getelementptr inbounds half, ptr %base, <8 x i16> %eidxs
1106   call void @llvm.vp.scatter.v8f16.v8p0(<8 x half> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1107   ret void
1110 define void @vpscatter_baseidx_v8f16(<8 x half> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1111 ; RV32-LABEL: vpscatter_baseidx_v8f16:
1112 ; RV32:       # %bb.0:
1113 ; RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
1114 ; RV32-NEXT:    vwadd.vv v10, v9, v9
1115 ; RV32-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1116 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1117 ; RV32-NEXT:    ret
1119 ; RV64-LABEL: vpscatter_baseidx_v8f16:
1120 ; RV64:       # %bb.0:
1121 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1122 ; RV64-NEXT:    vsext.vf4 v12, v9
1123 ; RV64-NEXT:    vadd.vv v12, v12, v12
1124 ; RV64-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
1125 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1126 ; RV64-NEXT:    ret
1127   %ptrs = getelementptr inbounds half, ptr %base, <8 x i16> %idxs
1128   call void @llvm.vp.scatter.v8f16.v8p0(<8 x half> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1129   ret void
1132 declare void @llvm.vp.scatter.v2f32.v2p0(<2 x float>, <2 x ptr>, <2 x i1>, i32)
1134 define void @vpscatter_v2f32(<2 x float> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
1135 ; RV32-LABEL: vpscatter_v2f32:
1136 ; RV32:       # %bb.0:
1137 ; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1138 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1139 ; RV32-NEXT:    ret
1141 ; RV64-LABEL: vpscatter_v2f32:
1142 ; RV64:       # %bb.0:
1143 ; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1144 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1145 ; RV64-NEXT:    ret
1146   call void @llvm.vp.scatter.v2f32.v2p0(<2 x float> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
1147   ret void
1150 declare void @llvm.vp.scatter.v4f32.v4p0(<4 x float>, <4 x ptr>, <4 x i1>, i32)
1152 define void @vpscatter_v4f32(<4 x float> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 zeroext %evl) {
1153 ; RV32-LABEL: vpscatter_v4f32:
1154 ; RV32:       # %bb.0:
1155 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1156 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1157 ; RV32-NEXT:    ret
1159 ; RV64-LABEL: vpscatter_v4f32:
1160 ; RV64:       # %bb.0:
1161 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1162 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1163 ; RV64-NEXT:    ret
1164   call void @llvm.vp.scatter.v4f32.v4p0(<4 x float> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 %evl)
1165   ret void
1168 define void @vpscatter_truemask_v4f32(<4 x float> %val, <4 x ptr> %ptrs, i32 zeroext %evl) {
1169 ; RV32-LABEL: vpscatter_truemask_v4f32:
1170 ; RV32:       # %bb.0:
1171 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1172 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9
1173 ; RV32-NEXT:    ret
1175 ; RV64-LABEL: vpscatter_truemask_v4f32:
1176 ; RV64:       # %bb.0:
1177 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1178 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
1179 ; RV64-NEXT:    ret
1180   call void @llvm.vp.scatter.v4f32.v4p0(<4 x float> %val, <4 x ptr> %ptrs, <4 x i1> splat (i1 1), i32 %evl)
1181   ret void
1184 declare void @llvm.vp.scatter.v8f32.v8p0(<8 x float>, <8 x ptr>, <8 x i1>, i32)
1186 define void @vpscatter_v8f32(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 zeroext %evl) {
1187 ; RV32-LABEL: vpscatter_v8f32:
1188 ; RV32:       # %bb.0:
1189 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1190 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1191 ; RV32-NEXT:    ret
1193 ; RV64-LABEL: vpscatter_v8f32:
1194 ; RV64:       # %bb.0:
1195 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1196 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1197 ; RV64-NEXT:    ret
1198   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1199   ret void
1202 define void @vpscatter_baseidx_v8i8_v8f32(<8 x float> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1203 ; RV32-LABEL: vpscatter_baseidx_v8i8_v8f32:
1204 ; RV32:       # %bb.0:
1205 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1206 ; RV32-NEXT:    vsext.vf4 v12, v10
1207 ; RV32-NEXT:    vsll.vi v10, v12, 2
1208 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1209 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1210 ; RV32-NEXT:    ret
1212 ; RV64-LABEL: vpscatter_baseidx_v8i8_v8f32:
1213 ; RV64:       # %bb.0:
1214 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1215 ; RV64-NEXT:    vsext.vf8 v12, v10
1216 ; RV64-NEXT:    vsll.vi v12, v12, 2
1217 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1218 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1219 ; RV64-NEXT:    ret
1220   %ptrs = getelementptr inbounds float, ptr %base, <8 x i8> %idxs
1221   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1222   ret void
1225 define void @vpscatter_baseidx_sext_v8i8_v8f32(<8 x float> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1226 ; RV32-LABEL: vpscatter_baseidx_sext_v8i8_v8f32:
1227 ; RV32:       # %bb.0:
1228 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1229 ; RV32-NEXT:    vsext.vf4 v12, v10
1230 ; RV32-NEXT:    vsll.vi v10, v12, 2
1231 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1232 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1233 ; RV32-NEXT:    ret
1235 ; RV64-LABEL: vpscatter_baseidx_sext_v8i8_v8f32:
1236 ; RV64:       # %bb.0:
1237 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1238 ; RV64-NEXT:    vsext.vf8 v12, v10
1239 ; RV64-NEXT:    vsll.vi v12, v12, 2
1240 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1241 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1242 ; RV64-NEXT:    ret
1243   %eidxs = sext <8 x i8> %idxs to <8 x i32>
1244   %ptrs = getelementptr inbounds float, ptr %base, <8 x i32> %eidxs
1245   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1246   ret void
1249 define void @vpscatter_baseidx_zext_v8i8_v8f32(<8 x float> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1250 ; RV32-LABEL: vpscatter_baseidx_zext_v8i8_v8f32:
1251 ; RV32:       # %bb.0:
1252 ; RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
1253 ; RV32-NEXT:    vzext.vf2 v11, v10
1254 ; RV32-NEXT:    vsll.vi v10, v11, 2
1255 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1256 ; RV32-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
1257 ; RV32-NEXT:    ret
1259 ; RV64-LABEL: vpscatter_baseidx_zext_v8i8_v8f32:
1260 ; RV64:       # %bb.0:
1261 ; RV64-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
1262 ; RV64-NEXT:    vzext.vf2 v11, v10
1263 ; RV64-NEXT:    vsll.vi v10, v11, 2
1264 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1265 ; RV64-NEXT:    vsoxei16.v v8, (a0), v10, v0.t
1266 ; RV64-NEXT:    ret
1267   %eidxs = zext <8 x i8> %idxs to <8 x i32>
1268   %ptrs = getelementptr inbounds float, ptr %base, <8 x i32> %eidxs
1269   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1270   ret void
1273 define void @vpscatter_baseidx_v8i16_v8f32(<8 x float> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1274 ; RV32-LABEL: vpscatter_baseidx_v8i16_v8f32:
1275 ; RV32:       # %bb.0:
1276 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1277 ; RV32-NEXT:    vsext.vf2 v12, v10
1278 ; RV32-NEXT:    vsll.vi v10, v12, 2
1279 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1280 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1281 ; RV32-NEXT:    ret
1283 ; RV64-LABEL: vpscatter_baseidx_v8i16_v8f32:
1284 ; RV64:       # %bb.0:
1285 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1286 ; RV64-NEXT:    vsext.vf4 v12, v10
1287 ; RV64-NEXT:    vsll.vi v12, v12, 2
1288 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1289 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1290 ; RV64-NEXT:    ret
1291   %ptrs = getelementptr inbounds float, ptr %base, <8 x i16> %idxs
1292   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1293   ret void
1296 define void @vpscatter_baseidx_sext_v8i16_v8f32(<8 x float> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1297 ; RV32-LABEL: vpscatter_baseidx_sext_v8i16_v8f32:
1298 ; RV32:       # %bb.0:
1299 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1300 ; RV32-NEXT:    vsext.vf2 v12, v10
1301 ; RV32-NEXT:    vsll.vi v10, v12, 2
1302 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1303 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1304 ; RV32-NEXT:    ret
1306 ; RV64-LABEL: vpscatter_baseidx_sext_v8i16_v8f32:
1307 ; RV64:       # %bb.0:
1308 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1309 ; RV64-NEXT:    vsext.vf4 v12, v10
1310 ; RV64-NEXT:    vsll.vi v12, v12, 2
1311 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1312 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1313 ; RV64-NEXT:    ret
1314   %eidxs = sext <8 x i16> %idxs to <8 x i32>
1315   %ptrs = getelementptr inbounds float, ptr %base, <8 x i32> %eidxs
1316   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1317   ret void
1320 define void @vpscatter_baseidx_zext_v8i16_v8f32(<8 x float> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1321 ; RV32-LABEL: vpscatter_baseidx_zext_v8i16_v8f32:
1322 ; RV32:       # %bb.0:
1323 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1324 ; RV32-NEXT:    vzext.vf2 v12, v10
1325 ; RV32-NEXT:    vsll.vi v10, v12, 2
1326 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1327 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1328 ; RV32-NEXT:    ret
1330 ; RV64-LABEL: vpscatter_baseidx_zext_v8i16_v8f32:
1331 ; RV64:       # %bb.0:
1332 ; RV64-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1333 ; RV64-NEXT:    vzext.vf2 v12, v10
1334 ; RV64-NEXT:    vsll.vi v10, v12, 2
1335 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1336 ; RV64-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1337 ; RV64-NEXT:    ret
1338   %eidxs = zext <8 x i16> %idxs to <8 x i32>
1339   %ptrs = getelementptr inbounds float, ptr %base, <8 x i32> %eidxs
1340   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1341   ret void
1344 define void @vpscatter_baseidx_v8f32(<8 x float> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1345 ; RV32-LABEL: vpscatter_baseidx_v8f32:
1346 ; RV32:       # %bb.0:
1347 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1348 ; RV32-NEXT:    vsll.vi v10, v10, 2
1349 ; RV32-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1350 ; RV32-NEXT:    vsoxei32.v v8, (a0), v10, v0.t
1351 ; RV32-NEXT:    ret
1353 ; RV64-LABEL: vpscatter_baseidx_v8f32:
1354 ; RV64:       # %bb.0:
1355 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1356 ; RV64-NEXT:    vsext.vf2 v12, v10
1357 ; RV64-NEXT:    vsll.vi v12, v12, 2
1358 ; RV64-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
1359 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1360 ; RV64-NEXT:    ret
1361   %ptrs = getelementptr inbounds float, ptr %base, <8 x i32> %idxs
1362   call void @llvm.vp.scatter.v8f32.v8p0(<8 x float> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1363   ret void
1366 declare void @llvm.vp.scatter.v2f64.v2p0(<2 x double>, <2 x ptr>, <2 x i1>, i32)
1368 define void @vpscatter_v2f64(<2 x double> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 zeroext %evl) {
1369 ; RV32-LABEL: vpscatter_v2f64:
1370 ; RV32:       # %bb.0:
1371 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1372 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1373 ; RV32-NEXT:    ret
1375 ; RV64-LABEL: vpscatter_v2f64:
1376 ; RV64:       # %bb.0:
1377 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1378 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1379 ; RV64-NEXT:    ret
1380   call void @llvm.vp.scatter.v2f64.v2p0(<2 x double> %val, <2 x ptr> %ptrs, <2 x i1> %m, i32 %evl)
1381   ret void
1384 declare void @llvm.vp.scatter.v4f64.v4p0(<4 x double>, <4 x ptr>, <4 x i1>, i32)
1386 define void @vpscatter_v4f64(<4 x double> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 zeroext %evl) {
1387 ; RV32-LABEL: vpscatter_v4f64:
1388 ; RV32:       # %bb.0:
1389 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1390 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1391 ; RV32-NEXT:    ret
1393 ; RV64-LABEL: vpscatter_v4f64:
1394 ; RV64:       # %bb.0:
1395 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1396 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1397 ; RV64-NEXT:    ret
1398   call void @llvm.vp.scatter.v4f64.v4p0(<4 x double> %val, <4 x ptr> %ptrs, <4 x i1> %m, i32 %evl)
1399   ret void
1402 define void @vpscatter_truemask_v4f64(<4 x double> %val, <4 x ptr> %ptrs, i32 zeroext %evl) {
1403 ; RV32-LABEL: vpscatter_truemask_v4f64:
1404 ; RV32:       # %bb.0:
1405 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1406 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
1407 ; RV32-NEXT:    ret
1409 ; RV64-LABEL: vpscatter_truemask_v4f64:
1410 ; RV64:       # %bb.0:
1411 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1412 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10
1413 ; RV64-NEXT:    ret
1414   call void @llvm.vp.scatter.v4f64.v4p0(<4 x double> %val, <4 x ptr> %ptrs, <4 x i1> splat (i1 1), i32 %evl)
1415   ret void
1418 declare void @llvm.vp.scatter.v8f64.v8p0(<8 x double>, <8 x ptr>, <8 x i1>, i32)
1420 define void @vpscatter_v8f64(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 zeroext %evl) {
1421 ; RV32-LABEL: vpscatter_v8f64:
1422 ; RV32:       # %bb.0:
1423 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1424 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
1425 ; RV32-NEXT:    ret
1427 ; RV64-LABEL: vpscatter_v8f64:
1428 ; RV64:       # %bb.0:
1429 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1430 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1431 ; RV64-NEXT:    ret
1432   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1433   ret void
1436 define void @vpscatter_baseidx_v8i8_v8f64(<8 x double> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1437 ; RV32-LABEL: vpscatter_baseidx_v8i8_v8f64:
1438 ; RV32:       # %bb.0:
1439 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1440 ; RV32-NEXT:    vsext.vf4 v14, v12
1441 ; RV32-NEXT:    vsll.vi v12, v14, 3
1442 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1443 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1444 ; RV32-NEXT:    ret
1446 ; RV64-LABEL: vpscatter_baseidx_v8i8_v8f64:
1447 ; RV64:       # %bb.0:
1448 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1449 ; RV64-NEXT:    vsext.vf8 v16, v12
1450 ; RV64-NEXT:    vsll.vi v12, v16, 3
1451 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1452 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1453 ; RV64-NEXT:    ret
1454   %ptrs = getelementptr inbounds double, ptr %base, <8 x i8> %idxs
1455   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1456   ret void
1459 define void @vpscatter_baseidx_sext_v8i8_v8f64(<8 x double> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1460 ; RV32-LABEL: vpscatter_baseidx_sext_v8i8_v8f64:
1461 ; RV32:       # %bb.0:
1462 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1463 ; RV32-NEXT:    vsext.vf4 v14, v12
1464 ; RV32-NEXT:    vsll.vi v12, v14, 3
1465 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1466 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1467 ; RV32-NEXT:    ret
1469 ; RV64-LABEL: vpscatter_baseidx_sext_v8i8_v8f64:
1470 ; RV64:       # %bb.0:
1471 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1472 ; RV64-NEXT:    vsext.vf8 v16, v12
1473 ; RV64-NEXT:    vsll.vi v12, v16, 3
1474 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1475 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1476 ; RV64-NEXT:    ret
1477   %eidxs = sext <8 x i8> %idxs to <8 x i64>
1478   %ptrs = getelementptr inbounds double, ptr %base, <8 x i64> %eidxs
1479   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1480   ret void
1483 define void @vpscatter_baseidx_zext_v8i8_v8f64(<8 x double> %val, ptr %base, <8 x i8> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1484 ; RV32-LABEL: vpscatter_baseidx_zext_v8i8_v8f64:
1485 ; RV32:       # %bb.0:
1486 ; RV32-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
1487 ; RV32-NEXT:    vzext.vf2 v13, v12
1488 ; RV32-NEXT:    vsll.vi v12, v13, 3
1489 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1490 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1491 ; RV32-NEXT:    ret
1493 ; RV64-LABEL: vpscatter_baseidx_zext_v8i8_v8f64:
1494 ; RV64:       # %bb.0:
1495 ; RV64-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
1496 ; RV64-NEXT:    vzext.vf2 v13, v12
1497 ; RV64-NEXT:    vsll.vi v12, v13, 3
1498 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1499 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1500 ; RV64-NEXT:    ret
1501   %eidxs = zext <8 x i8> %idxs to <8 x i64>
1502   %ptrs = getelementptr inbounds double, ptr %base, <8 x i64> %eidxs
1503   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1504   ret void
1507 define void @vpscatter_baseidx_v8i16_v8f64(<8 x double> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1508 ; RV32-LABEL: vpscatter_baseidx_v8i16_v8f64:
1509 ; RV32:       # %bb.0:
1510 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1511 ; RV32-NEXT:    vsext.vf2 v14, v12
1512 ; RV32-NEXT:    vsll.vi v12, v14, 3
1513 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1514 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1515 ; RV32-NEXT:    ret
1517 ; RV64-LABEL: vpscatter_baseidx_v8i16_v8f64:
1518 ; RV64:       # %bb.0:
1519 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1520 ; RV64-NEXT:    vsext.vf4 v16, v12
1521 ; RV64-NEXT:    vsll.vi v12, v16, 3
1522 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1523 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1524 ; RV64-NEXT:    ret
1525   %ptrs = getelementptr inbounds double, ptr %base, <8 x i16> %idxs
1526   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1527   ret void
1530 define void @vpscatter_baseidx_sext_v8i16_v8f64(<8 x double> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1531 ; RV32-LABEL: vpscatter_baseidx_sext_v8i16_v8f64:
1532 ; RV32:       # %bb.0:
1533 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1534 ; RV32-NEXT:    vsext.vf2 v14, v12
1535 ; RV32-NEXT:    vsll.vi v12, v14, 3
1536 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1537 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1538 ; RV32-NEXT:    ret
1540 ; RV64-LABEL: vpscatter_baseidx_sext_v8i16_v8f64:
1541 ; RV64:       # %bb.0:
1542 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1543 ; RV64-NEXT:    vsext.vf4 v16, v12
1544 ; RV64-NEXT:    vsll.vi v12, v16, 3
1545 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1546 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1547 ; RV64-NEXT:    ret
1548   %eidxs = sext <8 x i16> %idxs to <8 x i64>
1549   %ptrs = getelementptr inbounds double, ptr %base, <8 x i64> %eidxs
1550   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1551   ret void
1554 define void @vpscatter_baseidx_zext_v8i16_v8f64(<8 x double> %val, ptr %base, <8 x i16> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1555 ; RV32-LABEL: vpscatter_baseidx_zext_v8i16_v8f64:
1556 ; RV32:       # %bb.0:
1557 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1558 ; RV32-NEXT:    vzext.vf2 v14, v12
1559 ; RV32-NEXT:    vsll.vi v12, v14, 3
1560 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1561 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1562 ; RV32-NEXT:    ret
1564 ; RV64-LABEL: vpscatter_baseidx_zext_v8i16_v8f64:
1565 ; RV64:       # %bb.0:
1566 ; RV64-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1567 ; RV64-NEXT:    vzext.vf2 v14, v12
1568 ; RV64-NEXT:    vsll.vi v12, v14, 3
1569 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1570 ; RV64-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1571 ; RV64-NEXT:    ret
1572   %eidxs = zext <8 x i16> %idxs to <8 x i64>
1573   %ptrs = getelementptr inbounds double, ptr %base, <8 x i64> %eidxs
1574   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1575   ret void
1578 define void @vpscatter_baseidx_v8i32_v8f64(<8 x double> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1579 ; RV32-LABEL: vpscatter_baseidx_v8i32_v8f64:
1580 ; RV32:       # %bb.0:
1581 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1582 ; RV32-NEXT:    vsll.vi v12, v12, 3
1583 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1584 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1585 ; RV32-NEXT:    ret
1587 ; RV64-LABEL: vpscatter_baseidx_v8i32_v8f64:
1588 ; RV64:       # %bb.0:
1589 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1590 ; RV64-NEXT:    vsext.vf2 v16, v12
1591 ; RV64-NEXT:    vsll.vi v12, v16, 3
1592 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1593 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1594 ; RV64-NEXT:    ret
1595   %ptrs = getelementptr inbounds double, ptr %base, <8 x i32> %idxs
1596   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1597   ret void
1600 define void @vpscatter_baseidx_sext_v8i32_v8f64(<8 x double> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1601 ; RV32-LABEL: vpscatter_baseidx_sext_v8i32_v8f64:
1602 ; RV32:       # %bb.0:
1603 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1604 ; RV32-NEXT:    vsll.vi v12, v12, 3
1605 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1606 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1607 ; RV32-NEXT:    ret
1609 ; RV64-LABEL: vpscatter_baseidx_sext_v8i32_v8f64:
1610 ; RV64:       # %bb.0:
1611 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1612 ; RV64-NEXT:    vsext.vf2 v16, v12
1613 ; RV64-NEXT:    vsll.vi v12, v16, 3
1614 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1615 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1616 ; RV64-NEXT:    ret
1617   %eidxs = sext <8 x i32> %idxs to <8 x i64>
1618   %ptrs = getelementptr inbounds double, ptr %base, <8 x i64> %eidxs
1619   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1620   ret void
1623 define void @vpscatter_baseidx_zext_v8i32_v8f64(<8 x double> %val, ptr %base, <8 x i32> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1624 ; RV32-LABEL: vpscatter_baseidx_zext_v8i32_v8f64:
1625 ; RV32:       # %bb.0:
1626 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1627 ; RV32-NEXT:    vsll.vi v12, v12, 3
1628 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1629 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1630 ; RV32-NEXT:    ret
1632 ; RV64-LABEL: vpscatter_baseidx_zext_v8i32_v8f64:
1633 ; RV64:       # %bb.0:
1634 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1635 ; RV64-NEXT:    vzext.vf2 v16, v12
1636 ; RV64-NEXT:    vsll.vi v12, v16, 3
1637 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1638 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1639 ; RV64-NEXT:    ret
1640   %eidxs = zext <8 x i32> %idxs to <8 x i64>
1641   %ptrs = getelementptr inbounds double, ptr %base, <8 x i64> %eidxs
1642   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1643   ret void
1646 define void @vpscatter_baseidx_v8f64(<8 x double> %val, ptr %base, <8 x i64> %idxs, <8 x i1> %m, i32 zeroext %evl) {
1647 ; RV32-LABEL: vpscatter_baseidx_v8f64:
1648 ; RV32:       # %bb.0:
1649 ; RV32-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
1650 ; RV32-NEXT:    vnsrl.wi v16, v12, 0
1651 ; RV32-NEXT:    vsll.vi v12, v16, 3
1652 ; RV32-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1653 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1654 ; RV32-NEXT:    ret
1656 ; RV64-LABEL: vpscatter_baseidx_v8f64:
1657 ; RV64:       # %bb.0:
1658 ; RV64-NEXT:    vsetivli zero, 8, e64, m4, ta, ma
1659 ; RV64-NEXT:    vsll.vi v12, v12, 3
1660 ; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
1661 ; RV64-NEXT:    vsoxei64.v v8, (a0), v12, v0.t
1662 ; RV64-NEXT:    ret
1663   %ptrs = getelementptr inbounds double, ptr %base, <8 x i64> %idxs
1664   call void @llvm.vp.scatter.v8f64.v8p0(<8 x double> %val, <8 x ptr> %ptrs, <8 x i1> %m, i32 %evl)
1665   ret void
1668 declare void @llvm.vp.scatter.v32f64.v32p0(<32 x double>, <32 x ptr>, <32 x i1>, i32)
1670 define void @vpscatter_v32f64(<32 x double> %val, <32 x ptr> %ptrs, <32 x i1> %m, i32 zeroext %evl) {
1671 ; RV32-LABEL: vpscatter_v32f64:
1672 ; RV32:       # %bb.0:
1673 ; RV32-NEXT:    li a2, 32
1674 ; RV32-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
1675 ; RV32-NEXT:    vle32.v v24, (a0)
1676 ; RV32-NEXT:    li a2, 16
1677 ; RV32-NEXT:    mv a0, a1
1678 ; RV32-NEXT:    bltu a1, a2, .LBB79_2
1679 ; RV32-NEXT:  # %bb.1:
1680 ; RV32-NEXT:    li a0, 16
1681 ; RV32-NEXT:  .LBB79_2:
1682 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1683 ; RV32-NEXT:    vsoxei32.v v8, (zero), v24, v0.t
1684 ; RV32-NEXT:    addi a0, a1, -16
1685 ; RV32-NEXT:    sltu a1, a1, a0
1686 ; RV32-NEXT:    addi a1, a1, -1
1687 ; RV32-NEXT:    and a0, a1, a0
1688 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1689 ; RV32-NEXT:    vslidedown.vi v0, v0, 2
1690 ; RV32-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
1691 ; RV32-NEXT:    vslidedown.vi v8, v24, 16
1692 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1693 ; RV32-NEXT:    vsoxei32.v v16, (zero), v8, v0.t
1694 ; RV32-NEXT:    ret
1696 ; RV64-LABEL: vpscatter_v32f64:
1697 ; RV64:       # %bb.0:
1698 ; RV64-NEXT:    addi sp, sp, -16
1699 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1700 ; RV64-NEXT:    csrr a1, vlenb
1701 ; RV64-NEXT:    slli a1, a1, 3
1702 ; RV64-NEXT:    sub sp, sp, a1
1703 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
1704 ; RV64-NEXT:    addi a1, a0, 128
1705 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1706 ; RV64-NEXT:    vle64.v v24, (a1)
1707 ; RV64-NEXT:    addi a1, sp, 16
1708 ; RV64-NEXT:    vs8r.v v24, (a1) # Unknown-size Folded Spill
1709 ; RV64-NEXT:    vle64.v v24, (a0)
1710 ; RV64-NEXT:    li a1, 16
1711 ; RV64-NEXT:    mv a0, a2
1712 ; RV64-NEXT:    bltu a2, a1, .LBB79_2
1713 ; RV64-NEXT:  # %bb.1:
1714 ; RV64-NEXT:    li a0, 16
1715 ; RV64-NEXT:  .LBB79_2:
1716 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1717 ; RV64-NEXT:    vsoxei64.v v8, (zero), v24, v0.t
1718 ; RV64-NEXT:    addi a0, a2, -16
1719 ; RV64-NEXT:    sltu a1, a2, a0
1720 ; RV64-NEXT:    addi a1, a1, -1
1721 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1722 ; RV64-NEXT:    vslidedown.vi v0, v0, 2
1723 ; RV64-NEXT:    and a0, a1, a0
1724 ; RV64-NEXT:    addi a1, sp, 16
1725 ; RV64-NEXT:    vl8r.v v8, (a1) # Unknown-size Folded Reload
1726 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1727 ; RV64-NEXT:    vsoxei64.v v16, (zero), v8, v0.t
1728 ; RV64-NEXT:    csrr a0, vlenb
1729 ; RV64-NEXT:    slli a0, a0, 3
1730 ; RV64-NEXT:    add sp, sp, a0
1731 ; RV64-NEXT:    addi sp, sp, 16
1732 ; RV64-NEXT:    ret
1733   call void @llvm.vp.scatter.v32f64.v32p0(<32 x double> %val, <32 x ptr> %ptrs, <32 x i1> %m, i32 %evl)
1734   ret void
1737 define void @vpscatter_baseidx_v32i32_v32f64(<32 x double> %val, ptr %base, <32 x i32> %idxs, <32 x i1> %m, i32 zeroext %evl) {
1738 ; RV32-LABEL: vpscatter_baseidx_v32i32_v32f64:
1739 ; RV32:       # %bb.0:
1740 ; RV32-NEXT:    li a3, 32
1741 ; RV32-NEXT:    vsetvli zero, a3, e32, m8, ta, ma
1742 ; RV32-NEXT:    vle32.v v24, (a1)
1743 ; RV32-NEXT:    li a3, 16
1744 ; RV32-NEXT:    vsll.vi v24, v24, 3
1745 ; RV32-NEXT:    mv a1, a2
1746 ; RV32-NEXT:    bltu a2, a3, .LBB80_2
1747 ; RV32-NEXT:  # %bb.1:
1748 ; RV32-NEXT:    li a1, 16
1749 ; RV32-NEXT:  .LBB80_2:
1750 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1751 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
1752 ; RV32-NEXT:    addi a1, a2, -16
1753 ; RV32-NEXT:    sltu a2, a2, a1
1754 ; RV32-NEXT:    addi a2, a2, -1
1755 ; RV32-NEXT:    and a1, a2, a1
1756 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1757 ; RV32-NEXT:    vslidedown.vi v0, v0, 2
1758 ; RV32-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
1759 ; RV32-NEXT:    vslidedown.vi v8, v24, 16
1760 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1761 ; RV32-NEXT:    vsoxei32.v v16, (a0), v8, v0.t
1762 ; RV32-NEXT:    ret
1764 ; RV64-LABEL: vpscatter_baseidx_v32i32_v32f64:
1765 ; RV64:       # %bb.0:
1766 ; RV64-NEXT:    addi sp, sp, -16
1767 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1768 ; RV64-NEXT:    csrr a3, vlenb
1769 ; RV64-NEXT:    slli a3, a3, 3
1770 ; RV64-NEXT:    sub sp, sp, a3
1771 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
1772 ; RV64-NEXT:    li a3, 32
1773 ; RV64-NEXT:    vsetvli zero, a3, e32, m8, ta, ma
1774 ; RV64-NEXT:    vle32.v v24, (a1)
1775 ; RV64-NEXT:    vmv1r.v v7, v0
1776 ; RV64-NEXT:    addi a1, sp, 16
1777 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
1778 ; RV64-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
1779 ; RV64-NEXT:    vslidedown.vi v16, v24, 16
1780 ; RV64-NEXT:    vmv4r.v v0, v24
1781 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1782 ; RV64-NEXT:    vsext.vf2 v24, v16
1783 ; RV64-NEXT:    vsll.vi v16, v24, 3
1784 ; RV64-NEXT:    vsext.vf2 v24, v0
1785 ; RV64-NEXT:    li a3, 16
1786 ; RV64-NEXT:    vsll.vi v24, v24, 3
1787 ; RV64-NEXT:    mv a1, a2
1788 ; RV64-NEXT:    bltu a2, a3, .LBB80_2
1789 ; RV64-NEXT:  # %bb.1:
1790 ; RV64-NEXT:    li a1, 16
1791 ; RV64-NEXT:  .LBB80_2:
1792 ; RV64-NEXT:    vmv1r.v v0, v7
1793 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1794 ; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t
1795 ; RV64-NEXT:    addi a1, a2, -16
1796 ; RV64-NEXT:    sltu a2, a2, a1
1797 ; RV64-NEXT:    addi a2, a2, -1
1798 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1799 ; RV64-NEXT:    vslidedown.vi v0, v7, 2
1800 ; RV64-NEXT:    and a1, a2, a1
1801 ; RV64-NEXT:    addi a2, sp, 16
1802 ; RV64-NEXT:    vl8r.v v8, (a2) # Unknown-size Folded Reload
1803 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1804 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1805 ; RV64-NEXT:    csrr a0, vlenb
1806 ; RV64-NEXT:    slli a0, a0, 3
1807 ; RV64-NEXT:    add sp, sp, a0
1808 ; RV64-NEXT:    addi sp, sp, 16
1809 ; RV64-NEXT:    ret
1810   %ptrs = getelementptr inbounds double, ptr %base, <32 x i32> %idxs
1811   call void @llvm.vp.scatter.v32f64.v32p0(<32 x double> %val, <32 x ptr> %ptrs, <32 x i1> %m, i32 %evl)
1812   ret void
1815 define void @vpscatter_baseidx_sext_v32i32_v32f64(<32 x double> %val, ptr %base, <32 x i32> %idxs, <32 x i1> %m, i32 zeroext %evl) {
1816 ; RV32-LABEL: vpscatter_baseidx_sext_v32i32_v32f64:
1817 ; RV32:       # %bb.0:
1818 ; RV32-NEXT:    li a3, 32
1819 ; RV32-NEXT:    vsetvli zero, a3, e32, m8, ta, ma
1820 ; RV32-NEXT:    vle32.v v24, (a1)
1821 ; RV32-NEXT:    li a3, 16
1822 ; RV32-NEXT:    vsll.vi v24, v24, 3
1823 ; RV32-NEXT:    mv a1, a2
1824 ; RV32-NEXT:    bltu a2, a3, .LBB81_2
1825 ; RV32-NEXT:  # %bb.1:
1826 ; RV32-NEXT:    li a1, 16
1827 ; RV32-NEXT:  .LBB81_2:
1828 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1829 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
1830 ; RV32-NEXT:    addi a1, a2, -16
1831 ; RV32-NEXT:    sltu a2, a2, a1
1832 ; RV32-NEXT:    addi a2, a2, -1
1833 ; RV32-NEXT:    and a1, a2, a1
1834 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1835 ; RV32-NEXT:    vslidedown.vi v0, v0, 2
1836 ; RV32-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
1837 ; RV32-NEXT:    vslidedown.vi v8, v24, 16
1838 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1839 ; RV32-NEXT:    vsoxei32.v v16, (a0), v8, v0.t
1840 ; RV32-NEXT:    ret
1842 ; RV64-LABEL: vpscatter_baseidx_sext_v32i32_v32f64:
1843 ; RV64:       # %bb.0:
1844 ; RV64-NEXT:    addi sp, sp, -16
1845 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1846 ; RV64-NEXT:    csrr a3, vlenb
1847 ; RV64-NEXT:    li a4, 10
1848 ; RV64-NEXT:    mul a3, a3, a4
1849 ; RV64-NEXT:    sub sp, sp, a3
1850 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x0a, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 10 * vlenb
1851 ; RV64-NEXT:    li a3, 32
1852 ; RV64-NEXT:    vsetvli zero, a3, e32, m8, ta, ma
1853 ; RV64-NEXT:    vle32.v v24, (a1)
1854 ; RV64-NEXT:    addi a1, sp, 16
1855 ; RV64-NEXT:    vs1r.v v0, (a1) # Unknown-size Folded Spill
1856 ; RV64-NEXT:    csrr a1, vlenb
1857 ; RV64-NEXT:    add a1, sp, a1
1858 ; RV64-NEXT:    addi a1, a1, 16
1859 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
1860 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1861 ; RV64-NEXT:    vsext.vf2 v0, v24
1862 ; RV64-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
1863 ; RV64-NEXT:    vslidedown.vi v24, v24, 16
1864 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1865 ; RV64-NEXT:    vsext.vf2 v16, v24
1866 ; RV64-NEXT:    vsll.vi v16, v16, 3
1867 ; RV64-NEXT:    li a3, 16
1868 ; RV64-NEXT:    vsll.vi v24, v0, 3
1869 ; RV64-NEXT:    mv a1, a2
1870 ; RV64-NEXT:    bltu a2, a3, .LBB81_2
1871 ; RV64-NEXT:  # %bb.1:
1872 ; RV64-NEXT:    li a1, 16
1873 ; RV64-NEXT:  .LBB81_2:
1874 ; RV64-NEXT:    addi a3, sp, 16
1875 ; RV64-NEXT:    vl1r.v v0, (a3) # Unknown-size Folded Reload
1876 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1877 ; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t
1878 ; RV64-NEXT:    addi a1, a2, -16
1879 ; RV64-NEXT:    sltu a2, a2, a1
1880 ; RV64-NEXT:    addi a2, a2, -1
1881 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1882 ; RV64-NEXT:    vslidedown.vi v0, v0, 2
1883 ; RV64-NEXT:    and a1, a2, a1
1884 ; RV64-NEXT:    csrr a2, vlenb
1885 ; RV64-NEXT:    add a2, sp, a2
1886 ; RV64-NEXT:    addi a2, a2, 16
1887 ; RV64-NEXT:    vl8r.v v8, (a2) # Unknown-size Folded Reload
1888 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1889 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1890 ; RV64-NEXT:    csrr a0, vlenb
1891 ; RV64-NEXT:    li a1, 10
1892 ; RV64-NEXT:    mul a0, a0, a1
1893 ; RV64-NEXT:    add sp, sp, a0
1894 ; RV64-NEXT:    addi sp, sp, 16
1895 ; RV64-NEXT:    ret
1896   %eidxs = sext <32 x i32> %idxs to <32 x i64>
1897   %ptrs = getelementptr inbounds double, ptr %base, <32 x i64> %eidxs
1898   call void @llvm.vp.scatter.v32f64.v32p0(<32 x double> %val, <32 x ptr> %ptrs, <32 x i1> %m, i32 %evl)
1899   ret void
1902 define void @vpscatter_baseidx_zext_v32i32_v32f64(<32 x double> %val, ptr %base, <32 x i32> %idxs, <32 x i1> %m, i32 zeroext %evl) {
1903 ; RV32-LABEL: vpscatter_baseidx_zext_v32i32_v32f64:
1904 ; RV32:       # %bb.0:
1905 ; RV32-NEXT:    li a3, 32
1906 ; RV32-NEXT:    vsetvli zero, a3, e32, m8, ta, ma
1907 ; RV32-NEXT:    vle32.v v24, (a1)
1908 ; RV32-NEXT:    li a3, 16
1909 ; RV32-NEXT:    vsll.vi v24, v24, 3
1910 ; RV32-NEXT:    mv a1, a2
1911 ; RV32-NEXT:    bltu a2, a3, .LBB82_2
1912 ; RV32-NEXT:  # %bb.1:
1913 ; RV32-NEXT:    li a1, 16
1914 ; RV32-NEXT:  .LBB82_2:
1915 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1916 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
1917 ; RV32-NEXT:    addi a1, a2, -16
1918 ; RV32-NEXT:    sltu a2, a2, a1
1919 ; RV32-NEXT:    addi a2, a2, -1
1920 ; RV32-NEXT:    and a1, a2, a1
1921 ; RV32-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1922 ; RV32-NEXT:    vslidedown.vi v0, v0, 2
1923 ; RV32-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
1924 ; RV32-NEXT:    vslidedown.vi v8, v24, 16
1925 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1926 ; RV32-NEXT:    vsoxei32.v v16, (a0), v8, v0.t
1927 ; RV32-NEXT:    ret
1929 ; RV64-LABEL: vpscatter_baseidx_zext_v32i32_v32f64:
1930 ; RV64:       # %bb.0:
1931 ; RV64-NEXT:    addi sp, sp, -16
1932 ; RV64-NEXT:    .cfi_def_cfa_offset 16
1933 ; RV64-NEXT:    csrr a3, vlenb
1934 ; RV64-NEXT:    li a4, 10
1935 ; RV64-NEXT:    mul a3, a3, a4
1936 ; RV64-NEXT:    sub sp, sp, a3
1937 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x0a, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 10 * vlenb
1938 ; RV64-NEXT:    li a3, 32
1939 ; RV64-NEXT:    vsetvli zero, a3, e32, m8, ta, ma
1940 ; RV64-NEXT:    vle32.v v24, (a1)
1941 ; RV64-NEXT:    addi a1, sp, 16
1942 ; RV64-NEXT:    vs1r.v v0, (a1) # Unknown-size Folded Spill
1943 ; RV64-NEXT:    csrr a1, vlenb
1944 ; RV64-NEXT:    add a1, sp, a1
1945 ; RV64-NEXT:    addi a1, a1, 16
1946 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
1947 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1948 ; RV64-NEXT:    vzext.vf2 v0, v24
1949 ; RV64-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
1950 ; RV64-NEXT:    vslidedown.vi v24, v24, 16
1951 ; RV64-NEXT:    vsetivli zero, 16, e64, m8, ta, ma
1952 ; RV64-NEXT:    vzext.vf2 v16, v24
1953 ; RV64-NEXT:    vsll.vi v16, v16, 3
1954 ; RV64-NEXT:    li a3, 16
1955 ; RV64-NEXT:    vsll.vi v24, v0, 3
1956 ; RV64-NEXT:    mv a1, a2
1957 ; RV64-NEXT:    bltu a2, a3, .LBB82_2
1958 ; RV64-NEXT:  # %bb.1:
1959 ; RV64-NEXT:    li a1, 16
1960 ; RV64-NEXT:  .LBB82_2:
1961 ; RV64-NEXT:    addi a3, sp, 16
1962 ; RV64-NEXT:    vl1r.v v0, (a3) # Unknown-size Folded Reload
1963 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1964 ; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t
1965 ; RV64-NEXT:    addi a1, a2, -16
1966 ; RV64-NEXT:    sltu a2, a2, a1
1967 ; RV64-NEXT:    addi a2, a2, -1
1968 ; RV64-NEXT:    vsetivli zero, 2, e8, mf4, ta, ma
1969 ; RV64-NEXT:    vslidedown.vi v0, v0, 2
1970 ; RV64-NEXT:    and a1, a2, a1
1971 ; RV64-NEXT:    csrr a2, vlenb
1972 ; RV64-NEXT:    add a2, sp, a2
1973 ; RV64-NEXT:    addi a2, a2, 16
1974 ; RV64-NEXT:    vl8r.v v8, (a2) # Unknown-size Folded Reload
1975 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1976 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1977 ; RV64-NEXT:    csrr a0, vlenb
1978 ; RV64-NEXT:    li a1, 10
1979 ; RV64-NEXT:    mul a0, a0, a1
1980 ; RV64-NEXT:    add sp, sp, a0
1981 ; RV64-NEXT:    addi sp, sp, 16
1982 ; RV64-NEXT:    ret
1983   %eidxs = zext <32 x i32> %idxs to <32 x i64>
1984   %ptrs = getelementptr inbounds double, ptr %base, <32 x i64> %eidxs
1985   call void @llvm.vp.scatter.v32f64.v32p0(<32 x double> %val, <32 x ptr> %ptrs, <32 x i1> %m, i32 %evl)
1986   ret void