1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=ilp32d \
3 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32ZVFH
4 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v,+m -target-abi=lp64d \
5 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64ZVFH
6 ; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=ilp32d \
7 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,RV32ZVFHMIN
8 ; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v,+m -target-abi=lp64d \
9 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,RV64ZVFHMIN
10 declare <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)
12 define <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) {
13 ; RV32-LABEL: vpmerge_nxv1i1:
15 ; RV32-NEXT: vsetvli a1, zero, e32, mf2, ta, ma
16 ; RV32-NEXT: vid.v v10
17 ; RV32-NEXT: vmsltu.vx v10, v10, a0
18 ; RV32-NEXT: vmand.mm v9, v9, v10
19 ; RV32-NEXT: vmandn.mm v8, v8, v9
20 ; RV32-NEXT: vmand.mm v9, v0, v9
21 ; RV32-NEXT: vmor.mm v0, v9, v8
24 ; RV64-LABEL: vpmerge_nxv1i1:
26 ; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, ma
27 ; RV64-NEXT: vid.v v10
28 ; RV64-NEXT: vmsltu.vx v10, v10, a0
29 ; RV64-NEXT: vmand.mm v9, v9, v10
30 ; RV64-NEXT: vmandn.mm v8, v8, v9
31 ; RV64-NEXT: vmand.mm v9, v0, v9
32 ; RV64-NEXT: vmor.mm v0, v9, v8
34 %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)
35 ret <vscale x 1 x i1> %v
38 define <vscale x 2 x i1> @vpmerge_nxv2i1(<vscale x 2 x i1> %va, <vscale x 2 x i1> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
39 ; RV32-LABEL: vpmerge_nxv2i1:
41 ; RV32-NEXT: vsetvli a1, zero, e32, m1, ta, ma
42 ; RV32-NEXT: vid.v v10
43 ; RV32-NEXT: vmsltu.vx v10, v10, a0
44 ; RV32-NEXT: vmand.mm v9, v9, v10
45 ; RV32-NEXT: vmandn.mm v8, v8, v9
46 ; RV32-NEXT: vmand.mm v9, v0, v9
47 ; RV32-NEXT: vmor.mm v0, v9, v8
50 ; RV64-LABEL: vpmerge_nxv2i1:
52 ; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma
53 ; RV64-NEXT: vid.v v10
54 ; RV64-NEXT: vmsltu.vx v12, v10, a0
55 ; RV64-NEXT: vmand.mm v9, v9, v12
56 ; RV64-NEXT: vmandn.mm v8, v8, v9
57 ; RV64-NEXT: vmand.mm v9, v0, v9
58 ; RV64-NEXT: vmor.mm v0, v9, v8
60 %v = call <vscale x 2 x i1> @llvm.vp.merge.nxv2i1(<vscale x 2 x i1> %m, <vscale x 2 x i1> %va, <vscale x 2 x i1> %vb, i32 %evl)
61 ret <vscale x 2 x i1> %v
64 define <vscale x 4 x i1> @vpmerge_nxv4i1(<vscale x 4 x i1> %va, <vscale x 4 x i1> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
65 ; RV32-LABEL: vpmerge_nxv4i1:
67 ; RV32-NEXT: vsetvli a1, zero, e32, m2, ta, ma
68 ; RV32-NEXT: vid.v v10
69 ; RV32-NEXT: vmsltu.vx v12, v10, a0
70 ; RV32-NEXT: vmand.mm v9, v9, v12
71 ; RV32-NEXT: vmandn.mm v8, v8, v9
72 ; RV32-NEXT: vmand.mm v9, v0, v9
73 ; RV32-NEXT: vmor.mm v0, v9, v8
76 ; RV64-LABEL: vpmerge_nxv4i1:
78 ; RV64-NEXT: vsetvli a1, zero, e64, m4, ta, ma
79 ; RV64-NEXT: vid.v v12
80 ; RV64-NEXT: vmsltu.vx v10, v12, a0
81 ; RV64-NEXT: vmand.mm v9, v9, v10
82 ; RV64-NEXT: vmandn.mm v8, v8, v9
83 ; RV64-NEXT: vmand.mm v9, v0, v9
84 ; RV64-NEXT: vmor.mm v0, v9, v8
86 %v = call <vscale x 4 x i1> @llvm.vp.merge.nxv4i1(<vscale x 4 x i1> %m, <vscale x 4 x i1> %va, <vscale x 4 x i1> %vb, i32 %evl)
87 ret <vscale x 4 x i1> %v
90 define <vscale x 8 x i1> @vpmerge_nxv8i1(<vscale x 8 x i1> %va, <vscale x 8 x i1> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
91 ; RV32-LABEL: vpmerge_nxv8i1:
93 ; RV32-NEXT: vsetvli a1, zero, e32, m4, ta, ma
94 ; RV32-NEXT: vid.v v12
95 ; RV32-NEXT: vmsltu.vx v10, v12, a0
96 ; RV32-NEXT: vmand.mm v9, v9, v10
97 ; RV32-NEXT: vmandn.mm v8, v8, v9
98 ; RV32-NEXT: vmand.mm v9, v0, v9
99 ; RV32-NEXT: vmor.mm v0, v9, v8
102 ; RV64-LABEL: vpmerge_nxv8i1:
104 ; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma
105 ; RV64-NEXT: vid.v v16
106 ; RV64-NEXT: vmsltu.vx v10, v16, a0
107 ; RV64-NEXT: vmand.mm v9, v9, v10
108 ; RV64-NEXT: vmandn.mm v8, v8, v9
109 ; RV64-NEXT: vmand.mm v9, v0, v9
110 ; RV64-NEXT: vmor.mm v0, v9, v8
112 %v = call <vscale x 8 x i1> @llvm.vp.merge.nxv8i1(<vscale x 8 x i1> %m, <vscale x 8 x i1> %va, <vscale x 8 x i1> %vb, i32 %evl)
113 ret <vscale x 8 x i1> %v
116 define <vscale x 16 x i1> @vpmerge_nxv16i1(<vscale x 16 x i1> %va, <vscale x 16 x i1> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
117 ; RV32-LABEL: vpmerge_nxv16i1:
119 ; RV32-NEXT: vsetvli a1, zero, e32, m8, ta, ma
120 ; RV32-NEXT: vid.v v16
121 ; RV32-NEXT: vmsltu.vx v10, v16, a0
122 ; RV32-NEXT: vmand.mm v9, v9, v10
123 ; RV32-NEXT: vmandn.mm v8, v8, v9
124 ; RV32-NEXT: vmand.mm v9, v0, v9
125 ; RV32-NEXT: vmor.mm v0, v9, v8
128 ; RV64-LABEL: vpmerge_nxv16i1:
130 ; RV64-NEXT: vsetvli a1, zero, e8, m2, ta, ma
131 ; RV64-NEXT: vmv.v.i v10, 0
132 ; RV64-NEXT: vsetvli zero, a0, e8, m2, ta, ma
133 ; RV64-NEXT: vmerge.vim v12, v10, 1, v0
134 ; RV64-NEXT: vmv1r.v v0, v8
135 ; RV64-NEXT: vsetvli a1, zero, e8, m2, ta, ma
136 ; RV64-NEXT: vmerge.vim v10, v10, 1, v0
137 ; RV64-NEXT: vmv1r.v v0, v9
138 ; RV64-NEXT: vsetvli zero, a0, e8, m2, tu, ma
139 ; RV64-NEXT: vmerge.vvm v10, v10, v12, v0
140 ; RV64-NEXT: vsetvli a0, zero, e8, m2, ta, ma
141 ; RV64-NEXT: vmsne.vi v0, v10, 0
143 %v = call <vscale x 16 x i1> @llvm.vp.merge.nxv16i1(<vscale x 16 x i1> %m, <vscale x 16 x i1> %va, <vscale x 16 x i1> %vb, i32 %evl)
144 ret <vscale x 16 x i1> %v
147 define <vscale x 32 x i1> @vpmerge_nxv32i1(<vscale x 32 x i1> %va, <vscale x 32 x i1> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
148 ; CHECK-LABEL: vpmerge_nxv32i1:
150 ; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma
151 ; CHECK-NEXT: vmv.v.i v12, 0
152 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma
153 ; CHECK-NEXT: vmerge.vim v16, v12, 1, v0
154 ; CHECK-NEXT: vmv1r.v v0, v8
155 ; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma
156 ; CHECK-NEXT: vmerge.vim v12, v12, 1, v0
157 ; CHECK-NEXT: vmv1r.v v0, v9
158 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, ma
159 ; CHECK-NEXT: vmerge.vvm v12, v12, v16, v0
160 ; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma
161 ; CHECK-NEXT: vmsne.vi v0, v12, 0
163 %v = call <vscale x 32 x i1> @llvm.vp.merge.nxv32i1(<vscale x 32 x i1> %m, <vscale x 32 x i1> %va, <vscale x 32 x i1> %vb, i32 %evl)
164 ret <vscale x 32 x i1> %v
167 define <vscale x 64 x i1> @vpmerge_nxv64i1(<vscale x 64 x i1> %va, <vscale x 64 x i1> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) {
168 ; CHECK-LABEL: vpmerge_nxv64i1:
170 ; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma
171 ; CHECK-NEXT: vmv.v.i v16, 0
172 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
173 ; CHECK-NEXT: vmerge.vim v24, v16, 1, v0
174 ; CHECK-NEXT: vmv1r.v v0, v8
175 ; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma
176 ; CHECK-NEXT: vmerge.vim v16, v16, 1, v0
177 ; CHECK-NEXT: vmv1r.v v0, v9
178 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma
179 ; CHECK-NEXT: vmerge.vvm v16, v16, v24, v0
180 ; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma
181 ; CHECK-NEXT: vmsne.vi v0, v16, 0
183 %v = call <vscale x 64 x i1> @llvm.vp.merge.nxv64i1(<vscale x 64 x i1> %m, <vscale x 64 x i1> %va, <vscale x 64 x i1> %vb, i32 %evl)
184 ret <vscale x 64 x i1> %v
187 define <vscale x 128 x i1> @vpmerge_nxv128i1(<vscale x 128 x i1> %va, <vscale x 128 x i1> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) {
188 ; CHECK-LABEL: vpmerge_nxv128i1:
190 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
191 ; CHECK-NEXT: vmv1r.v v7, v12
192 ; CHECK-NEXT: vmv1r.v v4, v11
193 ; CHECK-NEXT: vmv1r.v v6, v10
194 ; CHECK-NEXT: vmv1r.v v3, v9
195 ; CHECK-NEXT: vmv1r.v v5, v8
196 ; CHECK-NEXT: csrr a2, vlenb
197 ; CHECK-NEXT: slli a2, a2, 3
198 ; CHECK-NEXT: mv a1, a0
199 ; CHECK-NEXT: bltu a0, a2, .LBB7_2
200 ; CHECK-NEXT: # %bb.1:
201 ; CHECK-NEXT: mv a1, a2
202 ; CHECK-NEXT: .LBB7_2:
203 ; CHECK-NEXT: vsetvli a3, zero, e8, m8, ta, ma
204 ; CHECK-NEXT: vmv.v.i v16, 0
205 ; CHECK-NEXT: sub a2, a0, a2
206 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma
207 ; CHECK-NEXT: vmerge.vim v24, v16, 1, v0
208 ; CHECK-NEXT: vmv1r.v v0, v3
209 ; CHECK-NEXT: vsetvli a3, zero, e8, m8, ta, ma
210 ; CHECK-NEXT: vmerge.vim v16, v16, 1, v0
211 ; CHECK-NEXT: sltu a0, a0, a2
212 ; CHECK-NEXT: vmv1r.v v0, v4
213 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, tu, ma
214 ; CHECK-NEXT: vmerge.vvm v16, v16, v24, v0
215 ; CHECK-NEXT: addi a0, a0, -1
216 ; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma
217 ; CHECK-NEXT: vmsne.vi v9, v16, 0
218 ; CHECK-NEXT: and a0, a0, a2
219 ; CHECK-NEXT: vmv1r.v v0, v5
220 ; CHECK-NEXT: vmv.v.i v24, 0
221 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma
222 ; CHECK-NEXT: vmerge.vim v16, v24, 1, v0
223 ; CHECK-NEXT: vmv1r.v v0, v6
224 ; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma
225 ; CHECK-NEXT: vmerge.vim v24, v24, 1, v0
226 ; CHECK-NEXT: vmv1r.v v0, v7
227 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma
228 ; CHECK-NEXT: vmerge.vvm v24, v24, v16, v0
229 ; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma
230 ; CHECK-NEXT: vmsne.vi v8, v24, 0
231 ; CHECK-NEXT: vmv1r.v v0, v9
233 %v = call <vscale x 128 x i1> @llvm.vp.merge.nxv128i1(<vscale x 128 x i1> %m, <vscale x 128 x i1> %va, <vscale x 128 x i1> %vb, i32 %evl)
234 ret <vscale x 128 x i1> %v
237 declare <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)
239 define <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) {
240 ; CHECK-LABEL: vpmerge_vv_nxv1i8:
242 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, tu, ma
243 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
244 ; CHECK-NEXT: vmv1r.v v8, v9
246 %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)
247 ret <vscale x 1 x i8> %v
250 define <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) {
251 ; CHECK-LABEL: vpmerge_vx_nxv1i8:
253 ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, tu, ma
254 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
256 %elt.head = insertelement <vscale x 1 x i8> poison, i8 %a, i32 0
257 %va = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer
258 %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)
259 ret <vscale x 1 x i8> %v
262 define <vscale x 1 x i8> @vpmerge_vi_nxv1i8(<vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
263 ; CHECK-LABEL: vpmerge_vi_nxv1i8:
265 ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, tu, ma
266 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
268 %v = call <vscale x 1 x i8> @llvm.vp.merge.nxv1i8(<vscale x 1 x i1> %m, <vscale x 1 x i8> splat (i8 2), <vscale x 1 x i8> %vb, i32 %evl)
269 ret <vscale x 1 x i8> %v
272 declare <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)
274 define <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) {
275 ; CHECK-LABEL: vpmerge_vv_nxv2i8:
277 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, tu, ma
278 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
279 ; CHECK-NEXT: vmv1r.v v8, v9
281 %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)
282 ret <vscale x 2 x i8> %v
285 define <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) {
286 ; CHECK-LABEL: vpmerge_vx_nxv2i8:
288 ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, tu, ma
289 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
291 %elt.head = insertelement <vscale x 2 x i8> poison, i8 %a, i32 0
292 %va = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer
293 %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)
294 ret <vscale x 2 x i8> %v
297 define <vscale x 2 x i8> @vpmerge_vi_nxv2i8(<vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
298 ; CHECK-LABEL: vpmerge_vi_nxv2i8:
300 ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, tu, ma
301 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
303 %v = call <vscale x 2 x i8> @llvm.vp.merge.nxv2i8(<vscale x 2 x i1> %m, <vscale x 2 x i8> splat (i8 2), <vscale x 2 x i8> %vb, i32 %evl)
304 ret <vscale x 2 x i8> %v
307 declare <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)
309 define <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) {
310 ; CHECK-LABEL: vpmerge_vv_nxv3i8:
312 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
313 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
314 ; CHECK-NEXT: vmv1r.v v8, v9
316 %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)
317 ret <vscale x 3 x i8> %v
320 define <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) {
321 ; CHECK-LABEL: vpmerge_vx_nxv3i8:
323 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma
324 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
326 %elt.head = insertelement <vscale x 3 x i8> poison, i8 %a, i32 0
327 %va = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer
328 %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)
329 ret <vscale x 3 x i8> %v
332 define <vscale x 3 x i8> @vpmerge_vi_nxv3i8(<vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 zeroext %evl) {
333 ; CHECK-LABEL: vpmerge_vi_nxv3i8:
335 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
336 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
338 %v = call <vscale x 3 x i8> @llvm.vp.merge.nxv3i8(<vscale x 3 x i1> %m, <vscale x 3 x i8> splat (i8 2), <vscale x 3 x i8> %vb, i32 %evl)
339 ret <vscale x 3 x i8> %v
342 declare <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)
344 define <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) {
345 ; CHECK-LABEL: vpmerge_vv_nxv4i8:
347 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
348 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
349 ; CHECK-NEXT: vmv1r.v v8, v9
351 %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)
352 ret <vscale x 4 x i8> %v
355 define <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) {
356 ; CHECK-LABEL: vpmerge_vx_nxv4i8:
358 ; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma
359 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
361 %elt.head = insertelement <vscale x 4 x i8> poison, i8 %a, i32 0
362 %va = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer
363 %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)
364 ret <vscale x 4 x i8> %v
367 define <vscale x 4 x i8> @vpmerge_vi_nxv4i8(<vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
368 ; CHECK-LABEL: vpmerge_vi_nxv4i8:
370 ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma
371 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
373 %v = call <vscale x 4 x i8> @llvm.vp.merge.nxv4i8(<vscale x 4 x i1> %m, <vscale x 4 x i8> splat (i8 2), <vscale x 4 x i8> %vb, i32 %evl)
374 ret <vscale x 4 x i8> %v
377 declare <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)
379 define <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) {
380 ; CHECK-LABEL: vpmerge_vv_nxv8i7:
382 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
383 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
384 ; CHECK-NEXT: vmv1r.v v8, v9
386 %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)
387 ret <vscale x 8 x i7> %v
390 define <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) {
391 ; CHECK-LABEL: vpmerge_vx_nxv8i7:
393 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, ma
394 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
396 %elt.head = insertelement <vscale x 8 x i7> poison, i7 %a, i32 0
397 %va = shufflevector <vscale x 8 x i7> %elt.head, <vscale x 8 x i7> poison, <vscale x 8 x i32> zeroinitializer
398 %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)
399 ret <vscale x 8 x i7> %v
402 define <vscale x 8 x i7> @vpmerge_vi_nxv8i7(<vscale x 8 x i7> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
403 ; CHECK-LABEL: vpmerge_vi_nxv8i7:
405 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
406 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
408 %v = call <vscale x 8 x i7> @llvm.vp.merge.nxv8i7(<vscale x 8 x i1> %m, <vscale x 8 x i7> splat (i7 2), <vscale x 8 x i7> %vb, i32 %evl)
409 ret <vscale x 8 x i7> %v
412 declare <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)
414 define <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) {
415 ; CHECK-LABEL: vpmerge_vv_nxv8i8:
417 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
418 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
419 ; CHECK-NEXT: vmv1r.v v8, v9
421 %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)
422 ret <vscale x 8 x i8> %v
425 define <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) {
426 ; CHECK-LABEL: vpmerge_vx_nxv8i8:
428 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, ma
429 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
431 %elt.head = insertelement <vscale x 8 x i8> poison, i8 %a, i32 0
432 %va = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer
433 %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)
434 ret <vscale x 8 x i8> %v
437 define <vscale x 8 x i8> @vpmerge_vi_nxv8i8(<vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
438 ; CHECK-LABEL: vpmerge_vi_nxv8i8:
440 ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma
441 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
443 %v = call <vscale x 8 x i8> @llvm.vp.merge.nxv8i8(<vscale x 8 x i1> %m, <vscale x 8 x i8> splat (i8 2), <vscale x 8 x i8> %vb, i32 %evl)
444 ret <vscale x 8 x i8> %v
447 declare <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)
449 define <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) {
450 ; CHECK-LABEL: vpmerge_vv_nxv16i8:
452 ; CHECK-NEXT: vsetvli zero, a0, e8, m2, tu, ma
453 ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0
454 ; CHECK-NEXT: vmv2r.v v8, v10
456 %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)
457 ret <vscale x 16 x i8> %v
460 define <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) {
461 ; CHECK-LABEL: vpmerge_vx_nxv16i8:
463 ; CHECK-NEXT: vsetvli zero, a1, e8, m2, tu, ma
464 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
466 %elt.head = insertelement <vscale x 16 x i8> poison, i8 %a, i32 0
467 %va = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer
468 %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)
469 ret <vscale x 16 x i8> %v
472 define <vscale x 16 x i8> @vpmerge_vi_nxv16i8(<vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
473 ; CHECK-LABEL: vpmerge_vi_nxv16i8:
475 ; CHECK-NEXT: vsetvli zero, a0, e8, m2, tu, ma
476 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
478 %v = call <vscale x 16 x i8> @llvm.vp.merge.nxv16i8(<vscale x 16 x i1> %m, <vscale x 16 x i8> splat (i8 2), <vscale x 16 x i8> %vb, i32 %evl)
479 ret <vscale x 16 x i8> %v
482 declare <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)
484 define <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) {
485 ; CHECK-LABEL: vpmerge_vv_nxv32i8:
487 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, ma
488 ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
489 ; CHECK-NEXT: vmv4r.v v8, v12
491 %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)
492 ret <vscale x 32 x i8> %v
495 define <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) {
496 ; CHECK-LABEL: vpmerge_vx_nxv32i8:
498 ; CHECK-NEXT: vsetvli zero, a1, e8, m4, tu, ma
499 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
501 %elt.head = insertelement <vscale x 32 x i8> poison, i8 %a, i32 0
502 %va = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer
503 %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)
504 ret <vscale x 32 x i8> %v
507 define <vscale x 32 x i8> @vpmerge_vi_nxv32i8(<vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
508 ; CHECK-LABEL: vpmerge_vi_nxv32i8:
510 ; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, ma
511 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
513 %v = call <vscale x 32 x i8> @llvm.vp.merge.nxv32i8(<vscale x 32 x i1> %m, <vscale x 32 x i8> splat (i8 2), <vscale x 32 x i8> %vb, i32 %evl)
514 ret <vscale x 32 x i8> %v
517 declare <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)
519 define <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) {
520 ; CHECK-LABEL: vpmerge_vv_nxv64i8:
522 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma
523 ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0
524 ; CHECK-NEXT: vmv8r.v v8, v16
526 %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)
527 ret <vscale x 64 x i8> %v
530 define <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) {
531 ; CHECK-LABEL: vpmerge_vx_nxv64i8:
533 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, tu, ma
534 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
536 %elt.head = insertelement <vscale x 64 x i8> poison, i8 %a, i32 0
537 %va = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer
538 %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)
539 ret <vscale x 64 x i8> %v
542 define <vscale x 64 x i8> @vpmerge_vi_nxv64i8(<vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 zeroext %evl) {
543 ; CHECK-LABEL: vpmerge_vi_nxv64i8:
545 ; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma
546 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
548 %v = call <vscale x 64 x i8> @llvm.vp.merge.nxv64i8(<vscale x 64 x i1> %m, <vscale x 64 x i8> splat (i8 2), <vscale x 64 x i8> %vb, i32 %evl)
549 ret <vscale x 64 x i8> %v
552 declare <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)
554 define <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) {
555 ; CHECK-LABEL: vpmerge_vv_nxv128i8:
557 ; CHECK-NEXT: addi sp, sp, -16
558 ; CHECK-NEXT: .cfi_def_cfa_offset 16
559 ; CHECK-NEXT: csrr a1, vlenb
560 ; CHECK-NEXT: slli a1, a1, 3
561 ; CHECK-NEXT: sub sp, sp, a1
562 ; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb
563 ; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma
564 ; CHECK-NEXT: vmv1r.v v7, v0
565 ; CHECK-NEXT: vmv8r.v v24, v16
566 ; CHECK-NEXT: addi a1, sp, 16
567 ; CHECK-NEXT: vs8r.v v8, (a1) # Unknown-size Folded Spill
568 ; CHECK-NEXT: csrr a1, vlenb
569 ; CHECK-NEXT: vlm.v v0, (a2)
570 ; CHECK-NEXT: slli a1, a1, 3
571 ; CHECK-NEXT: add a2, a0, a1
572 ; CHECK-NEXT: sub a4, a3, a1
573 ; CHECK-NEXT: vl8r.v v16, (a2)
574 ; CHECK-NEXT: sltu a2, a3, a4
575 ; CHECK-NEXT: vl8r.v v8, (a0)
576 ; CHECK-NEXT: addi a2, a2, -1
577 ; CHECK-NEXT: and a2, a2, a4
578 ; CHECK-NEXT: vsetvli zero, a2, e8, m8, tu, ma
579 ; CHECK-NEXT: vmerge.vvm v16, v16, v24, v0
580 ; CHECK-NEXT: bltu a3, a1, .LBB35_2
581 ; CHECK-NEXT: # %bb.1:
582 ; CHECK-NEXT: mv a3, a1
583 ; CHECK-NEXT: .LBB35_2:
584 ; CHECK-NEXT: vmv1r.v v0, v7
585 ; CHECK-NEXT: addi a0, sp, 16
586 ; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload
587 ; CHECK-NEXT: vsetvli zero, a3, e8, m8, tu, ma
588 ; CHECK-NEXT: vmerge.vvm v8, v8, v24, v0
589 ; CHECK-NEXT: csrr a0, vlenb
590 ; CHECK-NEXT: slli a0, a0, 3
591 ; CHECK-NEXT: add sp, sp, a0
592 ; CHECK-NEXT: .cfi_def_cfa sp, 16
593 ; CHECK-NEXT: addi sp, sp, 16
594 ; CHECK-NEXT: .cfi_def_cfa_offset 0
596 %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)
597 ret <vscale x 128 x i8> %v
600 define <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) {
601 ; CHECK-LABEL: vpmerge_vx_nxv128i8:
603 ; CHECK-NEXT: vsetvli a3, zero, e8, m8, ta, ma
604 ; CHECK-NEXT: vmv1r.v v24, v0
605 ; CHECK-NEXT: vlm.v v0, (a1)
606 ; CHECK-NEXT: csrr a1, vlenb
607 ; CHECK-NEXT: slli a1, a1, 3
608 ; CHECK-NEXT: sub a3, a2, a1
609 ; CHECK-NEXT: sltu a4, a2, a3
610 ; CHECK-NEXT: addi a4, a4, -1
611 ; CHECK-NEXT: and a3, a4, a3
612 ; CHECK-NEXT: vsetvli zero, a3, e8, m8, tu, ma
613 ; CHECK-NEXT: vmerge.vxm v16, v16, a0, v0
614 ; CHECK-NEXT: bltu a2, a1, .LBB36_2
615 ; CHECK-NEXT: # %bb.1:
616 ; CHECK-NEXT: mv a2, a1
617 ; CHECK-NEXT: .LBB36_2:
618 ; CHECK-NEXT: vmv1r.v v0, v24
619 ; CHECK-NEXT: vsetvli zero, a2, e8, m8, tu, ma
620 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
622 %elt.head = insertelement <vscale x 128 x i8> poison, i8 %a, i32 0
623 %va = shufflevector <vscale x 128 x i8> %elt.head, <vscale x 128 x i8> poison, <vscale x 128 x i32> zeroinitializer
624 %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)
625 ret <vscale x 128 x i8> %v
628 define <vscale x 128 x i8> @vpmerge_vi_nxv128i8(<vscale x 128 x i8> %vb, <vscale x 128 x i1> %m, i32 zeroext %evl) {
629 ; CHECK-LABEL: vpmerge_vi_nxv128i8:
631 ; CHECK-NEXT: vsetvli a2, zero, e8, m8, ta, ma
632 ; CHECK-NEXT: vmv1r.v v24, v0
633 ; CHECK-NEXT: vlm.v v0, (a0)
634 ; CHECK-NEXT: csrr a0, vlenb
635 ; CHECK-NEXT: slli a0, a0, 3
636 ; CHECK-NEXT: sub a2, a1, a0
637 ; CHECK-NEXT: sltu a3, a1, a2
638 ; CHECK-NEXT: addi a3, a3, -1
639 ; CHECK-NEXT: and a2, a3, a2
640 ; CHECK-NEXT: vsetvli zero, a2, e8, m8, tu, ma
641 ; CHECK-NEXT: vmerge.vim v16, v16, 2, v0
642 ; CHECK-NEXT: bltu a1, a0, .LBB37_2
643 ; CHECK-NEXT: # %bb.1:
644 ; CHECK-NEXT: mv a1, a0
645 ; CHECK-NEXT: .LBB37_2:
646 ; CHECK-NEXT: vmv1r.v v0, v24
647 ; CHECK-NEXT: vsetvli zero, a1, e8, m8, tu, ma
648 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
650 %v = call <vscale x 128 x i8> @llvm.vp.merge.nxv128i8(<vscale x 128 x i1> %m, <vscale x 128 x i8> splat (i8 2), <vscale x 128 x i8> %vb, i32 %evl)
651 ret <vscale x 128 x i8> %v
654 declare <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)
656 define <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) {
657 ; CHECK-LABEL: vpmerge_vv_nxv1i16:
659 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma
660 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
661 ; CHECK-NEXT: vmv1r.v v8, v9
663 %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)
664 ret <vscale x 1 x i16> %v
667 define <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) {
668 ; CHECK-LABEL: vpmerge_vx_nxv1i16:
670 ; CHECK-NEXT: vsetvli zero, a1, e16, mf4, tu, ma
671 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
673 %elt.head = insertelement <vscale x 1 x i16> poison, i16 %a, i32 0
674 %va = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer
675 %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)
676 ret <vscale x 1 x i16> %v
679 define <vscale x 1 x i16> @vpmerge_vi_nxv1i16(<vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
680 ; CHECK-LABEL: vpmerge_vi_nxv1i16:
682 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma
683 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
685 %v = call <vscale x 1 x i16> @llvm.vp.merge.nxv1i16(<vscale x 1 x i1> %m, <vscale x 1 x i16> splat (i16 2), <vscale x 1 x i16> %vb, i32 %evl)
686 ret <vscale x 1 x i16> %v
689 declare <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)
691 define <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) {
692 ; CHECK-LABEL: vpmerge_vv_nxv2i16:
694 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma
695 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
696 ; CHECK-NEXT: vmv1r.v v8, v9
698 %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)
699 ret <vscale x 2 x i16> %v
702 define <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) {
703 ; CHECK-LABEL: vpmerge_vx_nxv2i16:
705 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, tu, ma
706 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
708 %elt.head = insertelement <vscale x 2 x i16> poison, i16 %a, i32 0
709 %va = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
710 %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)
711 ret <vscale x 2 x i16> %v
714 define <vscale x 2 x i16> @vpmerge_vi_nxv2i16(<vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
715 ; CHECK-LABEL: vpmerge_vi_nxv2i16:
717 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma
718 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
720 %v = call <vscale x 2 x i16> @llvm.vp.merge.nxv2i16(<vscale x 2 x i1> %m, <vscale x 2 x i16> splat (i16 2), <vscale x 2 x i16> %vb, i32 %evl)
721 ret <vscale x 2 x i16> %v
724 declare <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)
726 define <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) {
727 ; CHECK-LABEL: vpmerge_vv_nxv4i16:
729 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma
730 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
731 ; CHECK-NEXT: vmv1r.v v8, v9
733 %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)
734 ret <vscale x 4 x i16> %v
737 define <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) {
738 ; CHECK-LABEL: vpmerge_vx_nxv4i16:
740 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, tu, ma
741 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
743 %elt.head = insertelement <vscale x 4 x i16> poison, i16 %a, i32 0
744 %va = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer
745 %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)
746 ret <vscale x 4 x i16> %v
749 define <vscale x 4 x i16> @vpmerge_vi_nxv4i16(<vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
750 ; CHECK-LABEL: vpmerge_vi_nxv4i16:
752 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma
753 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
755 %v = call <vscale x 4 x i16> @llvm.vp.merge.nxv4i16(<vscale x 4 x i1> %m, <vscale x 4 x i16> splat (i16 2), <vscale x 4 x i16> %vb, i32 %evl)
756 ret <vscale x 4 x i16> %v
759 declare <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)
761 define <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) {
762 ; CHECK-LABEL: vpmerge_vv_nxv8i16:
764 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma
765 ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0
766 ; CHECK-NEXT: vmv2r.v v8, v10
768 %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)
769 ret <vscale x 8 x i16> %v
772 define <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) {
773 ; CHECK-LABEL: vpmerge_vx_nxv8i16:
775 ; CHECK-NEXT: vsetvli zero, a1, e16, m2, tu, ma
776 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
778 %elt.head = insertelement <vscale x 8 x i16> poison, i16 %a, i32 0
779 %va = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer
780 %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)
781 ret <vscale x 8 x i16> %v
784 define <vscale x 8 x i16> @vpmerge_vi_nxv8i16(<vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
785 ; CHECK-LABEL: vpmerge_vi_nxv8i16:
787 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma
788 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
790 %v = call <vscale x 8 x i16> @llvm.vp.merge.nxv8i16(<vscale x 8 x i1> %m, <vscale x 8 x i16> splat (i16 2), <vscale x 8 x i16> %vb, i32 %evl)
791 ret <vscale x 8 x i16> %v
794 declare <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)
796 define <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) {
797 ; CHECK-LABEL: vpmerge_vv_nxv16i16:
799 ; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma
800 ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
801 ; CHECK-NEXT: vmv4r.v v8, v12
803 %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)
804 ret <vscale x 16 x i16> %v
807 define <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) {
808 ; CHECK-LABEL: vpmerge_vx_nxv16i16:
810 ; CHECK-NEXT: vsetvli zero, a1, e16, m4, tu, ma
811 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
813 %elt.head = insertelement <vscale x 16 x i16> poison, i16 %a, i32 0
814 %va = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer
815 %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)
816 ret <vscale x 16 x i16> %v
819 define <vscale x 16 x i16> @vpmerge_vi_nxv16i16(<vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
820 ; CHECK-LABEL: vpmerge_vi_nxv16i16:
822 ; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma
823 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
825 %v = call <vscale x 16 x i16> @llvm.vp.merge.nxv16i16(<vscale x 16 x i1> %m, <vscale x 16 x i16> splat (i16 2), <vscale x 16 x i16> %vb, i32 %evl)
826 ret <vscale x 16 x i16> %v
829 declare <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)
831 define <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) {
832 ; CHECK-LABEL: vpmerge_vv_nxv32i16:
834 ; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, ma
835 ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0
836 ; CHECK-NEXT: vmv8r.v v8, v16
838 %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)
839 ret <vscale x 32 x i16> %v
842 define <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) {
843 ; CHECK-LABEL: vpmerge_vx_nxv32i16:
845 ; CHECK-NEXT: vsetvli zero, a1, e16, m8, tu, ma
846 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
848 %elt.head = insertelement <vscale x 32 x i16> poison, i16 %a, i32 0
849 %va = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer
850 %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)
851 ret <vscale x 32 x i16> %v
854 define <vscale x 32 x i16> @vpmerge_vi_nxv32i16(<vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 zeroext %evl) {
855 ; CHECK-LABEL: vpmerge_vi_nxv32i16:
857 ; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, ma
858 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
860 %v = call <vscale x 32 x i16> @llvm.vp.merge.nxv32i16(<vscale x 32 x i1> %m, <vscale x 32 x i16> splat (i16 2), <vscale x 32 x i16> %vb, i32 %evl)
861 ret <vscale x 32 x i16> %v
864 declare <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)
866 define <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) {
867 ; CHECK-LABEL: vpmerge_vv_nxv1i32:
869 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma
870 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
871 ; CHECK-NEXT: vmv1r.v v8, v9
873 %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)
874 ret <vscale x 1 x i32> %v
877 define <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) {
878 ; CHECK-LABEL: vpmerge_vx_nxv1i32:
880 ; CHECK-NEXT: vsetvli zero, a1, e32, mf2, tu, ma
881 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
883 %elt.head = insertelement <vscale x 1 x i32> poison, i32 %a, i32 0
884 %va = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer
885 %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)
886 ret <vscale x 1 x i32> %v
889 define <vscale x 1 x i32> @vpmerge_vi_nxv1i32(<vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
890 ; CHECK-LABEL: vpmerge_vi_nxv1i32:
892 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma
893 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
895 %v = call <vscale x 1 x i32> @llvm.vp.merge.nxv1i32(<vscale x 1 x i1> %m, <vscale x 1 x i32> splat (i32 2), <vscale x 1 x i32> %vb, i32 %evl)
896 ret <vscale x 1 x i32> %v
899 declare <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)
901 define <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) {
902 ; CHECK-LABEL: vpmerge_vv_nxv2i32:
904 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma
905 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
906 ; CHECK-NEXT: vmv1r.v v8, v9
908 %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)
909 ret <vscale x 2 x i32> %v
912 define <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) {
913 ; CHECK-LABEL: vpmerge_vx_nxv2i32:
915 ; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, ma
916 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
918 %elt.head = insertelement <vscale x 2 x i32> poison, i32 %a, i32 0
919 %va = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
920 %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)
921 ret <vscale x 2 x i32> %v
924 define <vscale x 2 x i32> @vpmerge_vi_nxv2i32(<vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
925 ; CHECK-LABEL: vpmerge_vi_nxv2i32:
927 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma
928 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
930 %v = call <vscale x 2 x i32> @llvm.vp.merge.nxv2i32(<vscale x 2 x i1> %m, <vscale x 2 x i32> splat (i32 2), <vscale x 2 x i32> %vb, i32 %evl)
931 ret <vscale x 2 x i32> %v
934 declare <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)
936 define <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) {
937 ; CHECK-LABEL: vpmerge_vv_nxv4i32:
939 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
940 ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0
941 ; CHECK-NEXT: vmv2r.v v8, v10
943 %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)
944 ret <vscale x 4 x i32> %v
947 define <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) {
948 ; CHECK-LABEL: vpmerge_vx_nxv4i32:
950 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, tu, ma
951 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
953 %elt.head = insertelement <vscale x 4 x i32> poison, i32 %a, i32 0
954 %va = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer
955 %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)
956 ret <vscale x 4 x i32> %v
959 define <vscale x 4 x i32> @vpmerge_vi_nxv4i32(<vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
960 ; CHECK-LABEL: vpmerge_vi_nxv4i32:
962 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
963 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
965 %v = call <vscale x 4 x i32> @llvm.vp.merge.nxv4i32(<vscale x 4 x i1> %m, <vscale x 4 x i32> splat (i32 2), <vscale x 4 x i32> %vb, i32 %evl)
966 ret <vscale x 4 x i32> %v
969 declare <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)
971 define <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) {
972 ; CHECK-LABEL: vpmerge_vv_nxv8i32:
974 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma
975 ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
976 ; CHECK-NEXT: vmv4r.v v8, v12
978 %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)
979 ret <vscale x 8 x i32> %v
982 define <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) {
983 ; CHECK-LABEL: vpmerge_vx_nxv8i32:
985 ; CHECK-NEXT: vsetvli zero, a1, e32, m4, tu, ma
986 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
988 %elt.head = insertelement <vscale x 8 x i32> poison, i32 %a, i32 0
989 %va = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer
990 %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)
991 ret <vscale x 8 x i32> %v
994 define <vscale x 8 x i32> @vpmerge_vi_nxv8i32(<vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
995 ; CHECK-LABEL: vpmerge_vi_nxv8i32:
997 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma
998 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
1000 %v = call <vscale x 8 x i32> @llvm.vp.merge.nxv8i32(<vscale x 8 x i1> %m, <vscale x 8 x i32> splat (i32 2), <vscale x 8 x i32> %vb, i32 %evl)
1001 ret <vscale x 8 x i32> %v
1004 declare <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)
1006 define <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) {
1007 ; CHECK-LABEL: vpmerge_vv_nxv16i32:
1009 ; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, ma
1010 ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0
1011 ; CHECK-NEXT: vmv8r.v v8, v16
1013 %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)
1014 ret <vscale x 16 x i32> %v
1017 define <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) {
1018 ; CHECK-LABEL: vpmerge_vx_nxv16i32:
1020 ; CHECK-NEXT: vsetvli zero, a1, e32, m8, tu, ma
1021 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
1023 %elt.head = insertelement <vscale x 16 x i32> poison, i32 %a, i32 0
1024 %va = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer
1025 %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)
1026 ret <vscale x 16 x i32> %v
1029 define <vscale x 16 x i32> @vpmerge_vi_nxv16i32(<vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 zeroext %evl) {
1030 ; CHECK-LABEL: vpmerge_vi_nxv16i32:
1032 ; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, ma
1033 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
1035 %v = call <vscale x 16 x i32> @llvm.vp.merge.nxv16i32(<vscale x 16 x i1> %m, <vscale x 16 x i32> splat (i32 2), <vscale x 16 x i32> %vb, i32 %evl)
1036 ret <vscale x 16 x i32> %v
1039 declare <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)
1041 define <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) {
1042 ; CHECK-LABEL: vpmerge_vv_nxv1i64:
1044 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma
1045 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
1046 ; CHECK-NEXT: vmv1r.v v8, v9
1048 %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)
1049 ret <vscale x 1 x i64> %v
1052 define <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) {
1053 ; RV32-LABEL: vpmerge_vx_nxv1i64:
1055 ; RV32-NEXT: addi sp, sp, -16
1056 ; RV32-NEXT: .cfi_def_cfa_offset 16
1057 ; RV32-NEXT: sw a0, 8(sp)
1058 ; RV32-NEXT: sw a1, 12(sp)
1059 ; RV32-NEXT: addi a0, sp, 8
1060 ; RV32-NEXT: vsetvli zero, a2, e64, m1, tu, mu
1061 ; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t
1062 ; RV32-NEXT: addi sp, sp, 16
1063 ; RV32-NEXT: .cfi_def_cfa_offset 0
1066 ; RV64-LABEL: vpmerge_vx_nxv1i64:
1068 ; RV64-NEXT: vsetvli zero, a1, e64, m1, tu, ma
1069 ; RV64-NEXT: vmerge.vxm v8, v8, a0, v0
1071 %elt.head = insertelement <vscale x 1 x i64> poison, i64 %a, i32 0
1072 %va = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer
1073 %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)
1074 ret <vscale x 1 x i64> %v
1077 define <vscale x 1 x i64> @vpmerge_vi_nxv1i64(<vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 zeroext %evl) {
1078 ; CHECK-LABEL: vpmerge_vi_nxv1i64:
1080 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma
1081 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
1083 %v = call <vscale x 1 x i64> @llvm.vp.merge.nxv1i64(<vscale x 1 x i1> %m, <vscale x 1 x i64> splat (i64 2), <vscale x 1 x i64> %vb, i32 %evl)
1084 ret <vscale x 1 x i64> %v
1087 declare <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)
1089 define <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) {
1090 ; CHECK-LABEL: vpmerge_vv_nxv2i64:
1092 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma
1093 ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0
1094 ; CHECK-NEXT: vmv2r.v v8, v10
1096 %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)
1097 ret <vscale x 2 x i64> %v
1100 define <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) {
1101 ; RV32-LABEL: vpmerge_vx_nxv2i64:
1103 ; RV32-NEXT: addi sp, sp, -16
1104 ; RV32-NEXT: .cfi_def_cfa_offset 16
1105 ; RV32-NEXT: sw a0, 8(sp)
1106 ; RV32-NEXT: sw a1, 12(sp)
1107 ; RV32-NEXT: addi a0, sp, 8
1108 ; RV32-NEXT: vsetvli zero, a2, e64, m2, tu, mu
1109 ; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t
1110 ; RV32-NEXT: addi sp, sp, 16
1111 ; RV32-NEXT: .cfi_def_cfa_offset 0
1114 ; RV64-LABEL: vpmerge_vx_nxv2i64:
1116 ; RV64-NEXT: vsetvli zero, a1, e64, m2, tu, ma
1117 ; RV64-NEXT: vmerge.vxm v8, v8, a0, v0
1119 %elt.head = insertelement <vscale x 2 x i64> poison, i64 %a, i32 0
1120 %va = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
1121 %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)
1122 ret <vscale x 2 x i64> %v
1125 define <vscale x 2 x i64> @vpmerge_vi_nxv2i64(<vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 zeroext %evl) {
1126 ; CHECK-LABEL: vpmerge_vi_nxv2i64:
1128 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma
1129 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
1131 %v = call <vscale x 2 x i64> @llvm.vp.merge.nxv2i64(<vscale x 2 x i1> %m, <vscale x 2 x i64> splat (i64 2), <vscale x 2 x i64> %vb, i32 %evl)
1132 ret <vscale x 2 x i64> %v
1135 declare <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)
1137 define <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) {
1138 ; CHECK-LABEL: vpmerge_vv_nxv4i64:
1140 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma
1141 ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
1142 ; CHECK-NEXT: vmv4r.v v8, v12
1144 %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)
1145 ret <vscale x 4 x i64> %v
1148 define <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) {
1149 ; RV32-LABEL: vpmerge_vx_nxv4i64:
1151 ; RV32-NEXT: addi sp, sp, -16
1152 ; RV32-NEXT: .cfi_def_cfa_offset 16
1153 ; RV32-NEXT: sw a0, 8(sp)
1154 ; RV32-NEXT: sw a1, 12(sp)
1155 ; RV32-NEXT: addi a0, sp, 8
1156 ; RV32-NEXT: vsetvli zero, a2, e64, m4, tu, mu
1157 ; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t
1158 ; RV32-NEXT: addi sp, sp, 16
1159 ; RV32-NEXT: .cfi_def_cfa_offset 0
1162 ; RV64-LABEL: vpmerge_vx_nxv4i64:
1164 ; RV64-NEXT: vsetvli zero, a1, e64, m4, tu, ma
1165 ; RV64-NEXT: vmerge.vxm v8, v8, a0, v0
1167 %elt.head = insertelement <vscale x 4 x i64> poison, i64 %a, i32 0
1168 %va = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer
1169 %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)
1170 ret <vscale x 4 x i64> %v
1173 define <vscale x 4 x i64> @vpmerge_vi_nxv4i64(<vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 zeroext %evl) {
1174 ; CHECK-LABEL: vpmerge_vi_nxv4i64:
1176 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma
1177 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
1179 %v = call <vscale x 4 x i64> @llvm.vp.merge.nxv4i64(<vscale x 4 x i1> %m, <vscale x 4 x i64> splat (i64 2), <vscale x 4 x i64> %vb, i32 %evl)
1180 ret <vscale x 4 x i64> %v
1183 declare <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)
1185 define <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) {
1186 ; CHECK-LABEL: vpmerge_vv_nxv8i64:
1188 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma
1189 ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0
1190 ; CHECK-NEXT: vmv8r.v v8, v16
1192 %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)
1193 ret <vscale x 8 x i64> %v
1196 define <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) {
1197 ; RV32-LABEL: vpmerge_vx_nxv8i64:
1199 ; RV32-NEXT: addi sp, sp, -16
1200 ; RV32-NEXT: .cfi_def_cfa_offset 16
1201 ; RV32-NEXT: sw a0, 8(sp)
1202 ; RV32-NEXT: sw a1, 12(sp)
1203 ; RV32-NEXT: addi a0, sp, 8
1204 ; RV32-NEXT: vsetvli zero, a2, e64, m8, tu, mu
1205 ; RV32-NEXT: vlse64.v v8, (a0), zero, v0.t
1206 ; RV32-NEXT: addi sp, sp, 16
1207 ; RV32-NEXT: .cfi_def_cfa_offset 0
1210 ; RV64-LABEL: vpmerge_vx_nxv8i64:
1212 ; RV64-NEXT: vsetvli zero, a1, e64, m8, tu, ma
1213 ; RV64-NEXT: vmerge.vxm v8, v8, a0, v0
1215 %elt.head = insertelement <vscale x 8 x i64> poison, i64 %a, i32 0
1216 %va = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer
1217 %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)
1218 ret <vscale x 8 x i64> %v
1221 define <vscale x 8 x i64> @vpmerge_vi_nxv8i64(<vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 zeroext %evl) {
1222 ; CHECK-LABEL: vpmerge_vi_nxv8i64:
1224 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma
1225 ; CHECK-NEXT: vmerge.vim v8, v8, 2, v0
1227 %v = call <vscale x 8 x i64> @llvm.vp.merge.nxv8i64(<vscale x 8 x i1> %m, <vscale x 8 x i64> splat (i64 2), <vscale x 8 x i64> %vb, i32 %evl)
1228 ret <vscale x 8 x i64> %v
1231 declare <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)
1233 define <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) {
1234 ; CHECK-LABEL: vpmerge_vv_nxv1f16:
1236 ; CHECK-NEXT: vsetvli zero, a0, e16, mf4, tu, ma
1237 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
1238 ; CHECK-NEXT: vmv1r.v v8, v9
1240 %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)
1241 ret <vscale x 1 x half> %v
1244 define <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) {
1245 ; RV32ZVFH-LABEL: vpmerge_vf_nxv1f16:
1246 ; RV32ZVFH: # %bb.0:
1247 ; RV32ZVFH-NEXT: vsetvli zero, a0, e16, mf4, tu, ma
1248 ; RV32ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1249 ; RV32ZVFH-NEXT: ret
1251 ; RV64ZVFH-LABEL: vpmerge_vf_nxv1f16:
1252 ; RV64ZVFH: # %bb.0:
1253 ; RV64ZVFH-NEXT: vsetvli zero, a0, e16, mf4, tu, ma
1254 ; RV64ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1255 ; RV64ZVFH-NEXT: ret
1257 ; RV32ZVFHMIN-LABEL: vpmerge_vf_nxv1f16:
1258 ; RV32ZVFHMIN: # %bb.0:
1259 ; RV32ZVFHMIN-NEXT: fmv.x.h a1, fa0
1260 ; RV32ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
1261 ; RV32ZVFHMIN-NEXT: vmv.v.x v9, a1
1262 ; RV32ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, tu, ma
1263 ; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
1264 ; RV32ZVFHMIN-NEXT: ret
1266 ; RV64ZVFHMIN-LABEL: vpmerge_vf_nxv1f16:
1267 ; RV64ZVFHMIN: # %bb.0:
1268 ; RV64ZVFHMIN-NEXT: fmv.x.h a1, fa0
1269 ; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma
1270 ; RV64ZVFHMIN-NEXT: vmv.v.x v9, a1
1271 ; RV64ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, tu, ma
1272 ; RV64ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
1273 ; RV64ZVFHMIN-NEXT: ret
1274 %elt.head = insertelement <vscale x 1 x half> poison, half %a, i32 0
1275 %va = shufflevector <vscale x 1 x half> %elt.head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
1276 %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)
1277 ret <vscale x 1 x half> %v
1280 declare <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)
1282 define <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) {
1283 ; CHECK-LABEL: vpmerge_vv_nxv2f16:
1285 ; CHECK-NEXT: vsetvli zero, a0, e16, mf2, tu, ma
1286 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
1287 ; CHECK-NEXT: vmv1r.v v8, v9
1289 %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)
1290 ret <vscale x 2 x half> %v
1293 define <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) {
1294 ; RV32ZVFH-LABEL: vpmerge_vf_nxv2f16:
1295 ; RV32ZVFH: # %bb.0:
1296 ; RV32ZVFH-NEXT: vsetvli zero, a0, e16, mf2, tu, ma
1297 ; RV32ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1298 ; RV32ZVFH-NEXT: ret
1300 ; RV64ZVFH-LABEL: vpmerge_vf_nxv2f16:
1301 ; RV64ZVFH: # %bb.0:
1302 ; RV64ZVFH-NEXT: vsetvli zero, a0, e16, mf2, tu, ma
1303 ; RV64ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1304 ; RV64ZVFH-NEXT: ret
1306 ; RV32ZVFHMIN-LABEL: vpmerge_vf_nxv2f16:
1307 ; RV32ZVFHMIN: # %bb.0:
1308 ; RV32ZVFHMIN-NEXT: fmv.x.h a1, fa0
1309 ; RV32ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
1310 ; RV32ZVFHMIN-NEXT: vmv.v.x v9, a1
1311 ; RV32ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, tu, ma
1312 ; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
1313 ; RV32ZVFHMIN-NEXT: ret
1315 ; RV64ZVFHMIN-LABEL: vpmerge_vf_nxv2f16:
1316 ; RV64ZVFHMIN: # %bb.0:
1317 ; RV64ZVFHMIN-NEXT: fmv.x.h a1, fa0
1318 ; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma
1319 ; RV64ZVFHMIN-NEXT: vmv.v.x v9, a1
1320 ; RV64ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, tu, ma
1321 ; RV64ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
1322 ; RV64ZVFHMIN-NEXT: ret
1323 %elt.head = insertelement <vscale x 2 x half> poison, half %a, i32 0
1324 %va = shufflevector <vscale x 2 x half> %elt.head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
1325 %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)
1326 ret <vscale x 2 x half> %v
1329 declare <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)
1331 define <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) {
1332 ; CHECK-LABEL: vpmerge_vv_nxv4f16:
1334 ; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma
1335 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
1336 ; CHECK-NEXT: vmv1r.v v8, v9
1338 %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)
1339 ret <vscale x 4 x half> %v
1342 define <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) {
1343 ; RV32ZVFH-LABEL: vpmerge_vf_nxv4f16:
1344 ; RV32ZVFH: # %bb.0:
1345 ; RV32ZVFH-NEXT: vsetvli zero, a0, e16, m1, tu, ma
1346 ; RV32ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1347 ; RV32ZVFH-NEXT: ret
1349 ; RV64ZVFH-LABEL: vpmerge_vf_nxv4f16:
1350 ; RV64ZVFH: # %bb.0:
1351 ; RV64ZVFH-NEXT: vsetvli zero, a0, e16, m1, tu, ma
1352 ; RV64ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1353 ; RV64ZVFH-NEXT: ret
1355 ; RV32ZVFHMIN-LABEL: vpmerge_vf_nxv4f16:
1356 ; RV32ZVFHMIN: # %bb.0:
1357 ; RV32ZVFHMIN-NEXT: fmv.x.h a1, fa0
1358 ; RV32ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1359 ; RV32ZVFHMIN-NEXT: vmv.v.x v9, a1
1360 ; RV32ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, tu, ma
1361 ; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
1362 ; RV32ZVFHMIN-NEXT: ret
1364 ; RV64ZVFHMIN-LABEL: vpmerge_vf_nxv4f16:
1365 ; RV64ZVFHMIN: # %bb.0:
1366 ; RV64ZVFHMIN-NEXT: fmv.x.h a1, fa0
1367 ; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma
1368 ; RV64ZVFHMIN-NEXT: vmv.v.x v9, a1
1369 ; RV64ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, tu, ma
1370 ; RV64ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
1371 ; RV64ZVFHMIN-NEXT: ret
1372 %elt.head = insertelement <vscale x 4 x half> poison, half %a, i32 0
1373 %va = shufflevector <vscale x 4 x half> %elt.head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
1374 %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)
1375 ret <vscale x 4 x half> %v
1378 declare <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)
1380 define <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) {
1381 ; CHECK-LABEL: vpmerge_vv_nxv8f16:
1383 ; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma
1384 ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0
1385 ; CHECK-NEXT: vmv2r.v v8, v10
1387 %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)
1388 ret <vscale x 8 x half> %v
1391 define <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) {
1392 ; RV32ZVFH-LABEL: vpmerge_vf_nxv8f16:
1393 ; RV32ZVFH: # %bb.0:
1394 ; RV32ZVFH-NEXT: vsetvli zero, a0, e16, m2, tu, ma
1395 ; RV32ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1396 ; RV32ZVFH-NEXT: ret
1398 ; RV64ZVFH-LABEL: vpmerge_vf_nxv8f16:
1399 ; RV64ZVFH: # %bb.0:
1400 ; RV64ZVFH-NEXT: vsetvli zero, a0, e16, m2, tu, ma
1401 ; RV64ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1402 ; RV64ZVFH-NEXT: ret
1404 ; RV32ZVFHMIN-LABEL: vpmerge_vf_nxv8f16:
1405 ; RV32ZVFHMIN: # %bb.0:
1406 ; RV32ZVFHMIN-NEXT: fmv.x.h a1, fa0
1407 ; RV32ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
1408 ; RV32ZVFHMIN-NEXT: vmv.v.x v10, a1
1409 ; RV32ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, tu, ma
1410 ; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v10, v0
1411 ; RV32ZVFHMIN-NEXT: ret
1413 ; RV64ZVFHMIN-LABEL: vpmerge_vf_nxv8f16:
1414 ; RV64ZVFHMIN: # %bb.0:
1415 ; RV64ZVFHMIN-NEXT: fmv.x.h a1, fa0
1416 ; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma
1417 ; RV64ZVFHMIN-NEXT: vmv.v.x v10, a1
1418 ; RV64ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, tu, ma
1419 ; RV64ZVFHMIN-NEXT: vmerge.vvm v8, v8, v10, v0
1420 ; RV64ZVFHMIN-NEXT: ret
1421 %elt.head = insertelement <vscale x 8 x half> poison, half %a, i32 0
1422 %va = shufflevector <vscale x 8 x half> %elt.head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
1423 %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)
1424 ret <vscale x 8 x half> %v
1427 declare <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)
1429 define <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) {
1430 ; CHECK-LABEL: vpmerge_vv_nxv16f16:
1432 ; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma
1433 ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
1434 ; CHECK-NEXT: vmv4r.v v8, v12
1436 %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)
1437 ret <vscale x 16 x half> %v
1440 define <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) {
1441 ; RV32ZVFH-LABEL: vpmerge_vf_nxv16f16:
1442 ; RV32ZVFH: # %bb.0:
1443 ; RV32ZVFH-NEXT: vsetvli zero, a0, e16, m4, tu, ma
1444 ; RV32ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1445 ; RV32ZVFH-NEXT: ret
1447 ; RV64ZVFH-LABEL: vpmerge_vf_nxv16f16:
1448 ; RV64ZVFH: # %bb.0:
1449 ; RV64ZVFH-NEXT: vsetvli zero, a0, e16, m4, tu, ma
1450 ; RV64ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1451 ; RV64ZVFH-NEXT: ret
1453 ; RV32ZVFHMIN-LABEL: vpmerge_vf_nxv16f16:
1454 ; RV32ZVFHMIN: # %bb.0:
1455 ; RV32ZVFHMIN-NEXT: fmv.x.h a1, fa0
1456 ; RV32ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma
1457 ; RV32ZVFHMIN-NEXT: vmv.v.x v12, a1
1458 ; RV32ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, tu, ma
1459 ; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v12, v0
1460 ; RV32ZVFHMIN-NEXT: ret
1462 ; RV64ZVFHMIN-LABEL: vpmerge_vf_nxv16f16:
1463 ; RV64ZVFHMIN: # %bb.0:
1464 ; RV64ZVFHMIN-NEXT: fmv.x.h a1, fa0
1465 ; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma
1466 ; RV64ZVFHMIN-NEXT: vmv.v.x v12, a1
1467 ; RV64ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, tu, ma
1468 ; RV64ZVFHMIN-NEXT: vmerge.vvm v8, v8, v12, v0
1469 ; RV64ZVFHMIN-NEXT: ret
1470 %elt.head = insertelement <vscale x 16 x half> poison, half %a, i32 0
1471 %va = shufflevector <vscale x 16 x half> %elt.head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
1472 %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)
1473 ret <vscale x 16 x half> %v
1476 declare <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)
1478 define <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) {
1479 ; CHECK-LABEL: vpmerge_vv_nxv32f16:
1481 ; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, ma
1482 ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0
1483 ; CHECK-NEXT: vmv8r.v v8, v16
1485 %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)
1486 ret <vscale x 32 x half> %v
1489 define <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) {
1490 ; RV32ZVFH-LABEL: vpmerge_vf_nxv32f16:
1491 ; RV32ZVFH: # %bb.0:
1492 ; RV32ZVFH-NEXT: vsetvli zero, a0, e16, m8, tu, ma
1493 ; RV32ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1494 ; RV32ZVFH-NEXT: ret
1496 ; RV64ZVFH-LABEL: vpmerge_vf_nxv32f16:
1497 ; RV64ZVFH: # %bb.0:
1498 ; RV64ZVFH-NEXT: vsetvli zero, a0, e16, m8, tu, ma
1499 ; RV64ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
1500 ; RV64ZVFH-NEXT: ret
1502 ; RV32ZVFHMIN-LABEL: vpmerge_vf_nxv32f16:
1503 ; RV32ZVFHMIN: # %bb.0:
1504 ; RV32ZVFHMIN-NEXT: fmv.x.h a1, fa0
1505 ; RV32ZVFHMIN-NEXT: vsetvli zero, a0, e16, m8, ta, ma
1506 ; RV32ZVFHMIN-NEXT: vmv.v.x v16, a1
1507 ; RV32ZVFHMIN-NEXT: vsetvli zero, zero, e16, m8, tu, ma
1508 ; RV32ZVFHMIN-NEXT: vmerge.vvm v8, v8, v16, v0
1509 ; RV32ZVFHMIN-NEXT: ret
1511 ; RV64ZVFHMIN-LABEL: vpmerge_vf_nxv32f16:
1512 ; RV64ZVFHMIN: # %bb.0:
1513 ; RV64ZVFHMIN-NEXT: fmv.x.h a1, fa0
1514 ; RV64ZVFHMIN-NEXT: vsetvli zero, a0, e16, m8, ta, ma
1515 ; RV64ZVFHMIN-NEXT: vmv.v.x v16, a1
1516 ; RV64ZVFHMIN-NEXT: vsetvli zero, zero, e16, m8, tu, ma
1517 ; RV64ZVFHMIN-NEXT: vmerge.vvm v8, v8, v16, v0
1518 ; RV64ZVFHMIN-NEXT: ret
1519 %elt.head = insertelement <vscale x 32 x half> poison, half %a, i32 0
1520 %va = shufflevector <vscale x 32 x half> %elt.head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
1521 %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)
1522 ret <vscale x 32 x half> %v
1525 declare <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)
1527 define <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) {
1528 ; CHECK-LABEL: vpmerge_vv_nxv1f32:
1530 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma
1531 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
1532 ; CHECK-NEXT: vmv1r.v v8, v9
1534 %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)
1535 ret <vscale x 1 x float> %v
1538 define <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) {
1539 ; CHECK-LABEL: vpmerge_vf_nxv1f32:
1541 ; CHECK-NEXT: vsetvli zero, a0, e32, mf2, tu, ma
1542 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1544 %elt.head = insertelement <vscale x 1 x float> poison, float %a, i32 0
1545 %va = shufflevector <vscale x 1 x float> %elt.head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
1546 %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)
1547 ret <vscale x 1 x float> %v
1550 declare <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)
1552 define <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) {
1553 ; CHECK-LABEL: vpmerge_vv_nxv2f32:
1555 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma
1556 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
1557 ; CHECK-NEXT: vmv1r.v v8, v9
1559 %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)
1560 ret <vscale x 2 x float> %v
1563 define <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) {
1564 ; CHECK-LABEL: vpmerge_vf_nxv2f32:
1566 ; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma
1567 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1569 %elt.head = insertelement <vscale x 2 x float> poison, float %a, i32 0
1570 %va = shufflevector <vscale x 2 x float> %elt.head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
1571 %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)
1572 ret <vscale x 2 x float> %v
1575 declare <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)
1577 define <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) {
1578 ; CHECK-LABEL: vpmerge_vv_nxv4f32:
1580 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
1581 ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0
1582 ; CHECK-NEXT: vmv2r.v v8, v10
1584 %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)
1585 ret <vscale x 4 x float> %v
1588 define <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) {
1589 ; CHECK-LABEL: vpmerge_vf_nxv4f32:
1591 ; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma
1592 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1594 %elt.head = insertelement <vscale x 4 x float> poison, float %a, i32 0
1595 %va = shufflevector <vscale x 4 x float> %elt.head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
1596 %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)
1597 ret <vscale x 4 x float> %v
1600 declare <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)
1602 define <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) {
1603 ; CHECK-LABEL: vpmerge_vv_nxv8f32:
1605 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma
1606 ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
1607 ; CHECK-NEXT: vmv4r.v v8, v12
1609 %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)
1610 ret <vscale x 8 x float> %v
1613 define <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) {
1614 ; CHECK-LABEL: vpmerge_vf_nxv8f32:
1616 ; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma
1617 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1619 %elt.head = insertelement <vscale x 8 x float> poison, float %a, i32 0
1620 %va = shufflevector <vscale x 8 x float> %elt.head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
1621 %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)
1622 ret <vscale x 8 x float> %v
1625 declare <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)
1627 define <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) {
1628 ; CHECK-LABEL: vpmerge_vv_nxv16f32:
1630 ; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, ma
1631 ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0
1632 ; CHECK-NEXT: vmv8r.v v8, v16
1634 %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)
1635 ret <vscale x 16 x float> %v
1638 define <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) {
1639 ; CHECK-LABEL: vpmerge_vf_nxv16f32:
1641 ; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, ma
1642 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1644 %elt.head = insertelement <vscale x 16 x float> poison, float %a, i32 0
1645 %va = shufflevector <vscale x 16 x float> %elt.head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
1646 %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)
1647 ret <vscale x 16 x float> %v
1650 declare <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)
1652 define <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) {
1653 ; CHECK-LABEL: vpmerge_vv_nxv1f64:
1655 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma
1656 ; CHECK-NEXT: vmerge.vvm v9, v9, v8, v0
1657 ; CHECK-NEXT: vmv1r.v v8, v9
1659 %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)
1660 ret <vscale x 1 x double> %v
1663 define <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) {
1664 ; CHECK-LABEL: vpmerge_vf_nxv1f64:
1666 ; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma
1667 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1669 %elt.head = insertelement <vscale x 1 x double> poison, double %a, i32 0
1670 %va = shufflevector <vscale x 1 x double> %elt.head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
1671 %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)
1672 ret <vscale x 1 x double> %v
1675 declare <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)
1677 define <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) {
1678 ; CHECK-LABEL: vpmerge_vv_nxv2f64:
1680 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma
1681 ; CHECK-NEXT: vmerge.vvm v10, v10, v8, v0
1682 ; CHECK-NEXT: vmv2r.v v8, v10
1684 %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)
1685 ret <vscale x 2 x double> %v
1688 define <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) {
1689 ; CHECK-LABEL: vpmerge_vf_nxv2f64:
1691 ; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma
1692 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1694 %elt.head = insertelement <vscale x 2 x double> poison, double %a, i32 0
1695 %va = shufflevector <vscale x 2 x double> %elt.head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
1696 %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)
1697 ret <vscale x 2 x double> %v
1700 declare <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)
1702 define <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) {
1703 ; CHECK-LABEL: vpmerge_vv_nxv4f64:
1705 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma
1706 ; CHECK-NEXT: vmerge.vvm v12, v12, v8, v0
1707 ; CHECK-NEXT: vmv4r.v v8, v12
1709 %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)
1710 ret <vscale x 4 x double> %v
1713 define <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) {
1714 ; CHECK-LABEL: vpmerge_vf_nxv4f64:
1716 ; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma
1717 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1719 %elt.head = insertelement <vscale x 4 x double> poison, double %a, i32 0
1720 %va = shufflevector <vscale x 4 x double> %elt.head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
1721 %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)
1722 ret <vscale x 4 x double> %v
1725 declare <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)
1727 define <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) {
1728 ; CHECK-LABEL: vpmerge_vv_nxv8f64:
1730 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma
1731 ; CHECK-NEXT: vmerge.vvm v16, v16, v8, v0
1732 ; CHECK-NEXT: vmv8r.v v8, v16
1734 %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)
1735 ret <vscale x 8 x double> %v
1738 define <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) {
1739 ; CHECK-LABEL: vpmerge_vf_nxv8f64:
1741 ; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma
1742 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
1744 %elt.head = insertelement <vscale x 8 x double> poison, double %a, i32 0
1745 %va = shufflevector <vscale x 8 x double> %elt.head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
1746 %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)
1747 ret <vscale x 8 x double> %v