1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+experimental-zfh,+experimental-v \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
4; RUN: llc -mtriple=riscv64 -mattr=+d,+experimental-zfh,+experimental-v \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
6
7declare <vscale x 1 x i8> @llvm.vp.gather.nxv1i8.nxv1p0i8(<vscale x 1 x i8*>, <vscale x 1 x i1>, i32)
8
9define <vscale x 1 x i8> @vpgather_nxv1i8(<vscale x 1 x i8*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
10; RV32-LABEL: vpgather_nxv1i8:
11; RV32:       # %bb.0:
12; RV32-NEXT:    vsetvli zero, a0, e8, mf8, ta, mu
13; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
14; RV32-NEXT:    vmv1r.v v8, v9
15; RV32-NEXT:    ret
16;
17; RV64-LABEL: vpgather_nxv1i8:
18; RV64:       # %bb.0:
19; RV64-NEXT:    vsetvli zero, a0, e8, mf8, ta, mu
20; RV64-NEXT:    vluxei64.v v9, (zero), v8, v0.t
21; RV64-NEXT:    vmv1r.v v8, v9
22; RV64-NEXT:    ret
23  %v = call <vscale x 1 x i8> @llvm.vp.gather.nxv1i8.nxv1p0i8(<vscale x 1 x i8*> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
24  ret <vscale x 1 x i8> %v
25}
26
27declare <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*>, <vscale x 2 x i1>, i32)
28
29define <vscale x 2 x i8> @vpgather_nxv2i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
30; RV32-LABEL: vpgather_nxv2i8:
31; RV32:       # %bb.0:
32; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
33; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
34; RV32-NEXT:    vmv1r.v v8, v9
35; RV32-NEXT:    ret
36;
37; RV64-LABEL: vpgather_nxv2i8:
38; RV64:       # %bb.0:
39; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
40; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
41; RV64-NEXT:    vmv1r.v v8, v10
42; RV64-NEXT:    ret
43  %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
44  ret <vscale x 2 x i8> %v
45}
46
47define <vscale x 2 x i16> @vpgather_nxv2i8_sextload_nxv2i16(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
48; RV32-LABEL: vpgather_nxv2i8_sextload_nxv2i16:
49; RV32:       # %bb.0:
50; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
51; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
52; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
53; RV32-NEXT:    vsext.vf2 v8, v9
54; RV32-NEXT:    ret
55;
56; RV64-LABEL: vpgather_nxv2i8_sextload_nxv2i16:
57; RV64:       # %bb.0:
58; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
59; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
60; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
61; RV64-NEXT:    vsext.vf2 v8, v10
62; RV64-NEXT:    ret
63  %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
64  %ev = sext <vscale x 2 x i8> %v to <vscale x 2 x i16>
65  ret <vscale x 2 x i16> %ev
66}
67
68define <vscale x 2 x i16> @vpgather_nxv2i8_zextload_nxv2i16(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
69; RV32-LABEL: vpgather_nxv2i8_zextload_nxv2i16:
70; RV32:       # %bb.0:
71; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
72; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
73; RV32-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
74; RV32-NEXT:    vzext.vf2 v8, v9
75; RV32-NEXT:    ret
76;
77; RV64-LABEL: vpgather_nxv2i8_zextload_nxv2i16:
78; RV64:       # %bb.0:
79; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
80; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
81; RV64-NEXT:    vsetvli a0, zero, e16, mf2, ta, mu
82; RV64-NEXT:    vzext.vf2 v8, v10
83; RV64-NEXT:    ret
84  %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
85  %ev = zext <vscale x 2 x i8> %v to <vscale x 2 x i16>
86  ret <vscale x 2 x i16> %ev
87}
88
89define <vscale x 2 x i32> @vpgather_nxv2i8_sextload_nxv2i32(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
90; RV32-LABEL: vpgather_nxv2i8_sextload_nxv2i32:
91; RV32:       # %bb.0:
92; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
93; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
94; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
95; RV32-NEXT:    vsext.vf4 v8, v9
96; RV32-NEXT:    ret
97;
98; RV64-LABEL: vpgather_nxv2i8_sextload_nxv2i32:
99; RV64:       # %bb.0:
100; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
101; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
102; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
103; RV64-NEXT:    vsext.vf4 v8, v10
104; RV64-NEXT:    ret
105  %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
106  %ev = sext <vscale x 2 x i8> %v to <vscale x 2 x i32>
107  ret <vscale x 2 x i32> %ev
108}
109
110define <vscale x 2 x i32> @vpgather_nxv2i8_zextload_nxv2i32(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
111; RV32-LABEL: vpgather_nxv2i8_zextload_nxv2i32:
112; RV32:       # %bb.0:
113; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
114; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
115; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
116; RV32-NEXT:    vzext.vf4 v8, v9
117; RV32-NEXT:    ret
118;
119; RV64-LABEL: vpgather_nxv2i8_zextload_nxv2i32:
120; RV64:       # %bb.0:
121; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
122; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
123; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
124; RV64-NEXT:    vzext.vf4 v8, v10
125; RV64-NEXT:    ret
126  %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
127  %ev = zext <vscale x 2 x i8> %v to <vscale x 2 x i32>
128  ret <vscale x 2 x i32> %ev
129}
130
131define <vscale x 2 x i64> @vpgather_nxv2i8_sextload_nxv2i64(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
132; RV32-LABEL: vpgather_nxv2i8_sextload_nxv2i64:
133; RV32:       # %bb.0:
134; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
135; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
136; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
137; RV32-NEXT:    vsext.vf8 v8, v10
138; RV32-NEXT:    ret
139;
140; RV64-LABEL: vpgather_nxv2i8_sextload_nxv2i64:
141; RV64:       # %bb.0:
142; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
143; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
144; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
145; RV64-NEXT:    vsext.vf8 v8, v10
146; RV64-NEXT:    ret
147  %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
148  %ev = sext <vscale x 2 x i8> %v to <vscale x 2 x i64>
149  ret <vscale x 2 x i64> %ev
150}
151
152define <vscale x 2 x i64> @vpgather_nxv2i8_zextload_nxv2i64(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
153; RV32-LABEL: vpgather_nxv2i8_zextload_nxv2i64:
154; RV32:       # %bb.0:
155; RV32-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
156; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
157; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
158; RV32-NEXT:    vzext.vf8 v8, v10
159; RV32-NEXT:    ret
160;
161; RV64-LABEL: vpgather_nxv2i8_zextload_nxv2i64:
162; RV64:       # %bb.0:
163; RV64-NEXT:    vsetvli zero, a0, e8, mf4, ta, mu
164; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
165; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
166; RV64-NEXT:    vzext.vf8 v8, v10
167; RV64-NEXT:    ret
168  %v = call <vscale x 2 x i8> @llvm.vp.gather.nxv2i8.nxv2p0i8(<vscale x 2 x i8*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
169  %ev = zext <vscale x 2 x i8> %v to <vscale x 2 x i64>
170  ret <vscale x 2 x i64> %ev
171}
172
173declare <vscale x 4 x i8> @llvm.vp.gather.nxv4i8.nxv4p0i8(<vscale x 4 x i8*>, <vscale x 4 x i1>, i32)
174
175define <vscale x 4 x i8> @vpgather_nxv4i8(<vscale x 4 x i8*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
176; RV32-LABEL: vpgather_nxv4i8:
177; RV32:       # %bb.0:
178; RV32-NEXT:    vsetvli zero, a0, e8, mf2, ta, mu
179; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
180; RV32-NEXT:    vmv1r.v v8, v10
181; RV32-NEXT:    ret
182;
183; RV64-LABEL: vpgather_nxv4i8:
184; RV64:       # %bb.0:
185; RV64-NEXT:    vsetvli zero, a0, e8, mf2, ta, mu
186; RV64-NEXT:    vluxei64.v v12, (zero), v8, v0.t
187; RV64-NEXT:    vmv1r.v v8, v12
188; RV64-NEXT:    ret
189  %v = call <vscale x 4 x i8> @llvm.vp.gather.nxv4i8.nxv4p0i8(<vscale x 4 x i8*> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
190  ret <vscale x 4 x i8> %v
191}
192
193define <vscale x 4 x i8> @vpgather_truemask_nxv4i8(<vscale x 4 x i8*> %ptrs, i32 zeroext %evl) {
194; RV32-LABEL: vpgather_truemask_nxv4i8:
195; RV32:       # %bb.0:
196; RV32-NEXT:    vsetvli zero, a0, e8, mf2, ta, mu
197; RV32-NEXT:    vluxei32.v v10, (zero), v8
198; RV32-NEXT:    vmv1r.v v8, v10
199; RV32-NEXT:    ret
200;
201; RV64-LABEL: vpgather_truemask_nxv4i8:
202; RV64:       # %bb.0:
203; RV64-NEXT:    vsetvli zero, a0, e8, mf2, ta, mu
204; RV64-NEXT:    vluxei64.v v12, (zero), v8
205; RV64-NEXT:    vmv1r.v v8, v12
206; RV64-NEXT:    ret
207  %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
208  %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
209  %v = call <vscale x 4 x i8> @llvm.vp.gather.nxv4i8.nxv4p0i8(<vscale x 4 x i8*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
210  ret <vscale x 4 x i8> %v
211}
212
213declare <vscale x 8 x i8> @llvm.vp.gather.nxv8i8.nxv8p0i8(<vscale x 8 x i8*>, <vscale x 8 x i1>, i32)
214
215define <vscale x 8 x i8> @vpgather_nxv8i8(<vscale x 8 x i8*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
216; RV32-LABEL: vpgather_nxv8i8:
217; RV32:       # %bb.0:
218; RV32-NEXT:    vsetvli zero, a0, e8, m1, ta, mu
219; RV32-NEXT:    vluxei32.v v12, (zero), v8, v0.t
220; RV32-NEXT:    vmv1r.v v8, v12
221; RV32-NEXT:    ret
222;
223; RV64-LABEL: vpgather_nxv8i8:
224; RV64:       # %bb.0:
225; RV64-NEXT:    vsetvli zero, a0, e8, m1, ta, mu
226; RV64-NEXT:    vluxei64.v v16, (zero), v8, v0.t
227; RV64-NEXT:    vmv1r.v v8, v16
228; RV64-NEXT:    ret
229  %v = call <vscale x 8 x i8> @llvm.vp.gather.nxv8i8.nxv8p0i8(<vscale x 8 x i8*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
230  ret <vscale x 8 x i8> %v
231}
232
233define <vscale x 8 x i8> @vpgather_baseidx_nxv8i8(i8* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
234; RV32-LABEL: vpgather_baseidx_nxv8i8:
235; RV32:       # %bb.0:
236; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
237; RV32-NEXT:    vsext.vf4 v12, v8
238; RV32-NEXT:    vsetvli zero, a1, e8, m1, ta, mu
239; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
240; RV32-NEXT:    ret
241;
242; RV64-LABEL: vpgather_baseidx_nxv8i8:
243; RV64:       # %bb.0:
244; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
245; RV64-NEXT:    vsext.vf8 v16, v8
246; RV64-NEXT:    vsetvli zero, a1, e8, m1, ta, mu
247; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
248; RV64-NEXT:    ret
249  %ptrs = getelementptr inbounds i8, i8* %base, <vscale x 8 x i8> %idxs
250  %v = call <vscale x 8 x i8> @llvm.vp.gather.nxv8i8.nxv8p0i8(<vscale x 8 x i8*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
251  ret <vscale x 8 x i8> %v
252}
253
254declare <vscale x 1 x i16> @llvm.vp.gather.nxv1i16.nxv1p0i16(<vscale x 1 x i16*>, <vscale x 1 x i1>, i32)
255
256define <vscale x 1 x i16> @vpgather_nxv1i16(<vscale x 1 x i16*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
257; RV32-LABEL: vpgather_nxv1i16:
258; RV32:       # %bb.0:
259; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, mu
260; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
261; RV32-NEXT:    vmv1r.v v8, v9
262; RV32-NEXT:    ret
263;
264; RV64-LABEL: vpgather_nxv1i16:
265; RV64:       # %bb.0:
266; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, mu
267; RV64-NEXT:    vluxei64.v v9, (zero), v8, v0.t
268; RV64-NEXT:    vmv1r.v v8, v9
269; RV64-NEXT:    ret
270  %v = call <vscale x 1 x i16> @llvm.vp.gather.nxv1i16.nxv1p0i16(<vscale x 1 x i16*> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
271  ret <vscale x 1 x i16> %v
272}
273
274declare <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*>, <vscale x 2 x i1>, i32)
275
276define <vscale x 2 x i16> @vpgather_nxv2i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
277; RV32-LABEL: vpgather_nxv2i16:
278; RV32:       # %bb.0:
279; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
280; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
281; RV32-NEXT:    vmv1r.v v8, v9
282; RV32-NEXT:    ret
283;
284; RV64-LABEL: vpgather_nxv2i16:
285; RV64:       # %bb.0:
286; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
287; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
288; RV64-NEXT:    vmv1r.v v8, v10
289; RV64-NEXT:    ret
290  %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
291  ret <vscale x 2 x i16> %v
292}
293
294define <vscale x 2 x i32> @vpgather_nxv2i16_sextload_nxv2i32(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
295; RV32-LABEL: vpgather_nxv2i16_sextload_nxv2i32:
296; RV32:       # %bb.0:
297; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
298; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
299; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
300; RV32-NEXT:    vsext.vf2 v8, v9
301; RV32-NEXT:    ret
302;
303; RV64-LABEL: vpgather_nxv2i16_sextload_nxv2i32:
304; RV64:       # %bb.0:
305; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
306; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
307; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
308; RV64-NEXT:    vsext.vf2 v8, v10
309; RV64-NEXT:    ret
310  %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
311  %ev = sext <vscale x 2 x i16> %v to <vscale x 2 x i32>
312  ret <vscale x 2 x i32> %ev
313}
314
315define <vscale x 2 x i32> @vpgather_nxv2i16_zextload_nxv2i32(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
316; RV32-LABEL: vpgather_nxv2i16_zextload_nxv2i32:
317; RV32:       # %bb.0:
318; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
319; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
320; RV32-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
321; RV32-NEXT:    vzext.vf2 v8, v9
322; RV32-NEXT:    ret
323;
324; RV64-LABEL: vpgather_nxv2i16_zextload_nxv2i32:
325; RV64:       # %bb.0:
326; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
327; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
328; RV64-NEXT:    vsetvli a0, zero, e32, m1, ta, mu
329; RV64-NEXT:    vzext.vf2 v8, v10
330; RV64-NEXT:    ret
331  %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
332  %ev = zext <vscale x 2 x i16> %v to <vscale x 2 x i32>
333  ret <vscale x 2 x i32> %ev
334}
335
336define <vscale x 2 x i64> @vpgather_nxv2i16_sextload_nxv2i64(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
337; RV32-LABEL: vpgather_nxv2i16_sextload_nxv2i64:
338; RV32:       # %bb.0:
339; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
340; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
341; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
342; RV32-NEXT:    vsext.vf4 v8, v10
343; RV32-NEXT:    ret
344;
345; RV64-LABEL: vpgather_nxv2i16_sextload_nxv2i64:
346; RV64:       # %bb.0:
347; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
348; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
349; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
350; RV64-NEXT:    vsext.vf4 v8, v10
351; RV64-NEXT:    ret
352  %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
353  %ev = sext <vscale x 2 x i16> %v to <vscale x 2 x i64>
354  ret <vscale x 2 x i64> %ev
355}
356
357define <vscale x 2 x i64> @vpgather_nxv2i16_zextload_nxv2i64(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
358; RV32-LABEL: vpgather_nxv2i16_zextload_nxv2i64:
359; RV32:       # %bb.0:
360; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
361; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
362; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
363; RV32-NEXT:    vzext.vf4 v8, v10
364; RV32-NEXT:    ret
365;
366; RV64-LABEL: vpgather_nxv2i16_zextload_nxv2i64:
367; RV64:       # %bb.0:
368; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
369; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
370; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
371; RV64-NEXT:    vzext.vf4 v8, v10
372; RV64-NEXT:    ret
373  %v = call <vscale x 2 x i16> @llvm.vp.gather.nxv2i16.nxv2p0i16(<vscale x 2 x i16*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
374  %ev = zext <vscale x 2 x i16> %v to <vscale x 2 x i64>
375  ret <vscale x 2 x i64> %ev
376}
377
378declare <vscale x 4 x i16> @llvm.vp.gather.nxv4i16.nxv4p0i16(<vscale x 4 x i16*>, <vscale x 4 x i1>, i32)
379
380define <vscale x 4 x i16> @vpgather_nxv4i16(<vscale x 4 x i16*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
381; RV32-LABEL: vpgather_nxv4i16:
382; RV32:       # %bb.0:
383; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
384; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
385; RV32-NEXT:    vmv1r.v v8, v10
386; RV32-NEXT:    ret
387;
388; RV64-LABEL: vpgather_nxv4i16:
389; RV64:       # %bb.0:
390; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
391; RV64-NEXT:    vluxei64.v v12, (zero), v8, v0.t
392; RV64-NEXT:    vmv1r.v v8, v12
393; RV64-NEXT:    ret
394  %v = call <vscale x 4 x i16> @llvm.vp.gather.nxv4i16.nxv4p0i16(<vscale x 4 x i16*> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
395  ret <vscale x 4 x i16> %v
396}
397
398define <vscale x 4 x i16> @vpgather_truemask_nxv4i16(<vscale x 4 x i16*> %ptrs, i32 zeroext %evl) {
399; RV32-LABEL: vpgather_truemask_nxv4i16:
400; RV32:       # %bb.0:
401; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
402; RV32-NEXT:    vluxei32.v v10, (zero), v8
403; RV32-NEXT:    vmv1r.v v8, v10
404; RV32-NEXT:    ret
405;
406; RV64-LABEL: vpgather_truemask_nxv4i16:
407; RV64:       # %bb.0:
408; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
409; RV64-NEXT:    vluxei64.v v12, (zero), v8
410; RV64-NEXT:    vmv1r.v v8, v12
411; RV64-NEXT:    ret
412  %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
413  %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
414  %v = call <vscale x 4 x i16> @llvm.vp.gather.nxv4i16.nxv4p0i16(<vscale x 4 x i16*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
415  ret <vscale x 4 x i16> %v
416}
417
418declare <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*>, <vscale x 8 x i1>, i32)
419
420define <vscale x 8 x i16> @vpgather_nxv8i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
421; RV32-LABEL: vpgather_nxv8i16:
422; RV32:       # %bb.0:
423; RV32-NEXT:    vsetvli zero, a0, e16, m2, ta, mu
424; RV32-NEXT:    vluxei32.v v12, (zero), v8, v0.t
425; RV32-NEXT:    vmv2r.v v8, v12
426; RV32-NEXT:    ret
427;
428; RV64-LABEL: vpgather_nxv8i16:
429; RV64:       # %bb.0:
430; RV64-NEXT:    vsetvli zero, a0, e16, m2, ta, mu
431; RV64-NEXT:    vluxei64.v v16, (zero), v8, v0.t
432; RV64-NEXT:    vmv2r.v v8, v16
433; RV64-NEXT:    ret
434  %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
435  ret <vscale x 8 x i16> %v
436}
437
438define <vscale x 8 x i16> @vpgather_baseidx_nxv8i8_nxv8i16(i16* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
439; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8i16:
440; RV32:       # %bb.0:
441; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
442; RV32-NEXT:    vsext.vf4 v12, v8
443; RV32-NEXT:    vadd.vv v12, v12, v12
444; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
445; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
446; RV32-NEXT:    ret
447;
448; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8i16:
449; RV64:       # %bb.0:
450; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
451; RV64-NEXT:    vsext.vf8 v16, v8
452; RV64-NEXT:    vadd.vv v16, v16, v16
453; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
454; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
455; RV64-NEXT:    ret
456  %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i8> %idxs
457  %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
458  ret <vscale x 8 x i16> %v
459}
460
461define <vscale x 8 x i16> @vpgather_baseidx_sext_nxv8i8_nxv8i16(i16* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
462; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i16:
463; RV32:       # %bb.0:
464; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
465; RV32-NEXT:    vsext.vf4 v12, v8
466; RV32-NEXT:    vadd.vv v12, v12, v12
467; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
468; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
469; RV32-NEXT:    ret
470;
471; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i16:
472; RV64:       # %bb.0:
473; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
474; RV64-NEXT:    vsext.vf8 v16, v8
475; RV64-NEXT:    vadd.vv v16, v16, v16
476; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
477; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
478; RV64-NEXT:    ret
479  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
480  %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i16> %eidxs
481  %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
482  ret <vscale x 8 x i16> %v
483}
484
485define <vscale x 8 x i16> @vpgather_baseidx_zext_nxv8i8_nxv8i16(i16* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
486; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i16:
487; RV32:       # %bb.0:
488; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
489; RV32-NEXT:    vzext.vf4 v12, v8
490; RV32-NEXT:    vadd.vv v12, v12, v12
491; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
492; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
493; RV32-NEXT:    ret
494;
495; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i16:
496; RV64:       # %bb.0:
497; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
498; RV64-NEXT:    vzext.vf8 v16, v8
499; RV64-NEXT:    vadd.vv v16, v16, v16
500; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
501; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
502; RV64-NEXT:    ret
503  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
504  %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i16> %eidxs
505  %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
506  ret <vscale x 8 x i16> %v
507}
508
509define <vscale x 8 x i16> @vpgather_baseidx_nxv8i16(i16* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
510; RV32-LABEL: vpgather_baseidx_nxv8i16:
511; RV32:       # %bb.0:
512; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
513; RV32-NEXT:    vsext.vf2 v12, v8
514; RV32-NEXT:    vadd.vv v12, v12, v12
515; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
516; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
517; RV32-NEXT:    ret
518;
519; RV64-LABEL: vpgather_baseidx_nxv8i16:
520; RV64:       # %bb.0:
521; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
522; RV64-NEXT:    vsext.vf4 v16, v8
523; RV64-NEXT:    vadd.vv v16, v16, v16
524; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
525; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
526; RV64-NEXT:    ret
527  %ptrs = getelementptr inbounds i16, i16* %base, <vscale x 8 x i16> %idxs
528  %v = call <vscale x 8 x i16> @llvm.vp.gather.nxv8i16.nxv8p0i16(<vscale x 8 x i16*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
529  ret <vscale x 8 x i16> %v
530}
531
532declare <vscale x 1 x i32> @llvm.vp.gather.nxv1i32.nxv1p0i32(<vscale x 1 x i32*>, <vscale x 1 x i1>, i32)
533
534define <vscale x 1 x i32> @vpgather_nxv1i32(<vscale x 1 x i32*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
535; RV32-LABEL: vpgather_nxv1i32:
536; RV32:       # %bb.0:
537; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, mu
538; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
539; RV32-NEXT:    ret
540;
541; RV64-LABEL: vpgather_nxv1i32:
542; RV64:       # %bb.0:
543; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, mu
544; RV64-NEXT:    vluxei64.v v9, (zero), v8, v0.t
545; RV64-NEXT:    vmv1r.v v8, v9
546; RV64-NEXT:    ret
547  %v = call <vscale x 1 x i32> @llvm.vp.gather.nxv1i32.nxv1p0i32(<vscale x 1 x i32*> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
548  ret <vscale x 1 x i32> %v
549}
550
551declare <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*>, <vscale x 2 x i1>, i32)
552
553define <vscale x 2 x i32> @vpgather_nxv2i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
554; RV32-LABEL: vpgather_nxv2i32:
555; RV32:       # %bb.0:
556; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
557; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
558; RV32-NEXT:    ret
559;
560; RV64-LABEL: vpgather_nxv2i32:
561; RV64:       # %bb.0:
562; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
563; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
564; RV64-NEXT:    vmv1r.v v8, v10
565; RV64-NEXT:    ret
566  %v = call <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
567  ret <vscale x 2 x i32> %v
568}
569
570define <vscale x 2 x i64> @vpgather_nxv2i32_sextload_nxv2i64(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
571; RV32-LABEL: vpgather_nxv2i32_sextload_nxv2i64:
572; RV32:       # %bb.0:
573; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
574; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
575; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
576; RV32-NEXT:    vsext.vf2 v8, v10
577; RV32-NEXT:    ret
578;
579; RV64-LABEL: vpgather_nxv2i32_sextload_nxv2i64:
580; RV64:       # %bb.0:
581; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
582; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
583; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
584; RV64-NEXT:    vsext.vf2 v8, v10
585; RV64-NEXT:    ret
586  %v = call <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
587  %ev = sext <vscale x 2 x i32> %v to <vscale x 2 x i64>
588  ret <vscale x 2 x i64> %ev
589}
590
591define <vscale x 2 x i64> @vpgather_nxv2i32_zextload_nxv2i64(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
592; RV32-LABEL: vpgather_nxv2i32_zextload_nxv2i64:
593; RV32:       # %bb.0:
594; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
595; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
596; RV32-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
597; RV32-NEXT:    vzext.vf2 v8, v10
598; RV32-NEXT:    ret
599;
600; RV64-LABEL: vpgather_nxv2i32_zextload_nxv2i64:
601; RV64:       # %bb.0:
602; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
603; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
604; RV64-NEXT:    vsetvli a0, zero, e64, m2, ta, mu
605; RV64-NEXT:    vzext.vf2 v8, v10
606; RV64-NEXT:    ret
607  %v = call <vscale x 2 x i32> @llvm.vp.gather.nxv2i32.nxv2p0i32(<vscale x 2 x i32*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
608  %ev = zext <vscale x 2 x i32> %v to <vscale x 2 x i64>
609  ret <vscale x 2 x i64> %ev
610}
611
612declare <vscale x 4 x i32> @llvm.vp.gather.nxv4i32.nxv4p0i32(<vscale x 4 x i32*>, <vscale x 4 x i1>, i32)
613
614define <vscale x 4 x i32> @vpgather_nxv4i32(<vscale x 4 x i32*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
615; RV32-LABEL: vpgather_nxv4i32:
616; RV32:       # %bb.0:
617; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
618; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
619; RV32-NEXT:    ret
620;
621; RV64-LABEL: vpgather_nxv4i32:
622; RV64:       # %bb.0:
623; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
624; RV64-NEXT:    vluxei64.v v12, (zero), v8, v0.t
625; RV64-NEXT:    vmv2r.v v8, v12
626; RV64-NEXT:    ret
627  %v = call <vscale x 4 x i32> @llvm.vp.gather.nxv4i32.nxv4p0i32(<vscale x 4 x i32*> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
628  ret <vscale x 4 x i32> %v
629}
630
631define <vscale x 4 x i32> @vpgather_truemask_nxv4i32(<vscale x 4 x i32*> %ptrs, i32 zeroext %evl) {
632; RV32-LABEL: vpgather_truemask_nxv4i32:
633; RV32:       # %bb.0:
634; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
635; RV32-NEXT:    vluxei32.v v8, (zero), v8
636; RV32-NEXT:    ret
637;
638; RV64-LABEL: vpgather_truemask_nxv4i32:
639; RV64:       # %bb.0:
640; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
641; RV64-NEXT:    vluxei64.v v12, (zero), v8
642; RV64-NEXT:    vmv2r.v v8, v12
643; RV64-NEXT:    ret
644  %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
645  %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
646  %v = call <vscale x 4 x i32> @llvm.vp.gather.nxv4i32.nxv4p0i32(<vscale x 4 x i32*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
647  ret <vscale x 4 x i32> %v
648}
649
650declare <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*>, <vscale x 8 x i1>, i32)
651
652define <vscale x 8 x i32> @vpgather_nxv8i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
653; RV32-LABEL: vpgather_nxv8i32:
654; RV32:       # %bb.0:
655; RV32-NEXT:    vsetvli zero, a0, e32, m4, ta, mu
656; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
657; RV32-NEXT:    ret
658;
659; RV64-LABEL: vpgather_nxv8i32:
660; RV64:       # %bb.0:
661; RV64-NEXT:    vsetvli zero, a0, e32, m4, ta, mu
662; RV64-NEXT:    vluxei64.v v16, (zero), v8, v0.t
663; RV64-NEXT:    vmv4r.v v8, v16
664; RV64-NEXT:    ret
665  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
666  ret <vscale x 8 x i32> %v
667}
668
669define <vscale x 8 x i32> @vpgather_baseidx_nxv8i8_nxv8i32(i32* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
670; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8i32:
671; RV32:       # %bb.0:
672; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
673; RV32-NEXT:    vsext.vf4 v12, v8
674; RV32-NEXT:    vsll.vi v8, v12, 2
675; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
676; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
677; RV32-NEXT:    ret
678;
679; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8i32:
680; RV64:       # %bb.0:
681; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
682; RV64-NEXT:    vsext.vf8 v16, v8
683; RV64-NEXT:    vsll.vi v16, v16, 2
684; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
685; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
686; RV64-NEXT:    ret
687  %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i8> %idxs
688  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
689  ret <vscale x 8 x i32> %v
690}
691
692define <vscale x 8 x i32> @vpgather_baseidx_sext_nxv8i8_nxv8i32(i32* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
693; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i32:
694; RV32:       # %bb.0:
695; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
696; RV32-NEXT:    vsext.vf4 v12, v8
697; RV32-NEXT:    vsll.vi v8, v12, 2
698; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
699; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
700; RV32-NEXT:    ret
701;
702; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i32:
703; RV64:       # %bb.0:
704; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
705; RV64-NEXT:    vsext.vf8 v16, v8
706; RV64-NEXT:    vsll.vi v16, v16, 2
707; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
708; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
709; RV64-NEXT:    ret
710  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
711  %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs
712  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
713  ret <vscale x 8 x i32> %v
714}
715
716define <vscale x 8 x i32> @vpgather_baseidx_zext_nxv8i8_nxv8i32(i32* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
717; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i32:
718; RV32:       # %bb.0:
719; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
720; RV32-NEXT:    vzext.vf4 v12, v8
721; RV32-NEXT:    vsll.vi v8, v12, 2
722; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
723; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
724; RV32-NEXT:    ret
725;
726; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i32:
727; RV64:       # %bb.0:
728; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
729; RV64-NEXT:    vzext.vf8 v16, v8
730; RV64-NEXT:    vsll.vi v16, v16, 2
731; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
732; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
733; RV64-NEXT:    ret
734  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
735  %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs
736  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
737  ret <vscale x 8 x i32> %v
738}
739
740define <vscale x 8 x i32> @vpgather_baseidx_nxv8i16_nxv8i32(i32* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
741; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8i32:
742; RV32:       # %bb.0:
743; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
744; RV32-NEXT:    vsext.vf2 v12, v8
745; RV32-NEXT:    vsll.vi v8, v12, 2
746; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
747; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
748; RV32-NEXT:    ret
749;
750; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8i32:
751; RV64:       # %bb.0:
752; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
753; RV64-NEXT:    vsext.vf4 v16, v8
754; RV64-NEXT:    vsll.vi v16, v16, 2
755; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
756; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
757; RV64-NEXT:    ret
758  %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i16> %idxs
759  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
760  ret <vscale x 8 x i32> %v
761}
762
763define <vscale x 8 x i32> @vpgather_baseidx_sext_nxv8i16_nxv8i32(i32* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
764; RV32-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8i32:
765; RV32:       # %bb.0:
766; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
767; RV32-NEXT:    vsext.vf2 v12, v8
768; RV32-NEXT:    vsll.vi v8, v12, 2
769; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
770; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
771; RV32-NEXT:    ret
772;
773; RV64-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8i32:
774; RV64:       # %bb.0:
775; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
776; RV64-NEXT:    vsext.vf4 v16, v8
777; RV64-NEXT:    vsll.vi v16, v16, 2
778; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
779; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
780; RV64-NEXT:    ret
781  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
782  %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs
783  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
784  ret <vscale x 8 x i32> %v
785}
786
787define <vscale x 8 x i32> @vpgather_baseidx_zext_nxv8i16_nxv8i32(i32* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
788; RV32-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8i32:
789; RV32:       # %bb.0:
790; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
791; RV32-NEXT:    vzext.vf2 v12, v8
792; RV32-NEXT:    vsll.vi v8, v12, 2
793; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
794; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
795; RV32-NEXT:    ret
796;
797; RV64-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8i32:
798; RV64:       # %bb.0:
799; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
800; RV64-NEXT:    vzext.vf4 v16, v8
801; RV64-NEXT:    vsll.vi v16, v16, 2
802; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
803; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
804; RV64-NEXT:    ret
805  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
806  %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %eidxs
807  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
808  ret <vscale x 8 x i32> %v
809}
810
811define <vscale x 8 x i32> @vpgather_baseidx_nxv8i32(i32* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
812; RV32-LABEL: vpgather_baseidx_nxv8i32:
813; RV32:       # %bb.0:
814; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
815; RV32-NEXT:    vsll.vi v8, v8, 2
816; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
817; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
818; RV32-NEXT:    ret
819;
820; RV64-LABEL: vpgather_baseidx_nxv8i32:
821; RV64:       # %bb.0:
822; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
823; RV64-NEXT:    vsext.vf2 v16, v8
824; RV64-NEXT:    vsll.vi v16, v16, 2
825; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
826; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
827; RV64-NEXT:    ret
828  %ptrs = getelementptr inbounds i32, i32* %base, <vscale x 8 x i32> %idxs
829  %v = call <vscale x 8 x i32> @llvm.vp.gather.nxv8i32.nxv8p0i32(<vscale x 8 x i32*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
830  ret <vscale x 8 x i32> %v
831}
832
833declare <vscale x 1 x i64> @llvm.vp.gather.nxv1i64.nxv1p0i64(<vscale x 1 x i64*>, <vscale x 1 x i1>, i32)
834
835define <vscale x 1 x i64> @vpgather_nxv1i64(<vscale x 1 x i64*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
836; RV32-LABEL: vpgather_nxv1i64:
837; RV32:       # %bb.0:
838; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, mu
839; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
840; RV32-NEXT:    vmv1r.v v8, v9
841; RV32-NEXT:    ret
842;
843; RV64-LABEL: vpgather_nxv1i64:
844; RV64:       # %bb.0:
845; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, mu
846; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
847; RV64-NEXT:    ret
848  %v = call <vscale x 1 x i64> @llvm.vp.gather.nxv1i64.nxv1p0i64(<vscale x 1 x i64*> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
849  ret <vscale x 1 x i64> %v
850}
851
852declare <vscale x 2 x i64> @llvm.vp.gather.nxv2i64.nxv2p0i64(<vscale x 2 x i64*>, <vscale x 2 x i1>, i32)
853
854define <vscale x 2 x i64> @vpgather_nxv2i64(<vscale x 2 x i64*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
855; RV32-LABEL: vpgather_nxv2i64:
856; RV32:       # %bb.0:
857; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, mu
858; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
859; RV32-NEXT:    vmv2r.v v8, v10
860; RV32-NEXT:    ret
861;
862; RV64-LABEL: vpgather_nxv2i64:
863; RV64:       # %bb.0:
864; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, mu
865; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
866; RV64-NEXT:    ret
867  %v = call <vscale x 2 x i64> @llvm.vp.gather.nxv2i64.nxv2p0i64(<vscale x 2 x i64*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
868  ret <vscale x 2 x i64> %v
869}
870
871declare <vscale x 4 x i64> @llvm.vp.gather.nxv4i64.nxv4p0i64(<vscale x 4 x i64*>, <vscale x 4 x i1>, i32)
872
873define <vscale x 4 x i64> @vpgather_nxv4i64(<vscale x 4 x i64*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
874; RV32-LABEL: vpgather_nxv4i64:
875; RV32:       # %bb.0:
876; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
877; RV32-NEXT:    vluxei32.v v12, (zero), v8, v0.t
878; RV32-NEXT:    vmv4r.v v8, v12
879; RV32-NEXT:    ret
880;
881; RV64-LABEL: vpgather_nxv4i64:
882; RV64:       # %bb.0:
883; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
884; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
885; RV64-NEXT:    ret
886  %v = call <vscale x 4 x i64> @llvm.vp.gather.nxv4i64.nxv4p0i64(<vscale x 4 x i64*> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
887  ret <vscale x 4 x i64> %v
888}
889
890define <vscale x 4 x i64> @vpgather_truemask_nxv4i64(<vscale x 4 x i64*> %ptrs, i32 zeroext %evl) {
891; RV32-LABEL: vpgather_truemask_nxv4i64:
892; RV32:       # %bb.0:
893; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
894; RV32-NEXT:    vluxei32.v v12, (zero), v8
895; RV32-NEXT:    vmv4r.v v8, v12
896; RV32-NEXT:    ret
897;
898; RV64-LABEL: vpgather_truemask_nxv4i64:
899; RV64:       # %bb.0:
900; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
901; RV64-NEXT:    vluxei64.v v8, (zero), v8
902; RV64-NEXT:    ret
903  %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
904  %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
905  %v = call <vscale x 4 x i64> @llvm.vp.gather.nxv4i64.nxv4p0i64(<vscale x 4 x i64*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
906  ret <vscale x 4 x i64> %v
907}
908
909declare <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*>, <vscale x 8 x i1>, i32)
910
911define <vscale x 8 x i64> @vpgather_nxv8i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
912; RV32-LABEL: vpgather_nxv8i64:
913; RV32:       # %bb.0:
914; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, mu
915; RV32-NEXT:    vluxei32.v v16, (zero), v8, v0.t
916; RV32-NEXT:    vmv8r.v v8, v16
917; RV32-NEXT:    ret
918;
919; RV64-LABEL: vpgather_nxv8i64:
920; RV64:       # %bb.0:
921; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, mu
922; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
923; RV64-NEXT:    ret
924  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
925  ret <vscale x 8 x i64> %v
926}
927
928define <vscale x 8 x i64> @vpgather_baseidx_nxv8i8_nxv8i64(i64* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
929; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8i64:
930; RV32:       # %bb.0:
931; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
932; RV32-NEXT:    vsext.vf4 v12, v8
933; RV32-NEXT:    vsll.vi v16, v12, 3
934; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
935; RV32-NEXT:    vluxei32.v v8, (a0), v16, v0.t
936; RV32-NEXT:    ret
937;
938; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8i64:
939; RV64:       # %bb.0:
940; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
941; RV64-NEXT:    vsext.vf8 v16, v8
942; RV64-NEXT:    vsll.vi v8, v16, 3
943; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
944; RV64-NEXT:    vluxei64.v v8, (a0), v8, v0.t
945; RV64-NEXT:    ret
946  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i8> %idxs
947  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
948  ret <vscale x 8 x i64> %v
949}
950
951define <vscale x 8 x i64> @vpgather_baseidx_sext_nxv8i8_nxv8i64(i64* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
952; CHECK-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8i64:
953; CHECK:       # %bb.0:
954; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
955; CHECK-NEXT:    vsext.vf8 v16, v8
956; CHECK-NEXT:    vsll.vi v8, v16, 3
957; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
958; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
959; CHECK-NEXT:    ret
960  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
961  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs
962  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
963  ret <vscale x 8 x i64> %v
964}
965
966define <vscale x 8 x i64> @vpgather_baseidx_zext_nxv8i8_nxv8i64(i64* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
967; CHECK-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8i64:
968; CHECK:       # %bb.0:
969; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
970; CHECK-NEXT:    vzext.vf8 v16, v8
971; CHECK-NEXT:    vsll.vi v8, v16, 3
972; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
973; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
974; CHECK-NEXT:    ret
975  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
976  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs
977  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
978  ret <vscale x 8 x i64> %v
979}
980
981define <vscale x 8 x i64> @vpgather_baseidx_nxv8i16_nxv8i64(i64* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
982; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8i64:
983; RV32:       # %bb.0:
984; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
985; RV32-NEXT:    vsext.vf2 v12, v8
986; RV32-NEXT:    vsll.vi v16, v12, 3
987; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
988; RV32-NEXT:    vluxei32.v v8, (a0), v16, v0.t
989; RV32-NEXT:    ret
990;
991; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8i64:
992; RV64:       # %bb.0:
993; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
994; RV64-NEXT:    vsext.vf4 v16, v8
995; RV64-NEXT:    vsll.vi v8, v16, 3
996; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
997; RV64-NEXT:    vluxei64.v v8, (a0), v8, v0.t
998; RV64-NEXT:    ret
999  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i16> %idxs
1000  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1001  ret <vscale x 8 x i64> %v
1002}
1003
1004define <vscale x 8 x i64> @vpgather_baseidx_sext_nxv8i16_nxv8i64(i64* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1005; CHECK-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8i64:
1006; CHECK:       # %bb.0:
1007; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1008; CHECK-NEXT:    vsext.vf4 v16, v8
1009; CHECK-NEXT:    vsll.vi v8, v16, 3
1010; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1011; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1012; CHECK-NEXT:    ret
1013  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1014  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs
1015  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1016  ret <vscale x 8 x i64> %v
1017}
1018
1019define <vscale x 8 x i64> @vpgather_baseidx_zext_nxv8i16_nxv8i64(i64* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1020; CHECK-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8i64:
1021; CHECK:       # %bb.0:
1022; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1023; CHECK-NEXT:    vzext.vf4 v16, v8
1024; CHECK-NEXT:    vsll.vi v8, v16, 3
1025; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1026; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1027; CHECK-NEXT:    ret
1028  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1029  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs
1030  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1031  ret <vscale x 8 x i64> %v
1032}
1033
1034define <vscale x 8 x i64> @vpgather_baseidx_nxv8i32_nxv8i64(i64* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1035; RV32-LABEL: vpgather_baseidx_nxv8i32_nxv8i64:
1036; RV32:       # %bb.0:
1037; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1038; RV32-NEXT:    vsll.vi v16, v8, 3
1039; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1040; RV32-NEXT:    vluxei32.v v8, (a0), v16, v0.t
1041; RV32-NEXT:    ret
1042;
1043; RV64-LABEL: vpgather_baseidx_nxv8i32_nxv8i64:
1044; RV64:       # %bb.0:
1045; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1046; RV64-NEXT:    vsext.vf2 v16, v8
1047; RV64-NEXT:    vsll.vi v8, v16, 3
1048; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1049; RV64-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1050; RV64-NEXT:    ret
1051  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i32> %idxs
1052  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1053  ret <vscale x 8 x i64> %v
1054}
1055
1056define <vscale x 8 x i64> @vpgather_baseidx_sext_nxv8i32_nxv8i64(i64* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1057; CHECK-LABEL: vpgather_baseidx_sext_nxv8i32_nxv8i64:
1058; CHECK:       # %bb.0:
1059; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1060; CHECK-NEXT:    vsext.vf2 v16, v8
1061; CHECK-NEXT:    vsll.vi v8, v16, 3
1062; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1063; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1064; CHECK-NEXT:    ret
1065  %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1066  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs
1067  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1068  ret <vscale x 8 x i64> %v
1069}
1070
1071define <vscale x 8 x i64> @vpgather_baseidx_zext_nxv8i32_nxv8i64(i64* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1072; CHECK-LABEL: vpgather_baseidx_zext_nxv8i32_nxv8i64:
1073; CHECK:       # %bb.0:
1074; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1075; CHECK-NEXT:    vzext.vf2 v16, v8
1076; CHECK-NEXT:    vsll.vi v8, v16, 3
1077; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1078; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1079; CHECK-NEXT:    ret
1080  %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1081  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %eidxs
1082  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1083  ret <vscale x 8 x i64> %v
1084}
1085
1086define <vscale x 8 x i64> @vpgather_baseidx_nxv8i64(i64* %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1087; CHECK-LABEL: vpgather_baseidx_nxv8i64:
1088; CHECK:       # %bb.0:
1089; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1090; CHECK-NEXT:    vsll.vi v8, v8, 3
1091; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1092; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1093; CHECK-NEXT:    ret
1094  %ptrs = getelementptr inbounds i64, i64* %base, <vscale x 8 x i64> %idxs
1095  %v = call <vscale x 8 x i64> @llvm.vp.gather.nxv8i64.nxv8p0i64(<vscale x 8 x i64*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1096  ret <vscale x 8 x i64> %v
1097}
1098
1099declare <vscale x 1 x half> @llvm.vp.gather.nxv1f16.nxv1p0f16(<vscale x 1 x half*>, <vscale x 1 x i1>, i32)
1100
1101define <vscale x 1 x half> @vpgather_nxv1f16(<vscale x 1 x half*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1102; RV32-LABEL: vpgather_nxv1f16:
1103; RV32:       # %bb.0:
1104; RV32-NEXT:    vsetvli zero, a0, e16, mf4, ta, mu
1105; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
1106; RV32-NEXT:    vmv1r.v v8, v9
1107; RV32-NEXT:    ret
1108;
1109; RV64-LABEL: vpgather_nxv1f16:
1110; RV64:       # %bb.0:
1111; RV64-NEXT:    vsetvli zero, a0, e16, mf4, ta, mu
1112; RV64-NEXT:    vluxei64.v v9, (zero), v8, v0.t
1113; RV64-NEXT:    vmv1r.v v8, v9
1114; RV64-NEXT:    ret
1115  %v = call <vscale x 1 x half> @llvm.vp.gather.nxv1f16.nxv1p0f16(<vscale x 1 x half*> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
1116  ret <vscale x 1 x half> %v
1117}
1118
1119declare <vscale x 2 x half> @llvm.vp.gather.nxv2f16.nxv2p0f16(<vscale x 2 x half*>, <vscale x 2 x i1>, i32)
1120
1121define <vscale x 2 x half> @vpgather_nxv2f16(<vscale x 2 x half*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1122; RV32-LABEL: vpgather_nxv2f16:
1123; RV32:       # %bb.0:
1124; RV32-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
1125; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
1126; RV32-NEXT:    vmv1r.v v8, v9
1127; RV32-NEXT:    ret
1128;
1129; RV64-LABEL: vpgather_nxv2f16:
1130; RV64:       # %bb.0:
1131; RV64-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu
1132; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
1133; RV64-NEXT:    vmv1r.v v8, v10
1134; RV64-NEXT:    ret
1135  %v = call <vscale x 2 x half> @llvm.vp.gather.nxv2f16.nxv2p0f16(<vscale x 2 x half*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
1136  ret <vscale x 2 x half> %v
1137}
1138
1139declare <vscale x 4 x half> @llvm.vp.gather.nxv4f16.nxv4p0f16(<vscale x 4 x half*>, <vscale x 4 x i1>, i32)
1140
1141define <vscale x 4 x half> @vpgather_nxv4f16(<vscale x 4 x half*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1142; RV32-LABEL: vpgather_nxv4f16:
1143; RV32:       # %bb.0:
1144; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
1145; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
1146; RV32-NEXT:    vmv1r.v v8, v10
1147; RV32-NEXT:    ret
1148;
1149; RV64-LABEL: vpgather_nxv4f16:
1150; RV64:       # %bb.0:
1151; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
1152; RV64-NEXT:    vluxei64.v v12, (zero), v8, v0.t
1153; RV64-NEXT:    vmv1r.v v8, v12
1154; RV64-NEXT:    ret
1155  %v = call <vscale x 4 x half> @llvm.vp.gather.nxv4f16.nxv4p0f16(<vscale x 4 x half*> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
1156  ret <vscale x 4 x half> %v
1157}
1158
1159define <vscale x 4 x half> @vpgather_truemask_nxv4f16(<vscale x 4 x half*> %ptrs, i32 zeroext %evl) {
1160; RV32-LABEL: vpgather_truemask_nxv4f16:
1161; RV32:       # %bb.0:
1162; RV32-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
1163; RV32-NEXT:    vluxei32.v v10, (zero), v8
1164; RV32-NEXT:    vmv1r.v v8, v10
1165; RV32-NEXT:    ret
1166;
1167; RV64-LABEL: vpgather_truemask_nxv4f16:
1168; RV64:       # %bb.0:
1169; RV64-NEXT:    vsetvli zero, a0, e16, m1, ta, mu
1170; RV64-NEXT:    vluxei64.v v12, (zero), v8
1171; RV64-NEXT:    vmv1r.v v8, v12
1172; RV64-NEXT:    ret
1173  %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
1174  %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
1175  %v = call <vscale x 4 x half> @llvm.vp.gather.nxv4f16.nxv4p0f16(<vscale x 4 x half*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
1176  ret <vscale x 4 x half> %v
1177}
1178
1179declare <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*>, <vscale x 8 x i1>, i32)
1180
1181define <vscale x 8 x half> @vpgather_nxv8f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1182; RV32-LABEL: vpgather_nxv8f16:
1183; RV32:       # %bb.0:
1184; RV32-NEXT:    vsetvli zero, a0, e16, m2, ta, mu
1185; RV32-NEXT:    vluxei32.v v12, (zero), v8, v0.t
1186; RV32-NEXT:    vmv2r.v v8, v12
1187; RV32-NEXT:    ret
1188;
1189; RV64-LABEL: vpgather_nxv8f16:
1190; RV64:       # %bb.0:
1191; RV64-NEXT:    vsetvli zero, a0, e16, m2, ta, mu
1192; RV64-NEXT:    vluxei64.v v16, (zero), v8, v0.t
1193; RV64-NEXT:    vmv2r.v v8, v16
1194; RV64-NEXT:    ret
1195  %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1196  ret <vscale x 8 x half> %v
1197}
1198
1199define <vscale x 8 x half> @vpgather_baseidx_nxv8i8_nxv8f16(half* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1200; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8f16:
1201; RV32:       # %bb.0:
1202; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1203; RV32-NEXT:    vsext.vf4 v12, v8
1204; RV32-NEXT:    vadd.vv v12, v12, v12
1205; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1206; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
1207; RV32-NEXT:    ret
1208;
1209; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8f16:
1210; RV64:       # %bb.0:
1211; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1212; RV64-NEXT:    vsext.vf8 v16, v8
1213; RV64-NEXT:    vadd.vv v16, v16, v16
1214; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1215; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1216; RV64-NEXT:    ret
1217  %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i8> %idxs
1218  %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1219  ret <vscale x 8 x half> %v
1220}
1221
1222define <vscale x 8 x half> @vpgather_baseidx_sext_nxv8i8_nxv8f16(half* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1223; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f16:
1224; RV32:       # %bb.0:
1225; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1226; RV32-NEXT:    vsext.vf4 v12, v8
1227; RV32-NEXT:    vadd.vv v12, v12, v12
1228; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1229; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
1230; RV32-NEXT:    ret
1231;
1232; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f16:
1233; RV64:       # %bb.0:
1234; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1235; RV64-NEXT:    vsext.vf8 v16, v8
1236; RV64-NEXT:    vadd.vv v16, v16, v16
1237; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1238; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1239; RV64-NEXT:    ret
1240  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
1241  %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i16> %eidxs
1242  %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1243  ret <vscale x 8 x half> %v
1244}
1245
1246define <vscale x 8 x half> @vpgather_baseidx_zext_nxv8i8_nxv8f16(half* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1247; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f16:
1248; RV32:       # %bb.0:
1249; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1250; RV32-NEXT:    vzext.vf4 v12, v8
1251; RV32-NEXT:    vadd.vv v12, v12, v12
1252; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1253; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
1254; RV32-NEXT:    ret
1255;
1256; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f16:
1257; RV64:       # %bb.0:
1258; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1259; RV64-NEXT:    vzext.vf8 v16, v8
1260; RV64-NEXT:    vadd.vv v16, v16, v16
1261; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1262; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1263; RV64-NEXT:    ret
1264  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i16>
1265  %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i16> %eidxs
1266  %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1267  ret <vscale x 8 x half> %v
1268}
1269
1270define <vscale x 8 x half> @vpgather_baseidx_nxv8f16(half* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1271; RV32-LABEL: vpgather_baseidx_nxv8f16:
1272; RV32:       # %bb.0:
1273; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1274; RV32-NEXT:    vsext.vf2 v12, v8
1275; RV32-NEXT:    vadd.vv v12, v12, v12
1276; RV32-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1277; RV32-NEXT:    vluxei32.v v8, (a0), v12, v0.t
1278; RV32-NEXT:    ret
1279;
1280; RV64-LABEL: vpgather_baseidx_nxv8f16:
1281; RV64:       # %bb.0:
1282; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1283; RV64-NEXT:    vsext.vf4 v16, v8
1284; RV64-NEXT:    vadd.vv v16, v16, v16
1285; RV64-NEXT:    vsetvli zero, a1, e16, m2, ta, mu
1286; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1287; RV64-NEXT:    ret
1288  %ptrs = getelementptr inbounds half, half* %base, <vscale x 8 x i16> %idxs
1289  %v = call <vscale x 8 x half> @llvm.vp.gather.nxv8f16.nxv8p0f16(<vscale x 8 x half*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1290  ret <vscale x 8 x half> %v
1291}
1292
1293declare <vscale x 1 x float> @llvm.vp.gather.nxv1f32.nxv1p0f32(<vscale x 1 x float*>, <vscale x 1 x i1>, i32)
1294
1295define <vscale x 1 x float> @vpgather_nxv1f32(<vscale x 1 x float*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1296; RV32-LABEL: vpgather_nxv1f32:
1297; RV32:       # %bb.0:
1298; RV32-NEXT:    vsetvli zero, a0, e32, mf2, ta, mu
1299; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
1300; RV32-NEXT:    ret
1301;
1302; RV64-LABEL: vpgather_nxv1f32:
1303; RV64:       # %bb.0:
1304; RV64-NEXT:    vsetvli zero, a0, e32, mf2, ta, mu
1305; RV64-NEXT:    vluxei64.v v9, (zero), v8, v0.t
1306; RV64-NEXT:    vmv1r.v v8, v9
1307; RV64-NEXT:    ret
1308  %v = call <vscale x 1 x float> @llvm.vp.gather.nxv1f32.nxv1p0f32(<vscale x 1 x float*> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
1309  ret <vscale x 1 x float> %v
1310}
1311
1312declare <vscale x 2 x float> @llvm.vp.gather.nxv2f32.nxv2p0f32(<vscale x 2 x float*>, <vscale x 2 x i1>, i32)
1313
1314define <vscale x 2 x float> @vpgather_nxv2f32(<vscale x 2 x float*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1315; RV32-LABEL: vpgather_nxv2f32:
1316; RV32:       # %bb.0:
1317; RV32-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
1318; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
1319; RV32-NEXT:    ret
1320;
1321; RV64-LABEL: vpgather_nxv2f32:
1322; RV64:       # %bb.0:
1323; RV64-NEXT:    vsetvli zero, a0, e32, m1, ta, mu
1324; RV64-NEXT:    vluxei64.v v10, (zero), v8, v0.t
1325; RV64-NEXT:    vmv1r.v v8, v10
1326; RV64-NEXT:    ret
1327  %v = call <vscale x 2 x float> @llvm.vp.gather.nxv2f32.nxv2p0f32(<vscale x 2 x float*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
1328  ret <vscale x 2 x float> %v
1329}
1330
1331declare <vscale x 4 x float> @llvm.vp.gather.nxv4f32.nxv4p0f32(<vscale x 4 x float*>, <vscale x 4 x i1>, i32)
1332
1333define <vscale x 4 x float> @vpgather_nxv4f32(<vscale x 4 x float*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1334; RV32-LABEL: vpgather_nxv4f32:
1335; RV32:       # %bb.0:
1336; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
1337; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
1338; RV32-NEXT:    ret
1339;
1340; RV64-LABEL: vpgather_nxv4f32:
1341; RV64:       # %bb.0:
1342; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
1343; RV64-NEXT:    vluxei64.v v12, (zero), v8, v0.t
1344; RV64-NEXT:    vmv2r.v v8, v12
1345; RV64-NEXT:    ret
1346  %v = call <vscale x 4 x float> @llvm.vp.gather.nxv4f32.nxv4p0f32(<vscale x 4 x float*> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
1347  ret <vscale x 4 x float> %v
1348}
1349
1350define <vscale x 4 x float> @vpgather_truemask_nxv4f32(<vscale x 4 x float*> %ptrs, i32 zeroext %evl) {
1351; RV32-LABEL: vpgather_truemask_nxv4f32:
1352; RV32:       # %bb.0:
1353; RV32-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
1354; RV32-NEXT:    vluxei32.v v8, (zero), v8
1355; RV32-NEXT:    ret
1356;
1357; RV64-LABEL: vpgather_truemask_nxv4f32:
1358; RV64:       # %bb.0:
1359; RV64-NEXT:    vsetvli zero, a0, e32, m2, ta, mu
1360; RV64-NEXT:    vluxei64.v v12, (zero), v8
1361; RV64-NEXT:    vmv2r.v v8, v12
1362; RV64-NEXT:    ret
1363  %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
1364  %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
1365  %v = call <vscale x 4 x float> @llvm.vp.gather.nxv4f32.nxv4p0f32(<vscale x 4 x float*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
1366  ret <vscale x 4 x float> %v
1367}
1368
1369declare <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*>, <vscale x 8 x i1>, i32)
1370
1371define <vscale x 8 x float> @vpgather_nxv8f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1372; RV32-LABEL: vpgather_nxv8f32:
1373; RV32:       # %bb.0:
1374; RV32-NEXT:    vsetvli zero, a0, e32, m4, ta, mu
1375; RV32-NEXT:    vluxei32.v v8, (zero), v8, v0.t
1376; RV32-NEXT:    ret
1377;
1378; RV64-LABEL: vpgather_nxv8f32:
1379; RV64:       # %bb.0:
1380; RV64-NEXT:    vsetvli zero, a0, e32, m4, ta, mu
1381; RV64-NEXT:    vluxei64.v v16, (zero), v8, v0.t
1382; RV64-NEXT:    vmv4r.v v8, v16
1383; RV64-NEXT:    ret
1384  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1385  ret <vscale x 8 x float> %v
1386}
1387
1388define <vscale x 8 x float> @vpgather_baseidx_nxv8i8_nxv8f32(float* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1389; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8f32:
1390; RV32:       # %bb.0:
1391; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1392; RV32-NEXT:    vsext.vf4 v12, v8
1393; RV32-NEXT:    vsll.vi v8, v12, 2
1394; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1395; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
1396; RV32-NEXT:    ret
1397;
1398; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8f32:
1399; RV64:       # %bb.0:
1400; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1401; RV64-NEXT:    vsext.vf8 v16, v8
1402; RV64-NEXT:    vsll.vi v16, v16, 2
1403; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1404; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1405; RV64-NEXT:    ret
1406  %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i8> %idxs
1407  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1408  ret <vscale x 8 x float> %v
1409}
1410
1411define <vscale x 8 x float> @vpgather_baseidx_sext_nxv8i8_nxv8f32(float* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1412; RV32-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f32:
1413; RV32:       # %bb.0:
1414; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1415; RV32-NEXT:    vsext.vf4 v12, v8
1416; RV32-NEXT:    vsll.vi v8, v12, 2
1417; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1418; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
1419; RV32-NEXT:    ret
1420;
1421; RV64-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f32:
1422; RV64:       # %bb.0:
1423; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1424; RV64-NEXT:    vsext.vf8 v16, v8
1425; RV64-NEXT:    vsll.vi v16, v16, 2
1426; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1427; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1428; RV64-NEXT:    ret
1429  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
1430  %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs
1431  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1432  ret <vscale x 8 x float> %v
1433}
1434
1435define <vscale x 8 x float> @vpgather_baseidx_zext_nxv8i8_nxv8f32(float* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1436; RV32-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f32:
1437; RV32:       # %bb.0:
1438; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1439; RV32-NEXT:    vzext.vf4 v12, v8
1440; RV32-NEXT:    vsll.vi v8, v12, 2
1441; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1442; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
1443; RV32-NEXT:    ret
1444;
1445; RV64-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f32:
1446; RV64:       # %bb.0:
1447; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1448; RV64-NEXT:    vzext.vf8 v16, v8
1449; RV64-NEXT:    vsll.vi v16, v16, 2
1450; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1451; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1452; RV64-NEXT:    ret
1453  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i32>
1454  %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs
1455  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1456  ret <vscale x 8 x float> %v
1457}
1458
1459define <vscale x 8 x float> @vpgather_baseidx_nxv8i16_nxv8f32(float* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1460; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8f32:
1461; RV32:       # %bb.0:
1462; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1463; RV32-NEXT:    vsext.vf2 v12, v8
1464; RV32-NEXT:    vsll.vi v8, v12, 2
1465; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1466; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
1467; RV32-NEXT:    ret
1468;
1469; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8f32:
1470; RV64:       # %bb.0:
1471; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1472; RV64-NEXT:    vsext.vf4 v16, v8
1473; RV64-NEXT:    vsll.vi v16, v16, 2
1474; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1475; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1476; RV64-NEXT:    ret
1477  %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i16> %idxs
1478  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1479  ret <vscale x 8 x float> %v
1480}
1481
1482define <vscale x 8 x float> @vpgather_baseidx_sext_nxv8i16_nxv8f32(float* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1483; RV32-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8f32:
1484; RV32:       # %bb.0:
1485; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1486; RV32-NEXT:    vsext.vf2 v12, v8
1487; RV32-NEXT:    vsll.vi v8, v12, 2
1488; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1489; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
1490; RV32-NEXT:    ret
1491;
1492; RV64-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8f32:
1493; RV64:       # %bb.0:
1494; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1495; RV64-NEXT:    vsext.vf4 v16, v8
1496; RV64-NEXT:    vsll.vi v16, v16, 2
1497; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1498; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1499; RV64-NEXT:    ret
1500  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
1501  %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs
1502  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1503  ret <vscale x 8 x float> %v
1504}
1505
1506define <vscale x 8 x float> @vpgather_baseidx_zext_nxv8i16_nxv8f32(float* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1507; RV32-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8f32:
1508; RV32:       # %bb.0:
1509; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1510; RV32-NEXT:    vzext.vf2 v12, v8
1511; RV32-NEXT:    vsll.vi v8, v12, 2
1512; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1513; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
1514; RV32-NEXT:    ret
1515;
1516; RV64-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8f32:
1517; RV64:       # %bb.0:
1518; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1519; RV64-NEXT:    vzext.vf4 v16, v8
1520; RV64-NEXT:    vsll.vi v16, v16, 2
1521; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1522; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1523; RV64-NEXT:    ret
1524  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i32>
1525  %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %eidxs
1526  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1527  ret <vscale x 8 x float> %v
1528}
1529
1530define <vscale x 8 x float> @vpgather_baseidx_nxv8f32(float* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1531; RV32-LABEL: vpgather_baseidx_nxv8f32:
1532; RV32:       # %bb.0:
1533; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1534; RV32-NEXT:    vsll.vi v8, v8, 2
1535; RV32-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1536; RV32-NEXT:    vluxei32.v v8, (a0), v8, v0.t
1537; RV32-NEXT:    ret
1538;
1539; RV64-LABEL: vpgather_baseidx_nxv8f32:
1540; RV64:       # %bb.0:
1541; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1542; RV64-NEXT:    vsext.vf2 v16, v8
1543; RV64-NEXT:    vsll.vi v16, v16, 2
1544; RV64-NEXT:    vsetvli zero, a1, e32, m4, ta, mu
1545; RV64-NEXT:    vluxei64.v v8, (a0), v16, v0.t
1546; RV64-NEXT:    ret
1547  %ptrs = getelementptr inbounds float, float* %base, <vscale x 8 x i32> %idxs
1548  %v = call <vscale x 8 x float> @llvm.vp.gather.nxv8f32.nxv8p0f32(<vscale x 8 x float*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1549  ret <vscale x 8 x float> %v
1550}
1551
1552declare <vscale x 1 x double> @llvm.vp.gather.nxv1f64.nxv1p0f64(<vscale x 1 x double*>, <vscale x 1 x i1>, i32)
1553
1554define <vscale x 1 x double> @vpgather_nxv1f64(<vscale x 1 x double*> %ptrs, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1555; RV32-LABEL: vpgather_nxv1f64:
1556; RV32:       # %bb.0:
1557; RV32-NEXT:    vsetvli zero, a0, e64, m1, ta, mu
1558; RV32-NEXT:    vluxei32.v v9, (zero), v8, v0.t
1559; RV32-NEXT:    vmv1r.v v8, v9
1560; RV32-NEXT:    ret
1561;
1562; RV64-LABEL: vpgather_nxv1f64:
1563; RV64:       # %bb.0:
1564; RV64-NEXT:    vsetvli zero, a0, e64, m1, ta, mu
1565; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
1566; RV64-NEXT:    ret
1567  %v = call <vscale x 1 x double> @llvm.vp.gather.nxv1f64.nxv1p0f64(<vscale x 1 x double*> %ptrs, <vscale x 1 x i1> %m, i32 %evl)
1568  ret <vscale x 1 x double> %v
1569}
1570
1571declare <vscale x 2 x double> @llvm.vp.gather.nxv2f64.nxv2p0f64(<vscale x 2 x double*>, <vscale x 2 x i1>, i32)
1572
1573define <vscale x 2 x double> @vpgather_nxv2f64(<vscale x 2 x double*> %ptrs, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1574; RV32-LABEL: vpgather_nxv2f64:
1575; RV32:       # %bb.0:
1576; RV32-NEXT:    vsetvli zero, a0, e64, m2, ta, mu
1577; RV32-NEXT:    vluxei32.v v10, (zero), v8, v0.t
1578; RV32-NEXT:    vmv2r.v v8, v10
1579; RV32-NEXT:    ret
1580;
1581; RV64-LABEL: vpgather_nxv2f64:
1582; RV64:       # %bb.0:
1583; RV64-NEXT:    vsetvli zero, a0, e64, m2, ta, mu
1584; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
1585; RV64-NEXT:    ret
1586  %v = call <vscale x 2 x double> @llvm.vp.gather.nxv2f64.nxv2p0f64(<vscale x 2 x double*> %ptrs, <vscale x 2 x i1> %m, i32 %evl)
1587  ret <vscale x 2 x double> %v
1588}
1589
1590declare <vscale x 4 x double> @llvm.vp.gather.nxv4f64.nxv4p0f64(<vscale x 4 x double*>, <vscale x 4 x i1>, i32)
1591
1592define <vscale x 4 x double> @vpgather_nxv4f64(<vscale x 4 x double*> %ptrs, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1593; RV32-LABEL: vpgather_nxv4f64:
1594; RV32:       # %bb.0:
1595; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
1596; RV32-NEXT:    vluxei32.v v12, (zero), v8, v0.t
1597; RV32-NEXT:    vmv4r.v v8, v12
1598; RV32-NEXT:    ret
1599;
1600; RV64-LABEL: vpgather_nxv4f64:
1601; RV64:       # %bb.0:
1602; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
1603; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
1604; RV64-NEXT:    ret
1605  %v = call <vscale x 4 x double> @llvm.vp.gather.nxv4f64.nxv4p0f64(<vscale x 4 x double*> %ptrs, <vscale x 4 x i1> %m, i32 %evl)
1606  ret <vscale x 4 x double> %v
1607}
1608
1609define <vscale x 4 x double> @vpgather_truemask_nxv4f64(<vscale x 4 x double*> %ptrs, i32 zeroext %evl) {
1610; RV32-LABEL: vpgather_truemask_nxv4f64:
1611; RV32:       # %bb.0:
1612; RV32-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
1613; RV32-NEXT:    vluxei32.v v12, (zero), v8
1614; RV32-NEXT:    vmv4r.v v8, v12
1615; RV32-NEXT:    ret
1616;
1617; RV64-LABEL: vpgather_truemask_nxv4f64:
1618; RV64:       # %bb.0:
1619; RV64-NEXT:    vsetvli zero, a0, e64, m4, ta, mu
1620; RV64-NEXT:    vluxei64.v v8, (zero), v8
1621; RV64-NEXT:    ret
1622  %mhead = insertelement <vscale x 4 x i1> undef, i1 1, i32 0
1623  %mtrue = shufflevector <vscale x 4 x i1> %mhead, <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer
1624  %v = call <vscale x 4 x double> @llvm.vp.gather.nxv4f64.nxv4p0f64(<vscale x 4 x double*> %ptrs, <vscale x 4 x i1> %mtrue, i32 %evl)
1625  ret <vscale x 4 x double> %v
1626}
1627
1628declare <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*>, <vscale x 8 x i1>, i32)
1629
1630define <vscale x 8 x double> @vpgather_nxv8f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1631; RV32-LABEL: vpgather_nxv8f64:
1632; RV32:       # %bb.0:
1633; RV32-NEXT:    vsetvli zero, a0, e64, m8, ta, mu
1634; RV32-NEXT:    vluxei32.v v16, (zero), v8, v0.t
1635; RV32-NEXT:    vmv8r.v v8, v16
1636; RV32-NEXT:    ret
1637;
1638; RV64-LABEL: vpgather_nxv8f64:
1639; RV64:       # %bb.0:
1640; RV64-NEXT:    vsetvli zero, a0, e64, m8, ta, mu
1641; RV64-NEXT:    vluxei64.v v8, (zero), v8, v0.t
1642; RV64-NEXT:    ret
1643  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1644  ret <vscale x 8 x double> %v
1645}
1646
1647define <vscale x 8 x double> @vpgather_baseidx_nxv8i8_nxv8f64(double* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1648; RV32-LABEL: vpgather_baseidx_nxv8i8_nxv8f64:
1649; RV32:       # %bb.0:
1650; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1651; RV32-NEXT:    vsext.vf4 v12, v8
1652; RV32-NEXT:    vsll.vi v16, v12, 3
1653; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1654; RV32-NEXT:    vluxei32.v v8, (a0), v16, v0.t
1655; RV32-NEXT:    ret
1656;
1657; RV64-LABEL: vpgather_baseidx_nxv8i8_nxv8f64:
1658; RV64:       # %bb.0:
1659; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1660; RV64-NEXT:    vsext.vf8 v16, v8
1661; RV64-NEXT:    vsll.vi v8, v16, 3
1662; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1663; RV64-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1664; RV64-NEXT:    ret
1665  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i8> %idxs
1666  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1667  ret <vscale x 8 x double> %v
1668}
1669
1670define <vscale x 8 x double> @vpgather_baseidx_sext_nxv8i8_nxv8f64(double* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1671; CHECK-LABEL: vpgather_baseidx_sext_nxv8i8_nxv8f64:
1672; CHECK:       # %bb.0:
1673; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1674; CHECK-NEXT:    vsext.vf8 v16, v8
1675; CHECK-NEXT:    vsll.vi v8, v16, 3
1676; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1677; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1678; CHECK-NEXT:    ret
1679  %eidxs = sext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
1680  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs
1681  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1682  ret <vscale x 8 x double> %v
1683}
1684
1685define <vscale x 8 x double> @vpgather_baseidx_zext_nxv8i8_nxv8f64(double* %base, <vscale x 8 x i8> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1686; CHECK-LABEL: vpgather_baseidx_zext_nxv8i8_nxv8f64:
1687; CHECK:       # %bb.0:
1688; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1689; CHECK-NEXT:    vzext.vf8 v16, v8
1690; CHECK-NEXT:    vsll.vi v8, v16, 3
1691; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1692; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1693; CHECK-NEXT:    ret
1694  %eidxs = zext <vscale x 8 x i8> %idxs to <vscale x 8 x i64>
1695  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs
1696  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1697  ret <vscale x 8 x double> %v
1698}
1699
1700define <vscale x 8 x double> @vpgather_baseidx_nxv8i16_nxv8f64(double* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1701; RV32-LABEL: vpgather_baseidx_nxv8i16_nxv8f64:
1702; RV32:       # %bb.0:
1703; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1704; RV32-NEXT:    vsext.vf2 v12, v8
1705; RV32-NEXT:    vsll.vi v16, v12, 3
1706; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1707; RV32-NEXT:    vluxei32.v v8, (a0), v16, v0.t
1708; RV32-NEXT:    ret
1709;
1710; RV64-LABEL: vpgather_baseidx_nxv8i16_nxv8f64:
1711; RV64:       # %bb.0:
1712; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1713; RV64-NEXT:    vsext.vf4 v16, v8
1714; RV64-NEXT:    vsll.vi v8, v16, 3
1715; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1716; RV64-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1717; RV64-NEXT:    ret
1718  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i16> %idxs
1719  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1720  ret <vscale x 8 x double> %v
1721}
1722
1723define <vscale x 8 x double> @vpgather_baseidx_sext_nxv8i16_nxv8f64(double* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1724; CHECK-LABEL: vpgather_baseidx_sext_nxv8i16_nxv8f64:
1725; CHECK:       # %bb.0:
1726; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1727; CHECK-NEXT:    vsext.vf4 v16, v8
1728; CHECK-NEXT:    vsll.vi v8, v16, 3
1729; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1730; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1731; CHECK-NEXT:    ret
1732  %eidxs = sext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1733  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs
1734  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1735  ret <vscale x 8 x double> %v
1736}
1737
1738define <vscale x 8 x double> @vpgather_baseidx_zext_nxv8i16_nxv8f64(double* %base, <vscale x 8 x i16> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1739; CHECK-LABEL: vpgather_baseidx_zext_nxv8i16_nxv8f64:
1740; CHECK:       # %bb.0:
1741; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1742; CHECK-NEXT:    vzext.vf4 v16, v8
1743; CHECK-NEXT:    vsll.vi v8, v16, 3
1744; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1745; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1746; CHECK-NEXT:    ret
1747  %eidxs = zext <vscale x 8 x i16> %idxs to <vscale x 8 x i64>
1748  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs
1749  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1750  ret <vscale x 8 x double> %v
1751}
1752
1753define <vscale x 8 x double> @vpgather_baseidx_nxv8i32_nxv8f64(double* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1754; RV32-LABEL: vpgather_baseidx_nxv8i32_nxv8f64:
1755; RV32:       # %bb.0:
1756; RV32-NEXT:    vsetvli a2, zero, e32, m4, ta, mu
1757; RV32-NEXT:    vsll.vi v16, v8, 3
1758; RV32-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1759; RV32-NEXT:    vluxei32.v v8, (a0), v16, v0.t
1760; RV32-NEXT:    ret
1761;
1762; RV64-LABEL: vpgather_baseidx_nxv8i32_nxv8f64:
1763; RV64:       # %bb.0:
1764; RV64-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1765; RV64-NEXT:    vsext.vf2 v16, v8
1766; RV64-NEXT:    vsll.vi v8, v16, 3
1767; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1768; RV64-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1769; RV64-NEXT:    ret
1770  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i32> %idxs
1771  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1772  ret <vscale x 8 x double> %v
1773}
1774
1775define <vscale x 8 x double> @vpgather_baseidx_sext_nxv8i32_nxv8f64(double* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1776; CHECK-LABEL: vpgather_baseidx_sext_nxv8i32_nxv8f64:
1777; CHECK:       # %bb.0:
1778; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1779; CHECK-NEXT:    vsext.vf2 v16, v8
1780; CHECK-NEXT:    vsll.vi v8, v16, 3
1781; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1782; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1783; CHECK-NEXT:    ret
1784  %eidxs = sext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1785  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs
1786  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1787  ret <vscale x 8 x double> %v
1788}
1789
1790define <vscale x 8 x double> @vpgather_baseidx_zext_nxv8i32_nxv8f64(double* %base, <vscale x 8 x i32> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1791; CHECK-LABEL: vpgather_baseidx_zext_nxv8i32_nxv8f64:
1792; CHECK:       # %bb.0:
1793; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1794; CHECK-NEXT:    vzext.vf2 v16, v8
1795; CHECK-NEXT:    vsll.vi v8, v16, 3
1796; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1797; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1798; CHECK-NEXT:    ret
1799  %eidxs = zext <vscale x 8 x i32> %idxs to <vscale x 8 x i64>
1800  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %eidxs
1801  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1802  ret <vscale x 8 x double> %v
1803}
1804
1805define <vscale x 8 x double> @vpgather_baseidx_nxv8f64(double* %base, <vscale x 8 x i64> %idxs, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1806; CHECK-LABEL: vpgather_baseidx_nxv8f64:
1807; CHECK:       # %bb.0:
1808; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
1809; CHECK-NEXT:    vsll.vi v8, v8, 3
1810; CHECK-NEXT:    vsetvli zero, a1, e64, m8, ta, mu
1811; CHECK-NEXT:    vluxei64.v v8, (a0), v8, v0.t
1812; CHECK-NEXT:    ret
1813  %ptrs = getelementptr inbounds double, double* %base, <vscale x 8 x i64> %idxs
1814  %v = call <vscale x 8 x double> @llvm.vp.gather.nxv8f64.nxv8p0f64(<vscale x 8 x double*> %ptrs, <vscale x 8 x i1> %m, i32 %evl)
1815  ret <vscale x 8 x double> %v
1816}
1817