[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vpscatter-sdnode.ll
blob984ac65b1f2189a7f2538306ce0669bd3454225e
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   %mhead = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
149   %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
150   call void @llvm.vp.scatter.nxv4i8.nxv4p0(<vscale x 4 x i8> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
151   ret void
154 declare void @llvm.vp.scatter.nxv8i8.nxv8p0(<vscale x 8 x i8>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
156 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) {
157 ; RV32-LABEL: vpscatter_nxv8i8:
158 ; RV32:       # %bb.0:
159 ; RV32-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
160 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
161 ; RV32-NEXT:    ret
163 ; RV64-LABEL: vpscatter_nxv8i8:
164 ; RV64:       # %bb.0:
165 ; RV64-NEXT:    vsetvli zero, a0, e8, m1, ta, ma
166 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
167 ; RV64-NEXT:    ret
168   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)
169   ret void
172 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) {
173 ; RV32-LABEL: vpscatter_baseidx_nxv8i8:
174 ; RV32:       # %bb.0:
175 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
176 ; RV32-NEXT:    vsext.vf4 v12, v9
177 ; RV32-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
178 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
179 ; RV32-NEXT:    ret
181 ; RV64-LABEL: vpscatter_baseidx_nxv8i8:
182 ; RV64:       # %bb.0:
183 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
184 ; RV64-NEXT:    vsext.vf8 v16, v9
185 ; RV64-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
186 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
187 ; RV64-NEXT:    ret
188   %ptrs = getelementptr inbounds i8, ptr %base, <vscale x 8 x i8> %idxs
189   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)
190   ret void
193 declare void @llvm.vp.scatter.nxv1i16.nxv1p0(<vscale x 1 x i16>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
195 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) {
196 ; RV32-LABEL: vpscatter_nxv1i16:
197 ; RV32:       # %bb.0:
198 ; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
199 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
200 ; RV32-NEXT:    ret
202 ; RV64-LABEL: vpscatter_nxv1i16:
203 ; RV64:       # %bb.0:
204 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
205 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
206 ; RV64-NEXT:    ret
207   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)
208   ret void
211 declare void @llvm.vp.scatter.nxv2i16.nxv2p0(<vscale x 2 x i16>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
213 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) {
214 ; RV32-LABEL: vpscatter_nxv2i16:
215 ; RV32:       # %bb.0:
216 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
217 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
218 ; RV32-NEXT:    ret
220 ; RV64-LABEL: vpscatter_nxv2i16:
221 ; RV64:       # %bb.0:
222 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
223 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
224 ; RV64-NEXT:    ret
225   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)
226   ret void
229 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) {
230 ; RV32-LABEL: vpscatter_nxv2i32_truncstore_nxv2i16:
231 ; RV32:       # %bb.0:
232 ; RV32-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
233 ; RV32-NEXT:    vnsrl.wi v8, v8, 0
234 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
235 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
236 ; RV32-NEXT:    ret
238 ; RV64-LABEL: vpscatter_nxv2i32_truncstore_nxv2i16:
239 ; RV64:       # %bb.0:
240 ; RV64-NEXT:    vsetvli a1, zero, e16, mf2, ta, ma
241 ; RV64-NEXT:    vnsrl.wi v8, v8, 0
242 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
243 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
244 ; RV64-NEXT:    ret
245   %tval = trunc <vscale x 2 x i32> %val to <vscale x 2 x i16>
246   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)
247   ret void
250 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) {
251 ; RV32-LABEL: vpscatter_nxv2i64_truncstore_nxv2i16:
252 ; RV32:       # %bb.0:
253 ; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
254 ; RV32-NEXT:    vnsrl.wi v11, v8, 0
255 ; RV32-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
256 ; RV32-NEXT:    vnsrl.wi v8, v11, 0
257 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
258 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
259 ; RV32-NEXT:    ret
261 ; RV64-LABEL: vpscatter_nxv2i64_truncstore_nxv2i16:
262 ; RV64:       # %bb.0:
263 ; RV64-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
264 ; RV64-NEXT:    vnsrl.wi v12, v8, 0
265 ; RV64-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
266 ; RV64-NEXT:    vnsrl.wi v8, v12, 0
267 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
268 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
269 ; RV64-NEXT:    ret
270   %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i16>
271   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)
272   ret void
275 declare void @llvm.vp.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
277 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) {
278 ; RV32-LABEL: vpscatter_nxv4i16:
279 ; RV32:       # %bb.0:
280 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
281 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
282 ; RV32-NEXT:    ret
284 ; RV64-LABEL: vpscatter_nxv4i16:
285 ; RV64:       # %bb.0:
286 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
287 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
288 ; RV64-NEXT:    ret
289   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)
290   ret void
293 define void @vpscatter_truemask_nxv4i16(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
294 ; RV32-LABEL: vpscatter_truemask_nxv4i16:
295 ; RV32:       # %bb.0:
296 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
297 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
298 ; RV32-NEXT:    ret
300 ; RV64-LABEL: vpscatter_truemask_nxv4i16:
301 ; RV64:       # %bb.0:
302 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
303 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
304 ; RV64-NEXT:    ret
305   %mhead = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
306   %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
307   call void @llvm.vp.scatter.nxv4i16.nxv4p0(<vscale x 4 x i16> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
308   ret void
311 declare void @llvm.vp.scatter.nxv8i16.nxv8p0(<vscale x 8 x i16>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
313 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) {
314 ; RV32-LABEL: vpscatter_nxv8i16:
315 ; RV32:       # %bb.0:
316 ; RV32-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
317 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
318 ; RV32-NEXT:    ret
320 ; RV64-LABEL: vpscatter_nxv8i16:
321 ; RV64:       # %bb.0:
322 ; RV64-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
323 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
324 ; RV64-NEXT:    ret
325   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)
326   ret void
329 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) {
330 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8i16:
331 ; RV32:       # %bb.0:
332 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
333 ; RV32-NEXT:    vsext.vf4 v12, v10
334 ; RV32-NEXT:    vadd.vv v12, v12, v12
335 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
336 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
337 ; RV32-NEXT:    ret
339 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8i16:
340 ; RV64:       # %bb.0:
341 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
342 ; RV64-NEXT:    vsext.vf8 v16, v10
343 ; RV64-NEXT:    vadd.vv v16, v16, v16
344 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
345 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
346 ; RV64-NEXT:    ret
347   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i8> %idxs
348   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)
349   ret void
352 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) {
353 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i16:
354 ; RV32:       # %bb.0:
355 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
356 ; RV32-NEXT:    vsext.vf4 v12, v10
357 ; RV32-NEXT:    vadd.vv v12, v12, v12
358 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
359 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
360 ; RV32-NEXT:    ret
362 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i16:
363 ; RV64:       # %bb.0:
364 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
365 ; RV64-NEXT:    vsext.vf8 v16, v10
366 ; RV64-NEXT:    vadd.vv v16, v16, v16
367 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
368 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
369 ; RV64-NEXT:    ret
370   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
371   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %eidxs
372   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)
373   ret void
376 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) {
377 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i16:
378 ; RV32:       # %bb.0:
379 ; RV32-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
380 ; RV32-NEXT:    vwaddu.vv v12, v10, v10
381 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
382 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
383 ; RV32-NEXT:    ret
385 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i16:
386 ; RV64:       # %bb.0:
387 ; RV64-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
388 ; RV64-NEXT:    vwaddu.vv v12, v10, v10
389 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
390 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
391 ; RV64-NEXT:    ret
392   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
393   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %eidxs
394   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)
395   ret void
398 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) {
399 ; RV32-LABEL: vpscatter_baseidx_nxv8i16:
400 ; RV32:       # %bb.0:
401 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
402 ; RV32-NEXT:    vwadd.vv v12, v10, v10
403 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
404 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
405 ; RV32-NEXT:    ret
407 ; RV64-LABEL: vpscatter_baseidx_nxv8i16:
408 ; RV64:       # %bb.0:
409 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
410 ; RV64-NEXT:    vsext.vf4 v16, v10
411 ; RV64-NEXT:    vadd.vv v16, v16, v16
412 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
413 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
414 ; RV64-NEXT:    ret
415   %ptrs = getelementptr inbounds i16, ptr %base, <vscale x 8 x i16> %idxs
416   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)
417   ret void
420 declare void @llvm.vp.scatter.nxv1i32.nxv1p0(<vscale x 1 x i32>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
422 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) {
423 ; RV32-LABEL: vpscatter_nxv1i32:
424 ; RV32:       # %bb.0:
425 ; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
426 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
427 ; RV32-NEXT:    ret
429 ; RV64-LABEL: vpscatter_nxv1i32:
430 ; RV64:       # %bb.0:
431 ; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
432 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
433 ; RV64-NEXT:    ret
434   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)
435   ret void
438 declare void @llvm.vp.scatter.nxv2i32.nxv2p0(<vscale x 2 x i32>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
440 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) {
441 ; RV32-LABEL: vpscatter_nxv2i32:
442 ; RV32:       # %bb.0:
443 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
444 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
445 ; RV32-NEXT:    ret
447 ; RV64-LABEL: vpscatter_nxv2i32:
448 ; RV64:       # %bb.0:
449 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
450 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
451 ; RV64-NEXT:    ret
452   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)
453   ret void
456 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) {
457 ; RV32-LABEL: vpscatter_nxv2i64_truncstore_nxv2i32:
458 ; RV32:       # %bb.0:
459 ; RV32-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
460 ; RV32-NEXT:    vnsrl.wi v11, v8, 0
461 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
462 ; RV32-NEXT:    vsoxei32.v v11, (zero), v10, v0.t
463 ; RV32-NEXT:    ret
465 ; RV64-LABEL: vpscatter_nxv2i64_truncstore_nxv2i32:
466 ; RV64:       # %bb.0:
467 ; RV64-NEXT:    vsetvli a1, zero, e32, m1, ta, ma
468 ; RV64-NEXT:    vnsrl.wi v12, v8, 0
469 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
470 ; RV64-NEXT:    vsoxei64.v v12, (zero), v10, v0.t
471 ; RV64-NEXT:    ret
472   %tval = trunc <vscale x 2 x i64> %val to <vscale x 2 x i32>
473   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)
474   ret void
477 declare void @llvm.vp.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
479 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) {
480 ; RV32-LABEL: vpscatter_nxv4i32:
481 ; RV32:       # %bb.0:
482 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
483 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
484 ; RV32-NEXT:    ret
486 ; RV64-LABEL: vpscatter_nxv4i32:
487 ; RV64:       # %bb.0:
488 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
489 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
490 ; RV64-NEXT:    ret
491   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)
492   ret void
495 define void @vpscatter_truemask_nxv4i32(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
496 ; RV32-LABEL: vpscatter_truemask_nxv4i32:
497 ; RV32:       # %bb.0:
498 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
499 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
500 ; RV32-NEXT:    ret
502 ; RV64-LABEL: vpscatter_truemask_nxv4i32:
503 ; RV64:       # %bb.0:
504 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
505 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
506 ; RV64-NEXT:    ret
507   %mhead = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
508   %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
509   call void @llvm.vp.scatter.nxv4i32.nxv4p0(<vscale x 4 x i32> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
510   ret void
513 declare void @llvm.vp.scatter.nxv8i32.nxv8p0(<vscale x 8 x i32>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
515 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) {
516 ; RV32-LABEL: vpscatter_nxv8i32:
517 ; RV32:       # %bb.0:
518 ; RV32-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
519 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
520 ; RV32-NEXT:    ret
522 ; RV64-LABEL: vpscatter_nxv8i32:
523 ; RV64:       # %bb.0:
524 ; RV64-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
525 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
526 ; RV64-NEXT:    ret
527   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)
528   ret void
531 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) {
532 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8i32:
533 ; RV32:       # %bb.0:
534 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
535 ; RV32-NEXT:    vsext.vf4 v16, v12
536 ; RV32-NEXT:    vsll.vi v12, v16, 2
537 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
538 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
539 ; RV32-NEXT:    ret
541 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8i32:
542 ; RV64:       # %bb.0:
543 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
544 ; RV64-NEXT:    vsext.vf8 v16, v12
545 ; RV64-NEXT:    vsll.vi v16, v16, 2
546 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
547 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
548 ; RV64-NEXT:    ret
549   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i8> %idxs
550   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)
551   ret void
554 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) {
555 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i32:
556 ; RV32:       # %bb.0:
557 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
558 ; RV32-NEXT:    vsext.vf4 v16, v12
559 ; RV32-NEXT:    vsll.vi v12, v16, 2
560 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
561 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
562 ; RV32-NEXT:    ret
564 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i32:
565 ; RV64:       # %bb.0:
566 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
567 ; RV64-NEXT:    vsext.vf8 v16, v12
568 ; RV64-NEXT:    vsll.vi v16, v16, 2
569 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
570 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
571 ; RV64-NEXT:    ret
572   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
573   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
574   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)
575   ret void
578 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) {
579 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i32:
580 ; RV32:       # %bb.0:
581 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
582 ; RV32-NEXT:    vzext.vf2 v14, v12
583 ; RV32-NEXT:    vsll.vi v12, v14, 2
584 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
585 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
586 ; RV32-NEXT:    ret
588 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i32:
589 ; RV64:       # %bb.0:
590 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
591 ; RV64-NEXT:    vzext.vf2 v14, v12
592 ; RV64-NEXT:    vsll.vi v12, v14, 2
593 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
594 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
595 ; RV64-NEXT:    ret
596   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
597   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
598   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)
599   ret void
602 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) {
603 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8i32:
604 ; RV32:       # %bb.0:
605 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
606 ; RV32-NEXT:    vsext.vf2 v16, v12
607 ; RV32-NEXT:    vsll.vi v12, v16, 2
608 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
609 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
610 ; RV32-NEXT:    ret
612 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8i32:
613 ; RV64:       # %bb.0:
614 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
615 ; RV64-NEXT:    vsext.vf4 v16, v12
616 ; RV64-NEXT:    vsll.vi v16, v16, 2
617 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
618 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
619 ; RV64-NEXT:    ret
620   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i16> %idxs
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_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) {
626 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8i32:
627 ; RV32:       # %bb.0:
628 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
629 ; RV32-NEXT:    vsext.vf2 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_sext_nxv8i16_nxv8i32:
636 ; RV64:       # %bb.0:
637 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
638 ; RV64-NEXT:    vsext.vf4 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   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
644   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
645   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)
646   ret void
649 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) {
650 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i32:
651 ; RV32:       # %bb.0:
652 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
653 ; RV32-NEXT:    vzext.vf2 v16, v12
654 ; RV32-NEXT:    vsll.vi v12, v16, 2
655 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
656 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
657 ; RV32-NEXT:    ret
659 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i32:
660 ; RV64:       # %bb.0:
661 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
662 ; RV64-NEXT:    vzext.vf2 v16, v12
663 ; RV64-NEXT:    vsll.vi v12, v16, 2
664 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
665 ; RV64-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
666 ; RV64-NEXT:    ret
667   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
668   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %eidxs
669   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)
670   ret void
673 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) {
674 ; RV32-LABEL: vpscatter_baseidx_nxv8i32:
675 ; RV32:       # %bb.0:
676 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
677 ; RV32-NEXT:    vsll.vi v12, v12, 2
678 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
679 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
680 ; RV32-NEXT:    ret
682 ; RV64-LABEL: vpscatter_baseidx_nxv8i32:
683 ; RV64:       # %bb.0:
684 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
685 ; RV64-NEXT:    vsext.vf2 v16, v12
686 ; RV64-NEXT:    vsll.vi v16, v16, 2
687 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
688 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
689 ; RV64-NEXT:    ret
690   %ptrs = getelementptr inbounds i32, ptr %base, <vscale x 8 x i32> %idxs
691   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)
692   ret void
695 declare void @llvm.vp.scatter.nxv1i64.nxv1p0(<vscale x 1 x i64>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
697 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) {
698 ; RV32-LABEL: vpscatter_nxv1i64:
699 ; RV32:       # %bb.0:
700 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
701 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
702 ; RV32-NEXT:    ret
704 ; RV64-LABEL: vpscatter_nxv1i64:
705 ; RV64:       # %bb.0:
706 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
707 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
708 ; RV64-NEXT:    ret
709   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)
710   ret void
713 declare void @llvm.vp.scatter.nxv2i64.nxv2p0(<vscale x 2 x i64>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
715 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) {
716 ; RV32-LABEL: vpscatter_nxv2i64:
717 ; RV32:       # %bb.0:
718 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
719 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
720 ; RV32-NEXT:    ret
722 ; RV64-LABEL: vpscatter_nxv2i64:
723 ; RV64:       # %bb.0:
724 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
725 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
726 ; RV64-NEXT:    ret
727   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)
728   ret void
731 declare void @llvm.vp.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
733 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) {
734 ; RV32-LABEL: vpscatter_nxv4i64:
735 ; RV32:       # %bb.0:
736 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
737 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
738 ; RV32-NEXT:    ret
740 ; RV64-LABEL: vpscatter_nxv4i64:
741 ; RV64:       # %bb.0:
742 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
743 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
744 ; RV64-NEXT:    ret
745   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)
746   ret void
749 define void @vpscatter_truemask_nxv4i64(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
750 ; RV32-LABEL: vpscatter_truemask_nxv4i64:
751 ; RV32:       # %bb.0:
752 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
753 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12
754 ; RV32-NEXT:    ret
756 ; RV64-LABEL: vpscatter_truemask_nxv4i64:
757 ; RV64:       # %bb.0:
758 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
759 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
760 ; RV64-NEXT:    ret
761   %mhead = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
762   %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
763   call void @llvm.vp.scatter.nxv4i64.nxv4p0(<vscale x 4 x i64> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
764   ret void
767 declare void @llvm.vp.scatter.nxv8i64.nxv8p0(<vscale x 8 x i64>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
769 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) {
770 ; RV32-LABEL: vpscatter_nxv8i64:
771 ; RV32:       # %bb.0:
772 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
773 ; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t
774 ; RV32-NEXT:    ret
776 ; RV64-LABEL: vpscatter_nxv8i64:
777 ; RV64:       # %bb.0:
778 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
779 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
780 ; RV64-NEXT:    ret
781   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)
782   ret void
785 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) {
786 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8i64:
787 ; RV32:       # %bb.0:
788 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
789 ; RV32-NEXT:    vsext.vf4 v20, v16
790 ; RV32-NEXT:    vsll.vi v16, v20, 3
791 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
792 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
793 ; RV32-NEXT:    ret
795 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8i64:
796 ; RV64:       # %bb.0:
797 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
798 ; RV64-NEXT:    vsext.vf8 v24, v16
799 ; RV64-NEXT:    vsll.vi v16, v24, 3
800 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
801 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
802 ; RV64-NEXT:    ret
803   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i8> %idxs
804   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)
805   ret void
808 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) {
809 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i64:
810 ; RV32:       # %bb.0:
811 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
812 ; RV32-NEXT:    vsext.vf4 v20, v16
813 ; RV32-NEXT:    vsll.vi v16, v20, 3
814 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
815 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
816 ; RV32-NEXT:    ret
818 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8i64:
819 ; RV64:       # %bb.0:
820 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
821 ; RV64-NEXT:    vsext.vf8 v24, v16
822 ; RV64-NEXT:    vsll.vi v16, v24, 3
823 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
824 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
825 ; RV64-NEXT:    ret
826   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
827   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
828   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)
829   ret void
832 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) {
833 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i64:
834 ; RV32:       # %bb.0:
835 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
836 ; RV32-NEXT:    vzext.vf2 v18, v16
837 ; RV32-NEXT:    vsll.vi v16, v18, 3
838 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
839 ; RV32-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
840 ; RV32-NEXT:    ret
842 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8i64:
843 ; RV64:       # %bb.0:
844 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
845 ; RV64-NEXT:    vzext.vf2 v18, v16
846 ; RV64-NEXT:    vsll.vi v16, v18, 3
847 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
848 ; RV64-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
849 ; RV64-NEXT:    ret
850   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
851   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
852   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)
853   ret void
856 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) {
857 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8i64:
858 ; RV32:       # %bb.0:
859 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
860 ; RV32-NEXT:    vsext.vf2 v20, v16
861 ; RV32-NEXT:    vsll.vi v16, v20, 3
862 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
863 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
864 ; RV32-NEXT:    ret
866 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8i64:
867 ; RV64:       # %bb.0:
868 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
869 ; RV64-NEXT:    vsext.vf4 v24, v16
870 ; RV64-NEXT:    vsll.vi v16, v24, 3
871 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
872 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
873 ; RV64-NEXT:    ret
874   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i16> %idxs
875   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)
876   ret void
879 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) {
880 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8i64:
881 ; RV32:       # %bb.0:
882 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
883 ; RV32-NEXT:    vsext.vf2 v20, v16
884 ; RV32-NEXT:    vsll.vi v16, v20, 3
885 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
886 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
887 ; RV32-NEXT:    ret
889 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8i64:
890 ; RV64:       # %bb.0:
891 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
892 ; RV64-NEXT:    vsext.vf4 v24, v16
893 ; RV64-NEXT:    vsll.vi v16, v24, 3
894 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
895 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
896 ; RV64-NEXT:    ret
897   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
898   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
899   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)
900   ret void
903 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) {
904 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i64:
905 ; RV32:       # %bb.0:
906 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
907 ; RV32-NEXT:    vzext.vf2 v20, v16
908 ; RV32-NEXT:    vsll.vi v16, v20, 3
909 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
910 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
911 ; RV32-NEXT:    ret
913 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8i64:
914 ; RV64:       # %bb.0:
915 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
916 ; RV64-NEXT:    vzext.vf2 v20, v16
917 ; RV64-NEXT:    vsll.vi v16, v20, 3
918 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
919 ; RV64-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
920 ; RV64-NEXT:    ret
921   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
922   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
923   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)
924   ret void
927 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) {
928 ; RV32-LABEL: vpscatter_baseidx_nxv8i32_nxv8i64:
929 ; RV32:       # %bb.0:
930 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
931 ; RV32-NEXT:    vsll.vi v16, v16, 3
932 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
933 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
934 ; RV32-NEXT:    ret
936 ; RV64-LABEL: vpscatter_baseidx_nxv8i32_nxv8i64:
937 ; RV64:       # %bb.0:
938 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
939 ; RV64-NEXT:    vsext.vf2 v24, v16
940 ; RV64-NEXT:    vsll.vi v16, v24, 3
941 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
942 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
943 ; RV64-NEXT:    ret
944   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i32> %idxs
945   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)
946   ret void
949 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) {
950 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i32_nxv8i64:
951 ; RV32:       # %bb.0:
952 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
953 ; RV32-NEXT:    vsll.vi v16, v16, 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_sext_nxv8i32_nxv8i64:
959 ; RV64:       # %bb.0:
960 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
961 ; RV64-NEXT:    vsext.vf2 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   %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
967   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %eidxs
968   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)
969   ret void
972 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) {
973 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i32_nxv8i64:
974 ; RV32:       # %bb.0:
975 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
976 ; RV32-NEXT:    vsll.vi v16, v16, 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_zext_nxv8i32_nxv8i64:
982 ; RV64:       # %bb.0:
983 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
984 ; RV64-NEXT:    vzext.vf2 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 = zext <vscale x 8 x i32> %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_nxv8i64(<vscale x 8 x i64> %val, ptr %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
996 ; RV32-LABEL: vpscatter_baseidx_nxv8i64:
997 ; RV32:       # %bb.0:
998 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
999 ; RV32-NEXT:    vnsrl.wi v24, v16, 0
1000 ; RV32-NEXT:    vsll.vi v16, v24, 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_nxv8i64:
1006 ; RV64:       # %bb.0:
1007 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1008 ; RV64-NEXT:    vsll.vi v16, v16, 3
1009 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1010 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1011 ; RV64-NEXT:    ret
1012   %ptrs = getelementptr inbounds i64, ptr %base, <vscale x 8 x i64> %idxs
1013   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)
1014   ret void
1017 declare void @llvm.vp.scatter.nxv1f16.nxv1p0(<vscale x 1 x half>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
1019 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) {
1020 ; RV32-LABEL: vpscatter_nxv1f16:
1021 ; RV32:       # %bb.0:
1022 ; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1023 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1024 ; RV32-NEXT:    ret
1026 ; RV64-LABEL: vpscatter_nxv1f16:
1027 ; RV64:       # %bb.0:
1028 ; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
1029 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1030 ; RV64-NEXT:    ret
1031   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)
1032   ret void
1035 declare void @llvm.vp.scatter.nxv2f16.nxv2p0(<vscale x 2 x half>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
1037 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) {
1038 ; RV32-LABEL: vpscatter_nxv2f16:
1039 ; RV32:       # %bb.0:
1040 ; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1041 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1042 ; RV32-NEXT:    ret
1044 ; RV64-LABEL: vpscatter_nxv2f16:
1045 ; RV64:       # %bb.0:
1046 ; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
1047 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1048 ; RV64-NEXT:    ret
1049   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)
1050   ret void
1053 declare void @llvm.vp.scatter.nxv4f16.nxv4p0(<vscale x 4 x half>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
1055 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) {
1056 ; RV32-LABEL: vpscatter_nxv4f16:
1057 ; RV32:       # %bb.0:
1058 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1059 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1060 ; RV32-NEXT:    ret
1062 ; RV64-LABEL: vpscatter_nxv4f16:
1063 ; RV64:       # %bb.0:
1064 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1065 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1066 ; RV64-NEXT:    ret
1067   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)
1068   ret void
1071 define void @vpscatter_truemask_nxv4f16(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
1072 ; RV32-LABEL: vpscatter_truemask_nxv4f16:
1073 ; RV32:       # %bb.0:
1074 ; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1075 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
1076 ; RV32-NEXT:    ret
1078 ; RV64-LABEL: vpscatter_truemask_nxv4f16:
1079 ; RV64:       # %bb.0:
1080 ; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
1081 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
1082 ; RV64-NEXT:    ret
1083   %mhead = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
1084   %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1085   call void @llvm.vp.scatter.nxv4f16.nxv4p0(<vscale x 4 x half> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
1086   ret void
1089 declare void @llvm.vp.scatter.nxv8f16.nxv8p0(<vscale x 8 x half>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
1091 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) {
1092 ; RV32-LABEL: vpscatter_nxv8f16:
1093 ; RV32:       # %bb.0:
1094 ; RV32-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1095 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
1096 ; RV32-NEXT:    ret
1098 ; RV64-LABEL: vpscatter_nxv8f16:
1099 ; RV64:       # %bb.0:
1100 ; RV64-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
1101 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1102 ; RV64-NEXT:    ret
1103   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)
1104   ret void
1107 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) {
1108 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8f16:
1109 ; RV32:       # %bb.0:
1110 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1111 ; RV32-NEXT:    vsext.vf4 v12, v10
1112 ; RV32-NEXT:    vadd.vv v12, v12, v12
1113 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1114 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1115 ; RV32-NEXT:    ret
1117 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8f16:
1118 ; RV64:       # %bb.0:
1119 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1120 ; RV64-NEXT:    vsext.vf8 v16, v10
1121 ; RV64-NEXT:    vadd.vv v16, v16, v16
1122 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1123 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1124 ; RV64-NEXT:    ret
1125   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i8> %idxs
1126   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)
1127   ret void
1130 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) {
1131 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f16:
1132 ; RV32:       # %bb.0:
1133 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1134 ; RV32-NEXT:    vsext.vf4 v12, v10
1135 ; RV32-NEXT:    vadd.vv v12, v12, v12
1136 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1137 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1138 ; RV32-NEXT:    ret
1140 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f16:
1141 ; RV64:       # %bb.0:
1142 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1143 ; RV64-NEXT:    vsext.vf8 v16, v10
1144 ; RV64-NEXT:    vadd.vv v16, v16, v16
1145 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1146 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1147 ; RV64-NEXT:    ret
1148   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
1149   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %eidxs
1150   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)
1151   ret void
1154 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) {
1155 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f16:
1156 ; RV32:       # %bb.0:
1157 ; RV32-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
1158 ; RV32-NEXT:    vwaddu.vv v12, v10, v10
1159 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1160 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1161 ; RV32-NEXT:    ret
1163 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f16:
1164 ; RV64:       # %bb.0:
1165 ; RV64-NEXT:    vsetvli a2, zero, e8, m1, ta, ma
1166 ; RV64-NEXT:    vwaddu.vv v12, v10, v10
1167 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1168 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1169 ; RV64-NEXT:    ret
1170   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
1171   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %eidxs
1172   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)
1173   ret void
1176 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) {
1177 ; RV32-LABEL: vpscatter_baseidx_nxv8f16:
1178 ; RV32:       # %bb.0:
1179 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1180 ; RV32-NEXT:    vwadd.vv v12, v10, v10
1181 ; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1182 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1183 ; RV32-NEXT:    ret
1185 ; RV64-LABEL: vpscatter_baseidx_nxv8f16:
1186 ; RV64:       # %bb.0:
1187 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1188 ; RV64-NEXT:    vsext.vf4 v16, v10
1189 ; RV64-NEXT:    vadd.vv v16, v16, v16
1190 ; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
1191 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1192 ; RV64-NEXT:    ret
1193   %ptrs = getelementptr inbounds half, ptr %base, <vscale x 8 x i16> %idxs
1194   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)
1195   ret void
1198 declare void @llvm.vp.scatter.nxv1f32.nxv1p0(<vscale x 1 x float>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
1200 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) {
1201 ; RV32-LABEL: vpscatter_nxv1f32:
1202 ; RV32:       # %bb.0:
1203 ; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1204 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1205 ; RV32-NEXT:    ret
1207 ; RV64-LABEL: vpscatter_nxv1f32:
1208 ; RV64:       # %bb.0:
1209 ; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
1210 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1211 ; RV64-NEXT:    ret
1212   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)
1213   ret void
1216 declare void @llvm.vp.scatter.nxv2f32.nxv2p0(<vscale x 2 x float>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
1218 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) {
1219 ; RV32-LABEL: vpscatter_nxv2f32:
1220 ; RV32:       # %bb.0:
1221 ; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1222 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1223 ; RV32-NEXT:    ret
1225 ; RV64-LABEL: vpscatter_nxv2f32:
1226 ; RV64:       # %bb.0:
1227 ; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
1228 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1229 ; RV64-NEXT:    ret
1230   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)
1231   ret void
1234 declare void @llvm.vp.scatter.nxv4f32.nxv4p0(<vscale x 4 x float>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
1236 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) {
1237 ; RV32-LABEL: vpscatter_nxv4f32:
1238 ; RV32:       # %bb.0:
1239 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1240 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1241 ; RV32-NEXT:    ret
1243 ; RV64-LABEL: vpscatter_nxv4f32:
1244 ; RV64:       # %bb.0:
1245 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1246 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1247 ; RV64-NEXT:    ret
1248   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)
1249   ret void
1252 define void @vpscatter_truemask_nxv4f32(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
1253 ; RV32-LABEL: vpscatter_truemask_nxv4f32:
1254 ; RV32:       # %bb.0:
1255 ; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1256 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10
1257 ; RV32-NEXT:    ret
1259 ; RV64-LABEL: vpscatter_truemask_nxv4f32:
1260 ; RV64:       # %bb.0:
1261 ; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
1262 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
1263 ; RV64-NEXT:    ret
1264   %mhead = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
1265   %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1266   call void @llvm.vp.scatter.nxv4f32.nxv4p0(<vscale x 4 x float> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
1267   ret void
1270 declare void @llvm.vp.scatter.nxv8f32.nxv8p0(<vscale x 8 x float>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
1272 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) {
1273 ; RV32-LABEL: vpscatter_nxv8f32:
1274 ; RV32:       # %bb.0:
1275 ; RV32-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1276 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
1277 ; RV32-NEXT:    ret
1279 ; RV64-LABEL: vpscatter_nxv8f32:
1280 ; RV64:       # %bb.0:
1281 ; RV64-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
1282 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1283 ; RV64-NEXT:    ret
1284   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)
1285   ret void
1288 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) {
1289 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8f32:
1290 ; RV32:       # %bb.0:
1291 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1292 ; RV32-NEXT:    vsext.vf4 v16, v12
1293 ; RV32-NEXT:    vsll.vi v12, v16, 2
1294 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1295 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1296 ; RV32-NEXT:    ret
1298 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8f32:
1299 ; RV64:       # %bb.0:
1300 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1301 ; RV64-NEXT:    vsext.vf8 v16, v12
1302 ; RV64-NEXT:    vsll.vi v16, v16, 2
1303 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1304 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1305 ; RV64-NEXT:    ret
1306   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i8> %idxs
1307   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)
1308   ret void
1311 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) {
1312 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f32:
1313 ; RV32:       # %bb.0:
1314 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1315 ; RV32-NEXT:    vsext.vf4 v16, v12
1316 ; RV32-NEXT:    vsll.vi v12, v16, 2
1317 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1318 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1319 ; RV32-NEXT:    ret
1321 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f32:
1322 ; RV64:       # %bb.0:
1323 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1324 ; RV64-NEXT:    vsext.vf8 v16, v12
1325 ; RV64-NEXT:    vsll.vi v16, v16, 2
1326 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1327 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1328 ; RV64-NEXT:    ret
1329   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
1330   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1331   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)
1332   ret void
1335 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) {
1336 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f32:
1337 ; RV32:       # %bb.0:
1338 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1339 ; RV32-NEXT:    vzext.vf2 v14, v12
1340 ; RV32-NEXT:    vsll.vi v12, v14, 2
1341 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1342 ; RV32-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1343 ; RV32-NEXT:    ret
1345 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f32:
1346 ; RV64:       # %bb.0:
1347 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1348 ; RV64-NEXT:    vzext.vf2 v14, v12
1349 ; RV64-NEXT:    vsll.vi v12, v14, 2
1350 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1351 ; RV64-NEXT:    vsoxei16.v v8, (a0), v12, v0.t
1352 ; RV64-NEXT:    ret
1353   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
1354   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1355   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)
1356   ret void
1359 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) {
1360 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8f32:
1361 ; RV32:       # %bb.0:
1362 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1363 ; RV32-NEXT:    vsext.vf2 v16, v12
1364 ; RV32-NEXT:    vsll.vi v12, v16, 2
1365 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1366 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1367 ; RV32-NEXT:    ret
1369 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8f32:
1370 ; RV64:       # %bb.0:
1371 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1372 ; RV64-NEXT:    vsext.vf4 v16, v12
1373 ; RV64-NEXT:    vsll.vi v16, v16, 2
1374 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1375 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1376 ; RV64-NEXT:    ret
1377   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i16> %idxs
1378   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)
1379   ret void
1382 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) {
1383 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f32:
1384 ; RV32:       # %bb.0:
1385 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1386 ; RV32-NEXT:    vsext.vf2 v16, v12
1387 ; RV32-NEXT:    vsll.vi v12, v16, 2
1388 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1389 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1390 ; RV32-NEXT:    ret
1392 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f32:
1393 ; RV64:       # %bb.0:
1394 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1395 ; RV64-NEXT:    vsext.vf4 v16, v12
1396 ; RV64-NEXT:    vsll.vi v16, v16, 2
1397 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1398 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1399 ; RV64-NEXT:    ret
1400   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
1401   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1402   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)
1403   ret void
1406 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) {
1407 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f32:
1408 ; RV32:       # %bb.0:
1409 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1410 ; RV32-NEXT:    vzext.vf2 v16, v12
1411 ; RV32-NEXT:    vsll.vi v12, v16, 2
1412 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1413 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1414 ; RV32-NEXT:    ret
1416 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f32:
1417 ; RV64:       # %bb.0:
1418 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1419 ; RV64-NEXT:    vzext.vf2 v16, v12
1420 ; RV64-NEXT:    vsll.vi v12, v16, 2
1421 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1422 ; RV64-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1423 ; RV64-NEXT:    ret
1424   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
1425   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %eidxs
1426   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)
1427   ret void
1430 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) {
1431 ; RV32-LABEL: vpscatter_baseidx_nxv8f32:
1432 ; RV32:       # %bb.0:
1433 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1434 ; RV32-NEXT:    vsll.vi v12, v12, 2
1435 ; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1436 ; RV32-NEXT:    vsoxei32.v v8, (a0), v12, v0.t
1437 ; RV32-NEXT:    ret
1439 ; RV64-LABEL: vpscatter_baseidx_nxv8f32:
1440 ; RV64:       # %bb.0:
1441 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1442 ; RV64-NEXT:    vsext.vf2 v16, v12
1443 ; RV64-NEXT:    vsll.vi v16, v16, 2
1444 ; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
1445 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1446 ; RV64-NEXT:    ret
1447   %ptrs = getelementptr inbounds float, ptr %base, <vscale x 8 x i32> %idxs
1448   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)
1449   ret void
1452 declare void @llvm.vp.scatter.nxv1f64.nxv1p0(<vscale x 1 x double>, <vscale x 1 x ptr>, <vscale x 1 x i1>, i32)
1454 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) {
1455 ; RV32-LABEL: vpscatter_nxv1f64:
1456 ; RV32:       # %bb.0:
1457 ; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1458 ; RV32-NEXT:    vsoxei32.v v8, (zero), v9, v0.t
1459 ; RV32-NEXT:    ret
1461 ; RV64-LABEL: vpscatter_nxv1f64:
1462 ; RV64:       # %bb.0:
1463 ; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
1464 ; RV64-NEXT:    vsoxei64.v v8, (zero), v9, v0.t
1465 ; RV64-NEXT:    ret
1466   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)
1467   ret void
1470 declare void @llvm.vp.scatter.nxv2f64.nxv2p0(<vscale x 2 x double>, <vscale x 2 x ptr>, <vscale x 2 x i1>, i32)
1472 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) {
1473 ; RV32-LABEL: vpscatter_nxv2f64:
1474 ; RV32:       # %bb.0:
1475 ; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1476 ; RV32-NEXT:    vsoxei32.v v8, (zero), v10, v0.t
1477 ; RV32-NEXT:    ret
1479 ; RV64-LABEL: vpscatter_nxv2f64:
1480 ; RV64:       # %bb.0:
1481 ; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
1482 ; RV64-NEXT:    vsoxei64.v v8, (zero), v10, v0.t
1483 ; RV64-NEXT:    ret
1484   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)
1485   ret void
1488 declare void @llvm.vp.scatter.nxv4f64.nxv4p0(<vscale x 4 x double>, <vscale x 4 x ptr>, <vscale x 4 x i1>, i32)
1490 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) {
1491 ; RV32-LABEL: vpscatter_nxv4f64:
1492 ; RV32:       # %bb.0:
1493 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1494 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12, v0.t
1495 ; RV32-NEXT:    ret
1497 ; RV64-LABEL: vpscatter_nxv4f64:
1498 ; RV64:       # %bb.0:
1499 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1500 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12, v0.t
1501 ; RV64-NEXT:    ret
1502   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)
1503   ret void
1506 define void @vpscatter_truemask_nxv4f64(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, i32 zeroext %evl) {
1507 ; RV32-LABEL: vpscatter_truemask_nxv4f64:
1508 ; RV32:       # %bb.0:
1509 ; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1510 ; RV32-NEXT:    vsoxei32.v v8, (zero), v12
1511 ; RV32-NEXT:    ret
1513 ; RV64-LABEL: vpscatter_truemask_nxv4f64:
1514 ; RV64:       # %bb.0:
1515 ; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
1516 ; RV64-NEXT:    vsoxei64.v v8, (zero), v12
1517 ; RV64-NEXT:    ret
1518   %mhead = insertelement <vscale x 4 x i1> poison, i1 1, i32 0
1519   %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
1520   call void @llvm.vp.scatter.nxv4f64.nxv4p0(<vscale x 4 x double> %val, <vscale x 4 x ptr> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
1521   ret void
1524 declare void @llvm.vp.scatter.nxv6f64.nxv6p0(<vscale x 6 x double>, <vscale x 6 x ptr>, <vscale x 6 x i1>, i32)
1526 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) {
1527 ; RV32-LABEL: vpscatter_nxv6f64:
1528 ; RV32:       # %bb.0:
1529 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1530 ; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t
1531 ; RV32-NEXT:    ret
1533 ; RV64-LABEL: vpscatter_nxv6f64:
1534 ; RV64:       # %bb.0:
1535 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1536 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1537 ; RV64-NEXT:    ret
1538   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)
1539   ret void
1542 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) {
1543 ; RV32-LABEL: vpscatter_baseidx_nxv6i8_nxv6f64:
1544 ; RV32:       # %bb.0:
1545 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1546 ; RV32-NEXT:    vsext.vf4 v20, v16
1547 ; RV32-NEXT:    vsll.vi v16, v20, 3
1548 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1549 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1550 ; RV32-NEXT:    ret
1552 ; RV64-LABEL: vpscatter_baseidx_nxv6i8_nxv6f64:
1553 ; RV64:       # %bb.0:
1554 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1555 ; RV64-NEXT:    vsext.vf8 v24, v16
1556 ; RV64-NEXT:    vsll.vi v16, v24, 3
1557 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1558 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1559 ; RV64-NEXT:    ret
1560   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i8> %idxs
1561   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)
1562   ret void
1565 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) {
1566 ; RV32-LABEL: vpscatter_baseidx_sext_nxv6i8_nxv6f64:
1567 ; RV32:       # %bb.0:
1568 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1569 ; RV32-NEXT:    vsext.vf4 v20, v16
1570 ; RV32-NEXT:    vsll.vi v16, v20, 3
1571 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1572 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1573 ; RV32-NEXT:    ret
1575 ; RV64-LABEL: vpscatter_baseidx_sext_nxv6i8_nxv6f64:
1576 ; RV64:       # %bb.0:
1577 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1578 ; RV64-NEXT:    vsext.vf8 v24, v16
1579 ; RV64-NEXT:    vsll.vi v16, v24, 3
1580 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1581 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1582 ; RV64-NEXT:    ret
1583   %eidxs = sext <vscale x 6 x i8> %idxs to <vscale x 6 x i64>
1584   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1585   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)
1586   ret void
1589 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) {
1590 ; RV32-LABEL: vpscatter_baseidx_zext_nxv6i8_nxv6f64:
1591 ; RV32:       # %bb.0:
1592 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1593 ; RV32-NEXT:    vzext.vf2 v18, v16
1594 ; RV32-NEXT:    vsll.vi v16, v18, 3
1595 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1596 ; RV32-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1597 ; RV32-NEXT:    ret
1599 ; RV64-LABEL: vpscatter_baseidx_zext_nxv6i8_nxv6f64:
1600 ; RV64:       # %bb.0:
1601 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1602 ; RV64-NEXT:    vzext.vf2 v18, v16
1603 ; RV64-NEXT:    vsll.vi v16, v18, 3
1604 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1605 ; RV64-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1606 ; RV64-NEXT:    ret
1607   %eidxs = zext <vscale x 6 x i8> %idxs to <vscale x 6 x i64>
1608   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1609   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)
1610   ret void
1613 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) {
1614 ; RV32-LABEL: vpscatter_baseidx_nxv6i16_nxv6f64:
1615 ; RV32:       # %bb.0:
1616 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1617 ; RV32-NEXT:    vsext.vf2 v20, v16
1618 ; RV32-NEXT:    vsll.vi v16, v20, 3
1619 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1620 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1621 ; RV32-NEXT:    ret
1623 ; RV64-LABEL: vpscatter_baseidx_nxv6i16_nxv6f64:
1624 ; RV64:       # %bb.0:
1625 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1626 ; RV64-NEXT:    vsext.vf4 v24, v16
1627 ; RV64-NEXT:    vsll.vi v16, v24, 3
1628 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1629 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1630 ; RV64-NEXT:    ret
1631   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i16> %idxs
1632   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)
1633   ret void
1636 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) {
1637 ; RV32-LABEL: vpscatter_baseidx_sext_nxv6i16_nxv6f64:
1638 ; RV32:       # %bb.0:
1639 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1640 ; RV32-NEXT:    vsext.vf2 v20, v16
1641 ; RV32-NEXT:    vsll.vi v16, v20, 3
1642 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1643 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1644 ; RV32-NEXT:    ret
1646 ; RV64-LABEL: vpscatter_baseidx_sext_nxv6i16_nxv6f64:
1647 ; RV64:       # %bb.0:
1648 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1649 ; RV64-NEXT:    vsext.vf4 v24, v16
1650 ; RV64-NEXT:    vsll.vi v16, v24, 3
1651 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1652 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1653 ; RV64-NEXT:    ret
1654   %eidxs = sext <vscale x 6 x i16> %idxs to <vscale x 6 x i64>
1655   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1656   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)
1657   ret void
1660 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) {
1661 ; RV32-LABEL: vpscatter_baseidx_zext_nxv6i16_nxv6f64:
1662 ; RV32:       # %bb.0:
1663 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1664 ; RV32-NEXT:    vzext.vf2 v20, v16
1665 ; RV32-NEXT:    vsll.vi v16, v20, 3
1666 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1667 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1668 ; RV32-NEXT:    ret
1670 ; RV64-LABEL: vpscatter_baseidx_zext_nxv6i16_nxv6f64:
1671 ; RV64:       # %bb.0:
1672 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1673 ; RV64-NEXT:    vzext.vf2 v20, v16
1674 ; RV64-NEXT:    vsll.vi v16, v20, 3
1675 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1676 ; RV64-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1677 ; RV64-NEXT:    ret
1678   %eidxs = zext <vscale x 6 x i16> %idxs to <vscale x 6 x i64>
1679   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1680   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)
1681   ret void
1684 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) {
1685 ; RV32-LABEL: vpscatter_baseidx_nxv6i32_nxv6f64:
1686 ; RV32:       # %bb.0:
1687 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1688 ; RV32-NEXT:    vsll.vi v16, v16, 3
1689 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1690 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1691 ; RV32-NEXT:    ret
1693 ; RV64-LABEL: vpscatter_baseidx_nxv6i32_nxv6f64:
1694 ; RV64:       # %bb.0:
1695 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1696 ; RV64-NEXT:    vsext.vf2 v24, v16
1697 ; RV64-NEXT:    vsll.vi v16, v24, 3
1698 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1699 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1700 ; RV64-NEXT:    ret
1701   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i32> %idxs
1702   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)
1703   ret void
1706 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) {
1707 ; RV32-LABEL: vpscatter_baseidx_sext_nxv6i32_nxv6f64:
1708 ; RV32:       # %bb.0:
1709 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1710 ; RV32-NEXT:    vsll.vi v16, v16, 3
1711 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1712 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1713 ; RV32-NEXT:    ret
1715 ; RV64-LABEL: vpscatter_baseidx_sext_nxv6i32_nxv6f64:
1716 ; RV64:       # %bb.0:
1717 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1718 ; RV64-NEXT:    vsext.vf2 v24, v16
1719 ; RV64-NEXT:    vsll.vi v16, v24, 3
1720 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1721 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1722 ; RV64-NEXT:    ret
1723   %eidxs = sext <vscale x 6 x i32> %idxs to <vscale x 6 x i64>
1724   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1725   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)
1726   ret void
1729 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) {
1730 ; RV32-LABEL: vpscatter_baseidx_zext_nxv6i32_nxv6f64:
1731 ; RV32:       # %bb.0:
1732 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1733 ; RV32-NEXT:    vsll.vi v16, v16, 3
1734 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1735 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1736 ; RV32-NEXT:    ret
1738 ; RV64-LABEL: vpscatter_baseidx_zext_nxv6i32_nxv6f64:
1739 ; RV64:       # %bb.0:
1740 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1741 ; RV64-NEXT:    vzext.vf2 v24, v16
1742 ; RV64-NEXT:    vsll.vi v16, v24, 3
1743 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1744 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1745 ; RV64-NEXT:    ret
1746   %eidxs = zext <vscale x 6 x i32> %idxs to <vscale x 6 x i64>
1747   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %eidxs
1748   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)
1749   ret void
1752 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) {
1753 ; RV32-LABEL: vpscatter_baseidx_nxv6f64:
1754 ; RV32:       # %bb.0:
1755 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1756 ; RV32-NEXT:    vnsrl.wi v24, v16, 0
1757 ; RV32-NEXT:    vsll.vi v16, v24, 3
1758 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1759 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1760 ; RV32-NEXT:    ret
1762 ; RV64-LABEL: vpscatter_baseidx_nxv6f64:
1763 ; RV64:       # %bb.0:
1764 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1765 ; RV64-NEXT:    vsll.vi v16, v16, 3
1766 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1767 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1768 ; RV64-NEXT:    ret
1769   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 6 x i64> %idxs
1770   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)
1771   ret void
1774 declare void @llvm.vp.scatter.nxv8f64.nxv8p0(<vscale x 8 x double>, <vscale x 8 x ptr>, <vscale x 8 x i1>, i32)
1776 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) {
1777 ; RV32-LABEL: vpscatter_nxv8f64:
1778 ; RV32:       # %bb.0:
1779 ; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1780 ; RV32-NEXT:    vsoxei32.v v8, (zero), v16, v0.t
1781 ; RV32-NEXT:    ret
1783 ; RV64-LABEL: vpscatter_nxv8f64:
1784 ; RV64:       # %bb.0:
1785 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
1786 ; RV64-NEXT:    vsoxei64.v v8, (zero), v16, v0.t
1787 ; RV64-NEXT:    ret
1788   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)
1789   ret void
1792 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) {
1793 ; RV32-LABEL: vpscatter_baseidx_nxv8i8_nxv8f64:
1794 ; RV32:       # %bb.0:
1795 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1796 ; RV32-NEXT:    vsext.vf4 v20, v16
1797 ; RV32-NEXT:    vsll.vi v16, v20, 3
1798 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1799 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1800 ; RV32-NEXT:    ret
1802 ; RV64-LABEL: vpscatter_baseidx_nxv8i8_nxv8f64:
1803 ; RV64:       # %bb.0:
1804 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1805 ; RV64-NEXT:    vsext.vf8 v24, v16
1806 ; RV64-NEXT:    vsll.vi v16, v24, 3
1807 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1808 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1809 ; RV64-NEXT:    ret
1810   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i8> %idxs
1811   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)
1812   ret void
1815 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) {
1816 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f64:
1817 ; RV32:       # %bb.0:
1818 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1819 ; RV32-NEXT:    vsext.vf4 v20, v16
1820 ; RV32-NEXT:    vsll.vi v16, v20, 3
1821 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1822 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1823 ; RV32-NEXT:    ret
1825 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i8_nxv8f64:
1826 ; RV64:       # %bb.0:
1827 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1828 ; RV64-NEXT:    vsext.vf8 v24, v16
1829 ; RV64-NEXT:    vsll.vi v16, v24, 3
1830 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1831 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1832 ; RV64-NEXT:    ret
1833   %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
1834   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1835   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)
1836   ret void
1839 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) {
1840 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f64:
1841 ; RV32:       # %bb.0:
1842 ; RV32-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1843 ; RV32-NEXT:    vzext.vf2 v18, v16
1844 ; RV32-NEXT:    vsll.vi v16, v18, 3
1845 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1846 ; RV32-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1847 ; RV32-NEXT:    ret
1849 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i8_nxv8f64:
1850 ; RV64:       # %bb.0:
1851 ; RV64-NEXT:    vsetvli a2, zero, e16, m2, ta, ma
1852 ; RV64-NEXT:    vzext.vf2 v18, v16
1853 ; RV64-NEXT:    vsll.vi v16, v18, 3
1854 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1855 ; RV64-NEXT:    vsoxei16.v v8, (a0), v16, v0.t
1856 ; RV64-NEXT:    ret
1857   %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
1858   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1859   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)
1860   ret void
1863 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) {
1864 ; RV32-LABEL: vpscatter_baseidx_nxv8i16_nxv8f64:
1865 ; RV32:       # %bb.0:
1866 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1867 ; RV32-NEXT:    vsext.vf2 v20, v16
1868 ; RV32-NEXT:    vsll.vi v16, v20, 3
1869 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1870 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1871 ; RV32-NEXT:    ret
1873 ; RV64-LABEL: vpscatter_baseidx_nxv8i16_nxv8f64:
1874 ; RV64:       # %bb.0:
1875 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1876 ; RV64-NEXT:    vsext.vf4 v24, v16
1877 ; RV64-NEXT:    vsll.vi v16, v24, 3
1878 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1879 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1880 ; RV64-NEXT:    ret
1881   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i16> %idxs
1882   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)
1883   ret void
1886 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) {
1887 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f64:
1888 ; RV32:       # %bb.0:
1889 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1890 ; RV32-NEXT:    vsext.vf2 v20, v16
1891 ; RV32-NEXT:    vsll.vi v16, v20, 3
1892 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1893 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1894 ; RV32-NEXT:    ret
1896 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i16_nxv8f64:
1897 ; RV64:       # %bb.0:
1898 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1899 ; RV64-NEXT:    vsext.vf4 v24, v16
1900 ; RV64-NEXT:    vsll.vi v16, v24, 3
1901 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1902 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1903 ; RV64-NEXT:    ret
1904   %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1905   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1906   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)
1907   ret void
1910 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) {
1911 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f64:
1912 ; RV32:       # %bb.0:
1913 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1914 ; RV32-NEXT:    vzext.vf2 v20, v16
1915 ; RV32-NEXT:    vsll.vi v16, v20, 3
1916 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1917 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1918 ; RV32-NEXT:    ret
1920 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i16_nxv8f64:
1921 ; RV64:       # %bb.0:
1922 ; RV64-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1923 ; RV64-NEXT:    vzext.vf2 v20, v16
1924 ; RV64-NEXT:    vsll.vi v16, v20, 3
1925 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1926 ; RV64-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1927 ; RV64-NEXT:    ret
1928   %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1929   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1930   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)
1931   ret void
1934 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) {
1935 ; RV32-LABEL: vpscatter_baseidx_nxv8i32_nxv8f64:
1936 ; RV32:       # %bb.0:
1937 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1938 ; RV32-NEXT:    vsll.vi v16, v16, 3
1939 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1940 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1941 ; RV32-NEXT:    ret
1943 ; RV64-LABEL: vpscatter_baseidx_nxv8i32_nxv8f64:
1944 ; RV64:       # %bb.0:
1945 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1946 ; RV64-NEXT:    vsext.vf2 v24, v16
1947 ; RV64-NEXT:    vsll.vi v16, v24, 3
1948 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1949 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1950 ; RV64-NEXT:    ret
1951   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i32> %idxs
1952   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)
1953   ret void
1956 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) {
1957 ; RV32-LABEL: vpscatter_baseidx_sext_nxv8i32_nxv8f64:
1958 ; RV32:       # %bb.0:
1959 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1960 ; RV32-NEXT:    vsll.vi v16, v16, 3
1961 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1962 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1963 ; RV32-NEXT:    ret
1965 ; RV64-LABEL: vpscatter_baseidx_sext_nxv8i32_nxv8f64:
1966 ; RV64:       # %bb.0:
1967 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1968 ; RV64-NEXT:    vsext.vf2 v24, v16
1969 ; RV64-NEXT:    vsll.vi v16, v24, 3
1970 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1971 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1972 ; RV64-NEXT:    ret
1973   %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1974   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1975   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)
1976   ret void
1979 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) {
1980 ; RV32-LABEL: vpscatter_baseidx_zext_nxv8i32_nxv8f64:
1981 ; RV32:       # %bb.0:
1982 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
1983 ; RV32-NEXT:    vsll.vi v16, v16, 3
1984 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1985 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
1986 ; RV32-NEXT:    ret
1988 ; RV64-LABEL: vpscatter_baseidx_zext_nxv8i32_nxv8f64:
1989 ; RV64:       # %bb.0:
1990 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
1991 ; RV64-NEXT:    vzext.vf2 v24, v16
1992 ; RV64-NEXT:    vsll.vi v16, v24, 3
1993 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
1994 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
1995 ; RV64-NEXT:    ret
1996   %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1997   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %eidxs
1998   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)
1999   ret void
2002 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) {
2003 ; RV32-LABEL: vpscatter_baseidx_nxv8f64:
2004 ; RV32:       # %bb.0:
2005 ; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, ma
2006 ; RV32-NEXT:    vnsrl.wi v24, v16, 0
2007 ; RV32-NEXT:    vsll.vi v16, v24, 3
2008 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2009 ; RV32-NEXT:    vsoxei32.v v8, (a0), v16, v0.t
2010 ; RV32-NEXT:    ret
2012 ; RV64-LABEL: vpscatter_baseidx_nxv8f64:
2013 ; RV64:       # %bb.0:
2014 ; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
2015 ; RV64-NEXT:    vsll.vi v16, v16, 3
2016 ; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2017 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2018 ; RV64-NEXT:    ret
2019   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 8 x i64> %idxs
2020   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)
2021   ret void
2024 declare void @llvm.vp.scatter.nxv16f64.nxv16p0(<vscale x 16 x double>, <vscale x 16 x ptr>, <vscale x 16 x i1>, i32)
2026 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) {
2027 ; RV32-LABEL: vpscatter_nxv16f64:
2028 ; RV32:       # %bb.0:
2029 ; RV32-NEXT:    vl8re32.v v24, (a0)
2030 ; RV32-NEXT:    csrr a0, vlenb
2031 ; RV32-NEXT:    mv a2, a1
2032 ; RV32-NEXT:    bltu a1, a0, .LBB95_2
2033 ; RV32-NEXT:  # %bb.1:
2034 ; RV32-NEXT:    mv a2, a0
2035 ; RV32-NEXT:  .LBB95_2:
2036 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2037 ; RV32-NEXT:    vsoxei32.v v8, (zero), v24, v0.t
2038 ; RV32-NEXT:    sub a2, a1, a0
2039 ; RV32-NEXT:    sltu a1, a1, a2
2040 ; RV32-NEXT:    addi a1, a1, -1
2041 ; RV32-NEXT:    and a1, a1, a2
2042 ; RV32-NEXT:    srli a0, a0, 3
2043 ; RV32-NEXT:    vsetvli a2, zero, e8, mf4, ta, ma
2044 ; RV32-NEXT:    vslidedown.vx v0, v0, a0
2045 ; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
2046 ; RV32-NEXT:    vsoxei32.v v16, (zero), v28, v0.t
2047 ; RV32-NEXT:    ret
2049 ; RV64-LABEL: vpscatter_nxv16f64:
2050 ; RV64:       # %bb.0:
2051 ; RV64-NEXT:    addi sp, sp, -16
2052 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2053 ; RV64-NEXT:    csrr a1, vlenb
2054 ; RV64-NEXT:    slli a1, a1, 3
2055 ; RV64-NEXT:    sub sp, sp, a1
2056 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
2057 ; RV64-NEXT:    csrr a1, vlenb
2058 ; RV64-NEXT:    slli a3, a1, 3
2059 ; RV64-NEXT:    add a3, a0, a3
2060 ; RV64-NEXT:    vl8re64.v v24, (a3)
2061 ; RV64-NEXT:    addi a3, sp, 16
2062 ; RV64-NEXT:    vs8r.v v24, (a3) # Unknown-size Folded Spill
2063 ; RV64-NEXT:    vl8re64.v v24, (a0)
2064 ; RV64-NEXT:    mv a0, a2
2065 ; RV64-NEXT:    bltu a2, a1, .LBB95_2
2066 ; RV64-NEXT:  # %bb.1:
2067 ; RV64-NEXT:    mv a0, a1
2068 ; RV64-NEXT:  .LBB95_2:
2069 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2070 ; RV64-NEXT:    vsoxei64.v v8, (zero), v24, v0.t
2071 ; RV64-NEXT:    sub a0, a2, a1
2072 ; RV64-NEXT:    sltu a2, a2, a0
2073 ; RV64-NEXT:    addi a2, a2, -1
2074 ; RV64-NEXT:    and a0, a2, a0
2075 ; RV64-NEXT:    srli a1, a1, 3
2076 ; RV64-NEXT:    vsetvli a2, zero, e8, mf4, ta, ma
2077 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2078 ; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
2079 ; RV64-NEXT:    addi a0, sp, 16
2080 ; RV64-NEXT:    vl8r.v v8, (a0) # Unknown-size Folded Reload
2081 ; RV64-NEXT:    vsoxei64.v v16, (zero), v8, v0.t
2082 ; RV64-NEXT:    csrr a0, vlenb
2083 ; RV64-NEXT:    slli a0, a0, 3
2084 ; RV64-NEXT:    add sp, sp, a0
2085 ; RV64-NEXT:    addi sp, sp, 16
2086 ; RV64-NEXT:    ret
2087   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)
2088   ret void
2091 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) {
2092 ; RV32-LABEL: vpscatter_baseidx_nxv16i16_nxv16f64:
2093 ; RV32:       # %bb.0:
2094 ; RV32-NEXT:    vl4re16.v v4, (a1)
2095 ; RV32-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2096 ; RV32-NEXT:    vsext.vf2 v24, v4
2097 ; RV32-NEXT:    csrr a1, vlenb
2098 ; RV32-NEXT:    vsll.vi v24, v24, 3
2099 ; RV32-NEXT:    mv a3, a2
2100 ; RV32-NEXT:    bltu a2, a1, .LBB96_2
2101 ; RV32-NEXT:  # %bb.1:
2102 ; RV32-NEXT:    mv a3, a1
2103 ; RV32-NEXT:  .LBB96_2:
2104 ; RV32-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2105 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2106 ; RV32-NEXT:    sub a3, a2, a1
2107 ; RV32-NEXT:    sltu a2, a2, a3
2108 ; RV32-NEXT:    addi a2, a2, -1
2109 ; RV32-NEXT:    and a2, a2, a3
2110 ; RV32-NEXT:    srli a1, a1, 3
2111 ; RV32-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2112 ; RV32-NEXT:    vslidedown.vx v0, v0, a1
2113 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2114 ; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2115 ; RV32-NEXT:    ret
2117 ; RV64-LABEL: vpscatter_baseidx_nxv16i16_nxv16f64:
2118 ; RV64:       # %bb.0:
2119 ; RV64-NEXT:    addi sp, sp, -16
2120 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2121 ; RV64-NEXT:    csrr a3, vlenb
2122 ; RV64-NEXT:    slli a3, a3, 4
2123 ; RV64-NEXT:    sub sp, sp, a3
2124 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
2125 ; RV64-NEXT:    vl4re16.v v24, (a1)
2126 ; RV64-NEXT:    csrr a1, vlenb
2127 ; RV64-NEXT:    slli a1, a1, 3
2128 ; RV64-NEXT:    add a1, sp, a1
2129 ; RV64-NEXT:    addi a1, a1, 16
2130 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2131 ; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
2132 ; RV64-NEXT:    vsext.vf4 v16, v26
2133 ; RV64-NEXT:    vsll.vi v16, v16, 3
2134 ; RV64-NEXT:    addi a1, sp, 16
2135 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2136 ; RV64-NEXT:    csrr a1, vlenb
2137 ; RV64-NEXT:    vsext.vf4 v16, v24
2138 ; RV64-NEXT:    vsll.vi v24, v16, 3
2139 ; RV64-NEXT:    mv a3, a2
2140 ; RV64-NEXT:    bltu a2, a1, .LBB96_2
2141 ; RV64-NEXT:  # %bb.1:
2142 ; RV64-NEXT:    mv a3, a1
2143 ; RV64-NEXT:  .LBB96_2:
2144 ; RV64-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2145 ; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t
2146 ; RV64-NEXT:    sub a3, a2, a1
2147 ; RV64-NEXT:    sltu a2, a2, a3
2148 ; RV64-NEXT:    addi a2, a2, -1
2149 ; RV64-NEXT:    and a2, a2, a3
2150 ; RV64-NEXT:    srli a1, a1, 3
2151 ; RV64-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2152 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2153 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2154 ; RV64-NEXT:    csrr a1, vlenb
2155 ; RV64-NEXT:    slli a1, a1, 3
2156 ; RV64-NEXT:    add a1, sp, a1
2157 ; RV64-NEXT:    addi a1, a1, 16
2158 ; RV64-NEXT:    vl8r.v v8, (a1) # Unknown-size Folded Reload
2159 ; RV64-NEXT:    addi a1, sp, 16
2160 ; RV64-NEXT:    vl8r.v v16, (a1) # Unknown-size Folded Reload
2161 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2162 ; RV64-NEXT:    csrr a0, vlenb
2163 ; RV64-NEXT:    slli a0, a0, 4
2164 ; RV64-NEXT:    add sp, sp, a0
2165 ; RV64-NEXT:    addi sp, sp, 16
2166 ; RV64-NEXT:    ret
2167   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i16> %idxs
2168   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)
2169   ret void
2172 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) {
2173 ; RV32-LABEL: vpscatter_baseidx_sext_nxv16i16_nxv16f64:
2174 ; RV32:       # %bb.0:
2175 ; RV32-NEXT:    vl4re16.v v4, (a1)
2176 ; RV32-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2177 ; RV32-NEXT:    vsext.vf2 v24, v4
2178 ; RV32-NEXT:    csrr a1, vlenb
2179 ; RV32-NEXT:    vsll.vi v24, v24, 3
2180 ; RV32-NEXT:    mv a3, a2
2181 ; RV32-NEXT:    bltu a2, a1, .LBB97_2
2182 ; RV32-NEXT:  # %bb.1:
2183 ; RV32-NEXT:    mv a3, a1
2184 ; RV32-NEXT:  .LBB97_2:
2185 ; RV32-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2186 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2187 ; RV32-NEXT:    sub a3, a2, a1
2188 ; RV32-NEXT:    sltu a2, a2, a3
2189 ; RV32-NEXT:    addi a2, a2, -1
2190 ; RV32-NEXT:    and a2, a2, a3
2191 ; RV32-NEXT:    srli a1, a1, 3
2192 ; RV32-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2193 ; RV32-NEXT:    vslidedown.vx v0, v0, a1
2194 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2195 ; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2196 ; RV32-NEXT:    ret
2198 ; RV64-LABEL: vpscatter_baseidx_sext_nxv16i16_nxv16f64:
2199 ; RV64:       # %bb.0:
2200 ; RV64-NEXT:    addi sp, sp, -16
2201 ; RV64-NEXT:    .cfi_def_cfa_offset 16
2202 ; RV64-NEXT:    csrr a3, vlenb
2203 ; RV64-NEXT:    slli a3, a3, 4
2204 ; RV64-NEXT:    sub sp, sp, a3
2205 ; RV64-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
2206 ; RV64-NEXT:    vl4re16.v v24, (a1)
2207 ; RV64-NEXT:    csrr a1, vlenb
2208 ; RV64-NEXT:    slli a1, a1, 3
2209 ; RV64-NEXT:    add a1, sp, a1
2210 ; RV64-NEXT:    addi a1, a1, 16
2211 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2212 ; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
2213 ; RV64-NEXT:    vsext.vf4 v16, v26
2214 ; RV64-NEXT:    vsll.vi v16, v16, 3
2215 ; RV64-NEXT:    addi a1, sp, 16
2216 ; RV64-NEXT:    vs8r.v v16, (a1) # Unknown-size Folded Spill
2217 ; RV64-NEXT:    csrr a1, vlenb
2218 ; RV64-NEXT:    vsext.vf4 v16, v24
2219 ; RV64-NEXT:    vsll.vi v24, v16, 3
2220 ; RV64-NEXT:    mv a3, a2
2221 ; RV64-NEXT:    bltu a2, a1, .LBB97_2
2222 ; RV64-NEXT:  # %bb.1:
2223 ; RV64-NEXT:    mv a3, a1
2224 ; RV64-NEXT:  .LBB97_2:
2225 ; RV64-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2226 ; RV64-NEXT:    vsoxei64.v v8, (a0), v24, v0.t
2227 ; RV64-NEXT:    sub a3, a2, a1
2228 ; RV64-NEXT:    sltu a2, a2, a3
2229 ; RV64-NEXT:    addi a2, a2, -1
2230 ; RV64-NEXT:    and a2, a2, a3
2231 ; RV64-NEXT:    srli a1, a1, 3
2232 ; RV64-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2233 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2234 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2235 ; RV64-NEXT:    csrr a1, vlenb
2236 ; RV64-NEXT:    slli a1, a1, 3
2237 ; RV64-NEXT:    add a1, sp, a1
2238 ; RV64-NEXT:    addi a1, a1, 16
2239 ; RV64-NEXT:    vl8r.v v8, (a1) # Unknown-size Folded Reload
2240 ; RV64-NEXT:    addi a1, sp, 16
2241 ; RV64-NEXT:    vl8r.v v16, (a1) # Unknown-size Folded Reload
2242 ; RV64-NEXT:    vsoxei64.v v8, (a0), v16, v0.t
2243 ; RV64-NEXT:    csrr a0, vlenb
2244 ; RV64-NEXT:    slli a0, a0, 4
2245 ; RV64-NEXT:    add sp, sp, a0
2246 ; RV64-NEXT:    addi sp, sp, 16
2247 ; RV64-NEXT:    ret
2248   %eidxs = sext <vscale x 16 x i16> %idxs to <vscale x 16 x i64>
2249   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i64> %eidxs
2250   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)
2251   ret void
2254 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) {
2255 ; RV32-LABEL: vpscatter_baseidx_zext_nxv16i16_nxv16f64:
2256 ; RV32:       # %bb.0:
2257 ; RV32-NEXT:    vl4re16.v v4, (a1)
2258 ; RV32-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2259 ; RV32-NEXT:    vzext.vf2 v24, v4
2260 ; RV32-NEXT:    csrr a1, vlenb
2261 ; RV32-NEXT:    vsll.vi v24, v24, 3
2262 ; RV32-NEXT:    mv a3, a2
2263 ; RV32-NEXT:    bltu a2, a1, .LBB98_2
2264 ; RV32-NEXT:  # %bb.1:
2265 ; RV32-NEXT:    mv a3, a1
2266 ; RV32-NEXT:  .LBB98_2:
2267 ; RV32-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2268 ; RV32-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2269 ; RV32-NEXT:    sub a3, a2, a1
2270 ; RV32-NEXT:    sltu a2, a2, a3
2271 ; RV32-NEXT:    addi a2, a2, -1
2272 ; RV32-NEXT:    and a2, a2, a3
2273 ; RV32-NEXT:    srli a1, a1, 3
2274 ; RV32-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2275 ; RV32-NEXT:    vslidedown.vx v0, v0, a1
2276 ; RV32-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2277 ; RV32-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2278 ; RV32-NEXT:    ret
2280 ; RV64-LABEL: vpscatter_baseidx_zext_nxv16i16_nxv16f64:
2281 ; RV64:       # %bb.0:
2282 ; RV64-NEXT:    vl4re16.v v4, (a1)
2283 ; RV64-NEXT:    vsetvli a1, zero, e32, m8, ta, ma
2284 ; RV64-NEXT:    vzext.vf2 v24, v4
2285 ; RV64-NEXT:    csrr a1, vlenb
2286 ; RV64-NEXT:    vsll.vi v24, v24, 3
2287 ; RV64-NEXT:    mv a3, a2
2288 ; RV64-NEXT:    bltu a2, a1, .LBB98_2
2289 ; RV64-NEXT:  # %bb.1:
2290 ; RV64-NEXT:    mv a3, a1
2291 ; RV64-NEXT:  .LBB98_2:
2292 ; RV64-NEXT:    vsetvli zero, a3, e64, m8, ta, ma
2293 ; RV64-NEXT:    vsoxei32.v v8, (a0), v24, v0.t
2294 ; RV64-NEXT:    sub a3, a2, a1
2295 ; RV64-NEXT:    sltu a2, a2, a3
2296 ; RV64-NEXT:    addi a2, a2, -1
2297 ; RV64-NEXT:    and a2, a2, a3
2298 ; RV64-NEXT:    srli a1, a1, 3
2299 ; RV64-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
2300 ; RV64-NEXT:    vslidedown.vx v0, v0, a1
2301 ; RV64-NEXT:    vsetvli zero, a2, e64, m8, ta, ma
2302 ; RV64-NEXT:    vsoxei32.v v16, (a0), v28, v0.t
2303 ; RV64-NEXT:    ret
2304   %eidxs = zext <vscale x 16 x i16> %idxs to <vscale x 16 x i64>
2305   %ptrs = getelementptr inbounds double, ptr %base, <vscale x 16 x i64> %eidxs
2306   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)
2307   ret void