[RISCV] Support postRA vsetvl insertion pass (#70549)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vpscatter-sdnode.ll
blob59662db42898fcaab4f5b699b07cc5cb43f9bbf1
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.nxv1i8.nxv1p0(<vscale x 1 x i8>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
9 define void @vpscatter_nxv1i8(<vscale x 1 x i8> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
10 ; RV32-LABEL: vpscatter_nxv1i8:
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_nxv1i8:
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.nxv1i8.nxv1p0(<vscale x 1 x i8> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
22   ret void
25 declare void @llvm.vp.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
27 define void @vpscatter_nxv2i8(<vscale x 2 x i8> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
28 ; RV32-LABEL: vpscatter_nxv2i8:
29 ; RV32:       # %bb.0:
30 ; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
31 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
32 ; RV32-NEXT:    ret
34 ; RV64-LABEL: vpscatter_nxv2i8:
35 ; RV64:       # %bb.0:
36 ; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
37 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
38 ; RV64-NEXT:    ret
39   call void @llvm.vp.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
40   ret void
43 define void @vpscatter_nxv2i16_truncstore_nxv2i8(<vscale x 2 x i16> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
44 ; RV32-LABEL: vpscatter_nxv2i16_truncstore_nxv2i8:
45 ; RV32:       # %bb.0:
46 ; RV32-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma
47 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
48 ; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
49 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
50 ; RV32-NEXT:    ret
52 ; RV64-LABEL: vpscatter_nxv2i16_truncstore_nxv2i8:
53 ; RV64:       # %bb.0:
54 ; RV64-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma
55 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
56 ; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
57 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
58 ; RV64-NEXT:    ret
59   %tval = trunc <vscale x 2 x i16> %val to <vscale x 2 x i8>
60   call void @llvm.vp.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %tval, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
61   ret void
64 define void @vpscatter_nxv2i32_truncstore_nxv2i8(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
65 ; RV32-LABEL: vpscatter_nxv2i32_truncstore_nxv2i8:
66 ; RV32:       # %bb.0:
67 ; RV32-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
68 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
69 ; RV32-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
70 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
71 ; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
72 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
73 ; RV32-NEXT:    ret
75 ; RV64-LABEL: vpscatter_nxv2i32_truncstore_nxv2i8:
76 ; RV64:       # %bb.0:
77 ; RV64-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
78 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
79 ; RV64-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
80 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
81 ; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
82 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
83 ; RV64-NEXT:    ret
84   %tval = trunc <vscale x 2 x i32> %val to <vscale x 2 x i8>
85   call void @llvm.vp.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %tval, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
86   ret void
89 define void @vpscatter_nxv2i64_truncstore_nxv2i8(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
90 ; RV32-LABEL: vpscatter_nxv2i64_truncstore_nxv2i8:
91 ; RV32:       # %bb.0:
92 ; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
93 ; RV32-NEXT:    vnsrl.wi v11, v8, 0
94 ; RV32-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
95 ; RV32-NEXT:    vnsrl.wi v8, v11, 0
96 ; RV32-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
97 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
98 ; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
99 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
100 ; RV32-NEXT:    ret
102 ; RV64-LABEL: vpscatter_nxv2i64_truncstore_nxv2i8:
103 ; RV64:       # %bb.0:
104 ; RV64-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
105 ; RV64-NEXT:    vnsrl.wi v12, v8, 0
106 ; RV64-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
107 ; RV64-NEXT:    vnsrl.wi v8, v12, 0
108 ; RV64-NEXT:    vsetvli zero, zero, e8, mf4, ta, ma
109 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
110 ; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, ma
111 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
112 ; RV64-NEXT:    ret
113   %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i8>
114   call void @llvm.vp.scatter.nxv2i8.nxv2p0(<vscale x 2 x i8> %tval, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
115   ret void
118 declare void @llvm.vp.scatter.nxv4i8.nxv4p0(<vscale x 4 x i8>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
120 define void @vpscatter_nxv4i8(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
121 ; RV32-LABEL: vpscatter_nxv4i8:
122 ; RV32:       # %bb.0:
123 ; RV32-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
124 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
125 ; RV32-NEXT:    ret
127 ; RV64-LABEL: vpscatter_nxv4i8:
128 ; RV64:       # %bb.0:
129 ; RV64-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
130 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
131 ; RV64-NEXT:    ret
132   call void @llvm.vp.scatter.nxv4i8.nxv4p0(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
133   ret void
136 define void @vpscatter_truemask_nxv4i8(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
137 ; RV32-LABEL: vpscatter_truemask_nxv4i8:
138 ; RV32:       # %bb.0:
139 ; RV32-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
140 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
141 ; RV32-NEXT:    ret
143 ; RV64-LABEL: vpscatter_truemask_nxv4i8:
144 ; RV64:       # %bb.0:
145 ; RV64-NEXT:    vsetvli zero, a0, e8, mf2, ta, ma
146 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
147 ; RV64-NEXT:    ret
148   call void @llvm.vp.scatter.nxv4i8.nxv4p0(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> splat (i1 1), i32 %evl)
149   ret void
152 declare void @llvm.vp.scatter.nxv8i8.nxv8p0(<vscale x 8 x i8>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
154 define void @vpscatter_nxv8i8(<vscale x 8 x i8> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
155 ; RV32-LABEL: vpscatter_nxv8i8:
156 ; RV32:       # %bb.0:
157 ; RV32-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
158 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
159 ; RV32-NEXT:    ret
161 ; RV64-LABEL: vpscatter_nxv8i8:
162 ; RV64:       # %bb.0:
163 ; RV64-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
164 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
165 ; RV64-NEXT:    ret
166   call void @llvm.vp.scatter.nxv8i8.nxv8p0(<vscale x 8 x i8> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
167   ret void
170 define void @vpscatter_baseidx_nxv8i8(<vscale x 8 x i8> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
171 ; RV32-LABEL: vpscatter_baseidx_nxv8i8:
172 ; RV32:       # %bb.0:
173 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
174 ; RV32-NEXT:    vsext.vf4 v12, v9
175 ; RV32-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
176 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
177 ; RV32-NEXT:    ret
179 ; RV64-LABEL: vpscatter_baseidx_nxv8i8:
180 ; RV64:       # %bb.0:
181 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
182 ; RV64-NEXT:    vsext.vf8 v16, v9
183 ; RV64-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
184 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
185 ; RV64-NEXT:    ret
186   %ptrs = getelementptr inbounds i8, ptr %base, <vscale x 8 x i8> %idxs
187   call void @llvm.vp.scatter.nxv8i8.nxv8p0(<vscale x 8 x i8> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
188   ret void
191 declare void @llvm.vp.scatter.nxv1i16.nxv1p0(<vscale x 1 x i16>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
193 define void @vpscatter_nxv1i16(<vscale x 1 x i16> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
194 ; RV32-LABEL: vpscatter_nxv1i16:
195 ; RV32:       # %bb.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_nxv1i16:
201 ; RV64:       # %bb.0:
202 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
203 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
204 ; RV64-NEXT:    ret
205   call void @llvm.vp.scatter.nxv1i16.nxv1p0(<vscale x 1 x i16> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
206   ret void
209 declare void @llvm.vp.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
211 define void @vpscatter_nxv2i16(<vscale x 2 x i16> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
212 ; RV32-LABEL: vpscatter_nxv2i16:
213 ; RV32:       # %bb.0:
214 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
215 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
216 ; RV32-NEXT:    ret
218 ; RV64-LABEL: vpscatter_nxv2i16:
219 ; RV64:       # %bb.0:
220 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
221 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
222 ; RV64-NEXT:    ret
223   call void @llvm.vp.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
224   ret void
227 define void @vpscatter_nxv2i32_truncstore_nxv2i16(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
228 ; RV32-LABEL: vpscatter_nxv2i32_truncstore_nxv2i16:
229 ; RV32:       # %bb.0:
230 ; RV32-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
231 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
232 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
233 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
234 ; RV32-NEXT:    ret
236 ; RV64-LABEL: vpscatter_nxv2i32_truncstore_nxv2i16:
237 ; RV64:       # %bb.0:
238 ; RV64-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
239 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
240 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
241 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
242 ; RV64-NEXT:    ret
243   %tval = trunc <vscale x 2 x i32> %val to <vscale x 2 x i16>
244   call void @llvm.vp.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16> %tval, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
245   ret void
248 define void @vpscatter_nxv2i64_truncstore_nxv2i16(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
249 ; RV32-LABEL: vpscatter_nxv2i64_truncstore_nxv2i16:
250 ; RV32:       # %bb.0:
251 ; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
252 ; RV32-NEXT:    vnsrl.wi v11, v8, 0
253 ; RV32-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
254 ; RV32-NEXT:    vnsrl.wi v8, v11, 0
255 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
256 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
257 ; RV32-NEXT:    ret
259 ; RV64-LABEL: vpscatter_nxv2i64_truncstore_nxv2i16:
260 ; RV64:       # %bb.0:
261 ; RV64-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
262 ; RV64-NEXT:    vnsrl.wi v12, v8, 0
263 ; RV64-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
264 ; RV64-NEXT:    vnsrl.wi v8, v12, 0
265 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
266 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
267 ; RV64-NEXT:    ret
268   %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i16>
269   call void @llvm.vp.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16> %tval, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
270   ret void
273 declare void @llvm.vp.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
275 define void @vpscatter_nxv4i16(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
276 ; RV32-LABEL: vpscatter_nxv4i16:
277 ; RV32:       # %bb.0:
278 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
279 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
280 ; RV32-NEXT:    ret
282 ; RV64-LABEL: vpscatter_nxv4i16:
283 ; RV64:       # %bb.0:
284 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
285 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
286 ; RV64-NEXT:    ret
287   call void @llvm.vp.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
288   ret void
291 define void @vpscatter_truemask_nxv4i16(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
292 ; RV32-LABEL: vpscatter_truemask_nxv4i16:
293 ; RV32:       # %bb.0:
294 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
295 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
296 ; RV32-NEXT:    ret
298 ; RV64-LABEL: vpscatter_truemask_nxv4i16:
299 ; RV64:       # %bb.0:
300 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
301 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
302 ; RV64-NEXT:    ret
303   call void @llvm.vp.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> splat (i1 1), i32 %evl)
304   ret void
307 declare void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
309 define void @vpscatter_nxv8i16(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
310 ; RV32-LABEL: vpscatter_nxv8i16:
311 ; RV32:       # %bb.0:
312 ; RV32-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
313 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
314 ; RV32-NEXT:    ret
316 ; RV64-LABEL: vpscatter_nxv8i16:
317 ; RV64:       # %bb.0:
318 ; RV64-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
319 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
320 ; RV64-NEXT:    ret
321   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
322   ret void
325 define void @vpscatter_baseidx_nxv8i8_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
326 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8i16:
327 ; RV32:       # %bb.0:
328 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
329 ; RV32-NEXT:    vsext.vf4 v12, v10
330 ; RV32-NEXT:    vadd.vv v12, v12, v12
331 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
332 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
333 ; RV32-NEXT:    ret
335 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8i16:
336 ; RV64:       # %bb.0:
337 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
338 ; RV64-NEXT:    vsext.vf8 v16, v10
339 ; RV64-NEXT:    vadd.vv v16, v16, v16
340 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
341 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
342 ; RV64-NEXT:    ret
343   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i8> %idxs
344   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
345   ret void
348 define void @vpscatter_baseidx_sext_nxv8i8_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
349 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i16:
350 ; RV32:       # %bb.0:
351 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
352 ; RV32-NEXT:    vsext.vf4 v12, v10
353 ; RV32-NEXT:    vadd.vv v12, v12, v12
354 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
355 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
356 ; RV32-NEXT:    ret
358 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i16:
359 ; RV64:       # %bb.0:
360 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
361 ; RV64-NEXT:    vsext.vf8 v16, v10
362 ; RV64-NEXT:    vadd.vv v16, v16, v16
363 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
364 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
365 ; RV64-NEXT:    ret
366   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
367   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %eidxs
368   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
369   ret void
372 define void @vpscatter_baseidx_zext_nxv8i8_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
373 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i16:
374 ; RV32:       # %bb.0:
375 ; RV32-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
376 ; RV32-NEXT:    vwaddu.vv v12, v10, v10
377 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
378 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
379 ; RV32-NEXT:    ret
381 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i16:
382 ; RV64:       # %bb.0:
383 ; RV64-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
384 ; RV64-NEXT:    vwaddu.vv v12, v10, v10
385 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
386 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
387 ; RV64-NEXT:    ret
388   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
389   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %eidxs
390   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
391   ret void
394 define void @vpscatter_baseidx_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
395 ; RV32-LABEL: vpscatter_baseidx_nxv8i16:
396 ; RV32:       # %bb.0:
397 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
398 ; RV32-NEXT:    vwadd.vv v12, v10, v10
399 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
400 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
401 ; RV32-NEXT:    ret
403 ; RV64-LABEL: vpscatter_baseidx_nxv8i16:
404 ; RV64:       # %bb.0:
405 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
406 ; RV64-NEXT:    vsext.vf4 v16, v10
407 ; RV64-NEXT:    vadd.vv v16, v16, v16
408 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
409 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
410 ; RV64-NEXT:    ret
411   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %idxs
412   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
413   ret void
416 declare <vscale x 8 x i32> @llvm.vp.sext.nxv8i16.nxv8i32(<vscale x 8 x i16>, <vscale x 8 x i1>, i32)
417 define void @vpscatter_baseidx_vpsext_nxv8i16_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
418 ; RV32-LABEL: vpscatter_baseidx_vpsext_nxv8i16_nxv8i16:
419 ; RV32:       # %bb.0:
420 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
421 ; RV32-NEXT:    vwadd.vv v12, v10, v10, v0.t
422 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
423 ; RV32-NEXT:    ret
425 ; RV64-LABEL: vpscatter_baseidx_vpsext_nxv8i16_nxv8i16:
426 ; RV64:       # %bb.0:
427 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
428 ; RV64-NEXT:    vsext.vf2 v12, v10, v0.t
429 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
430 ; RV64-NEXT:    vwadd.vv v16, v12, v12
431 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
432 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
433 ; RV64-NEXT:    ret
434   %eidxs = call <vscale x 8 x i32> @llvm.vp.sext.nxv8i16.nxv8i32(<vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 %evl)
435   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i32> %eidxs
436   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
437   ret void
440 declare <vscale x 8 x i32> @llvm.vp.zext.nxv8i16.nxv8i32(<vscale x 8 x i16>, <vscale x 8 x i1>, i32)
441 define void @vpscatter_baseidx_vpzext_nxv8i16_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
442 ; RV32-LABEL: vpscatter_baseidx_vpzext_nxv8i16_nxv8i16:
443 ; RV32:       # %bb.0:
444 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
445 ; RV32-NEXT:    vwaddu.vv v12, v10, v10, v0.t
446 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
447 ; RV32-NEXT:    ret
449 ; RV64-LABEL: vpscatter_baseidx_vpzext_nxv8i16_nxv8i16:
450 ; RV64:       # %bb.0:
451 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
452 ; RV64-NEXT:    vzext.vf2 v12, v10, v0.t
453 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
454 ; RV64-NEXT:    vwadd.vv v16, v12, v12
455 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
456 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
457 ; RV64-NEXT:    ret
458   %eidxs = call <vscale x 8 x i32> @llvm.vp.zext.nxv8i16.nxv8i32(<vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 %evl)
459   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i32> %eidxs
460   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
461   ret void
464 declare <vscale x 8 x i64> @llvm.vp.sext.nxv8i32.nxv8i64(<vscale x 8 x i32>, <vscale x 8 x i1>, i32)
465 define void @vpscatter_baseidx_vpsext_nxv8i32_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
466 ; RV32-LABEL: vpscatter_baseidx_vpsext_nxv8i32_nxv8i16:
467 ; RV32:       # %bb.0:
468 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
469 ; RV32-NEXT:    vsext.vf2 v16, v12, v0.t
470 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
471 ; RV32-NEXT:    vnsrl.wi v12, v16, 0
472 ; RV32-NEXT:    vadd.vv v12, v12, v12
473 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
474 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
475 ; RV32-NEXT:    ret
477 ; RV64-LABEL: vpscatter_baseidx_vpsext_nxv8i32_nxv8i16:
478 ; RV64:       # %bb.0:
479 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
480 ; RV64-NEXT:    vwadd.vv v16, v12, v12, v0.t
481 ; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
482 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
483 ; RV64-NEXT:    ret
484   %eidxs = call <vscale x 8 x i64> @llvm.vp.sext.nxv8i32.nxv8i64(<vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 %evl)
485   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i64> %eidxs
486   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
487   ret void
490 declare <vscale x 8 x i64> @llvm.vp.zext.nxv8i32.nxv8i64(<vscale x 8 x i32>, <vscale x 8 x i1>, i32)
491 define void @vpscatter_baseidx_vpzext_nxv8i32_nxv8i16(<vscale x 8 x i16> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
492 ; RV32-LABEL: vpscatter_baseidx_vpzext_nxv8i32_nxv8i16:
493 ; RV32:       # %bb.0:
494 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
495 ; RV32-NEXT:    vzext.vf2 v16, v12, v0.t
496 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
497 ; RV32-NEXT:    vnsrl.wi v12, v16, 0
498 ; RV32-NEXT:    vadd.vv v12, v12, v12
499 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
500 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
501 ; RV32-NEXT:    ret
503 ; RV64-LABEL: vpscatter_baseidx_vpzext_nxv8i32_nxv8i16:
504 ; RV64:       # %bb.0:
505 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
506 ; RV64-NEXT:    vwaddu.vv v16, v12, v12, v0.t
507 ; RV64-NEXT:    vsetvli zero, zero, e16, m2, ta, ma
508 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
509 ; RV64-NEXT:    ret
510   %eidxs = call <vscale x 8 x i64> @llvm.vp.zext.nxv8i32.nxv8i64(<vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 %evl)
511   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i64> %eidxs
512   call void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
513   ret void
516 declare void @llvm.vp.scatter.nxv1i32.nxv1p0(<vscale x 1 x i32>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
518 define void @vpscatter_nxv1i32(<vscale x 1 x i32> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
519 ; RV32-LABEL: vpscatter_nxv1i32:
520 ; RV32:       # %bb.0:
521 ; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
522 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
523 ; RV32-NEXT:    ret
525 ; RV64-LABEL: vpscatter_nxv1i32:
526 ; RV64:       # %bb.0:
527 ; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
528 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
529 ; RV64-NEXT:    ret
530   call void @llvm.vp.scatter.nxv1i32.nxv1p0(<vscale x 1 x i32> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
531   ret void
534 declare void @llvm.vp.scatter.nxv2i32.nxv2p0(<vscale x 2 x i32>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
536 define void @vpscatter_nxv2i32(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
537 ; RV32-LABEL: vpscatter_nxv2i32:
538 ; RV32:       # %bb.0:
539 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
540 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
541 ; RV32-NEXT:    ret
543 ; RV64-LABEL: vpscatter_nxv2i32:
544 ; RV64:       # %bb.0:
545 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
546 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
547 ; RV64-NEXT:    ret
548   call void @llvm.vp.scatter.nxv2i32.nxv2p0(<vscale x 2 x i32> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
549   ret void
552 define void @vpscatter_nxv2i64_truncstore_nxv2i32(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
553 ; RV32-LABEL: vpscatter_nxv2i64_truncstore_nxv2i32:
554 ; RV32:       # %bb.0:
555 ; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
556 ; RV32-NEXT:    vnsrl.wi v11, v8, 0
557 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
558 ; RV32-NEXT:    vsoxei32.v v11, (zero), v10, v0.t
559 ; RV32-NEXT:    ret
561 ; RV64-LABEL: vpscatter_nxv2i64_truncstore_nxv2i32:
562 ; RV64:       # %bb.0:
563 ; RV64-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
564 ; RV64-NEXT:    vnsrl.wi v12, v8, 0
565 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
566 ; RV64-NEXT:    vsoxei64.v v12, (zero), v10, v0.t
567 ; RV64-NEXT:    ret
568   %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i32>
569   call void @llvm.vp.scatter.nxv2i32.nxv2p0(<vscale x 2 x i32> %tval, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
570   ret void
573 declare void @llvm.vp.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
575 define void @vpscatter_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
576 ; RV32-LABEL: vpscatter_nxv4i32:
577 ; RV32:       # %bb.0:
578 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
579 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
580 ; RV32-NEXT:    ret
582 ; RV64-LABEL: vpscatter_nxv4i32:
583 ; RV64:       # %bb.0:
584 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
585 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
586 ; RV64-NEXT:    ret
587   call void @llvm.vp.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
588   ret void
591 define void @vpscatter_truemask_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
592 ; RV32-LABEL: vpscatter_truemask_nxv4i32:
593 ; RV32:       # %bb.0:
594 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
595 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
596 ; RV32-NEXT:    ret
598 ; RV64-LABEL: vpscatter_truemask_nxv4i32:
599 ; RV64:       # %bb.0:
600 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
601 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
602 ; RV64-NEXT:    ret
603   call void @llvm.vp.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> splat (i1 1), i32 %evl)
604   ret void
607 declare void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
609 define void @vpscatter_nxv8i32(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
610 ; RV32-LABEL: vpscatter_nxv8i32:
611 ; RV32:       # %bb.0:
612 ; RV32-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
613 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
614 ; RV32-NEXT:    ret
616 ; RV64-LABEL: vpscatter_nxv8i32:
617 ; RV64:       # %bb.0:
618 ; RV64-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
619 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
620 ; RV64-NEXT:    ret
621   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
622   ret void
625 define void @vpscatter_baseidx_nxv8i8_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
626 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8i32:
627 ; RV32:       # %bb.0:
628 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
629 ; RV32-NEXT:    vsext.vf4 v16, v12
630 ; RV32-NEXT:    vsll.vi v12, v16, 2
631 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
632 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
633 ; RV32-NEXT:    ret
635 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8i32:
636 ; RV64:       # %bb.0:
637 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
638 ; RV64-NEXT:    vsext.vf8 v16, v12
639 ; RV64-NEXT:    vsll.vi v16, v16, 2
640 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
641 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
642 ; RV64-NEXT:    ret
643   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i8> %idxs
644   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
645   ret void
648 define void @vpscatter_baseidx_sext_nxv8i8_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
649 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i32:
650 ; RV32:       # %bb.0:
651 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
652 ; RV32-NEXT:    vsext.vf4 v16, v12
653 ; RV32-NEXT:    vsll.vi v12, v16, 2
654 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
655 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
656 ; RV32-NEXT:    ret
658 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i32:
659 ; RV64:       # %bb.0:
660 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
661 ; RV64-NEXT:    vsext.vf8 v16, v12
662 ; RV64-NEXT:    vsll.vi v16, v16, 2
663 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
664 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
665 ; RV64-NEXT:    ret
666   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
667   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
668   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
669   ret void
672 define void @vpscatter_baseidx_zext_nxv8i8_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
673 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i32:
674 ; RV32:       # %bb.0:
675 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
676 ; RV32-NEXT:    vzext.vf2 v14, v12
677 ; RV32-NEXT:    vsll.vi v12, v14, 2
678 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
679 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
680 ; RV32-NEXT:    ret
682 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i32:
683 ; RV64:       # %bb.0:
684 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
685 ; RV64-NEXT:    vzext.vf2 v14, v12
686 ; RV64-NEXT:    vsll.vi v12, v14, 2
687 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
688 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
689 ; RV64-NEXT:    ret
690   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
691   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
692   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
693   ret void
696 define void @vpscatter_baseidx_nxv8i16_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
697 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8i32:
698 ; RV32:       # %bb.0:
699 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
700 ; RV32-NEXT:    vsext.vf2 v16, v12
701 ; RV32-NEXT:    vsll.vi v12, v16, 2
702 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
703 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
704 ; RV32-NEXT:    ret
706 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8i32:
707 ; RV64:       # %bb.0:
708 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
709 ; RV64-NEXT:    vsext.vf4 v16, v12
710 ; RV64-NEXT:    vsll.vi v16, v16, 2
711 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
712 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
713 ; RV64-NEXT:    ret
714   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i16> %idxs
715   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
716   ret void
719 define void @vpscatter_baseidx_sext_nxv8i16_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
720 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8i32:
721 ; RV32:       # %bb.0:
722 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
723 ; RV32-NEXT:    vsext.vf2 v16, v12
724 ; RV32-NEXT:    vsll.vi v12, v16, 2
725 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
726 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
727 ; RV32-NEXT:    ret
729 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8i32:
730 ; RV64:       # %bb.0:
731 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
732 ; RV64-NEXT:    vsext.vf4 v16, v12
733 ; RV64-NEXT:    vsll.vi v16, v16, 2
734 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
735 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
736 ; RV64-NEXT:    ret
737   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
738   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
739   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
740   ret void
743 define void @vpscatter_baseidx_zext_nxv8i16_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
744 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i32:
745 ; RV32:       # %bb.0:
746 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
747 ; RV32-NEXT:    vzext.vf2 v16, v12
748 ; RV32-NEXT:    vsll.vi v12, v16, 2
749 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
750 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
751 ; RV32-NEXT:    ret
753 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i32:
754 ; RV64:       # %bb.0:
755 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
756 ; RV64-NEXT:    vzext.vf2 v16, v12
757 ; RV64-NEXT:    vsll.vi v12, v16, 2
758 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
759 ; RV64-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
760 ; RV64-NEXT:    ret
761   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
762   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
763   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
764   ret void
767 define void @vpscatter_baseidx_nxv8i32(<vscale x 8 x i32> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
768 ; RV32-LABEL: vpscatter_baseidx_nxv8i32:
769 ; RV32:       # %bb.0:
770 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
771 ; RV32-NEXT:    vsll.vi v12, v12, 2
772 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
773 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
774 ; RV32-NEXT:    ret
776 ; RV64-LABEL: vpscatter_baseidx_nxv8i32:
777 ; RV64:       # %bb.0:
778 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
779 ; RV64-NEXT:    vsext.vf2 v16, v12
780 ; RV64-NEXT:    vsll.vi v16, v16, 2
781 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
782 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
783 ; RV64-NEXT:    ret
784   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %idxs
785   call void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
786   ret void
789 declare void @llvm.vp.scatter.nxv1i64.nxv1p0(<vscale x 1 x i64>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
791 define void @vpscatter_nxv1i64(<vscale x 1 x i64> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
792 ; RV32-LABEL: vpscatter_nxv1i64:
793 ; RV32:       # %bb.0:
794 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
795 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
796 ; RV32-NEXT:    ret
798 ; RV64-LABEL: vpscatter_nxv1i64:
799 ; RV64:       # %bb.0:
800 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
801 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
802 ; RV64-NEXT:    ret
803   call void @llvm.vp.scatter.nxv1i64.nxv1p0(<vscale x 1 x i64> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
804   ret void
807 declare void @llvm.vp.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
809 define void @vpscatter_nxv2i64(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
810 ; RV32-LABEL: vpscatter_nxv2i64:
811 ; RV32:       # %bb.0:
812 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
813 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
814 ; RV32-NEXT:    ret
816 ; RV64-LABEL: vpscatter_nxv2i64:
817 ; RV64:       # %bb.0:
818 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
819 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
820 ; RV64-NEXT:    ret
821   call void @llvm.vp.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
822   ret void
825 declare void @llvm.vp.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
827 define void @vpscatter_nxv4i64(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
828 ; RV32-LABEL: vpscatter_nxv4i64:
829 ; RV32:       # %bb.0:
830 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
831 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
832 ; RV32-NEXT:    ret
834 ; RV64-LABEL: vpscatter_nxv4i64:
835 ; RV64:       # %bb.0:
836 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
837 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
838 ; RV64-NEXT:    ret
839   call void @llvm.vp.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
840   ret void
843 define void @vpscatter_truemask_nxv4i64(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
844 ; RV32-LABEL: vpscatter_truemask_nxv4i64:
845 ; RV32:       # %bb.0:
846 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
847 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12
848 ; RV32-NEXT:    ret
850 ; RV64-LABEL: vpscatter_truemask_nxv4i64:
851 ; RV64:       # %bb.0:
852 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
853 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
854 ; RV64-NEXT:    ret
855   call void @llvm.vp.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> splat (i1 1), i32 %evl)
856   ret void
859 declare void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
861 define void @vpscatter_nxv8i64(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
862 ; RV32-LABEL: vpscatter_nxv8i64:
863 ; RV32:       # %bb.0:
864 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
865 ; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t
866 ; RV32-NEXT:    ret
868 ; RV64-LABEL: vpscatter_nxv8i64:
869 ; RV64:       # %bb.0:
870 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
871 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
872 ; RV64-NEXT:    ret
873   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
874   ret void
877 define void @vpscatter_baseidx_nxv8i8_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
878 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8i64:
879 ; RV32:       # %bb.0:
880 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
881 ; RV32-NEXT:    vsext.vf4 v20, v16
882 ; RV32-NEXT:    vsll.vi v16, v20, 3
883 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
884 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
885 ; RV32-NEXT:    ret
887 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8i64:
888 ; RV64:       # %bb.0:
889 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
890 ; RV64-NEXT:    vsext.vf8 v24, v16
891 ; RV64-NEXT:    vsll.vi v16, v24, 3
892 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
893 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
894 ; RV64-NEXT:    ret
895   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i8> %idxs
896   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
897   ret void
900 define void @vpscatter_baseidx_sext_nxv8i8_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
901 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i64:
902 ; RV32:       # %bb.0:
903 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
904 ; RV32-NEXT:    vsext.vf4 v20, v16
905 ; RV32-NEXT:    vsll.vi v16, v20, 3
906 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
907 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
908 ; RV32-NEXT:    ret
910 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i64:
911 ; RV64:       # %bb.0:
912 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
913 ; RV64-NEXT:    vsext.vf8 v24, v16
914 ; RV64-NEXT:    vsll.vi v16, v24, 3
915 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
916 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
917 ; RV64-NEXT:    ret
918   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
919   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
920   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
921   ret void
924 define void @vpscatter_baseidx_zext_nxv8i8_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
925 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i64:
926 ; RV32:       # %bb.0:
927 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
928 ; RV32-NEXT:    vzext.vf2 v18, v16
929 ; RV32-NEXT:    vsll.vi v16, v18, 3
930 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
931 ; RV32-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
932 ; RV32-NEXT:    ret
934 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i64:
935 ; RV64:       # %bb.0:
936 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
937 ; RV64-NEXT:    vzext.vf2 v18, v16
938 ; RV64-NEXT:    vsll.vi v16, v18, 3
939 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
940 ; RV64-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
941 ; RV64-NEXT:    ret
942   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
943   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
944   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
945   ret void
948 define void @vpscatter_baseidx_nxv8i16_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
949 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8i64:
950 ; RV32:       # %bb.0:
951 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
952 ; RV32-NEXT:    vsext.vf2 v20, v16
953 ; RV32-NEXT:    vsll.vi v16, v20, 3
954 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
955 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
956 ; RV32-NEXT:    ret
958 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8i64:
959 ; RV64:       # %bb.0:
960 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
961 ; RV64-NEXT:    vsext.vf4 v24, v16
962 ; RV64-NEXT:    vsll.vi v16, v24, 3
963 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
964 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
965 ; RV64-NEXT:    ret
966   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i16> %idxs
967   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
968   ret void
971 define void @vpscatter_baseidx_sext_nxv8i16_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
972 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8i64:
973 ; RV32:       # %bb.0:
974 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
975 ; RV32-NEXT:    vsext.vf2 v20, v16
976 ; RV32-NEXT:    vsll.vi v16, v20, 3
977 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
978 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
979 ; RV32-NEXT:    ret
981 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8i64:
982 ; RV64:       # %bb.0:
983 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
984 ; RV64-NEXT:    vsext.vf4 v24, v16
985 ; RV64-NEXT:    vsll.vi v16, v24, 3
986 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
987 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
988 ; RV64-NEXT:    ret
989   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
990   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
991   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
992   ret void
995 define void @vpscatter_baseidx_zext_nxv8i16_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
996 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i64:
997 ; RV32:       # %bb.0:
998 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
999 ; RV32-NEXT:    vzext.vf2 v20, v16
1000 ; RV32-NEXT:    vsll.vi v16, v20, 3
1001 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1002 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1003 ; RV32-NEXT:    ret
1005 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i64:
1006 ; RV64:       # %bb.0:
1007 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1008 ; RV64-NEXT:    vzext.vf2 v20, v16
1009 ; RV64-NEXT:    vsll.vi v16, v20, 3
1010 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1011 ; RV64-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1012 ; RV64-NEXT:    ret
1013   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1014   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
1015   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1016   ret void
1019 define void @vpscatter_baseidx_nxv8i32_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1020 ; RV32-LABEL: vpscatter_baseidx_nxv8i32_nxv8i64:
1021 ; RV32:       # %bb.0:
1022 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1023 ; RV32-NEXT:    vsll.vi v16, v16, 3
1024 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1025 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1026 ; RV32-NEXT:    ret
1028 ; RV64-LABEL: vpscatter_baseidx_nxv8i32_nxv8i64:
1029 ; RV64:       # %bb.0:
1030 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1031 ; RV64-NEXT:    vsext.vf2 v24, v16
1032 ; RV64-NEXT:    vsll.vi v16, v24, 3
1033 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1034 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1035 ; RV64-NEXT:    ret
1036   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i32> %idxs
1037   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1038   ret void
1041 define void @vpscatter_baseidx_sext_nxv8i32_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1042 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i32_nxv8i64:
1043 ; RV32:       # %bb.0:
1044 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1045 ; RV32-NEXT:    vsll.vi v16, v16, 3
1046 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1047 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1048 ; RV32-NEXT:    ret
1050 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i32_nxv8i64:
1051 ; RV64:       # %bb.0:
1052 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1053 ; RV64-NEXT:    vsext.vf2 v24, v16
1054 ; RV64-NEXT:    vsll.vi v16, v24, 3
1055 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1056 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1057 ; RV64-NEXT:    ret
1058   %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1059   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
1060   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1061   ret void
1064 define void @vpscatter_baseidx_zext_nxv8i32_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1065 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i32_nxv8i64:
1066 ; RV32:       # %bb.0:
1067 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1068 ; RV32-NEXT:    vsll.vi v16, v16, 3
1069 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1070 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1071 ; RV32-NEXT:    ret
1073 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i32_nxv8i64:
1074 ; RV64:       # %bb.0:
1075 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1076 ; RV64-NEXT:    vzext.vf2 v24, v16
1077 ; RV64-NEXT:    vsll.vi v16, v24, 3
1078 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1079 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1080 ; RV64-NEXT:    ret
1081   %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1082   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
1083   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1084   ret void
1087 define void @vpscatter_baseidx_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1088 ; RV32-LABEL: vpscatter_baseidx_nxv8i64:
1089 ; RV32:       # %bb.0:
1090 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1091 ; RV32-NEXT:    vnsrl.wi v24, v16, 0
1092 ; RV32-NEXT:    vsll.vi v16, v24, 3
1093 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1094 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1095 ; RV32-NEXT:    ret
1097 ; RV64-LABEL: vpscatter_baseidx_nxv8i64:
1098 ; RV64:       # %bb.0:
1099 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1100 ; RV64-NEXT:    vsll.vi v16, v16, 3
1101 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1102 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1103 ; RV64-NEXT:    ret
1104   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %idxs
1105   call void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1106   ret void
1109 declare void @llvm.vp.scatter.nxv1f16.nxv1p0(<vscale x 1 x half>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
1111 define void @vpscatter_nxv1f16(<vscale x 1 x half> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1112 ; RV32-LABEL: vpscatter_nxv1f16:
1113 ; RV32:       # %bb.0:
1114 ; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1115 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1116 ; RV32-NEXT:    ret
1118 ; RV64-LABEL: vpscatter_nxv1f16:
1119 ; RV64:       # %bb.0:
1120 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1121 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1122 ; RV64-NEXT:    ret
1123   call void @llvm.vp.scatter.nxv1f16.nxv1p0(<vscale x 1 x half> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
1124   ret void
1127 declare void @llvm.vp.scatter.nxv2f16.nxv2p0(<vscale x 2 x half>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
1129 define void @vpscatter_nxv2f16(<vscale x 2 x half> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1130 ; RV32-LABEL: vpscatter_nxv2f16:
1131 ; RV32:       # %bb.0:
1132 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1133 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1134 ; RV32-NEXT:    ret
1136 ; RV64-LABEL: vpscatter_nxv2f16:
1137 ; RV64:       # %bb.0:
1138 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1139 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1140 ; RV64-NEXT:    ret
1141   call void @llvm.vp.scatter.nxv2f16.nxv2p0(<vscale x 2 x half> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
1142   ret void
1145 declare void @llvm.vp.scatter.nxv4f16.nxv4p0(<vscale x 4 x half>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
1147 define void @vpscatter_nxv4f16(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1148 ; RV32-LABEL: vpscatter_nxv4f16:
1149 ; RV32:       # %bb.0:
1150 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1151 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1152 ; RV32-NEXT:    ret
1154 ; RV64-LABEL: vpscatter_nxv4f16:
1155 ; RV64:       # %bb.0:
1156 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1157 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1158 ; RV64-NEXT:    ret
1159   call void @llvm.vp.scatter.nxv4f16.nxv4p0(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
1160   ret void
1163 define void @vpscatter_truemask_nxv4f16(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
1164 ; RV32-LABEL: vpscatter_truemask_nxv4f16:
1165 ; RV32:       # %bb.0:
1166 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1167 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
1168 ; RV32-NEXT:    ret
1170 ; RV64-LABEL: vpscatter_truemask_nxv4f16:
1171 ; RV64:       # %bb.0:
1172 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1173 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
1174 ; RV64-NEXT:    ret
1175   call void @llvm.vp.scatter.nxv4f16.nxv4p0(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> splat (i1 1), i32 %evl)
1176   ret void
1179 declare void @llvm.vp.scatter.nxv8f16.nxv8p0(<vscale x 8 x half>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
1181 define void @vpscatter_nxv8f16(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1182 ; RV32-LABEL: vpscatter_nxv8f16:
1183 ; RV32:       # %bb.0:
1184 ; RV32-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1185 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
1186 ; RV32-NEXT:    ret
1188 ; RV64-LABEL: vpscatter_nxv8f16:
1189 ; RV64:       # %bb.0:
1190 ; RV64-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1191 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1192 ; RV64-NEXT:    ret
1193   call void @llvm.vp.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1194   ret void
1197 define void @vpscatter_baseidx_nxv8i8_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1198 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8f16:
1199 ; RV32:       # %bb.0:
1200 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1201 ; RV32-NEXT:    vsext.vf4 v12, v10
1202 ; RV32-NEXT:    vadd.vv v12, v12, v12
1203 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1204 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1205 ; RV32-NEXT:    ret
1207 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8f16:
1208 ; RV64:       # %bb.0:
1209 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1210 ; RV64-NEXT:    vsext.vf8 v16, v10
1211 ; RV64-NEXT:    vadd.vv v16, v16, v16
1212 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1213 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1214 ; RV64-NEXT:    ret
1215   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i8> %idxs
1216   call void @llvm.vp.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1217   ret void
1220 define void @vpscatter_baseidx_sext_nxv8i8_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1221 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f16:
1222 ; RV32:       # %bb.0:
1223 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1224 ; RV32-NEXT:    vsext.vf4 v12, v10
1225 ; RV32-NEXT:    vadd.vv v12, v12, v12
1226 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1227 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1228 ; RV32-NEXT:    ret
1230 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f16:
1231 ; RV64:       # %bb.0:
1232 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1233 ; RV64-NEXT:    vsext.vf8 v16, v10
1234 ; RV64-NEXT:    vadd.vv v16, v16, v16
1235 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1236 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1237 ; RV64-NEXT:    ret
1238   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
1239   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %eidxs
1240   call void @llvm.vp.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1241   ret void
1244 define void @vpscatter_baseidx_zext_nxv8i8_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1245 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f16:
1246 ; RV32:       # %bb.0:
1247 ; RV32-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
1248 ; RV32-NEXT:    vwaddu.vv v12, v10, v10
1249 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1250 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1251 ; RV32-NEXT:    ret
1253 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f16:
1254 ; RV64:       # %bb.0:
1255 ; RV64-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
1256 ; RV64-NEXT:    vwaddu.vv v12, v10, v10
1257 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1258 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1259 ; RV64-NEXT:    ret
1260   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
1261   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %eidxs
1262   call void @llvm.vp.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1263   ret void
1266 define void @vpscatter_baseidx_nxv8f16(<vscale x 8 x half> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1267 ; RV32-LABEL: vpscatter_baseidx_nxv8f16:
1268 ; RV32:       # %bb.0:
1269 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1270 ; RV32-NEXT:    vwadd.vv v12, v10, v10
1271 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1272 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1273 ; RV32-NEXT:    ret
1275 ; RV64-LABEL: vpscatter_baseidx_nxv8f16:
1276 ; RV64:       # %bb.0:
1277 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1278 ; RV64-NEXT:    vsext.vf4 v16, v10
1279 ; RV64-NEXT:    vadd.vv v16, v16, v16
1280 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1281 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1282 ; RV64-NEXT:    ret
1283   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %idxs
1284   call void @llvm.vp.scatter.nxv8f16.nxv8p0(<vscale x 8 x half> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1285   ret void
1288 declare void @llvm.vp.scatter.nxv1f32.nxv1p0(<vscale x 1 x float>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
1290 define void @vpscatter_nxv1f32(<vscale x 1 x float> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1291 ; RV32-LABEL: vpscatter_nxv1f32:
1292 ; RV32:       # %bb.0:
1293 ; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1294 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1295 ; RV32-NEXT:    ret
1297 ; RV64-LABEL: vpscatter_nxv1f32:
1298 ; RV64:       # %bb.0:
1299 ; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1300 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1301 ; RV64-NEXT:    ret
1302   call void @llvm.vp.scatter.nxv1f32.nxv1p0(<vscale x 1 x float> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
1303   ret void
1306 declare void @llvm.vp.scatter.nxv2f32.nxv2p0(<vscale x 2 x float>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
1308 define void @vpscatter_nxv2f32(<vscale x 2 x float> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1309 ; RV32-LABEL: vpscatter_nxv2f32:
1310 ; RV32:       # %bb.0:
1311 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1312 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1313 ; RV32-NEXT:    ret
1315 ; RV64-LABEL: vpscatter_nxv2f32:
1316 ; RV64:       # %bb.0:
1317 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1318 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1319 ; RV64-NEXT:    ret
1320   call void @llvm.vp.scatter.nxv2f32.nxv2p0(<vscale x 2 x float> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
1321   ret void
1324 declare void @llvm.vp.scatter.nxv4f32.nxv4p0(<vscale x 4 x float>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
1326 define void @vpscatter_nxv4f32(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1327 ; RV32-LABEL: vpscatter_nxv4f32:
1328 ; RV32:       # %bb.0:
1329 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1330 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1331 ; RV32-NEXT:    ret
1333 ; RV64-LABEL: vpscatter_nxv4f32:
1334 ; RV64:       # %bb.0:
1335 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1336 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1337 ; RV64-NEXT:    ret
1338   call void @llvm.vp.scatter.nxv4f32.nxv4p0(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
1339   ret void
1342 define void @vpscatter_truemask_nxv4f32(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
1343 ; RV32-LABEL: vpscatter_truemask_nxv4f32:
1344 ; RV32:       # %bb.0:
1345 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1346 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
1347 ; RV32-NEXT:    ret
1349 ; RV64-LABEL: vpscatter_truemask_nxv4f32:
1350 ; RV64:       # %bb.0:
1351 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1352 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
1353 ; RV64-NEXT:    ret
1354   call void @llvm.vp.scatter.nxv4f32.nxv4p0(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> splat (i1 1), i32 %evl)
1355   ret void
1358 declare void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
1360 define void @vpscatter_nxv8f32(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1361 ; RV32-LABEL: vpscatter_nxv8f32:
1362 ; RV32:       # %bb.0:
1363 ; RV32-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1364 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
1365 ; RV32-NEXT:    ret
1367 ; RV64-LABEL: vpscatter_nxv8f32:
1368 ; RV64:       # %bb.0:
1369 ; RV64-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1370 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1371 ; RV64-NEXT:    ret
1372   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1373   ret void
1376 define void @vpscatter_baseidx_nxv8i8_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1377 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8f32:
1378 ; RV32:       # %bb.0:
1379 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1380 ; RV32-NEXT:    vsext.vf4 v16, v12
1381 ; RV32-NEXT:    vsll.vi v12, v16, 2
1382 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1383 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1384 ; RV32-NEXT:    ret
1386 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8f32:
1387 ; RV64:       # %bb.0:
1388 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1389 ; RV64-NEXT:    vsext.vf8 v16, v12
1390 ; RV64-NEXT:    vsll.vi v16, v16, 2
1391 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1392 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1393 ; RV64-NEXT:    ret
1394   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i8> %idxs
1395   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1396   ret void
1399 define void @vpscatter_baseidx_sext_nxv8i8_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1400 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f32:
1401 ; RV32:       # %bb.0:
1402 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1403 ; RV32-NEXT:    vsext.vf4 v16, v12
1404 ; RV32-NEXT:    vsll.vi v12, v16, 2
1405 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1406 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1407 ; RV32-NEXT:    ret
1409 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f32:
1410 ; RV64:       # %bb.0:
1411 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1412 ; RV64-NEXT:    vsext.vf8 v16, v12
1413 ; RV64-NEXT:    vsll.vi v16, v16, 2
1414 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1415 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1416 ; RV64-NEXT:    ret
1417   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
1418   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1419   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1420   ret void
1423 define void @vpscatter_baseidx_zext_nxv8i8_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1424 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f32:
1425 ; RV32:       # %bb.0:
1426 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1427 ; RV32-NEXT:    vzext.vf2 v14, v12
1428 ; RV32-NEXT:    vsll.vi v12, v14, 2
1429 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1430 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1431 ; RV32-NEXT:    ret
1433 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f32:
1434 ; RV64:       # %bb.0:
1435 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1436 ; RV64-NEXT:    vzext.vf2 v14, v12
1437 ; RV64-NEXT:    vsll.vi v12, v14, 2
1438 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1439 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1440 ; RV64-NEXT:    ret
1441   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
1442   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1443   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1444   ret void
1447 define void @vpscatter_baseidx_nxv8i16_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1448 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8f32:
1449 ; RV32:       # %bb.0:
1450 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1451 ; RV32-NEXT:    vsext.vf2 v16, v12
1452 ; RV32-NEXT:    vsll.vi v12, v16, 2
1453 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1454 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1455 ; RV32-NEXT:    ret
1457 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8f32:
1458 ; RV64:       # %bb.0:
1459 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1460 ; RV64-NEXT:    vsext.vf4 v16, v12
1461 ; RV64-NEXT:    vsll.vi v16, v16, 2
1462 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1463 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1464 ; RV64-NEXT:    ret
1465   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i16> %idxs
1466   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1467   ret void
1470 define void @vpscatter_baseidx_sext_nxv8i16_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1471 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f32:
1472 ; RV32:       # %bb.0:
1473 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1474 ; RV32-NEXT:    vsext.vf2 v16, v12
1475 ; RV32-NEXT:    vsll.vi v12, v16, 2
1476 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1477 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1478 ; RV32-NEXT:    ret
1480 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f32:
1481 ; RV64:       # %bb.0:
1482 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1483 ; RV64-NEXT:    vsext.vf4 v16, v12
1484 ; RV64-NEXT:    vsll.vi v16, v16, 2
1485 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1486 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1487 ; RV64-NEXT:    ret
1488   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
1489   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1490   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1491   ret void
1494 define void @vpscatter_baseidx_zext_nxv8i16_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1495 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f32:
1496 ; RV32:       # %bb.0:
1497 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1498 ; RV32-NEXT:    vzext.vf2 v16, v12
1499 ; RV32-NEXT:    vsll.vi v12, v16, 2
1500 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1501 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1502 ; RV32-NEXT:    ret
1504 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f32:
1505 ; RV64:       # %bb.0:
1506 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1507 ; RV64-NEXT:    vzext.vf2 v16, v12
1508 ; RV64-NEXT:    vsll.vi v12, v16, 2
1509 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1510 ; RV64-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1511 ; RV64-NEXT:    ret
1512   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
1513   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1514   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1515   ret void
1518 define void @vpscatter_baseidx_nxv8f32(<vscale x 8 x float> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1519 ; RV32-LABEL: vpscatter_baseidx_nxv8f32:
1520 ; RV32:       # %bb.0:
1521 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1522 ; RV32-NEXT:    vsll.vi v12, v12, 2
1523 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1524 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1525 ; RV32-NEXT:    ret
1527 ; RV64-LABEL: vpscatter_baseidx_nxv8f32:
1528 ; RV64:       # %bb.0:
1529 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1530 ; RV64-NEXT:    vsext.vf2 v16, v12
1531 ; RV64-NEXT:    vsll.vi v16, v16, 2
1532 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1533 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1534 ; RV64-NEXT:    ret
1535   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %idxs
1536   call void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1537   ret void
1540 declare void @llvm.vp.scatter.nxv1f64.nxv1p0(<vscale x 1 x double>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
1542 define void @vpscatter_nxv1f64(<vscale x 1 x double> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1543 ; RV32-LABEL: vpscatter_nxv1f64:
1544 ; RV32:       # %bb.0:
1545 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1546 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1547 ; RV32-NEXT:    ret
1549 ; RV64-LABEL: vpscatter_nxv1f64:
1550 ; RV64:       # %bb.0:
1551 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1552 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1553 ; RV64-NEXT:    ret
1554   call void @llvm.vp.scatter.nxv1f64.nxv1p0(<vscale x 1 x double> %val, <vscale x 1 x ptr> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
1555   ret void
1558 declare void @llvm.vp.scatter.nxv2f64.nxv2p0(<vscale x 2 x double>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
1560 define void @vpscatter_nxv2f64(<vscale x 2 x double> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1561 ; RV32-LABEL: vpscatter_nxv2f64:
1562 ; RV32:       # %bb.0:
1563 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1564 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1565 ; RV32-NEXT:    ret
1567 ; RV64-LABEL: vpscatter_nxv2f64:
1568 ; RV64:       # %bb.0:
1569 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1570 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1571 ; RV64-NEXT:    ret
1572   call void @llvm.vp.scatter.nxv2f64.nxv2p0(<vscale x 2 x double> %val, <vscale x 2 x ptr> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
1573   ret void
1576 declare void @llvm.vp.scatter.nxv4f64.nxv4p0(<vscale x 4 x double>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
1578 define void @vpscatter_nxv4f64(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1579 ; RV32-LABEL: vpscatter_nxv4f64:
1580 ; RV32:       # %bb.0:
1581 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1582 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
1583 ; RV32-NEXT:    ret
1585 ; RV64-LABEL: vpscatter_nxv4f64:
1586 ; RV64:       # %bb.0:
1587 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1588 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1589 ; RV64-NEXT:    ret
1590   call void @llvm.vp.scatter.nxv4f64.nxv4p0(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
1591   ret void
1594 define void @vpscatter_truemask_nxv4f64(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
1595 ; RV32-LABEL: vpscatter_truemask_nxv4f64:
1596 ; RV32:       # %bb.0:
1597 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1598 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12
1599 ; RV32-NEXT:    ret
1601 ; RV64-LABEL: vpscatter_truemask_nxv4f64:
1602 ; RV64:       # %bb.0:
1603 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1604 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
1605 ; RV64-NEXT:    ret
1606   call void @llvm.vp.scatter.nxv4f64.nxv4p0(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> splat (i1 1), i32 %evl)
1607   ret void
1610 declare void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double>, <vscale x 6 x ptr>, <vscale x 6 x i1>, i32)
1612 define void @vpscatter_nxv6f64(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1613 ; RV32-LABEL: vpscatter_nxv6f64:
1614 ; RV32:       # %bb.0:
1615 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1616 ; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t
1617 ; RV32-NEXT:    ret
1619 ; RV64-LABEL: vpscatter_nxv6f64:
1620 ; RV64:       # %bb.0:
1621 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1622 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1623 ; RV64-NEXT:    ret
1624   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1625   ret void
1628 define void @vpscatter_baseidx_nxv6i8_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i8> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1629 ; RV32-LABEL: vpscatter_baseidx_nxv6i8_nxv6f64:
1630 ; RV32:       # %bb.0:
1631 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1632 ; RV32-NEXT:    vsext.vf4 v20, v16
1633 ; RV32-NEXT:    vsll.vi v16, v20, 3
1634 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1635 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1636 ; RV32-NEXT:    ret
1638 ; RV64-LABEL: vpscatter_baseidx_nxv6i8_nxv6f64:
1639 ; RV64:       # %bb.0:
1640 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1641 ; RV64-NEXT:    vsext.vf8 v24, v16
1642 ; RV64-NEXT:    vsll.vi v16, v24, 3
1643 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1644 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1645 ; RV64-NEXT:    ret
1646   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i8> %idxs
1647   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1648   ret void
1651 define void @vpscatter_baseidx_sext_nxv6i8_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i8> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1652 ; RV32-LABEL: vpscatter_baseidx_sext_nxv6i8_nxv6f64:
1653 ; RV32:       # %bb.0:
1654 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1655 ; RV32-NEXT:    vsext.vf4 v20, v16
1656 ; RV32-NEXT:    vsll.vi v16, v20, 3
1657 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1658 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1659 ; RV32-NEXT:    ret
1661 ; RV64-LABEL: vpscatter_baseidx_sext_nxv6i8_nxv6f64:
1662 ; RV64:       # %bb.0:
1663 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1664 ; RV64-NEXT:    vsext.vf8 v24, v16
1665 ; RV64-NEXT:    vsll.vi v16, v24, 3
1666 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1667 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1668 ; RV64-NEXT:    ret
1669   %eidxs = sext <vscale x 6 x i8> %idxs to <vscale x 6 x i64>
1670   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1671   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1672   ret void
1675 define void @vpscatter_baseidx_zext_nxv6i8_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i8> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1676 ; RV32-LABEL: vpscatter_baseidx_zext_nxv6i8_nxv6f64:
1677 ; RV32:       # %bb.0:
1678 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1679 ; RV32-NEXT:    vzext.vf2 v18, v16
1680 ; RV32-NEXT:    vsll.vi v16, v18, 3
1681 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1682 ; RV32-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1683 ; RV32-NEXT:    ret
1685 ; RV64-LABEL: vpscatter_baseidx_zext_nxv6i8_nxv6f64:
1686 ; RV64:       # %bb.0:
1687 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1688 ; RV64-NEXT:    vzext.vf2 v18, v16
1689 ; RV64-NEXT:    vsll.vi v16, v18, 3
1690 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1691 ; RV64-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1692 ; RV64-NEXT:    ret
1693   %eidxs = zext <vscale x 6 x i8> %idxs to <vscale x 6 x i64>
1694   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1695   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1696   ret void
1699 define void @vpscatter_baseidx_nxv6i16_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i16> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1700 ; RV32-LABEL: vpscatter_baseidx_nxv6i16_nxv6f64:
1701 ; RV32:       # %bb.0:
1702 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1703 ; RV32-NEXT:    vsext.vf2 v20, v16
1704 ; RV32-NEXT:    vsll.vi v16, v20, 3
1705 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1706 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1707 ; RV32-NEXT:    ret
1709 ; RV64-LABEL: vpscatter_baseidx_nxv6i16_nxv6f64:
1710 ; RV64:       # %bb.0:
1711 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1712 ; RV64-NEXT:    vsext.vf4 v24, v16
1713 ; RV64-NEXT:    vsll.vi v16, v24, 3
1714 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1715 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1716 ; RV64-NEXT:    ret
1717   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i16> %idxs
1718   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1719   ret void
1722 define void @vpscatter_baseidx_sext_nxv6i16_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i16> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1723 ; RV32-LABEL: vpscatter_baseidx_sext_nxv6i16_nxv6f64:
1724 ; RV32:       # %bb.0:
1725 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1726 ; RV32-NEXT:    vsext.vf2 v20, v16
1727 ; RV32-NEXT:    vsll.vi v16, v20, 3
1728 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1729 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1730 ; RV32-NEXT:    ret
1732 ; RV64-LABEL: vpscatter_baseidx_sext_nxv6i16_nxv6f64:
1733 ; RV64:       # %bb.0:
1734 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1735 ; RV64-NEXT:    vsext.vf4 v24, v16
1736 ; RV64-NEXT:    vsll.vi v16, v24, 3
1737 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1738 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1739 ; RV64-NEXT:    ret
1740   %eidxs = sext <vscale x 6 x i16> %idxs to <vscale x 6 x i64>
1741   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1742   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1743   ret void
1746 define void @vpscatter_baseidx_zext_nxv6i16_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i16> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1747 ; RV32-LABEL: vpscatter_baseidx_zext_nxv6i16_nxv6f64:
1748 ; RV32:       # %bb.0:
1749 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1750 ; RV32-NEXT:    vzext.vf2 v20, v16
1751 ; RV32-NEXT:    vsll.vi v16, v20, 3
1752 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1753 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1754 ; RV32-NEXT:    ret
1756 ; RV64-LABEL: vpscatter_baseidx_zext_nxv6i16_nxv6f64:
1757 ; RV64:       # %bb.0:
1758 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1759 ; RV64-NEXT:    vzext.vf2 v20, v16
1760 ; RV64-NEXT:    vsll.vi v16, v20, 3
1761 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1762 ; RV64-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1763 ; RV64-NEXT:    ret
1764   %eidxs = zext <vscale x 6 x i16> %idxs to <vscale x 6 x i64>
1765   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1766   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1767   ret void
1770 define void @vpscatter_baseidx_nxv6i32_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i32> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1771 ; RV32-LABEL: vpscatter_baseidx_nxv6i32_nxv6f64:
1772 ; RV32:       # %bb.0:
1773 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1774 ; RV32-NEXT:    vsll.vi v16, v16, 3
1775 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1776 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1777 ; RV32-NEXT:    ret
1779 ; RV64-LABEL: vpscatter_baseidx_nxv6i32_nxv6f64:
1780 ; RV64:       # %bb.0:
1781 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1782 ; RV64-NEXT:    vsext.vf2 v24, v16
1783 ; RV64-NEXT:    vsll.vi v16, v24, 3
1784 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1785 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1786 ; RV64-NEXT:    ret
1787   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i32> %idxs
1788   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1789   ret void
1792 define void @vpscatter_baseidx_sext_nxv6i32_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i32> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1793 ; RV32-LABEL: vpscatter_baseidx_sext_nxv6i32_nxv6f64:
1794 ; RV32:       # %bb.0:
1795 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1796 ; RV32-NEXT:    vsll.vi v16, v16, 3
1797 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1798 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1799 ; RV32-NEXT:    ret
1801 ; RV64-LABEL: vpscatter_baseidx_sext_nxv6i32_nxv6f64:
1802 ; RV64:       # %bb.0:
1803 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1804 ; RV64-NEXT:    vsext.vf2 v24, v16
1805 ; RV64-NEXT:    vsll.vi v16, v24, 3
1806 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1807 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1808 ; RV64-NEXT:    ret
1809   %eidxs = sext <vscale x 6 x i32> %idxs to <vscale x 6 x i64>
1810   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1811   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1812   ret void
1815 define void @vpscatter_baseidx_zext_nxv6i32_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i32> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1816 ; RV32-LABEL: vpscatter_baseidx_zext_nxv6i32_nxv6f64:
1817 ; RV32:       # %bb.0:
1818 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1819 ; RV32-NEXT:    vsll.vi v16, v16, 3
1820 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1821 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1822 ; RV32-NEXT:    ret
1824 ; RV64-LABEL: vpscatter_baseidx_zext_nxv6i32_nxv6f64:
1825 ; RV64:       # %bb.0:
1826 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1827 ; RV64-NEXT:    vzext.vf2 v24, v16
1828 ; RV64-NEXT:    vsll.vi v16, v24, 3
1829 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1830 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1831 ; RV64-NEXT:    ret
1832   %eidxs = zext <vscale x 6 x i32> %idxs to <vscale x 6 x i64>
1833   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1834   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1835   ret void
1838 define void @vpscatter_baseidx_nxv6f64(<vscale x 6 x double> %val, ptr %base, <vscale x 6 x i64> %idxs, <vscale x 6 x i1> %m, i32 zeroext %evl) {
1839 ; RV32-LABEL: vpscatter_baseidx_nxv6f64:
1840 ; RV32:       # %bb.0:
1841 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1842 ; RV32-NEXT:    vnsrl.wi v24, v16, 0
1843 ; RV32-NEXT:    vsll.vi v16, v24, 3
1844 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1845 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1846 ; RV32-NEXT:    ret
1848 ; RV64-LABEL: vpscatter_baseidx_nxv6f64:
1849 ; RV64:       # %bb.0:
1850 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1851 ; RV64-NEXT:    vsll.vi v16, v16, 3
1852 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1853 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1854 ; RV64-NEXT:    ret
1855   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %idxs
1856   call void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double> %val, <vscale x 6 x ptr> %ptrs, <vscale x 6 x i1> %m, i32 %evl)
1857   ret void
1860 declare void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
1862 define void @vpscatter_nxv8f64(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1863 ; RV32-LABEL: vpscatter_nxv8f64:
1864 ; RV32:       # %bb.0:
1865 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1866 ; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t
1867 ; RV32-NEXT:    ret
1869 ; RV64-LABEL: vpscatter_nxv8f64:
1870 ; RV64:       # %bb.0:
1871 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1872 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1873 ; RV64-NEXT:    ret
1874   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1875   ret void
1878 define void @vpscatter_baseidx_nxv8i8_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1879 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8f64:
1880 ; RV32:       # %bb.0:
1881 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1882 ; RV32-NEXT:    vsext.vf4 v20, v16
1883 ; RV32-NEXT:    vsll.vi v16, v20, 3
1884 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1885 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1886 ; RV32-NEXT:    ret
1888 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8f64:
1889 ; RV64:       # %bb.0:
1890 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1891 ; RV64-NEXT:    vsext.vf8 v24, v16
1892 ; RV64-NEXT:    vsll.vi v16, v24, 3
1893 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1894 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1895 ; RV64-NEXT:    ret
1896   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i8> %idxs
1897   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1898   ret void
1901 define void @vpscatter_baseidx_sext_nxv8i8_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1902 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f64:
1903 ; RV32:       # %bb.0:
1904 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1905 ; RV32-NEXT:    vsext.vf4 v20, v16
1906 ; RV32-NEXT:    vsll.vi v16, v20, 3
1907 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1908 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1909 ; RV32-NEXT:    ret
1911 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f64:
1912 ; RV64:       # %bb.0:
1913 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1914 ; RV64-NEXT:    vsext.vf8 v24, v16
1915 ; RV64-NEXT:    vsll.vi v16, v24, 3
1916 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1917 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1918 ; RV64-NEXT:    ret
1919   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
1920   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1921   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1922   ret void
1925 define void @vpscatter_baseidx_zext_nxv8i8_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1926 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f64:
1927 ; RV32:       # %bb.0:
1928 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1929 ; RV32-NEXT:    vzext.vf2 v18, v16
1930 ; RV32-NEXT:    vsll.vi v16, v18, 3
1931 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1932 ; RV32-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1933 ; RV32-NEXT:    ret
1935 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f64:
1936 ; RV64:       # %bb.0:
1937 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1938 ; RV64-NEXT:    vzext.vf2 v18, v16
1939 ; RV64-NEXT:    vsll.vi v16, v18, 3
1940 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1941 ; RV64-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1942 ; RV64-NEXT:    ret
1943   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
1944   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1945   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1946   ret void
1949 define void @vpscatter_baseidx_nxv8i16_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1950 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8f64:
1951 ; RV32:       # %bb.0:
1952 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1953 ; RV32-NEXT:    vsext.vf2 v20, v16
1954 ; RV32-NEXT:    vsll.vi v16, v20, 3
1955 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1956 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1957 ; RV32-NEXT:    ret
1959 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8f64:
1960 ; RV64:       # %bb.0:
1961 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1962 ; RV64-NEXT:    vsext.vf4 v24, v16
1963 ; RV64-NEXT:    vsll.vi v16, v24, 3
1964 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1965 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1966 ; RV64-NEXT:    ret
1967   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i16> %idxs
1968   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1969   ret void
1972 define void @vpscatter_baseidx_sext_nxv8i16_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1973 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f64:
1974 ; RV32:       # %bb.0:
1975 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1976 ; RV32-NEXT:    vsext.vf2 v20, v16
1977 ; RV32-NEXT:    vsll.vi v16, v20, 3
1978 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1979 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1980 ; RV32-NEXT:    ret
1982 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f64:
1983 ; RV64:       # %bb.0:
1984 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1985 ; RV64-NEXT:    vsext.vf4 v24, v16
1986 ; RV64-NEXT:    vsll.vi v16, v24, 3
1987 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1988 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1989 ; RV64-NEXT:    ret
1990   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1991   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1992   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1993   ret void
1996 define void @vpscatter_baseidx_zext_nxv8i16_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1997 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f64:
1998 ; RV32:       # %bb.0:
1999 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
2000 ; RV32-NEXT:    vzext.vf2 v20, v16
2001 ; RV32-NEXT:    vsll.vi v16, v20, 3
2002 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2003 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
2004 ; RV32-NEXT:    ret
2006 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f64:
2007 ; RV64:       # %bb.0:
2008 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
2009 ; RV64-NEXT:    vzext.vf2 v20, v16
2010 ; RV64-NEXT:    vsll.vi v16, v20, 3
2011 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2012 ; RV64-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
2013 ; RV64-NEXT:    ret
2014   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
2015   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
2016   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
2017   ret void
2020 define void @vpscatter_baseidx_nxv8i32_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
2021 ; RV32-LABEL: vpscatter_baseidx_nxv8i32_nxv8f64:
2022 ; RV32:       # %bb.0:
2023 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
2024 ; RV32-NEXT:    vsll.vi v16, v16, 3
2025 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2026 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
2027 ; RV32-NEXT:    ret
2029 ; RV64-LABEL: vpscatter_baseidx_nxv8i32_nxv8f64:
2030 ; RV64:       # %bb.0:
2031 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
2032 ; RV64-NEXT:    vsext.vf2 v24, v16
2033 ; RV64-NEXT:    vsll.vi v16, v24, 3
2034 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2035 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2036 ; RV64-NEXT:    ret
2037   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i32> %idxs
2038   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
2039   ret void
2042 define void @vpscatter_baseidx_sext_nxv8i32_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
2043 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i32_nxv8f64:
2044 ; RV32:       # %bb.0:
2045 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
2046 ; RV32-NEXT:    vsll.vi v16, v16, 3
2047 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2048 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
2049 ; RV32-NEXT:    ret
2051 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i32_nxv8f64:
2052 ; RV64:       # %bb.0:
2053 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
2054 ; RV64-NEXT:    vsext.vf2 v24, v16
2055 ; RV64-NEXT:    vsll.vi v16, v24, 3
2056 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2057 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2058 ; RV64-NEXT:    ret
2059   %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
2060   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
2061   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
2062   ret void
2065 define void @vpscatter_baseidx_zext_nxv8i32_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
2066 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i32_nxv8f64:
2067 ; RV32:       # %bb.0:
2068 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
2069 ; RV32-NEXT:    vsll.vi v16, v16, 3
2070 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2071 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
2072 ; RV32-NEXT:    ret
2074 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i32_nxv8f64:
2075 ; RV64:       # %bb.0:
2076 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
2077 ; RV64-NEXT:    vzext.vf2 v24, v16
2078 ; RV64-NEXT:    vsll.vi v16, v24, 3
2079 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2080 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2081 ; RV64-NEXT:    ret
2082   %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
2083   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
2084   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
2085   ret void
2088 define void @vpscatter_baseidx_nxv8f64(<vscale x 8 x double> %val, ptr %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
2089 ; RV32-LABEL: vpscatter_baseidx_nxv8f64:
2090 ; RV32:       # %bb.0:
2091 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
2092 ; RV32-NEXT:    vnsrl.wi v24, v16, 0
2093 ; RV32-NEXT:    vsll.vi v16, v24, 3
2094 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2095 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
2096 ; RV32-NEXT:    ret
2098 ; RV64-LABEL: vpscatter_baseidx_nxv8f64:
2099 ; RV64:       # %bb.0:
2100 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
2101 ; RV64-NEXT:    vsll.vi v16, v16, 3
2102 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2103 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2104 ; RV64-NEXT:    ret
2105   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %idxs
2106   call void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double> %val, <vscale x 8 x ptr> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
2107   ret void
2110 declare void @llvm.vp.scatter.nxv16f64.nxv16p0(<vscale x 16 x double>, <vscale x 16 x ptr>, <vscale x 16 x i1>, i32)
2112 define void @vpscatter_nxv16f64(<vscale x 16 x double> %val, <vscale x 16 x ptr> %ptrs, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2113 ; RV32-LABEL: vpscatter_nxv16f64:
2114 ; RV32:       # %bb.0:
2115 ; RV32-NEXT:    vl8re32.v v24, (a0)
2116 ; RV32-NEXT:    csrr a0, vlenb
2117 ; RV32-NEXT:    mv a2, a1
2118 ; RV32-NEXT:    bltu a1, a0, .LBB99_2
2119 ; RV32-NEXT:  # %bb.1:
2120 ; RV32-NEXT:    mv a2, a0
2121 ; RV32-NEXT:  .LBB99_2:
2122 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2123 ; RV32-NEXT:    vsoxei32.v v8, (zero), v24, v0.t
2124 ; RV32-NEXT:    sub a2, a1, a0
2125 ; RV32-NEXT:    sltu a1, a1, a2
2126 ; RV32-NEXT:    addi a1, a1, -1
2127 ; RV32-NEXT:    srli a0, a0, 3
2128 ; RV32-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2129 ; RV32-NEXT:    vslidedown.vx v0, v0, a0
2130 ; RV32-NEXT:    and a1, a1, a2
2131 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2132 ; RV32-NEXT:    vsoxei32.v v16, (zero), v28, v0.t
2133 ; RV32-NEXT:    ret
2135 ; RV64-LABEL: vpscatter_nxv16f64:
2136 ; RV64:       # %bb.0:
2137 ; RV64-NEXT:    addi sp, sp, -16
2138 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2139 ; RV64-NEXT:    csrr a1, vlenb
2140 ; RV64-NEXT:    slli a1, a1, 3
2141 ; RV64-NEXT:    sub sp, sp, a1
2142 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
2143 ; RV64-NEXT:    csrr a1, vlenb
2144 ; RV64-NEXT:    slli a3, a1, 3
2145 ; RV64-NEXT:    add a3, a0, a3
2146 ; RV64-NEXT:    vl8re64.v v24, (a3)
2147 ; RV64-NEXT:    addi a3, sp, 16
2148 ; RV64-NEXT:    vs8r.v v24, (a3) # Unknown-size Folded Spill
2149 ; RV64-NEXT:    vl8re64.v v24, (a0)
2150 ; RV64-NEXT:    mv a0, a2
2151 ; RV64-NEXT:    bltu a2, a1, .LBB99_2
2152 ; RV64-NEXT:  # %bb.1:
2153 ; RV64-NEXT:    mv a0, a1
2154 ; RV64-NEXT:  .LBB99_2:
2155 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2156 ; RV64-NEXT:    vsoxei64.v v8, (zero), v24, v0.t
2157 ; RV64-NEXT:    sub a0, a2, a1
2158 ; RV64-NEXT:    sltu a2, a2, a0
2159 ; RV64-NEXT:    addi a2, a2, -1
2160 ; RV64-NEXT:    srli a1, a1, 3
2161 ; RV64-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2162 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2163 ; RV64-NEXT:    and a0, a2, a0
2164 ; RV64-NEXT:    addi a1, sp, 16
2165 ; RV64-NEXT:    vl8r.v v8, (a1) # Unknown-size Folded Reload
2166 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2167 ; RV64-NEXT:    vsoxei64.v v16, (zero), v8, v0.t
2168 ; RV64-NEXT:    csrr a0, vlenb
2169 ; RV64-NEXT:    slli a0, a0, 3
2170 ; RV64-NEXT:    add sp, sp, a0
2171 ; RV64-NEXT:    addi sp, sp, 16
2172 ; RV64-NEXT:    ret
2173   call void @llvm.vp.scatter.nxv16f64.nxv16p0(<vscale x 16 x double> %val, <vscale x 16 x ptr> %ptrs, <vscale x 16 x i1> %m, i32 %evl)
2174   ret void
2177 define void @vpscatter_baseidx_nxv16i16_nxv16f64(<vscale x 16 x double> %val, ptr %base, <vscale x 16 x i16> %idxs, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2178 ; RV32-LABEL: vpscatter_baseidx_nxv16i16_nxv16f64:
2179 ; RV32:       # %bb.0:
2180 ; RV32-NEXT:    vl4re16.v v4, (a1)
2181 ; RV32-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2182 ; RV32-NEXT:    vsext.vf2 v24, v4
2183 ; RV32-NEXT:    csrr a1, vlenb
2184 ; RV32-NEXT:    vsll.vi v24, v24, 3
2185 ; RV32-NEXT:    mv a3, a2
2186 ; RV32-NEXT:    bltu a2, a1, .LBB100_2
2187 ; RV32-NEXT:  # %bb.1:
2188 ; RV32-NEXT:    mv a3, a1
2189 ; RV32-NEXT:  .LBB100_2:
2190 ; RV32-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2191 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2192 ; RV32-NEXT:    sub a3, a2, a1
2193 ; RV32-NEXT:    sltu a2, a2, a3
2194 ; RV32-NEXT:    addi a2, a2, -1
2195 ; RV32-NEXT:    srli a1, a1, 3
2196 ; RV32-NEXT:    vsetvli a4, zero, e8, mf4, ta, ma
2197 ; RV32-NEXT:    vslidedown.vx v0, v0, a1
2198 ; RV32-NEXT:    and a2, a2, a3
2199 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2200 ; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2201 ; RV32-NEXT:    ret
2203 ; RV64-LABEL: vpscatter_baseidx_nxv16i16_nxv16f64:
2204 ; RV64:       # %bb.0:
2205 ; RV64-NEXT:    addi sp, sp, -16
2206 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2207 ; RV64-NEXT:    csrr a3, vlenb
2208 ; RV64-NEXT:    slli a3, a3, 4
2209 ; RV64-NEXT:    sub sp, sp, a3
2210 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
2211 ; RV64-NEXT:    vl4re16.v v24, (a1)
2212 ; RV64-NEXT:    csrr a1, vlenb
2213 ; RV64-NEXT:    slli a1, a1, 3
2214 ; RV64-NEXT:    add a1, sp, a1
2215 ; RV64-NEXT:    addi a1, a1, 16
2216 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2217 ; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
2218 ; RV64-NEXT:    vsext.vf4 v16, v26
2219 ; RV64-NEXT:    vsll.vi v16, v16, 3
2220 ; RV64-NEXT:    addi a1, sp, 16
2221 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2222 ; RV64-NEXT:    vsext.vf4 v16, v24
2223 ; RV64-NEXT:    csrr a1, vlenb
2224 ; RV64-NEXT:    vsll.vi v24, v16, 3
2225 ; RV64-NEXT:    mv a3, a2
2226 ; RV64-NEXT:    bltu a2, a1, .LBB100_2
2227 ; RV64-NEXT:  # %bb.1:
2228 ; RV64-NEXT:    mv a3, a1
2229 ; RV64-NEXT:  .LBB100_2:
2230 ; RV64-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2231 ; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t
2232 ; RV64-NEXT:    sub a3, a2, a1
2233 ; RV64-NEXT:    sltu a2, a2, a3
2234 ; RV64-NEXT:    addi a2, a2, -1
2235 ; RV64-NEXT:    srli a1, a1, 3
2236 ; RV64-NEXT:    vsetvli a4, zero, e8, mf4, ta, ma
2237 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2238 ; RV64-NEXT:    and a2, a2, a3
2239 ; RV64-NEXT:    csrr a1, vlenb
2240 ; RV64-NEXT:    slli a1, a1, 3
2241 ; RV64-NEXT:    add a1, sp, a1
2242 ; RV64-NEXT:    addi a1, a1, 16
2243 ; RV64-NEXT:    vl8r.v v8, (a1) # Unknown-size Folded Reload
2244 ; RV64-NEXT:    addi a1, sp, 16
2245 ; RV64-NEXT:    vl8r.v v16, (a1) # Unknown-size Folded Reload
2246 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2247 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2248 ; RV64-NEXT:    csrr a0, vlenb
2249 ; RV64-NEXT:    slli a0, a0, 4
2250 ; RV64-NEXT:    add sp, sp, a0
2251 ; RV64-NEXT:    addi sp, sp, 16
2252 ; RV64-NEXT:    ret
2253   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i16> %idxs
2254   call void @llvm.vp.scatter.nxv16f64.nxv16p0(<vscale x 16 x double> %val, <vscale x 16 x ptr> %ptrs, <vscale x 16 x i1> %m, i32 %evl)
2255   ret void
2258 define void @vpscatter_baseidx_sext_nxv16i16_nxv16f64(<vscale x 16 x double> %val, ptr %base, <vscale x 16 x i16> %idxs, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2259 ; RV32-LABEL: vpscatter_baseidx_sext_nxv16i16_nxv16f64:
2260 ; RV32:       # %bb.0:
2261 ; RV32-NEXT:    vl4re16.v v4, (a1)
2262 ; RV32-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2263 ; RV32-NEXT:    vsext.vf2 v24, v4
2264 ; RV32-NEXT:    csrr a1, vlenb
2265 ; RV32-NEXT:    vsll.vi v24, v24, 3
2266 ; RV32-NEXT:    mv a3, a2
2267 ; RV32-NEXT:    bltu a2, a1, .LBB101_2
2268 ; RV32-NEXT:  # %bb.1:
2269 ; RV32-NEXT:    mv a3, a1
2270 ; RV32-NEXT:  .LBB101_2:
2271 ; RV32-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2272 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2273 ; RV32-NEXT:    sub a3, a2, a1
2274 ; RV32-NEXT:    sltu a2, a2, a3
2275 ; RV32-NEXT:    addi a2, a2, -1
2276 ; RV32-NEXT:    srli a1, a1, 3
2277 ; RV32-NEXT:    vsetvli a4, zero, e8, mf4, ta, ma
2278 ; RV32-NEXT:    vslidedown.vx v0, v0, a1
2279 ; RV32-NEXT:    and a2, a2, a3
2280 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2281 ; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2282 ; RV32-NEXT:    ret
2284 ; RV64-LABEL: vpscatter_baseidx_sext_nxv16i16_nxv16f64:
2285 ; RV64:       # %bb.0:
2286 ; RV64-NEXT:    addi sp, sp, -16
2287 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2288 ; RV64-NEXT:    csrr a3, vlenb
2289 ; RV64-NEXT:    li a4, 10
2290 ; RV64-NEXT:    mul a3, a3, a4
2291 ; RV64-NEXT:    sub sp, sp, a3
2292 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x0a, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 10 * vlenb
2293 ; RV64-NEXT:    vl4re16.v v24, (a1)
2294 ; RV64-NEXT:    addi a1, sp, 16
2295 ; RV64-NEXT:    vs1r.v v0, (a1) # Unknown-size Folded Spill
2296 ; RV64-NEXT:    csrr a1, vlenb
2297 ; RV64-NEXT:    add a1, sp, a1
2298 ; RV64-NEXT:    addi a1, a1, 16
2299 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2300 ; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
2301 ; RV64-NEXT:    vsext.vf4 v0, v24
2302 ; RV64-NEXT:    vsext.vf4 v16, v26
2303 ; RV64-NEXT:    vsll.vi v16, v16, 3
2304 ; RV64-NEXT:    csrr a1, vlenb
2305 ; RV64-NEXT:    vsll.vi v24, v0, 3
2306 ; RV64-NEXT:    mv a3, a2
2307 ; RV64-NEXT:    bltu a2, a1, .LBB101_2
2308 ; RV64-NEXT:  # %bb.1:
2309 ; RV64-NEXT:    mv a3, a1
2310 ; RV64-NEXT:  .LBB101_2:
2311 ; RV64-NEXT:    addi a4, sp, 16
2312 ; RV64-NEXT:    vl1r.v v0, (a4) # Unknown-size Folded Reload
2313 ; RV64-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2314 ; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t
2315 ; RV64-NEXT:    sub a3, a2, a1
2316 ; RV64-NEXT:    sltu a2, a2, a3
2317 ; RV64-NEXT:    addi a2, a2, -1
2318 ; RV64-NEXT:    srli a1, a1, 3
2319 ; RV64-NEXT:    vsetvli a4, zero, e8, mf4, ta, ma
2320 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2321 ; RV64-NEXT:    and a2, a2, a3
2322 ; RV64-NEXT:    csrr a1, vlenb
2323 ; RV64-NEXT:    add a1, sp, a1
2324 ; RV64-NEXT:    addi a1, a1, 16
2325 ; RV64-NEXT:    vl8r.v v8, (a1) # Unknown-size Folded Reload
2326 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2327 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2328 ; RV64-NEXT:    csrr a0, vlenb
2329 ; RV64-NEXT:    li a1, 10
2330 ; RV64-NEXT:    mul a0, a0, a1
2331 ; RV64-NEXT:    add sp, sp, a0
2332 ; RV64-NEXT:    addi sp, sp, 16
2333 ; RV64-NEXT:    ret
2334   %eidxs = sext <vscale x 16 x i16> %idxs to <vscale x 16 x i64>
2335   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i64> %eidxs
2336   call void @llvm.vp.scatter.nxv16f64.nxv16p0(<vscale x 16 x double> %val, <vscale x 16 x ptr> %ptrs, <vscale x 16 x i1> %m, i32 %evl)
2337   ret void
2340 define void @vpscatter_baseidx_zext_nxv16i16_nxv16f64(<vscale x 16 x double> %val, ptr %base, <vscale x 16 x i16> %idxs, <vscale x 16 x i1> %m, i32 zeroext %evl) {
2341 ; RV32-LABEL: vpscatter_baseidx_zext_nxv16i16_nxv16f64:
2342 ; RV32:       # %bb.0:
2343 ; RV32-NEXT:    vl4re16.v v4, (a1)
2344 ; RV32-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2345 ; RV32-NEXT:    vzext.vf2 v24, v4
2346 ; RV32-NEXT:    csrr a1, vlenb
2347 ; RV32-NEXT:    vsll.vi v24, v24, 3
2348 ; RV32-NEXT:    mv a3, a2
2349 ; RV32-NEXT:    bltu a2, a1, .LBB102_2
2350 ; RV32-NEXT:  # %bb.1:
2351 ; RV32-NEXT:    mv a3, a1
2352 ; RV32-NEXT:  .LBB102_2:
2353 ; RV32-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2354 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2355 ; RV32-NEXT:    sub a3, a2, a1
2356 ; RV32-NEXT:    sltu a2, a2, a3
2357 ; RV32-NEXT:    addi a2, a2, -1
2358 ; RV32-NEXT:    srli a1, a1, 3
2359 ; RV32-NEXT:    vsetvli a4, zero, e8, mf4, ta, ma
2360 ; RV32-NEXT:    vslidedown.vx v0, v0, a1
2361 ; RV32-NEXT:    and a2, a2, a3
2362 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2363 ; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2364 ; RV32-NEXT:    ret
2366 ; RV64-LABEL: vpscatter_baseidx_zext_nxv16i16_nxv16f64:
2367 ; RV64:       # %bb.0:
2368 ; RV64-NEXT:    vl4re16.v v4, (a1)
2369 ; RV64-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2370 ; RV64-NEXT:    vzext.vf2 v24, v4
2371 ; RV64-NEXT:    csrr a1, vlenb
2372 ; RV64-NEXT:    vsll.vi v24, v24, 3
2373 ; RV64-NEXT:    mv a3, a2
2374 ; RV64-NEXT:    bltu a2, a1, .LBB102_2
2375 ; RV64-NEXT:  # %bb.1:
2376 ; RV64-NEXT:    mv a3, a1
2377 ; RV64-NEXT:  .LBB102_2:
2378 ; RV64-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2379 ; RV64-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2380 ; RV64-NEXT:    sub a3, a2, a1
2381 ; RV64-NEXT:    sltu a2, a2, a3
2382 ; RV64-NEXT:    addi a2, a2, -1
2383 ; RV64-NEXT:    srli a1, a1, 3
2384 ; RV64-NEXT:    vsetvli a4, zero, e8, mf4, ta, ma
2385 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2386 ; RV64-NEXT:    and a2, a2, a3
2387 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2388 ; RV64-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2389 ; RV64-NEXT:    ret
2390   %eidxs = zext <vscale x 16 x i16> %idxs to <vscale x 16 x i64>
2391   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i64> %eidxs
2392   call void @llvm.vp.scatter.nxv16f64.nxv16p0(<vscale x 16 x double> %val, <vscale x 16 x ptr> %ptrs, <vscale x 16 x i1> %m, i32 %evl)
2393   ret void