1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+experimental-zvfh,+v,+m -target-abi=ilp32d \
3; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+experimental-zvfh,+v,+m -target-abi=lp64d \
5; RUN:     -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
6
7declare <vscale x 1 x i1> @llvm.vp.merge.nxv1i1(<vscale x 1 x i1>, <vscale x 1 x i1>, <vscale x 1 x i1>, i32)
8
9define <vscale x 1 x i1> @vpmerge_nxv1i1(<vscale x 1 x i1> %va, <vscale x 1 x i1> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
10; RV32-LABEL: vpmerge_nxv1i1:
11; RV32:       # %bb.0:
12; RV32-NEXT:    vsetvli a1, zero, e32, mf2, ta, mu
13; RV32-NEXT:    vid.v v10
14; RV32-NEXT:    vmsltu.vx v10, v10, a0
15; RV32-NEXT:    vmand.mm v9, v9, v10
16; RV32-NEXT:    vmandn.mm v8, v8, v9
17; RV32-NEXT:    vmand.mm v9, v0, v9
18; RV32-NEXT:    vmor.mm v0, v9, v8
19; RV32-NEXT:    ret
20;
21; RV64-LABEL: vpmerge_nxv1i1:
22; RV64:       # %bb.0:
23; RV64-NEXT:    vsetvli a1, zero, e64, m1, ta, mu
24; RV64-NEXT:    vid.v v10
25; RV64-NEXT:    vmsltu.vx v10, v10, a0
26; RV64-NEXT:    vmand.mm v9, v9, v10
27; RV64-NEXT:    vmandn.mm v8, v8, v9
28; RV64-NEXT:    vmand.mm v9, v0, v9
29; RV64-NEXT:    vmor.mm v0, v9, v8
30; RV64-NEXT:    ret
31  %v = call <vscale x 1 x i1> @llvm.vp.merge.nxv1i1(<vscale x 1 x i1> %m, <vscale x 1 x i1> %va, <vscale x 1 x i1> %vb, i32 %evl)
32  ret <vscale x 1 x i1> %v
33}
34
35declare <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1>, <vscale x 1 x i8>, <vscale x 1 x i8>, i32)
36
37define <vscale x 1 x i8> @vpmerge_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
38; CHECK-LABEL: vpmerge_vv_nxv1i8:
39; CHECK:       # %bb.0:
40; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, tu, mu
41; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
42; CHECK-NEXT:    vmv1r.v v8, v9
43; CHECK-NEXT:    ret
44  %v = call <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1> %m, <vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, i32 %evl)
45  ret <vscale x 1 x i8> %v
46}
47
48define <vscale x 1 x i8> @vpmerge_vx_nxv1i8(i8 %a, <vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
49; CHECK-LABEL: vpmerge_vx_nxv1i8:
50; CHECK:       # %bb.0:
51; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, tu, mu
52; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
53; CHECK-NEXT:    ret
54  %elt.head = insertelement <vscale x 1 x i8> poison, i8 %a, i32 0
55  %va = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
56  %v = call <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1> %m, <vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, i32 %evl)
57  ret <vscale x 1 x i8> %v
58}
59
60define <vscale x 1 x i8> @vpmerge_vi_nxv1i8(<vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
61; CHECK-LABEL: vpmerge_vi_nxv1i8:
62; CHECK:       # %bb.0:
63; CHECK-NEXT:    vsetvli zero, a0, e8, mf8, tu, mu
64; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
65; CHECK-NEXT:    ret
66  %elt.head = insertelement <vscale x 1 x i8> poison, i8 2, i32 0
67  %va = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
68  %v = call <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1> %m, <vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, i32 %evl)
69  ret <vscale x 1 x i8> %v
70}
71
72declare <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1>, <vscale x 2 x i8>, <vscale x 2 x i8>, i32)
73
74define <vscale x 2 x i8> @vpmerge_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
75; CHECK-LABEL: vpmerge_vv_nxv2i8:
76; CHECK:       # %bb.0:
77; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, tu, mu
78; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
79; CHECK-NEXT:    vmv1r.v v8, v9
80; CHECK-NEXT:    ret
81  %v = call <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1> %m, <vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, i32 %evl)
82  ret <vscale x 2 x i8> %v
83}
84
85define <vscale x 2 x i8> @vpmerge_vx_nxv2i8(i8 %a, <vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
86; CHECK-LABEL: vpmerge_vx_nxv2i8:
87; CHECK:       # %bb.0:
88; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, tu, mu
89; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
90; CHECK-NEXT:    ret
91  %elt.head = insertelement <vscale x 2 x i8> poison, i8 %a, i32 0
92  %va = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
93  %v = call <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1> %m, <vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, i32 %evl)
94  ret <vscale x 2 x i8> %v
95}
96
97define <vscale x 2 x i8> @vpmerge_vi_nxv2i8(<vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
98; CHECK-LABEL: vpmerge_vi_nxv2i8:
99; CHECK:       # %bb.0:
100; CHECK-NEXT:    vsetvli zero, a0, e8, mf4, tu, mu
101; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
102; CHECK-NEXT:    ret
103  %elt.head = insertelement <vscale x 2 x i8> poison, i8 2, i32 0
104  %va = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
105  %v = call <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1> %m, <vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, i32 %evl)
106  ret <vscale x 2 x i8> %v
107}
108
109declare <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1>, <vscale x 3 x i8>, <vscale x 3 x i8>, i32)
110
111define <vscale x 3 x i8> @vpmerge_vv_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 zeroext %evl) {
112; CHECK-LABEL: vpmerge_vv_nxv3i8:
113; CHECK:       # %bb.0:
114; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, tu, mu
115; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
116; CHECK-NEXT:    vmv1r.v v8, v9
117; CHECK-NEXT:    ret
118  %v = call <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1> %m, <vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, i32 %evl)
119  ret <vscale x 3 x i8> %v
120}
121
122define <vscale x 3 x i8> @vpmerge_vx_nxv3i8(i8 %a, <vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 zeroext %evl) {
123; CHECK-LABEL: vpmerge_vx_nxv3i8:
124; CHECK:       # %bb.0:
125; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, tu, mu
126; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
127; CHECK-NEXT:    ret
128  %elt.head = insertelement <vscale x 3 x i8> poison, i8 %a, i32 0
129  %va = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer
130  %v = call <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1> %m, <vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, i32 %evl)
131  ret <vscale x 3 x i8> %v
132}
133
134define <vscale x 3 x i8> @vpmerge_vi_nxv3i8(<vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 zeroext %evl) {
135; CHECK-LABEL: vpmerge_vi_nxv3i8:
136; CHECK:       # %bb.0:
137; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, tu, mu
138; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
139; CHECK-NEXT:    ret
140  %elt.head = insertelement <vscale x 3 x i8> poison, i8 2, i32 0
141  %va = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer
142  %v = call <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1> %m, <vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, i32 %evl)
143  ret <vscale x 3 x i8> %v
144}
145
146declare <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1>, <vscale x 4 x i8>, <vscale x 4 x i8>, i32)
147
148define <vscale x 4 x i8> @vpmerge_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
149; CHECK-LABEL: vpmerge_vv_nxv4i8:
150; CHECK:       # %bb.0:
151; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, tu, mu
152; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
153; CHECK-NEXT:    vmv1r.v v8, v9
154; CHECK-NEXT:    ret
155  %v = call <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1> %m, <vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, i32 %evl)
156  ret <vscale x 4 x i8> %v
157}
158
159define <vscale x 4 x i8> @vpmerge_vx_nxv4i8(i8 %a, <vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
160; CHECK-LABEL: vpmerge_vx_nxv4i8:
161; CHECK:       # %bb.0:
162; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, tu, mu
163; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
164; CHECK-NEXT:    ret
165  %elt.head = insertelement <vscale x 4 x i8> poison, i8 %a, i32 0
166  %va = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
167  %v = call <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1> %m, <vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, i32 %evl)
168  ret <vscale x 4 x i8> %v
169}
170
171define <vscale x 4 x i8> @vpmerge_vi_nxv4i8(<vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
172; CHECK-LABEL: vpmerge_vi_nxv4i8:
173; CHECK:       # %bb.0:
174; CHECK-NEXT:    vsetvli zero, a0, e8, mf2, tu, mu
175; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
176; CHECK-NEXT:    ret
177  %elt.head = insertelement <vscale x 4 x i8> poison, i8 2, i32 0
178  %va = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
179  %v = call <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1> %m, <vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, i32 %evl)
180  ret <vscale x 4 x i8> %v
181}
182
183declare <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1>, <vscale x 8 x i7>, <vscale x 8 x i7>, i32)
184
185define <vscale x 8 x i7> @vpmerge_vv_nxv8i7(<vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
186; CHECK-LABEL: vpmerge_vv_nxv8i7:
187; CHECK:       # %bb.0:
188; CHECK-NEXT:    vsetvli zero, a0, e8, m1, tu, mu
189; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
190; CHECK-NEXT:    vmv1r.v v8, v9
191; CHECK-NEXT:    ret
192  %v = call <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1> %m, <vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, i32 %evl)
193  ret <vscale x 8 x i7> %v
194}
195
196define <vscale x 8 x i7> @vpmerge_vx_nxv8i7(i7 %a, <vscale x 8 x i7> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
197; CHECK-LABEL: vpmerge_vx_nxv8i7:
198; CHECK:       # %bb.0:
199; CHECK-NEXT:    vsetvli zero, a1, e8, m1, tu, mu
200; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
201; CHECK-NEXT:    ret
202  %elt.head = insertelement <vscale x 8 x i7> poison, i7 %a, i32 0
203  %va = shufflevector <vscale x 8 x i7> %elt.head, <vscale x 8 x i7> poison, <vscale x 8 x i32> zeroinitializer
204  %v = call <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1> %m, <vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, i32 %evl)
205  ret <vscale x 8 x i7> %v
206}
207
208define <vscale x 8 x i7> @vpmerge_vi_nxv8i7(<vscale x 8 x i7> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
209; CHECK-LABEL: vpmerge_vi_nxv8i7:
210; CHECK:       # %bb.0:
211; CHECK-NEXT:    vsetvli zero, a0, e8, m1, tu, mu
212; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
213; CHECK-NEXT:    ret
214  %elt.head = insertelement <vscale x 8 x i7> poison, i7 2, i32 0
215  %va = shufflevector <vscale x 8 x i7> %elt.head, <vscale x 8 x i7> poison, <vscale x 8 x i32> zeroinitializer
216  %v = call <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1> %m, <vscale x 8 x i7> %va, <vscale x 8 x i7> %vb, i32 %evl)
217  ret <vscale x 8 x i7> %v
218}
219
220declare <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1>, <vscale x 8 x i8>, <vscale x 8 x i8>, i32)
221
222define <vscale x 8 x i8> @vpmerge_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
223; CHECK-LABEL: vpmerge_vv_nxv8i8:
224; CHECK:       # %bb.0:
225; CHECK-NEXT:    vsetvli zero, a0, e8, m1, tu, mu
226; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
227; CHECK-NEXT:    vmv1r.v v8, v9
228; CHECK-NEXT:    ret
229  %v = call <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1> %m, <vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, i32 %evl)
230  ret <vscale x 8 x i8> %v
231}
232
233define <vscale x 8 x i8> @vpmerge_vx_nxv8i8(i8 %a, <vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
234; CHECK-LABEL: vpmerge_vx_nxv8i8:
235; CHECK:       # %bb.0:
236; CHECK-NEXT:    vsetvli zero, a1, e8, m1, tu, mu
237; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
238; CHECK-NEXT:    ret
239  %elt.head = insertelement <vscale x 8 x i8> poison, i8 %a, i32 0
240  %va = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
241  %v = call <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1> %m, <vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, i32 %evl)
242  ret <vscale x 8 x i8> %v
243}
244
245define <vscale x 8 x i8> @vpmerge_vi_nxv8i8(<vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
246; CHECK-LABEL: vpmerge_vi_nxv8i8:
247; CHECK:       # %bb.0:
248; CHECK-NEXT:    vsetvli zero, a0, e8, m1, tu, mu
249; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
250; CHECK-NEXT:    ret
251  %elt.head = insertelement <vscale x 8 x i8> poison, i8 2, i32 0
252  %va = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
253  %v = call <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1> %m, <vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, i32 %evl)
254  ret <vscale x 8 x i8> %v
255}
256
257declare <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1>, <vscale x 16 x i8>, <vscale x 16 x i8>, i32)
258
259define <vscale x 16 x i8> @vpmerge_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
260; CHECK-LABEL: vpmerge_vv_nxv16i8:
261; CHECK:       # %bb.0:
262; CHECK-NEXT:    vsetvli zero, a0, e8, m2, tu, mu
263; CHECK-NEXT:    vmerge.vvm v10, v10, v8, v0
264; CHECK-NEXT:    vmv2r.v v8, v10
265; CHECK-NEXT:    ret
266  %v = call <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1> %m, <vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, i32 %evl)
267  ret <vscale x 16 x i8> %v
268}
269
270define <vscale x 16 x i8> @vpmerge_vx_nxv16i8(i8 %a, <vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
271; CHECK-LABEL: vpmerge_vx_nxv16i8:
272; CHECK:       # %bb.0:
273; CHECK-NEXT:    vsetvli zero, a1, e8, m2, tu, mu
274; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
275; CHECK-NEXT:    ret
276  %elt.head = insertelement <vscale x 16 x i8> poison, i8 %a, i32 0
277  %va = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
278  %v = call <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1> %m, <vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, i32 %evl)
279  ret <vscale x 16 x i8> %v
280}
281
282define <vscale x 16 x i8> @vpmerge_vi_nxv16i8(<vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
283; CHECK-LABEL: vpmerge_vi_nxv16i8:
284; CHECK:       # %bb.0:
285; CHECK-NEXT:    vsetvli zero, a0, e8, m2, tu, mu
286; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
287; CHECK-NEXT:    ret
288  %elt.head = insertelement <vscale x 16 x i8> poison, i8 2, i32 0
289  %va = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
290  %v = call <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1> %m, <vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, i32 %evl)
291  ret <vscale x 16 x i8> %v
292}
293
294declare <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1>, <vscale x 32 x i8>, <vscale x 32 x i8>, i32)
295
296define <vscale x 32 x i8> @vpmerge_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
297; CHECK-LABEL: vpmerge_vv_nxv32i8:
298; CHECK:       # %bb.0:
299; CHECK-NEXT:    vsetvli zero, a0, e8, m4, tu, mu
300; CHECK-NEXT:    vmerge.vvm v12, v12, v8, v0
301; CHECK-NEXT:    vmv4r.v v8, v12
302; CHECK-NEXT:    ret
303  %v = call <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1> %m, <vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, i32 %evl)
304  ret <vscale x 32 x i8> %v
305}
306
307define <vscale x 32 x i8> @vpmerge_vx_nxv32i8(i8 %a, <vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
308; CHECK-LABEL: vpmerge_vx_nxv32i8:
309; CHECK:       # %bb.0:
310; CHECK-NEXT:    vsetvli zero, a1, e8, m4, tu, mu
311; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
312; CHECK-NEXT:    ret
313  %elt.head = insertelement <vscale x 32 x i8> poison, i8 %a, i32 0
314  %va = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
315  %v = call <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1> %m, <vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, i32 %evl)
316  ret <vscale x 32 x i8> %v
317}
318
319define <vscale x 32 x i8> @vpmerge_vi_nxv32i8(<vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
320; CHECK-LABEL: vpmerge_vi_nxv32i8:
321; CHECK:       # %bb.0:
322; CHECK-NEXT:    vsetvli zero, a0, e8, m4, tu, mu
323; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
324; CHECK-NEXT:    ret
325  %elt.head = insertelement <vscale x 32 x i8> poison, i8 2, i32 0
326  %va = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
327  %v = call <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1> %m, <vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, i32 %evl)
328  ret <vscale x 32 x i8> %v
329}
330
331declare <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1>, <vscale x 64 x i8>, <vscale x 64 x i8>, i32)
332
333define <vscale x 64 x i8> @vpmerge_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) {
334; CHECK-LABEL: vpmerge_vv_nxv64i8:
335; CHECK:       # %bb.0:
336; CHECK-NEXT:    vsetvli zero, a0, e8, m8, tu, mu
337; CHECK-NEXT:    vmerge.vvm v16, v16, v8, v0
338; CHECK-NEXT:    vmv8r.v v8, v16
339; CHECK-NEXT:    ret
340  %v = call <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1> %m, <vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, i32 %evl)
341  ret <vscale x 64 x i8> %v
342}
343
344define <vscale x 64 x i8> @vpmerge_vx_nxv64i8(i8 %a, <vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) {
345; CHECK-LABEL: vpmerge_vx_nxv64i8:
346; CHECK:       # %bb.0:
347; CHECK-NEXT:    vsetvli zero, a1, e8, m8, tu, mu
348; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
349; CHECK-NEXT:    ret
350  %elt.head = insertelement <vscale x 64 x i8> poison, i8 %a, i32 0
351  %va = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
352  %v = call <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1> %m, <vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, i32 %evl)
353  ret <vscale x 64 x i8> %v
354}
355
356define <vscale x 64 x i8> @vpmerge_vi_nxv64i8(<vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) {
357; CHECK-LABEL: vpmerge_vi_nxv64i8:
358; CHECK:       # %bb.0:
359; CHECK-NEXT:    vsetvli zero, a0, e8, m8, tu, mu
360; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
361; CHECK-NEXT:    ret
362  %elt.head = insertelement <vscale x 64 x i8> poison, i8 2, i32 0
363  %va = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
364  %v = call <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1> %m, <vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, i32 %evl)
365  ret <vscale x 64 x i8> %v
366}
367
368declare <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1>, <vscale x 128 x i8>, <vscale x 128 x i8>, i32)
369
370define <vscale x 128 x i8> @vpmerge_vv_nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) {
371; RV32-LABEL: vpmerge_vv_nxv128i8:
372; RV32:       # %bb.0:
373; RV32-NEXT:    addi sp, sp, -16
374; RV32-NEXT:    .cfi_def_cfa_offset 16
375; RV32-NEXT:    csrr a1, vlenb
376; RV32-NEXT:    li a4, 24
377; RV32-NEXT:    mul a1, a1, a4
378; RV32-NEXT:    sub sp, sp, a1
379; RV32-NEXT:    csrr a1, vlenb
380; RV32-NEXT:    slli a1, a1, 3
381; RV32-NEXT:    add a4, a0, a1
382; RV32-NEXT:    vl8r.v v24, (a4)
383; RV32-NEXT:    csrr a4, vlenb
384; RV32-NEXT:    slli a4, a4, 3
385; RV32-NEXT:    add a4, sp, a4
386; RV32-NEXT:    addi a4, a4, 16
387; RV32-NEXT:    vs8r.v v24, (a4) # Unknown-size Folded Spill
388; RV32-NEXT:    vsetvli a4, zero, e8, m8, ta, mu
389; RV32-NEXT:    vlm.v v2, (a2)
390; RV32-NEXT:    sub a4, a3, a1
391; RV32-NEXT:    vmv1r.v v1, v0
392; RV32-NEXT:    csrr a2, vlenb
393; RV32-NEXT:    slli a2, a2, 4
394; RV32-NEXT:    add a2, sp, a2
395; RV32-NEXT:    addi a2, a2, 16
396; RV32-NEXT:    vs8r.v v16, (a2) # Unknown-size Folded Spill
397; RV32-NEXT:    addi a2, sp, 16
398; RV32-NEXT:    vs8r.v v8, (a2) # Unknown-size Folded Spill
399; RV32-NEXT:    li a2, 0
400; RV32-NEXT:    bltu a3, a4, .LBB28_2
401; RV32-NEXT:  # %bb.1:
402; RV32-NEXT:    mv a2, a4
403; RV32-NEXT:  .LBB28_2:
404; RV32-NEXT:    vl8r.v v8, (a0)
405; RV32-NEXT:    vsetvli zero, a2, e8, m8, tu, mu
406; RV32-NEXT:    vmv1r.v v0, v2
407; RV32-NEXT:    csrr a0, vlenb
408; RV32-NEXT:    slli a0, a0, 4
409; RV32-NEXT:    add a0, sp, a0
410; RV32-NEXT:    addi a0, a0, 16
411; RV32-NEXT:    vl8re8.v v24, (a0) # Unknown-size Folded Reload
412; RV32-NEXT:    csrr a0, vlenb
413; RV32-NEXT:    slli a0, a0, 3
414; RV32-NEXT:    add a0, sp, a0
415; RV32-NEXT:    addi a0, a0, 16
416; RV32-NEXT:    vl8re8.v v16, (a0) # Unknown-size Folded Reload
417; RV32-NEXT:    vmerge.vvm v16, v16, v24, v0
418; RV32-NEXT:    bltu a3, a1, .LBB28_4
419; RV32-NEXT:  # %bb.3:
420; RV32-NEXT:    mv a3, a1
421; RV32-NEXT:  .LBB28_4:
422; RV32-NEXT:    vsetvli zero, a3, e8, m8, tu, mu
423; RV32-NEXT:    vmv1r.v v0, v1
424; RV32-NEXT:    addi a0, sp, 16
425; RV32-NEXT:    vl8re8.v v24, (a0) # Unknown-size Folded Reload
426; RV32-NEXT:    vmerge.vvm v8, v8, v24, v0
427; RV32-NEXT:    csrr a0, vlenb
428; RV32-NEXT:    li a1, 24
429; RV32-NEXT:    mul a0, a0, a1
430; RV32-NEXT:    add sp, sp, a0
431; RV32-NEXT:    addi sp, sp, 16
432; RV32-NEXT:    ret
433;
434; RV64-LABEL: vpmerge_vv_nxv128i8:
435; RV64:       # %bb.0:
436; RV64-NEXT:    addi sp, sp, -16
437; RV64-NEXT:    .cfi_def_cfa_offset 16
438; RV64-NEXT:    csrr a1, vlenb
439; RV64-NEXT:    slli a1, a1, 3
440; RV64-NEXT:    sub sp, sp, a1
441; RV64-NEXT:    csrr a1, vlenb
442; RV64-NEXT:    slli a1, a1, 3
443; RV64-NEXT:    add a4, a0, a1
444; RV64-NEXT:    vl8r.v v24, (a4)
445; RV64-NEXT:    vsetvli a4, zero, e8, m8, ta, mu
446; RV64-NEXT:    vlm.v v2, (a2)
447; RV64-NEXT:    sub a4, a3, a1
448; RV64-NEXT:    vmv1r.v v1, v0
449; RV64-NEXT:    addi a2, sp, 16
450; RV64-NEXT:    vs8r.v v8, (a2) # Unknown-size Folded Spill
451; RV64-NEXT:    li a2, 0
452; RV64-NEXT:    bltu a3, a4, .LBB28_2
453; RV64-NEXT:  # %bb.1:
454; RV64-NEXT:    mv a2, a4
455; RV64-NEXT:  .LBB28_2:
456; RV64-NEXT:    vl8r.v v8, (a0)
457; RV64-NEXT:    vsetvli zero, a2, e8, m8, tu, mu
458; RV64-NEXT:    vmv1r.v v0, v2
459; RV64-NEXT:    vmerge.vvm v24, v24, v16, v0
460; RV64-NEXT:    bltu a3, a1, .LBB28_4
461; RV64-NEXT:  # %bb.3:
462; RV64-NEXT:    mv a3, a1
463; RV64-NEXT:  .LBB28_4:
464; RV64-NEXT:    vsetvli zero, a3, e8, m8, tu, mu
465; RV64-NEXT:    vmv1r.v v0, v1
466; RV64-NEXT:    addi a0, sp, 16
467; RV64-NEXT:    vl8re8.v v16, (a0) # Unknown-size Folded Reload
468; RV64-NEXT:    vmerge.vvm v8, v8, v16, v0
469; RV64-NEXT:    vmv8r.v v16, v24
470; RV64-NEXT:    csrr a0, vlenb
471; RV64-NEXT:    slli a0, a0, 3
472; RV64-NEXT:    add sp, sp, a0
473; RV64-NEXT:    addi sp, sp, 16
474; RV64-NEXT:    ret
475  %v = call <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1> %m, <vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, i32 %evl)
476  ret <vscale x 128 x i8> %v
477}
478
479define <vscale x 128 x i8> @vpmerge_vx_nxv128i8(i8 %a, <vscale x 128 x i8> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) {
480; CHECK-LABEL: vpmerge_vx_nxv128i8:
481; CHECK:       # %bb.0:
482; CHECK-NEXT:    csrr a3, vlenb
483; CHECK-NEXT:    slli a3, a3, 3
484; CHECK-NEXT:    mv a4, a2
485; CHECK-NEXT:    bltu a2, a3, .LBB29_2
486; CHECK-NEXT:  # %bb.1:
487; CHECK-NEXT:    mv a4, a3
488; CHECK-NEXT:  .LBB29_2:
489; CHECK-NEXT:    li a5, 0
490; CHECK-NEXT:    vsetvli a6, zero, e8, m8, ta, mu
491; CHECK-NEXT:    vlm.v v24, (a1)
492; CHECK-NEXT:    vsetvli zero, a4, e8, m8, tu, mu
493; CHECK-NEXT:    sub a1, a2, a3
494; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
495; CHECK-NEXT:    bltu a2, a1, .LBB29_4
496; CHECK-NEXT:  # %bb.3:
497; CHECK-NEXT:    mv a5, a1
498; CHECK-NEXT:  .LBB29_4:
499; CHECK-NEXT:    vsetvli zero, a5, e8, m8, tu, mu
500; CHECK-NEXT:    vmv1r.v v0, v24
501; CHECK-NEXT:    vmerge.vxm v16, v16, a0, v0
502; CHECK-NEXT:    ret
503  %elt.head = insertelement <vscale x 128 x i8> poison, i8 %a, i32 0
504  %va = shufflevector <vscale x 128 x i8> %elt.head, <vscale x 128 x i8> poison, <vscale x 128 x i32> zeroinitializer
505  %v = call <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1> %m, <vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, i32 %evl)
506  ret <vscale x 128 x i8> %v
507}
508
509define <vscale x 128 x i8> @vpmerge_vi_nxv128i8(<vscale x 128 x i8> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) {
510; CHECK-LABEL: vpmerge_vi_nxv128i8:
511; CHECK:       # %bb.0:
512; CHECK-NEXT:    csrr a2, vlenb
513; CHECK-NEXT:    slli a2, a2, 3
514; CHECK-NEXT:    mv a3, a1
515; CHECK-NEXT:    bltu a1, a2, .LBB30_2
516; CHECK-NEXT:  # %bb.1:
517; CHECK-NEXT:    mv a3, a2
518; CHECK-NEXT:  .LBB30_2:
519; CHECK-NEXT:    li a4, 0
520; CHECK-NEXT:    vsetvli a5, zero, e8, m8, ta, mu
521; CHECK-NEXT:    vlm.v v24, (a0)
522; CHECK-NEXT:    vsetvli zero, a3, e8, m8, tu, mu
523; CHECK-NEXT:    sub a0, a1, a2
524; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
525; CHECK-NEXT:    bltu a1, a0, .LBB30_4
526; CHECK-NEXT:  # %bb.3:
527; CHECK-NEXT:    mv a4, a0
528; CHECK-NEXT:  .LBB30_4:
529; CHECK-NEXT:    vsetvli zero, a4, e8, m8, tu, mu
530; CHECK-NEXT:    vmv1r.v v0, v24
531; CHECK-NEXT:    vmerge.vim v16, v16, 2, v0
532; CHECK-NEXT:    ret
533  %elt.head = insertelement <vscale x 128 x i8> poison, i8 2, i32 0
534  %va = shufflevector <vscale x 128 x i8> %elt.head, <vscale x 128 x i8> poison, <vscale x 128 x i32> zeroinitializer
535  %v = call <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1> %m, <vscale x 128 x i8> %va, <vscale x 128 x i8> %vb, i32 %evl)
536  ret <vscale x 128 x i8> %v
537}
538
539declare <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1>, <vscale x 1 x i16>, <vscale x 1 x i16>, i32)
540
541define <vscale x 1 x i16> @vpmerge_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
542; CHECK-LABEL: vpmerge_vv_nxv1i16:
543; CHECK:       # %bb.0:
544; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, tu, mu
545; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
546; CHECK-NEXT:    vmv1r.v v8, v9
547; CHECK-NEXT:    ret
548  %v = call <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1> %m, <vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, i32 %evl)
549  ret <vscale x 1 x i16> %v
550}
551
552define <vscale x 1 x i16> @vpmerge_vx_nxv1i16(i16 %a, <vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
553; CHECK-LABEL: vpmerge_vx_nxv1i16:
554; CHECK:       # %bb.0:
555; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, tu, mu
556; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
557; CHECK-NEXT:    ret
558  %elt.head = insertelement <vscale x 1 x i16> poison, i16 %a, i32 0
559  %va = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
560  %v = call <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1> %m, <vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, i32 %evl)
561  ret <vscale x 1 x i16> %v
562}
563
564define <vscale x 1 x i16> @vpmerge_vi_nxv1i16(<vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
565; CHECK-LABEL: vpmerge_vi_nxv1i16:
566; CHECK:       # %bb.0:
567; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, tu, mu
568; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
569; CHECK-NEXT:    ret
570  %elt.head = insertelement <vscale x 1 x i16> poison, i16 2, i32 0
571  %va = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
572  %v = call <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1> %m, <vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, i32 %evl)
573  ret <vscale x 1 x i16> %v
574}
575
576declare <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1>, <vscale x 2 x i16>, <vscale x 2 x i16>, i32)
577
578define <vscale x 2 x i16> @vpmerge_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
579; CHECK-LABEL: vpmerge_vv_nxv2i16:
580; CHECK:       # %bb.0:
581; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, tu, mu
582; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
583; CHECK-NEXT:    vmv1r.v v8, v9
584; CHECK-NEXT:    ret
585  %v = call <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1> %m, <vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, i32 %evl)
586  ret <vscale x 2 x i16> %v
587}
588
589define <vscale x 2 x i16> @vpmerge_vx_nxv2i16(i16 %a, <vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
590; CHECK-LABEL: vpmerge_vx_nxv2i16:
591; CHECK:       # %bb.0:
592; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, tu, mu
593; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
594; CHECK-NEXT:    ret
595  %elt.head = insertelement <vscale x 2 x i16> poison, i16 %a, i32 0
596  %va = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
597  %v = call <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1> %m, <vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, i32 %evl)
598  ret <vscale x 2 x i16> %v
599}
600
601define <vscale x 2 x i16> @vpmerge_vi_nxv2i16(<vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
602; CHECK-LABEL: vpmerge_vi_nxv2i16:
603; CHECK:       # %bb.0:
604; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, tu, mu
605; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
606; CHECK-NEXT:    ret
607  %elt.head = insertelement <vscale x 2 x i16> poison, i16 2, i32 0
608  %va = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
609  %v = call <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1> %m, <vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, i32 %evl)
610  ret <vscale x 2 x i16> %v
611}
612
613declare <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1>, <vscale x 4 x i16>, <vscale x 4 x i16>, i32)
614
615define <vscale x 4 x i16> @vpmerge_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
616; CHECK-LABEL: vpmerge_vv_nxv4i16:
617; CHECK:       # %bb.0:
618; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, mu
619; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
620; CHECK-NEXT:    vmv1r.v v8, v9
621; CHECK-NEXT:    ret
622  %v = call <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1> %m, <vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, i32 %evl)
623  ret <vscale x 4 x i16> %v
624}
625
626define <vscale x 4 x i16> @vpmerge_vx_nxv4i16(i16 %a, <vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
627; CHECK-LABEL: vpmerge_vx_nxv4i16:
628; CHECK:       # %bb.0:
629; CHECK-NEXT:    vsetvli zero, a1, e16, m1, tu, mu
630; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
631; CHECK-NEXT:    ret
632  %elt.head = insertelement <vscale x 4 x i16> poison, i16 %a, i32 0
633  %va = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
634  %v = call <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1> %m, <vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, i32 %evl)
635  ret <vscale x 4 x i16> %v
636}
637
638define <vscale x 4 x i16> @vpmerge_vi_nxv4i16(<vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
639; CHECK-LABEL: vpmerge_vi_nxv4i16:
640; CHECK:       # %bb.0:
641; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, mu
642; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
643; CHECK-NEXT:    ret
644  %elt.head = insertelement <vscale x 4 x i16> poison, i16 2, i32 0
645  %va = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
646  %v = call <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1> %m, <vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, i32 %evl)
647  ret <vscale x 4 x i16> %v
648}
649
650declare <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1>, <vscale x 8 x i16>, <vscale x 8 x i16>, i32)
651
652define <vscale x 8 x i16> @vpmerge_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
653; CHECK-LABEL: vpmerge_vv_nxv8i16:
654; CHECK:       # %bb.0:
655; CHECK-NEXT:    vsetvli zero, a0, e16, m2, tu, mu
656; CHECK-NEXT:    vmerge.vvm v10, v10, v8, v0
657; CHECK-NEXT:    vmv2r.v v8, v10
658; CHECK-NEXT:    ret
659  %v = call <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1> %m, <vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, i32 %evl)
660  ret <vscale x 8 x i16> %v
661}
662
663define <vscale x 8 x i16> @vpmerge_vx_nxv8i16(i16 %a, <vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
664; CHECK-LABEL: vpmerge_vx_nxv8i16:
665; CHECK:       # %bb.0:
666; CHECK-NEXT:    vsetvli zero, a1, e16, m2, tu, mu
667; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
668; CHECK-NEXT:    ret
669  %elt.head = insertelement <vscale x 8 x i16> poison, i16 %a, i32 0
670  %va = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
671  %v = call <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1> %m, <vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, i32 %evl)
672  ret <vscale x 8 x i16> %v
673}
674
675define <vscale x 8 x i16> @vpmerge_vi_nxv8i16(<vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
676; CHECK-LABEL: vpmerge_vi_nxv8i16:
677; CHECK:       # %bb.0:
678; CHECK-NEXT:    vsetvli zero, a0, e16, m2, tu, mu
679; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
680; CHECK-NEXT:    ret
681  %elt.head = insertelement <vscale x 8 x i16> poison, i16 2, i32 0
682  %va = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
683  %v = call <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1> %m, <vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, i32 %evl)
684  ret <vscale x 8 x i16> %v
685}
686
687declare <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1>, <vscale x 16 x i16>, <vscale x 16 x i16>, i32)
688
689define <vscale x 16 x i16> @vpmerge_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
690; CHECK-LABEL: vpmerge_vv_nxv16i16:
691; CHECK:       # %bb.0:
692; CHECK-NEXT:    vsetvli zero, a0, e16, m4, tu, mu
693; CHECK-NEXT:    vmerge.vvm v12, v12, v8, v0
694; CHECK-NEXT:    vmv4r.v v8, v12
695; CHECK-NEXT:    ret
696  %v = call <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1> %m, <vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, i32 %evl)
697  ret <vscale x 16 x i16> %v
698}
699
700define <vscale x 16 x i16> @vpmerge_vx_nxv16i16(i16 %a, <vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
701; CHECK-LABEL: vpmerge_vx_nxv16i16:
702; CHECK:       # %bb.0:
703; CHECK-NEXT:    vsetvli zero, a1, e16, m4, tu, mu
704; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
705; CHECK-NEXT:    ret
706  %elt.head = insertelement <vscale x 16 x i16> poison, i16 %a, i32 0
707  %va = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
708  %v = call <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1> %m, <vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, i32 %evl)
709  ret <vscale x 16 x i16> %v
710}
711
712define <vscale x 16 x i16> @vpmerge_vi_nxv16i16(<vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
713; CHECK-LABEL: vpmerge_vi_nxv16i16:
714; CHECK:       # %bb.0:
715; CHECK-NEXT:    vsetvli zero, a0, e16, m4, tu, mu
716; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
717; CHECK-NEXT:    ret
718  %elt.head = insertelement <vscale x 16 x i16> poison, i16 2, i32 0
719  %va = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
720  %v = call <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1> %m, <vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, i32 %evl)
721  ret <vscale x 16 x i16> %v
722}
723
724declare <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1>, <vscale x 32 x i16>, <vscale x 32 x i16>, i32)
725
726define <vscale x 32 x i16> @vpmerge_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
727; CHECK-LABEL: vpmerge_vv_nxv32i16:
728; CHECK:       # %bb.0:
729; CHECK-NEXT:    vsetvli zero, a0, e16, m8, tu, mu
730; CHECK-NEXT:    vmerge.vvm v16, v16, v8, v0
731; CHECK-NEXT:    vmv8r.v v8, v16
732; CHECK-NEXT:    ret
733  %v = call <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1> %m, <vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, i32 %evl)
734  ret <vscale x 32 x i16> %v
735}
736
737define <vscale x 32 x i16> @vpmerge_vx_nxv32i16(i16 %a, <vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
738; CHECK-LABEL: vpmerge_vx_nxv32i16:
739; CHECK:       # %bb.0:
740; CHECK-NEXT:    vsetvli zero, a1, e16, m8, tu, mu
741; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
742; CHECK-NEXT:    ret
743  %elt.head = insertelement <vscale x 32 x i16> poison, i16 %a, i32 0
744  %va = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
745  %v = call <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1> %m, <vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, i32 %evl)
746  ret <vscale x 32 x i16> %v
747}
748
749define <vscale x 32 x i16> @vpmerge_vi_nxv32i16(<vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
750; CHECK-LABEL: vpmerge_vi_nxv32i16:
751; CHECK:       # %bb.0:
752; CHECK-NEXT:    vsetvli zero, a0, e16, m8, tu, mu
753; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
754; CHECK-NEXT:    ret
755  %elt.head = insertelement <vscale x 32 x i16> poison, i16 2, i32 0
756  %va = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
757  %v = call <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1> %m, <vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, i32 %evl)
758  ret <vscale x 32 x i16> %v
759}
760
761declare <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1>, <vscale x 1 x i32>, <vscale x 1 x i32>, i32)
762
763define <vscale x 1 x i32> @vpmerge_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
764; CHECK-LABEL: vpmerge_vv_nxv1i32:
765; CHECK:       # %bb.0:
766; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, tu, mu
767; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
768; CHECK-NEXT:    vmv1r.v v8, v9
769; CHECK-NEXT:    ret
770  %v = call <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1> %m, <vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, i32 %evl)
771  ret <vscale x 1 x i32> %v
772}
773
774define <vscale x 1 x i32> @vpmerge_vx_nxv1i32(i32 %a, <vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
775; CHECK-LABEL: vpmerge_vx_nxv1i32:
776; CHECK:       # %bb.0:
777; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, tu, mu
778; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
779; CHECK-NEXT:    ret
780  %elt.head = insertelement <vscale x 1 x i32> poison, i32 %a, i32 0
781  %va = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
782  %v = call <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1> %m, <vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, i32 %evl)
783  ret <vscale x 1 x i32> %v
784}
785
786define <vscale x 1 x i32> @vpmerge_vi_nxv1i32(<vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
787; CHECK-LABEL: vpmerge_vi_nxv1i32:
788; CHECK:       # %bb.0:
789; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, tu, mu
790; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
791; CHECK-NEXT:    ret
792  %elt.head = insertelement <vscale x 1 x i32> poison, i32 2, i32 0
793  %va = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
794  %v = call <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1> %m, <vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, i32 %evl)
795  ret <vscale x 1 x i32> %v
796}
797
798declare <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1>, <vscale x 2 x i32>, <vscale x 2 x i32>, i32)
799
800define <vscale x 2 x i32> @vpmerge_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
801; CHECK-LABEL: vpmerge_vv_nxv2i32:
802; CHECK:       # %bb.0:
803; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
804; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
805; CHECK-NEXT:    vmv1r.v v8, v9
806; CHECK-NEXT:    ret
807  %v = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, i32 %evl)
808  ret <vscale x 2 x i32> %v
809}
810
811define <vscale x 2 x i32> @vpmerge_vx_nxv2i32(i32 %a, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
812; CHECK-LABEL: vpmerge_vx_nxv2i32:
813; CHECK:       # %bb.0:
814; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, mu
815; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
816; CHECK-NEXT:    ret
817  %elt.head = insertelement <vscale x 2 x i32> poison, i32 %a, i32 0
818  %va = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
819  %v = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, i32 %evl)
820  ret <vscale x 2 x i32> %v
821}
822
823define <vscale x 2 x i32> @vpmerge_vi_nxv2i32(<vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
824; CHECK-LABEL: vpmerge_vi_nxv2i32:
825; CHECK:       # %bb.0:
826; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
827; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
828; CHECK-NEXT:    ret
829  %elt.head = insertelement <vscale x 2 x i32> poison, i32 2, i32 0
830  %va = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
831  %v = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, i32 %evl)
832  ret <vscale x 2 x i32> %v
833}
834
835declare <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1>, <vscale x 4 x i32>, <vscale x 4 x i32>, i32)
836
837define <vscale x 4 x i32> @vpmerge_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
838; CHECK-LABEL: vpmerge_vv_nxv4i32:
839; CHECK:       # %bb.0:
840; CHECK-NEXT:    vsetvli zero, a0, e32, m2, tu, mu
841; CHECK-NEXT:    vmerge.vvm v10, v10, v8, v0
842; CHECK-NEXT:    vmv2r.v v8, v10
843; CHECK-NEXT:    ret
844  %v = call <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1> %m, <vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, i32 %evl)
845  ret <vscale x 4 x i32> %v
846}
847
848define <vscale x 4 x i32> @vpmerge_vx_nxv4i32(i32 %a, <vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
849; CHECK-LABEL: vpmerge_vx_nxv4i32:
850; CHECK:       # %bb.0:
851; CHECK-NEXT:    vsetvli zero, a1, e32, m2, tu, mu
852; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
853; CHECK-NEXT:    ret
854  %elt.head = insertelement <vscale x 4 x i32> poison, i32 %a, i32 0
855  %va = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
856  %v = call <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1> %m, <vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, i32 %evl)
857  ret <vscale x 4 x i32> %v
858}
859
860define <vscale x 4 x i32> @vpmerge_vi_nxv4i32(<vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
861; CHECK-LABEL: vpmerge_vi_nxv4i32:
862; CHECK:       # %bb.0:
863; CHECK-NEXT:    vsetvli zero, a0, e32, m2, tu, mu
864; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
865; CHECK-NEXT:    ret
866  %elt.head = insertelement <vscale x 4 x i32> poison, i32 2, i32 0
867  %va = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
868  %v = call <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1> %m, <vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, i32 %evl)
869  ret <vscale x 4 x i32> %v
870}
871
872declare <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1>, <vscale x 8 x i32>, <vscale x 8 x i32>, i32)
873
874define <vscale x 8 x i32> @vpmerge_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
875; CHECK-LABEL: vpmerge_vv_nxv8i32:
876; CHECK:       # %bb.0:
877; CHECK-NEXT:    vsetvli zero, a0, e32, m4, tu, mu
878; CHECK-NEXT:    vmerge.vvm v12, v12, v8, v0
879; CHECK-NEXT:    vmv4r.v v8, v12
880; CHECK-NEXT:    ret
881  %v = call <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1> %m, <vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, i32 %evl)
882  ret <vscale x 8 x i32> %v
883}
884
885define <vscale x 8 x i32> @vpmerge_vx_nxv8i32(i32 %a, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
886; CHECK-LABEL: vpmerge_vx_nxv8i32:
887; CHECK:       # %bb.0:
888; CHECK-NEXT:    vsetvli zero, a1, e32, m4, tu, mu
889; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
890; CHECK-NEXT:    ret
891  %elt.head = insertelement <vscale x 8 x i32> poison, i32 %a, i32 0
892  %va = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
893  %v = call <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1> %m, <vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, i32 %evl)
894  ret <vscale x 8 x i32> %v
895}
896
897define <vscale x 8 x i32> @vpmerge_vi_nxv8i32(<vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
898; CHECK-LABEL: vpmerge_vi_nxv8i32:
899; CHECK:       # %bb.0:
900; CHECK-NEXT:    vsetvli zero, a0, e32, m4, tu, mu
901; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
902; CHECK-NEXT:    ret
903  %elt.head = insertelement <vscale x 8 x i32> poison, i32 2, i32 0
904  %va = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
905  %v = call <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1> %m, <vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, i32 %evl)
906  ret <vscale x 8 x i32> %v
907}
908
909declare <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1>, <vscale x 16 x i32>, <vscale x 16 x i32>, i32)
910
911define <vscale x 16 x i32> @vpmerge_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
912; CHECK-LABEL: vpmerge_vv_nxv16i32:
913; CHECK:       # %bb.0:
914; CHECK-NEXT:    vsetvli zero, a0, e32, m8, tu, mu
915; CHECK-NEXT:    vmerge.vvm v16, v16, v8, v0
916; CHECK-NEXT:    vmv8r.v v8, v16
917; CHECK-NEXT:    ret
918  %v = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> %m, <vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, i32 %evl)
919  ret <vscale x 16 x i32> %v
920}
921
922define <vscale x 16 x i32> @vpmerge_vx_nxv16i32(i32 %a, <vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
923; CHECK-LABEL: vpmerge_vx_nxv16i32:
924; CHECK:       # %bb.0:
925; CHECK-NEXT:    vsetvli zero, a1, e32, m8, tu, mu
926; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
927; CHECK-NEXT:    ret
928  %elt.head = insertelement <vscale x 16 x i32> poison, i32 %a, i32 0
929  %va = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
930  %v = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> %m, <vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, i32 %evl)
931  ret <vscale x 16 x i32> %v
932}
933
934define <vscale x 16 x i32> @vpmerge_vi_nxv16i32(<vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
935; CHECK-LABEL: vpmerge_vi_nxv16i32:
936; CHECK:       # %bb.0:
937; CHECK-NEXT:    vsetvli zero, a0, e32, m8, tu, mu
938; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
939; CHECK-NEXT:    ret
940  %elt.head = insertelement <vscale x 16 x i32> poison, i32 2, i32 0
941  %va = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
942  %v = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> %m, <vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, i32 %evl)
943  ret <vscale x 16 x i32> %v
944}
945
946declare <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1>, <vscale x 1 x i64>, <vscale x 1 x i64>, i32)
947
948define <vscale x 1 x i64> @vpmerge_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
949; CHECK-LABEL: vpmerge_vv_nxv1i64:
950; CHECK:       # %bb.0:
951; CHECK-NEXT:    vsetvli zero, a0, e64, m1, tu, mu
952; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
953; CHECK-NEXT:    vmv1r.v v8, v9
954; CHECK-NEXT:    ret
955  %v = call <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1> %m, <vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, i32 %evl)
956  ret <vscale x 1 x i64> %v
957}
958
959define <vscale x 1 x i64> @vpmerge_vx_nxv1i64(i64 %a, <vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
960; RV32-LABEL: vpmerge_vx_nxv1i64:
961; RV32:       # %bb.0:
962; RV32-NEXT:    addi sp, sp, -16
963; RV32-NEXT:    .cfi_def_cfa_offset 16
964; RV32-NEXT:    sw a1, 12(sp)
965; RV32-NEXT:    sw a0, 8(sp)
966; RV32-NEXT:    addi a0, sp, 8
967; RV32-NEXT:    vsetvli a1, zero, e64, m1, ta, mu
968; RV32-NEXT:    vlse64.v v9, (a0), zero
969; RV32-NEXT:    vsetvli zero, a2, e64, m1, tu, mu
970; RV32-NEXT:    vmerge.vvm v8, v8, v9, v0
971; RV32-NEXT:    addi sp, sp, 16
972; RV32-NEXT:    ret
973;
974; RV64-LABEL: vpmerge_vx_nxv1i64:
975; RV64:       # %bb.0:
976; RV64-NEXT:    vsetvli zero, a1, e64, m1, tu, mu
977; RV64-NEXT:    vmerge.vxm v8, v8, a0, v0
978; RV64-NEXT:    ret
979  %elt.head = insertelement <vscale x 1 x i64> poison, i64 %a, i32 0
980  %va = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
981  %v = call <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1> %m, <vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, i32 %evl)
982  ret <vscale x 1 x i64> %v
983}
984
985define <vscale x 1 x i64> @vpmerge_vi_nxv1i64(<vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
986; CHECK-LABEL: vpmerge_vi_nxv1i64:
987; CHECK:       # %bb.0:
988; CHECK-NEXT:    vsetvli zero, a0, e64, m1, tu, mu
989; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
990; CHECK-NEXT:    ret
991  %elt.head = insertelement <vscale x 1 x i64> poison, i64 2, i32 0
992  %va = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
993  %v = call <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1> %m, <vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, i32 %evl)
994  ret <vscale x 1 x i64> %v
995}
996
997declare <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1>, <vscale x 2 x i64>, <vscale x 2 x i64>, i32)
998
999define <vscale x 2 x i64> @vpmerge_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1000; CHECK-LABEL: vpmerge_vv_nxv2i64:
1001; CHECK:       # %bb.0:
1002; CHECK-NEXT:    vsetvli zero, a0, e64, m2, tu, mu
1003; CHECK-NEXT:    vmerge.vvm v10, v10, v8, v0
1004; CHECK-NEXT:    vmv2r.v v8, v10
1005; CHECK-NEXT:    ret
1006  %v = call <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1> %m, <vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, i32 %evl)
1007  ret <vscale x 2 x i64> %v
1008}
1009
1010define <vscale x 2 x i64> @vpmerge_vx_nxv2i64(i64 %a, <vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1011; RV32-LABEL: vpmerge_vx_nxv2i64:
1012; RV32:       # %bb.0:
1013; RV32-NEXT:    addi sp, sp, -16
1014; RV32-NEXT:    .cfi_def_cfa_offset 16
1015; RV32-NEXT:    sw a1, 12(sp)
1016; RV32-NEXT:    sw a0, 8(sp)
1017; RV32-NEXT:    addi a0, sp, 8
1018; RV32-NEXT:    vsetvli a1, zero, e64, m2, ta, mu
1019; RV32-NEXT:    vlse64.v v10, (a0), zero
1020; RV32-NEXT:    vsetvli zero, a2, e64, m2, tu, mu
1021; RV32-NEXT:    vmerge.vvm v8, v8, v10, v0
1022; RV32-NEXT:    addi sp, sp, 16
1023; RV32-NEXT:    ret
1024;
1025; RV64-LABEL: vpmerge_vx_nxv2i64:
1026; RV64:       # %bb.0:
1027; RV64-NEXT:    vsetvli zero, a1, e64, m2, tu, mu
1028; RV64-NEXT:    vmerge.vxm v8, v8, a0, v0
1029; RV64-NEXT:    ret
1030  %elt.head = insertelement <vscale x 2 x i64> poison, i64 %a, i32 0
1031  %va = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
1032  %v = call <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1> %m, <vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, i32 %evl)
1033  ret <vscale x 2 x i64> %v
1034}
1035
1036define <vscale x 2 x i64> @vpmerge_vi_nxv2i64(<vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1037; CHECK-LABEL: vpmerge_vi_nxv2i64:
1038; CHECK:       # %bb.0:
1039; CHECK-NEXT:    vsetvli zero, a0, e64, m2, tu, mu
1040; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
1041; CHECK-NEXT:    ret
1042  %elt.head = insertelement <vscale x 2 x i64> poison, i64 2, i32 0
1043  %va = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
1044  %v = call <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1> %m, <vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, i32 %evl)
1045  ret <vscale x 2 x i64> %v
1046}
1047
1048declare <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1>, <vscale x 4 x i64>, <vscale x 4 x i64>, i32)
1049
1050define <vscale x 4 x i64> @vpmerge_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1051; CHECK-LABEL: vpmerge_vv_nxv4i64:
1052; CHECK:       # %bb.0:
1053; CHECK-NEXT:    vsetvli zero, a0, e64, m4, tu, mu
1054; CHECK-NEXT:    vmerge.vvm v12, v12, v8, v0
1055; CHECK-NEXT:    vmv4r.v v8, v12
1056; CHECK-NEXT:    ret
1057  %v = call <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1> %m, <vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, i32 %evl)
1058  ret <vscale x 4 x i64> %v
1059}
1060
1061define <vscale x 4 x i64> @vpmerge_vx_nxv4i64(i64 %a, <vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1062; RV32-LABEL: vpmerge_vx_nxv4i64:
1063; RV32:       # %bb.0:
1064; RV32-NEXT:    addi sp, sp, -16
1065; RV32-NEXT:    .cfi_def_cfa_offset 16
1066; RV32-NEXT:    sw a1, 12(sp)
1067; RV32-NEXT:    sw a0, 8(sp)
1068; RV32-NEXT:    addi a0, sp, 8
1069; RV32-NEXT:    vsetvli a1, zero, e64, m4, ta, mu
1070; RV32-NEXT:    vlse64.v v12, (a0), zero
1071; RV32-NEXT:    vsetvli zero, a2, e64, m4, tu, mu
1072; RV32-NEXT:    vmerge.vvm v8, v8, v12, v0
1073; RV32-NEXT:    addi sp, sp, 16
1074; RV32-NEXT:    ret
1075;
1076; RV64-LABEL: vpmerge_vx_nxv4i64:
1077; RV64:       # %bb.0:
1078; RV64-NEXT:    vsetvli zero, a1, e64, m4, tu, mu
1079; RV64-NEXT:    vmerge.vxm v8, v8, a0, v0
1080; RV64-NEXT:    ret
1081  %elt.head = insertelement <vscale x 4 x i64> poison, i64 %a, i32 0
1082  %va = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
1083  %v = call <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1> %m, <vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, i32 %evl)
1084  ret <vscale x 4 x i64> %v
1085}
1086
1087define <vscale x 4 x i64> @vpmerge_vi_nxv4i64(<vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1088; CHECK-LABEL: vpmerge_vi_nxv4i64:
1089; CHECK:       # %bb.0:
1090; CHECK-NEXT:    vsetvli zero, a0, e64, m4, tu, mu
1091; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
1092; CHECK-NEXT:    ret
1093  %elt.head = insertelement <vscale x 4 x i64> poison, i64 2, i32 0
1094  %va = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
1095  %v = call <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1> %m, <vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, i32 %evl)
1096  ret <vscale x 4 x i64> %v
1097}
1098
1099declare <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1>, <vscale x 8 x i64>, <vscale x 8 x i64>, i32)
1100
1101define <vscale x 8 x i64> @vpmerge_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1102; CHECK-LABEL: vpmerge_vv_nxv8i64:
1103; CHECK:       # %bb.0:
1104; CHECK-NEXT:    vsetvli zero, a0, e64, m8, tu, mu
1105; CHECK-NEXT:    vmerge.vvm v16, v16, v8, v0
1106; CHECK-NEXT:    vmv8r.v v8, v16
1107; CHECK-NEXT:    ret
1108  %v = call <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1> %m, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, i32 %evl)
1109  ret <vscale x 8 x i64> %v
1110}
1111
1112define <vscale x 8 x i64> @vpmerge_vx_nxv8i64(i64 %a, <vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1113; RV32-LABEL: vpmerge_vx_nxv8i64:
1114; RV32:       # %bb.0:
1115; RV32-NEXT:    addi sp, sp, -16
1116; RV32-NEXT:    .cfi_def_cfa_offset 16
1117; RV32-NEXT:    sw a1, 12(sp)
1118; RV32-NEXT:    sw a0, 8(sp)
1119; RV32-NEXT:    addi a0, sp, 8
1120; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, mu
1121; RV32-NEXT:    vlse64.v v16, (a0), zero
1122; RV32-NEXT:    vsetvli zero, a2, e64, m8, tu, mu
1123; RV32-NEXT:    vmerge.vvm v8, v8, v16, v0
1124; RV32-NEXT:    addi sp, sp, 16
1125; RV32-NEXT:    ret
1126;
1127; RV64-LABEL: vpmerge_vx_nxv8i64:
1128; RV64:       # %bb.0:
1129; RV64-NEXT:    vsetvli zero, a1, e64, m8, tu, mu
1130; RV64-NEXT:    vmerge.vxm v8, v8, a0, v0
1131; RV64-NEXT:    ret
1132  %elt.head = insertelement <vscale x 8 x i64> poison, i64 %a, i32 0
1133  %va = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
1134  %v = call <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1> %m, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, i32 %evl)
1135  ret <vscale x 8 x i64> %v
1136}
1137
1138define <vscale x 8 x i64> @vpmerge_vi_nxv8i64(<vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1139; CHECK-LABEL: vpmerge_vi_nxv8i64:
1140; CHECK:       # %bb.0:
1141; CHECK-NEXT:    vsetvli zero, a0, e64, m8, tu, mu
1142; CHECK-NEXT:    vmerge.vim v8, v8, 2, v0
1143; CHECK-NEXT:    ret
1144  %elt.head = insertelement <vscale x 8 x i64> poison, i64 2, i32 0
1145  %va = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
1146  %v = call <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1> %m, <vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, i32 %evl)
1147  ret <vscale x 8 x i64> %v
1148}
1149
1150declare <vscale x 1 x half> @llvm.vp.merge.nxv1f16(<vscale x 1 x i1>, <vscale x 1 x half>, <vscale x 1 x half>, i32)
1151
1152define <vscale x 1 x half> @vpmerge_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1153; CHECK-LABEL: vpmerge_vv_nxv1f16:
1154; CHECK:       # %bb.0:
1155; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, tu, mu
1156; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
1157; CHECK-NEXT:    vmv1r.v v8, v9
1158; CHECK-NEXT:    ret
1159  %v = call <vscale x 1 x half> @llvm.vp.merge.nxv1f16(<vscale x 1 x i1> %m, <vscale x 1 x half> %va, <vscale x 1 x half> %vb, i32 %evl)
1160  ret <vscale x 1 x half> %v
1161}
1162
1163define <vscale x 1 x half> @vpmerge_vf_nxv1f16(half %a, <vscale x 1 x half> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1164; CHECK-LABEL: vpmerge_vf_nxv1f16:
1165; CHECK:       # %bb.0:
1166; CHECK-NEXT:    vsetvli zero, a0, e16, mf4, tu, mu
1167; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1168; CHECK-NEXT:    ret
1169  %elt.head = insertelement <vscale x 1 x half> poison, half %a, i32 0
1170  %va = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
1171  %v = call <vscale x 1 x half> @llvm.vp.merge.nxv1f16(<vscale x 1 x i1> %m, <vscale x 1 x half> %va, <vscale x 1 x half> %vb, i32 %evl)
1172  ret <vscale x 1 x half> %v
1173}
1174
1175declare <vscale x 2 x half> @llvm.vp.merge.nxv2f16(<vscale x 2 x i1>, <vscale x 2 x half>, <vscale x 2 x half>, i32)
1176
1177define <vscale x 2 x half> @vpmerge_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1178; CHECK-LABEL: vpmerge_vv_nxv2f16:
1179; CHECK:       # %bb.0:
1180; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, tu, mu
1181; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
1182; CHECK-NEXT:    vmv1r.v v8, v9
1183; CHECK-NEXT:    ret
1184  %v = call <vscale x 2 x half> @llvm.vp.merge.nxv2f16(<vscale x 2 x i1> %m, <vscale x 2 x half> %va, <vscale x 2 x half> %vb, i32 %evl)
1185  ret <vscale x 2 x half> %v
1186}
1187
1188define <vscale x 2 x half> @vpmerge_vf_nxv2f16(half %a, <vscale x 2 x half> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1189; CHECK-LABEL: vpmerge_vf_nxv2f16:
1190; CHECK:       # %bb.0:
1191; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, tu, mu
1192; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1193; CHECK-NEXT:    ret
1194  %elt.head = insertelement <vscale x 2 x half> poison, half %a, i32 0
1195  %va = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
1196  %v = call <vscale x 2 x half> @llvm.vp.merge.nxv2f16(<vscale x 2 x i1> %m, <vscale x 2 x half> %va, <vscale x 2 x half> %vb, i32 %evl)
1197  ret <vscale x 2 x half> %v
1198}
1199
1200declare <vscale x 4 x half> @llvm.vp.merge.nxv4f16(<vscale x 4 x i1>, <vscale x 4 x half>, <vscale x 4 x half>, i32)
1201
1202define <vscale x 4 x half> @vpmerge_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1203; CHECK-LABEL: vpmerge_vv_nxv4f16:
1204; CHECK:       # %bb.0:
1205; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, mu
1206; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
1207; CHECK-NEXT:    vmv1r.v v8, v9
1208; CHECK-NEXT:    ret
1209  %v = call <vscale x 4 x half> @llvm.vp.merge.nxv4f16(<vscale x 4 x i1> %m, <vscale x 4 x half> %va, <vscale x 4 x half> %vb, i32 %evl)
1210  ret <vscale x 4 x half> %v
1211}
1212
1213define <vscale x 4 x half> @vpmerge_vf_nxv4f16(half %a, <vscale x 4 x half> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1214; CHECK-LABEL: vpmerge_vf_nxv4f16:
1215; CHECK:       # %bb.0:
1216; CHECK-NEXT:    vsetvli zero, a0, e16, m1, tu, mu
1217; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1218; CHECK-NEXT:    ret
1219  %elt.head = insertelement <vscale x 4 x half> poison, half %a, i32 0
1220  %va = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
1221  %v = call <vscale x 4 x half> @llvm.vp.merge.nxv4f16(<vscale x 4 x i1> %m, <vscale x 4 x half> %va, <vscale x 4 x half> %vb, i32 %evl)
1222  ret <vscale x 4 x half> %v
1223}
1224
1225declare <vscale x 8 x half> @llvm.vp.merge.nxv8f16(<vscale x 8 x i1>, <vscale x 8 x half>, <vscale x 8 x half>, i32)
1226
1227define <vscale x 8 x half> @vpmerge_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1228; CHECK-LABEL: vpmerge_vv_nxv8f16:
1229; CHECK:       # %bb.0:
1230; CHECK-NEXT:    vsetvli zero, a0, e16, m2, tu, mu
1231; CHECK-NEXT:    vmerge.vvm v10, v10, v8, v0
1232; CHECK-NEXT:    vmv2r.v v8, v10
1233; CHECK-NEXT:    ret
1234  %v = call <vscale x 8 x half> @llvm.vp.merge.nxv8f16(<vscale x 8 x i1> %m, <vscale x 8 x half> %va, <vscale x 8 x half> %vb, i32 %evl)
1235  ret <vscale x 8 x half> %v
1236}
1237
1238define <vscale x 8 x half> @vpmerge_vf_nxv8f16(half %a, <vscale x 8 x half> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1239; CHECK-LABEL: vpmerge_vf_nxv8f16:
1240; CHECK:       # %bb.0:
1241; CHECK-NEXT:    vsetvli zero, a0, e16, m2, tu, mu
1242; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1243; CHECK-NEXT:    ret
1244  %elt.head = insertelement <vscale x 8 x half> poison, half %a, i32 0
1245  %va = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
1246  %v = call <vscale x 8 x half> @llvm.vp.merge.nxv8f16(<vscale x 8 x i1> %m, <vscale x 8 x half> %va, <vscale x 8 x half> %vb, i32 %evl)
1247  ret <vscale x 8 x half> %v
1248}
1249
1250declare <vscale x 16 x half> @llvm.vp.merge.nxv16f16(<vscale x 16 x i1>, <vscale x 16 x half>, <vscale x 16 x half>, i32)
1251
1252define <vscale x 16 x half> @vpmerge_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1253; CHECK-LABEL: vpmerge_vv_nxv16f16:
1254; CHECK:       # %bb.0:
1255; CHECK-NEXT:    vsetvli zero, a0, e16, m4, tu, mu
1256; CHECK-NEXT:    vmerge.vvm v12, v12, v8, v0
1257; CHECK-NEXT:    vmv4r.v v8, v12
1258; CHECK-NEXT:    ret
1259  %v = call <vscale x 16 x half> @llvm.vp.merge.nxv16f16(<vscale x 16 x i1> %m, <vscale x 16 x half> %va, <vscale x 16 x half> %vb, i32 %evl)
1260  ret <vscale x 16 x half> %v
1261}
1262
1263define <vscale x 16 x half> @vpmerge_vf_nxv16f16(half %a, <vscale x 16 x half> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1264; CHECK-LABEL: vpmerge_vf_nxv16f16:
1265; CHECK:       # %bb.0:
1266; CHECK-NEXT:    vsetvli zero, a0, e16, m4, tu, mu
1267; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1268; CHECK-NEXT:    ret
1269  %elt.head = insertelement <vscale x 16 x half> poison, half %a, i32 0
1270  %va = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
1271  %v = call <vscale x 16 x half> @llvm.vp.merge.nxv16f16(<vscale x 16 x i1> %m, <vscale x 16 x half> %va, <vscale x 16 x half> %vb, i32 %evl)
1272  ret <vscale x 16 x half> %v
1273}
1274
1275declare <vscale x 32 x half> @llvm.vp.merge.nxv32f16(<vscale x 32 x i1>, <vscale x 32 x half>, <vscale x 32 x half>, i32)
1276
1277define <vscale x 32 x half> @vpmerge_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
1278; CHECK-LABEL: vpmerge_vv_nxv32f16:
1279; CHECK:       # %bb.0:
1280; CHECK-NEXT:    vsetvli zero, a0, e16, m8, tu, mu
1281; CHECK-NEXT:    vmerge.vvm v16, v16, v8, v0
1282; CHECK-NEXT:    vmv8r.v v8, v16
1283; CHECK-NEXT:    ret
1284  %v = call <vscale x 32 x half> @llvm.vp.merge.nxv32f16(<vscale x 32 x i1> %m, <vscale x 32 x half> %va, <vscale x 32 x half> %vb, i32 %evl)
1285  ret <vscale x 32 x half> %v
1286}
1287
1288define <vscale x 32 x half> @vpmerge_vf_nxv32f16(half %a, <vscale x 32 x half> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
1289; CHECK-LABEL: vpmerge_vf_nxv32f16:
1290; CHECK:       # %bb.0:
1291; CHECK-NEXT:    vsetvli zero, a0, e16, m8, tu, mu
1292; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1293; CHECK-NEXT:    ret
1294  %elt.head = insertelement <vscale x 32 x half> poison, half %a, i32 0
1295  %va = shufflevector <vscale x 32 x half> %elt.head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
1296  %v = call <vscale x 32 x half> @llvm.vp.merge.nxv32f16(<vscale x 32 x i1> %m, <vscale x 32 x half> %va, <vscale x 32 x half> %vb, i32 %evl)
1297  ret <vscale x 32 x half> %v
1298}
1299
1300declare <vscale x 1 x float> @llvm.vp.merge.nxv1f32(<vscale x 1 x i1>, <vscale x 1 x float>, <vscale x 1 x float>, i32)
1301
1302define <vscale x 1 x float> @vpmerge_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1303; CHECK-LABEL: vpmerge_vv_nxv1f32:
1304; CHECK:       # %bb.0:
1305; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, tu, mu
1306; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
1307; CHECK-NEXT:    vmv1r.v v8, v9
1308; CHECK-NEXT:    ret
1309  %v = call <vscale x 1 x float> @llvm.vp.merge.nxv1f32(<vscale x 1 x i1> %m, <vscale x 1 x float> %va, <vscale x 1 x float> %vb, i32 %evl)
1310  ret <vscale x 1 x float> %v
1311}
1312
1313define <vscale x 1 x float> @vpmerge_vf_nxv1f32(float %a, <vscale x 1 x float> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1314; CHECK-LABEL: vpmerge_vf_nxv1f32:
1315; CHECK:       # %bb.0:
1316; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, tu, mu
1317; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1318; CHECK-NEXT:    ret
1319  %elt.head = insertelement <vscale x 1 x float> poison, float %a, i32 0
1320  %va = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1321  %v = call <vscale x 1 x float> @llvm.vp.merge.nxv1f32(<vscale x 1 x i1> %m, <vscale x 1 x float> %va, <vscale x 1 x float> %vb, i32 %evl)
1322  ret <vscale x 1 x float> %v
1323}
1324
1325declare <vscale x 2 x float> @llvm.vp.merge.nxv2f32(<vscale x 2 x i1>, <vscale x 2 x float>, <vscale x 2 x float>, i32)
1326
1327define <vscale x 2 x float> @vpmerge_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1328; CHECK-LABEL: vpmerge_vv_nxv2f32:
1329; CHECK:       # %bb.0:
1330; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
1331; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
1332; CHECK-NEXT:    vmv1r.v v8, v9
1333; CHECK-NEXT:    ret
1334  %v = call <vscale x 2 x float> @llvm.vp.merge.nxv2f32(<vscale x 2 x i1> %m, <vscale x 2 x float> %va, <vscale x 2 x float> %vb, i32 %evl)
1335  ret <vscale x 2 x float> %v
1336}
1337
1338define <vscale x 2 x float> @vpmerge_vf_nxv2f32(float %a, <vscale x 2 x float> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1339; CHECK-LABEL: vpmerge_vf_nxv2f32:
1340; CHECK:       # %bb.0:
1341; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu
1342; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1343; CHECK-NEXT:    ret
1344  %elt.head = insertelement <vscale x 2 x float> poison, float %a, i32 0
1345  %va = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1346  %v = call <vscale x 2 x float> @llvm.vp.merge.nxv2f32(<vscale x 2 x i1> %m, <vscale x 2 x float> %va, <vscale x 2 x float> %vb, i32 %evl)
1347  ret <vscale x 2 x float> %v
1348}
1349
1350declare <vscale x 4 x float> @llvm.vp.merge.nxv4f32(<vscale x 4 x i1>, <vscale x 4 x float>, <vscale x 4 x float>, i32)
1351
1352define <vscale x 4 x float> @vpmerge_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1353; CHECK-LABEL: vpmerge_vv_nxv4f32:
1354; CHECK:       # %bb.0:
1355; CHECK-NEXT:    vsetvli zero, a0, e32, m2, tu, mu
1356; CHECK-NEXT:    vmerge.vvm v10, v10, v8, v0
1357; CHECK-NEXT:    vmv2r.v v8, v10
1358; CHECK-NEXT:    ret
1359  %v = call <vscale x 4 x float> @llvm.vp.merge.nxv4f32(<vscale x 4 x i1> %m, <vscale x 4 x float> %va, <vscale x 4 x float> %vb, i32 %evl)
1360  ret <vscale x 4 x float> %v
1361}
1362
1363define <vscale x 4 x float> @vpmerge_vf_nxv4f32(float %a, <vscale x 4 x float> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1364; CHECK-LABEL: vpmerge_vf_nxv4f32:
1365; CHECK:       # %bb.0:
1366; CHECK-NEXT:    vsetvli zero, a0, e32, m2, tu, mu
1367; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1368; CHECK-NEXT:    ret
1369  %elt.head = insertelement <vscale x 4 x float> poison, float %a, i32 0
1370  %va = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1371  %v = call <vscale x 4 x float> @llvm.vp.merge.nxv4f32(<vscale x 4 x i1> %m, <vscale x 4 x float> %va, <vscale x 4 x float> %vb, i32 %evl)
1372  ret <vscale x 4 x float> %v
1373}
1374
1375declare <vscale x 8 x float> @llvm.vp.merge.nxv8f32(<vscale x 8 x i1>, <vscale x 8 x float>, <vscale x 8 x float>, i32)
1376
1377define <vscale x 8 x float> @vpmerge_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1378; CHECK-LABEL: vpmerge_vv_nxv8f32:
1379; CHECK:       # %bb.0:
1380; CHECK-NEXT:    vsetvli zero, a0, e32, m4, tu, mu
1381; CHECK-NEXT:    vmerge.vvm v12, v12, v8, v0
1382; CHECK-NEXT:    vmv4r.v v8, v12
1383; CHECK-NEXT:    ret
1384  %v = call <vscale x 8 x float> @llvm.vp.merge.nxv8f32(<vscale x 8 x i1> %m, <vscale x 8 x float> %va, <vscale x 8 x float> %vb, i32 %evl)
1385  ret <vscale x 8 x float> %v
1386}
1387
1388define <vscale x 8 x float> @vpmerge_vf_nxv8f32(float %a, <vscale x 8 x float> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1389; CHECK-LABEL: vpmerge_vf_nxv8f32:
1390; CHECK:       # %bb.0:
1391; CHECK-NEXT:    vsetvli zero, a0, e32, m4, tu, mu
1392; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1393; CHECK-NEXT:    ret
1394  %elt.head = insertelement <vscale x 8 x float> poison, float %a, i32 0
1395  %va = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1396  %v = call <vscale x 8 x float> @llvm.vp.merge.nxv8f32(<vscale x 8 x i1> %m, <vscale x 8 x float> %va, <vscale x 8 x float> %vb, i32 %evl)
1397  ret <vscale x 8 x float> %v
1398}
1399
1400declare <vscale x 16 x float> @llvm.vp.merge.nxv16f32(<vscale x 16 x i1>, <vscale x 16 x float>, <vscale x 16 x float>, i32)
1401
1402define <vscale x 16 x float> @vpmerge_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1403; CHECK-LABEL: vpmerge_vv_nxv16f32:
1404; CHECK:       # %bb.0:
1405; CHECK-NEXT:    vsetvli zero, a0, e32, m8, tu, mu
1406; CHECK-NEXT:    vmerge.vvm v16, v16, v8, v0
1407; CHECK-NEXT:    vmv8r.v v8, v16
1408; CHECK-NEXT:    ret
1409  %v = call <vscale x 16 x float> @llvm.vp.merge.nxv16f32(<vscale x 16 x i1> %m, <vscale x 16 x float> %va, <vscale x 16 x float> %vb, i32 %evl)
1410  ret <vscale x 16 x float> %v
1411}
1412
1413define <vscale x 16 x float> @vpmerge_vf_nxv16f32(float %a, <vscale x 16 x float> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1414; CHECK-LABEL: vpmerge_vf_nxv16f32:
1415; CHECK:       # %bb.0:
1416; CHECK-NEXT:    vsetvli zero, a0, e32, m8, tu, mu
1417; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1418; CHECK-NEXT:    ret
1419  %elt.head = insertelement <vscale x 16 x float> poison, float %a, i32 0
1420  %va = shufflevector <vscale x 16 x float> %elt.head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
1421  %v = call <vscale x 16 x float> @llvm.vp.merge.nxv16f32(<vscale x 16 x i1> %m, <vscale x 16 x float> %va, <vscale x 16 x float> %vb, i32 %evl)
1422  ret <vscale x 16 x float> %v
1423}
1424
1425declare <vscale x 1 x double> @llvm.vp.merge.nxv1f64(<vscale x 1 x i1>, <vscale x 1 x double>, <vscale x 1 x double>, i32)
1426
1427define <vscale x 1 x double> @vpmerge_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1428; CHECK-LABEL: vpmerge_vv_nxv1f64:
1429; CHECK:       # %bb.0:
1430; CHECK-NEXT:    vsetvli zero, a0, e64, m1, tu, mu
1431; CHECK-NEXT:    vmerge.vvm v9, v9, v8, v0
1432; CHECK-NEXT:    vmv1r.v v8, v9
1433; CHECK-NEXT:    ret
1434  %v = call <vscale x 1 x double> @llvm.vp.merge.nxv1f64(<vscale x 1 x i1> %m, <vscale x 1 x double> %va, <vscale x 1 x double> %vb, i32 %evl)
1435  ret <vscale x 1 x double> %v
1436}
1437
1438define <vscale x 1 x double> @vpmerge_vf_nxv1f64(double %a, <vscale x 1 x double> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1439; CHECK-LABEL: vpmerge_vf_nxv1f64:
1440; CHECK:       # %bb.0:
1441; CHECK-NEXT:    vsetvli zero, a0, e64, m1, tu, mu
1442; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1443; CHECK-NEXT:    ret
1444  %elt.head = insertelement <vscale x 1 x double> poison, double %a, i32 0
1445  %va = shufflevector <vscale x 1 x double> %elt.head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
1446  %v = call <vscale x 1 x double> @llvm.vp.merge.nxv1f64(<vscale x 1 x i1> %m, <vscale x 1 x double> %va, <vscale x 1 x double> %vb, i32 %evl)
1447  ret <vscale x 1 x double> %v
1448}
1449
1450declare <vscale x 2 x double> @llvm.vp.merge.nxv2f64(<vscale x 2 x i1>, <vscale x 2 x double>, <vscale x 2 x double>, i32)
1451
1452define <vscale x 2 x double> @vpmerge_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1453; CHECK-LABEL: vpmerge_vv_nxv2f64:
1454; CHECK:       # %bb.0:
1455; CHECK-NEXT:    vsetvli zero, a0, e64, m2, tu, mu
1456; CHECK-NEXT:    vmerge.vvm v10, v10, v8, v0
1457; CHECK-NEXT:    vmv2r.v v8, v10
1458; CHECK-NEXT:    ret
1459  %v = call <vscale x 2 x double> @llvm.vp.merge.nxv2f64(<vscale x 2 x i1> %m, <vscale x 2 x double> %va, <vscale x 2 x double> %vb, i32 %evl)
1460  ret <vscale x 2 x double> %v
1461}
1462
1463define <vscale x 2 x double> @vpmerge_vf_nxv2f64(double %a, <vscale x 2 x double> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1464; CHECK-LABEL: vpmerge_vf_nxv2f64:
1465; CHECK:       # %bb.0:
1466; CHECK-NEXT:    vsetvli zero, a0, e64, m2, tu, mu
1467; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1468; CHECK-NEXT:    ret
1469  %elt.head = insertelement <vscale x 2 x double> poison, double %a, i32 0
1470  %va = shufflevector <vscale x 2 x double> %elt.head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
1471  %v = call <vscale x 2 x double> @llvm.vp.merge.nxv2f64(<vscale x 2 x i1> %m, <vscale x 2 x double> %va, <vscale x 2 x double> %vb, i32 %evl)
1472  ret <vscale x 2 x double> %v
1473}
1474
1475declare <vscale x 4 x double> @llvm.vp.merge.nxv4f64(<vscale x 4 x i1>, <vscale x 4 x double>, <vscale x 4 x double>, i32)
1476
1477define <vscale x 4 x double> @vpmerge_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1478; CHECK-LABEL: vpmerge_vv_nxv4f64:
1479; CHECK:       # %bb.0:
1480; CHECK-NEXT:    vsetvli zero, a0, e64, m4, tu, mu
1481; CHECK-NEXT:    vmerge.vvm v12, v12, v8, v0
1482; CHECK-NEXT:    vmv4r.v v8, v12
1483; CHECK-NEXT:    ret
1484  %v = call <vscale x 4 x double> @llvm.vp.merge.nxv4f64(<vscale x 4 x i1> %m, <vscale x 4 x double> %va, <vscale x 4 x double> %vb, i32 %evl)
1485  ret <vscale x 4 x double> %v
1486}
1487
1488define <vscale x 4 x double> @vpmerge_vf_nxv4f64(double %a, <vscale x 4 x double> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1489; CHECK-LABEL: vpmerge_vf_nxv4f64:
1490; CHECK:       # %bb.0:
1491; CHECK-NEXT:    vsetvli zero, a0, e64, m4, tu, mu
1492; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1493; CHECK-NEXT:    ret
1494  %elt.head = insertelement <vscale x 4 x double> poison, double %a, i32 0
1495  %va = shufflevector <vscale x 4 x double> %elt.head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
1496  %v = call <vscale x 4 x double> @llvm.vp.merge.nxv4f64(<vscale x 4 x i1> %m, <vscale x 4 x double> %va, <vscale x 4 x double> %vb, i32 %evl)
1497  ret <vscale x 4 x double> %v
1498}
1499
1500declare <vscale x 8 x double> @llvm.vp.merge.nxv8f64(<vscale x 8 x i1>, <vscale x 8 x double>, <vscale x 8 x double>, i32)
1501
1502define <vscale x 8 x double> @vpmerge_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1503; CHECK-LABEL: vpmerge_vv_nxv8f64:
1504; CHECK:       # %bb.0:
1505; CHECK-NEXT:    vsetvli zero, a0, e64, m8, tu, mu
1506; CHECK-NEXT:    vmerge.vvm v16, v16, v8, v0
1507; CHECK-NEXT:    vmv8r.v v8, v16
1508; CHECK-NEXT:    ret
1509  %v = call <vscale x 8 x double> @llvm.vp.merge.nxv8f64(<vscale x 8 x i1> %m, <vscale x 8 x double> %va, <vscale x 8 x double> %vb, i32 %evl)
1510  ret <vscale x 8 x double> %v
1511}
1512
1513define <vscale x 8 x double> @vpmerge_vf_nxv8f64(double %a, <vscale x 8 x double> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1514; CHECK-LABEL: vpmerge_vf_nxv8f64:
1515; CHECK:       # %bb.0:
1516; CHECK-NEXT:    vsetvli zero, a0, e64, m8, tu, mu
1517; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
1518; CHECK-NEXT:    ret
1519  %elt.head = insertelement <vscale x 8 x double> poison, double %a, i32 0
1520  %va = shufflevector <vscale x 8 x double> %elt.head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
1521  %v = call <vscale x 8 x double> @llvm.vp.merge.nxv8f64(<vscale x 8 x i1> %m, <vscale x 8 x double> %va, <vscale x 8 x double> %vb, i32 %evl)
1522  ret <vscale x 8 x double> %v
1523}
1524