1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfh,+zvfh,+v -target-abi=ilp32d \
3 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,CHECK-ZVFH
4 ; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfh,+zvfh,+v -target-abi=lp64d \
5 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,CHECK-ZVFH
6 ; RUN: llc -mtriple=riscv32 -mattr=+m,+d,+zfh,+zvfhmin,+v -target-abi=ilp32d \
7 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,CHECK-ZVFHMIN
8 ; RUN: llc -mtriple=riscv64 -mattr=+m,+d,+zfh,+zvfhmin,+v -target-abi=lp64d \
9 ; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,CHECK-ZVFHMIN
11 define <vscale x 1 x half> @vfmerge_vv_nxv1f16(<vscale x 1 x half> %va, <vscale x 1 x half> %vb, <vscale x 1 x i1> %cond) {
12 ; CHECK-LABEL: vfmerge_vv_nxv1f16:
14 ; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
15 ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
17 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x half> %va, <vscale x 1 x half> %vb
18 ret <vscale x 1 x half> %vc
21 define <vscale x 1 x half> @vfmerge_fv_nxv1f16(<vscale x 1 x half> %va, half %b, <vscale x 1 x i1> %cond) {
22 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv1f16:
23 ; CHECK-ZVFH: # %bb.0:
24 ; CHECK-ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
25 ; CHECK-ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
26 ; CHECK-ZVFH-NEXT: ret
28 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv1f16:
29 ; CHECK-ZVFHMIN: # %bb.0:
30 ; CHECK-ZVFHMIN-NEXT: fmv.x.h a0, fa0
31 ; CHECK-ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma
32 ; CHECK-ZVFHMIN-NEXT: vmv.v.x v9, a0
33 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
34 ; CHECK-ZVFHMIN-NEXT: ret
35 %head = insertelement <vscale x 1 x half> poison, half %b, i32 0
36 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer
37 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x half> %splat, <vscale x 1 x half> %va
38 ret <vscale x 1 x half> %vc
41 define <vscale x 2 x half> @vfmerge_vv_nxv2f16(<vscale x 2 x half> %va, <vscale x 2 x half> %vb, <vscale x 2 x i1> %cond) {
42 ; CHECK-LABEL: vfmerge_vv_nxv2f16:
44 ; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
45 ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
47 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x half> %va, <vscale x 2 x half> %vb
48 ret <vscale x 2 x half> %vc
51 define <vscale x 2 x half> @vfmerge_fv_nxv2f16(<vscale x 2 x half> %va, half %b, <vscale x 2 x i1> %cond) {
52 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv2f16:
53 ; CHECK-ZVFH: # %bb.0:
54 ; CHECK-ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
55 ; CHECK-ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
56 ; CHECK-ZVFH-NEXT: ret
58 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv2f16:
59 ; CHECK-ZVFHMIN: # %bb.0:
60 ; CHECK-ZVFHMIN-NEXT: fmv.x.h a0, fa0
61 ; CHECK-ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
62 ; CHECK-ZVFHMIN-NEXT: vmv.v.x v9, a0
63 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
64 ; CHECK-ZVFHMIN-NEXT: ret
65 %head = insertelement <vscale x 2 x half> poison, half %b, i32 0
66 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer
67 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x half> %splat, <vscale x 2 x half> %va
68 ret <vscale x 2 x half> %vc
71 define <vscale x 4 x half> @vfmerge_vv_nxv4f16(<vscale x 4 x half> %va, <vscale x 4 x half> %vb, <vscale x 4 x i1> %cond) {
72 ; CHECK-LABEL: vfmerge_vv_nxv4f16:
74 ; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma
75 ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
77 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x half> %va, <vscale x 4 x half> %vb
78 ret <vscale x 4 x half> %vc
81 define <vscale x 4 x half> @vfmerge_fv_nxv4f16(<vscale x 4 x half> %va, half %b, <vscale x 4 x i1> %cond) {
82 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv4f16:
83 ; CHECK-ZVFH: # %bb.0:
84 ; CHECK-ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma
85 ; CHECK-ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
86 ; CHECK-ZVFH-NEXT: ret
88 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv4f16:
89 ; CHECK-ZVFHMIN: # %bb.0:
90 ; CHECK-ZVFHMIN-NEXT: fmv.x.h a0, fa0
91 ; CHECK-ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma
92 ; CHECK-ZVFHMIN-NEXT: vmv.v.x v9, a0
93 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v9, v0
94 ; CHECK-ZVFHMIN-NEXT: ret
95 %head = insertelement <vscale x 4 x half> poison, half %b, i32 0
96 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer
97 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x half> %splat, <vscale x 4 x half> %va
98 ret <vscale x 4 x half> %vc
101 define <vscale x 8 x half> @vfmerge_vv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x half> %vb, <vscale x 8 x i1> %cond) {
102 ; CHECK-LABEL: vfmerge_vv_nxv8f16:
104 ; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma
105 ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0
107 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x half> %va, <vscale x 8 x half> %vb
108 ret <vscale x 8 x half> %vc
111 define <vscale x 8 x half> @vfmerge_fv_nxv8f16(<vscale x 8 x half> %va, half %b, <vscale x 8 x i1> %cond) {
112 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv8f16:
113 ; CHECK-ZVFH: # %bb.0:
114 ; CHECK-ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma
115 ; CHECK-ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
116 ; CHECK-ZVFH-NEXT: ret
118 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv8f16:
119 ; CHECK-ZVFHMIN: # %bb.0:
120 ; CHECK-ZVFHMIN-NEXT: fmv.x.h a0, fa0
121 ; CHECK-ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma
122 ; CHECK-ZVFHMIN-NEXT: vmv.v.x v10, a0
123 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v10, v0
124 ; CHECK-ZVFHMIN-NEXT: ret
125 %head = insertelement <vscale x 8 x half> poison, half %b, i32 0
126 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer
127 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x half> %splat, <vscale x 8 x half> %va
128 ret <vscale x 8 x half> %vc
131 define <vscale x 8 x half> @vfmerge_zv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x i1> %cond) {
132 ; CHECK-ZVFH-LABEL: vfmerge_zv_nxv8f16:
133 ; CHECK-ZVFH: # %bb.0:
134 ; CHECK-ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma
135 ; CHECK-ZVFH-NEXT: vmerge.vim v8, v8, 0, v0
136 ; CHECK-ZVFH-NEXT: ret
138 ; CHECK-ZVFHMIN-LABEL: vfmerge_zv_nxv8f16:
139 ; CHECK-ZVFHMIN: # %bb.0:
140 ; CHECK-ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma
141 ; CHECK-ZVFHMIN-NEXT: vmv.v.i v10, 0
142 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v10, v0
143 ; CHECK-ZVFHMIN-NEXT: ret
144 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x half> splat (half zeroinitializer), <vscale x 8 x half> %va
145 ret <vscale x 8 x half> %vc
148 define <vscale x 8 x half> @vfmerge_nzv_nxv8f16(<vscale x 8 x half> %va, <vscale x 8 x i1> %cond) {
149 ; CHECK-ZVFH-LABEL: vfmerge_nzv_nxv8f16:
150 ; CHECK-ZVFH: # %bb.0:
151 ; CHECK-ZVFH-NEXT: lui a0, 1048568
152 ; CHECK-ZVFH-NEXT: vsetvli a1, zero, e16, m2, ta, ma
153 ; CHECK-ZVFH-NEXT: vmerge.vxm v8, v8, a0, v0
154 ; CHECK-ZVFH-NEXT: ret
156 ; CHECK-ZVFHMIN-LABEL: vfmerge_nzv_nxv8f16:
157 ; CHECK-ZVFHMIN: # %bb.0:
158 ; CHECK-ZVFHMIN-NEXT: lui a0, 1048568
159 ; CHECK-ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma
160 ; CHECK-ZVFHMIN-NEXT: vmv.v.x v10, a0
161 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v10, v0
162 ; CHECK-ZVFHMIN-NEXT: ret
163 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x half> splat (half -0.0), <vscale x 8 x half> %va
164 ret <vscale x 8 x half> %vc
167 define <vscale x 8 x half> @vmerge_truelhs_nxv8f16_0(<vscale x 8 x half> %va, <vscale x 8 x half> %vb) {
168 ; CHECK-LABEL: vmerge_truelhs_nxv8f16_0:
171 %vc = select <vscale x 8 x i1> splat (i1 1), <vscale x 8 x half> %va, <vscale x 8 x half> %vb
172 ret <vscale x 8 x half> %vc
175 define <vscale x 8 x half> @vmerge_falselhs_nxv8f16_0(<vscale x 8 x half> %va, <vscale x 8 x half> %vb) {
176 ; CHECK-LABEL: vmerge_falselhs_nxv8f16_0:
178 ; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
179 ; CHECK-NEXT: vmv2r.v v8, v10
181 %vc = select <vscale x 8 x i1> zeroinitializer, <vscale x 8 x half> %va, <vscale x 8 x half> %vb
182 ret <vscale x 8 x half> %vc
185 define <vscale x 16 x half> @vfmerge_vv_nxv16f16(<vscale x 16 x half> %va, <vscale x 16 x half> %vb, <vscale x 16 x i1> %cond) {
186 ; CHECK-LABEL: vfmerge_vv_nxv16f16:
188 ; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma
189 ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0
191 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x half> %va, <vscale x 16 x half> %vb
192 ret <vscale x 16 x half> %vc
195 define <vscale x 16 x half> @vfmerge_fv_nxv16f16(<vscale x 16 x half> %va, half %b, <vscale x 16 x i1> %cond) {
196 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv16f16:
197 ; CHECK-ZVFH: # %bb.0:
198 ; CHECK-ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma
199 ; CHECK-ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
200 ; CHECK-ZVFH-NEXT: ret
202 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv16f16:
203 ; CHECK-ZVFHMIN: # %bb.0:
204 ; CHECK-ZVFHMIN-NEXT: fmv.x.h a0, fa0
205 ; CHECK-ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma
206 ; CHECK-ZVFHMIN-NEXT: vmv.v.x v12, a0
207 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v12, v0
208 ; CHECK-ZVFHMIN-NEXT: ret
209 %head = insertelement <vscale x 16 x half> poison, half %b, i32 0
210 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
211 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x half> %splat, <vscale x 16 x half> %va
212 ret <vscale x 16 x half> %vc
215 define <vscale x 32 x half> @vfmerge_vv_nxv32f16(<vscale x 32 x half> %va, <vscale x 32 x half> %vb, <vscale x 32 x i1> %cond) {
216 ; CHECK-LABEL: vfmerge_vv_nxv32f16:
218 ; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma
219 ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0
221 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x half> %va, <vscale x 32 x half> %vb
222 ret <vscale x 32 x half> %vc
225 define <vscale x 32 x half> @vfmerge_fv_nxv32f16(<vscale x 32 x half> %va, half %b, <vscale x 32 x i1> %cond) {
226 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv32f16:
227 ; CHECK-ZVFH: # %bb.0:
228 ; CHECK-ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma
229 ; CHECK-ZVFH-NEXT: vfmerge.vfm v8, v8, fa0, v0
230 ; CHECK-ZVFH-NEXT: ret
232 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv32f16:
233 ; CHECK-ZVFHMIN: # %bb.0:
234 ; CHECK-ZVFHMIN-NEXT: fmv.x.h a0, fa0
235 ; CHECK-ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma
236 ; CHECK-ZVFHMIN-NEXT: vmv.v.x v16, a0
237 ; CHECK-ZVFHMIN-NEXT: vmerge.vvm v8, v8, v16, v0
238 ; CHECK-ZVFHMIN-NEXT: ret
239 %head = insertelement <vscale x 32 x half> poison, half %b, i32 0
240 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
241 %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x half> %splat, <vscale x 32 x half> %va
242 ret <vscale x 32 x half> %vc
245 define <vscale x 1 x float> @vfmerge_vv_nxv1f32(<vscale x 1 x float> %va, <vscale x 1 x float> %vb, <vscale x 1 x i1> %cond) {
246 ; CHECK-LABEL: vfmerge_vv_nxv1f32:
248 ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
249 ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
251 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x float> %va, <vscale x 1 x float> %vb
252 ret <vscale x 1 x float> %vc
255 define <vscale x 1 x float> @vfmerge_fv_nxv1f32(<vscale x 1 x float> %va, float %b, <vscale x 1 x i1> %cond) {
256 ; CHECK-LABEL: vfmerge_fv_nxv1f32:
258 ; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
259 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
261 %head = insertelement <vscale x 1 x float> poison, float %b, i32 0
262 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
263 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x float> %splat, <vscale x 1 x float> %va
264 ret <vscale x 1 x float> %vc
267 define <vscale x 2 x float> @vfmerge_vv_nxv2f32(<vscale x 2 x float> %va, <vscale x 2 x float> %vb, <vscale x 2 x i1> %cond) {
268 ; CHECK-LABEL: vfmerge_vv_nxv2f32:
270 ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
271 ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
273 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x float> %va, <vscale x 2 x float> %vb
274 ret <vscale x 2 x float> %vc
277 define <vscale x 2 x float> @vfmerge_fv_nxv2f32(<vscale x 2 x float> %va, float %b, <vscale x 2 x i1> %cond) {
278 ; CHECK-LABEL: vfmerge_fv_nxv2f32:
280 ; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma
281 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
283 %head = insertelement <vscale x 2 x float> poison, float %b, i32 0
284 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
285 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x float> %splat, <vscale x 2 x float> %va
286 ret <vscale x 2 x float> %vc
289 define <vscale x 4 x float> @vfmerge_vv_nxv4f32(<vscale x 4 x float> %va, <vscale x 4 x float> %vb, <vscale x 4 x i1> %cond) {
290 ; CHECK-LABEL: vfmerge_vv_nxv4f32:
292 ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
293 ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0
295 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x float> %va, <vscale x 4 x float> %vb
296 ret <vscale x 4 x float> %vc
299 define <vscale x 4 x float> @vfmerge_fv_nxv4f32(<vscale x 4 x float> %va, float %b, <vscale x 4 x i1> %cond) {
300 ; CHECK-LABEL: vfmerge_fv_nxv4f32:
302 ; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma
303 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
305 %head = insertelement <vscale x 4 x float> poison, float %b, i32 0
306 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
307 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x float> %splat, <vscale x 4 x float> %va
308 ret <vscale x 4 x float> %vc
311 define <vscale x 8 x float> @vfmerge_vv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x float> %vb, <vscale x 8 x i1> %cond) {
312 ; CHECK-LABEL: vfmerge_vv_nxv8f32:
314 ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
315 ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0
317 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> %va, <vscale x 8 x float> %vb
318 ret <vscale x 8 x float> %vc
321 define <vscale x 8 x float> @vfmerge_fv_nxv8f32(<vscale x 8 x float> %va, float %b, <vscale x 8 x i1> %cond) {
322 ; CHECK-LABEL: vfmerge_fv_nxv8f32:
324 ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
325 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
327 %head = insertelement <vscale x 8 x float> poison, float %b, i32 0
328 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
329 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> %splat, <vscale x 8 x float> %va
330 ret <vscale x 8 x float> %vc
333 define <vscale x 8 x float> @vfmerge_zv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x i1> %cond) {
334 ; CHECK-LABEL: vfmerge_zv_nxv8f32:
336 ; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma
337 ; CHECK-NEXT: vmerge.vim v8, v8, 0, v0
339 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> splat (float zeroinitializer), <vscale x 8 x float> %va
340 ret <vscale x 8 x float> %vc
343 define <vscale x 8 x float> @vfmerge_nzv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x i1> %cond) {
344 ; CHECK-LABEL: vfmerge_nzv_nxv8f32:
346 ; CHECK-NEXT: lui a0, 524288
347 ; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma
348 ; CHECK-NEXT: vmerge.vxm v8, v8, a0, v0
350 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> splat (float -0.0), <vscale x 8 x float> %va
351 ret <vscale x 8 x float> %vc
354 define <vscale x 16 x float> @vfmerge_vv_nxv16f32(<vscale x 16 x float> %va, <vscale x 16 x float> %vb, <vscale x 16 x i1> %cond) {
355 ; CHECK-LABEL: vfmerge_vv_nxv16f32:
357 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
358 ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0
360 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x float> %va, <vscale x 16 x float> %vb
361 ret <vscale x 16 x float> %vc
364 define <vscale x 16 x float> @vfmerge_fv_nxv16f32(<vscale x 16 x float> %va, float %b, <vscale x 16 x i1> %cond) {
365 ; CHECK-LABEL: vfmerge_fv_nxv16f32:
367 ; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma
368 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
370 %head = insertelement <vscale x 16 x float> poison, float %b, i32 0
371 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
372 %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x float> %splat, <vscale x 16 x float> %va
373 ret <vscale x 16 x float> %vc
376 define <vscale x 1 x double> @vfmerge_vv_nxv1f64(<vscale x 1 x double> %va, <vscale x 1 x double> %vb, <vscale x 1 x i1> %cond) {
377 ; CHECK-LABEL: vfmerge_vv_nxv1f64:
379 ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
380 ; CHECK-NEXT: vmerge.vvm v8, v9, v8, v0
382 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x double> %va, <vscale x 1 x double> %vb
383 ret <vscale x 1 x double> %vc
386 define <vscale x 1 x double> @vfmerge_fv_nxv1f64(<vscale x 1 x double> %va, double %b, <vscale x 1 x i1> %cond) {
387 ; CHECK-LABEL: vfmerge_fv_nxv1f64:
389 ; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
390 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
392 %head = insertelement <vscale x 1 x double> poison, double %b, i32 0
393 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
394 %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x double> %splat, <vscale x 1 x double> %va
395 ret <vscale x 1 x double> %vc
398 define <vscale x 2 x double> @vfmerge_vv_nxv2f64(<vscale x 2 x double> %va, <vscale x 2 x double> %vb, <vscale x 2 x i1> %cond) {
399 ; CHECK-LABEL: vfmerge_vv_nxv2f64:
401 ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
402 ; CHECK-NEXT: vmerge.vvm v8, v10, v8, v0
404 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x double> %va, <vscale x 2 x double> %vb
405 ret <vscale x 2 x double> %vc
408 define <vscale x 2 x double> @vfmerge_fv_nxv2f64(<vscale x 2 x double> %va, double %b, <vscale x 2 x i1> %cond) {
409 ; CHECK-LABEL: vfmerge_fv_nxv2f64:
411 ; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma
412 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
414 %head = insertelement <vscale x 2 x double> poison, double %b, i32 0
415 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
416 %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x double> %splat, <vscale x 2 x double> %va
417 ret <vscale x 2 x double> %vc
420 define <vscale x 4 x double> @vfmerge_vv_nxv4f64(<vscale x 4 x double> %va, <vscale x 4 x double> %vb, <vscale x 4 x i1> %cond) {
421 ; CHECK-LABEL: vfmerge_vv_nxv4f64:
423 ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
424 ; CHECK-NEXT: vmerge.vvm v8, v12, v8, v0
426 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x double> %va, <vscale x 4 x double> %vb
427 ret <vscale x 4 x double> %vc
430 define <vscale x 4 x double> @vfmerge_fv_nxv4f64(<vscale x 4 x double> %va, double %b, <vscale x 4 x i1> %cond) {
431 ; CHECK-LABEL: vfmerge_fv_nxv4f64:
433 ; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma
434 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
436 %head = insertelement <vscale x 4 x double> poison, double %b, i32 0
437 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
438 %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x double> %splat, <vscale x 4 x double> %va
439 ret <vscale x 4 x double> %vc
442 define <vscale x 8 x double> @vfmerge_vv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x double> %vb, <vscale x 8 x i1> %cond) {
443 ; CHECK-LABEL: vfmerge_vv_nxv8f64:
445 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
446 ; CHECK-NEXT: vmerge.vvm v8, v16, v8, v0
448 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> %va, <vscale x 8 x double> %vb
449 ret <vscale x 8 x double> %vc
452 define <vscale x 8 x double> @vfmerge_fv_nxv8f64(<vscale x 8 x double> %va, double %b, <vscale x 8 x i1> %cond) {
453 ; CHECK-LABEL: vfmerge_fv_nxv8f64:
455 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
456 ; CHECK-NEXT: vfmerge.vfm v8, v8, fa0, v0
458 %head = insertelement <vscale x 8 x double> poison, double %b, i32 0
459 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
460 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> %splat, <vscale x 8 x double> %va
461 ret <vscale x 8 x double> %vc
464 define <vscale x 8 x double> @vfmerge_zv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x i1> %cond) {
465 ; CHECK-LABEL: vfmerge_zv_nxv8f64:
467 ; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma
468 ; CHECK-NEXT: vmerge.vim v8, v8, 0, v0
470 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> splat (double zeroinitializer), <vscale x 8 x double> %va
471 ret <vscale x 8 x double> %vc
474 define <vscale x 8 x double> @vfmerge_nzv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x i1> %cond) {
475 ; RV32-LABEL: vfmerge_nzv_nxv8f64:
477 ; RV32-NEXT: fcvt.d.w fa5, zero
478 ; RV32-NEXT: fneg.d fa5, fa5
479 ; RV32-NEXT: vsetvli a0, zero, e64, m8, ta, ma
480 ; RV32-NEXT: vfmerge.vfm v8, v8, fa5, v0
483 ; RV64-LABEL: vfmerge_nzv_nxv8f64:
485 ; RV64-NEXT: li a0, -1
486 ; RV64-NEXT: slli a0, a0, 63
487 ; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma
488 ; RV64-NEXT: vmerge.vxm v8, v8, a0, v0
490 %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> splat (double -0.0), <vscale x 8 x double> %va
491 ret <vscale x 8 x double> %vc
494 define <vscale x 16 x double> @vselect_combine_regression(<vscale x 16 x i64> %va, <vscale x 16 x double> %vb) {
495 ; CHECK-LABEL: vselect_combine_regression:
497 ; CHECK-NEXT: csrr a1, vlenb
498 ; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, mu
499 ; CHECK-NEXT: vmseq.vi v24, v16, 0
500 ; CHECK-NEXT: vmseq.vi v0, v8, 0
501 ; CHECK-NEXT: vmv.v.i v16, 0
502 ; CHECK-NEXT: slli a1, a1, 3
503 ; CHECK-NEXT: vmv.v.i v8, 0
504 ; CHECK-NEXT: add a1, a0, a1
505 ; CHECK-NEXT: vle64.v v8, (a0), v0.t
506 ; CHECK-NEXT: vmv1r.v v0, v24
507 ; CHECK-NEXT: vle64.v v16, (a1), v0.t
509 %cond = icmp eq <vscale x 16 x i64> %va, zeroinitializer
510 %sel = select <vscale x 16 x i1> %cond, <vscale x 16 x double> %vb, <vscale x 16 x double> zeroinitializer
511 ret <vscale x 16 x double> %sel
514 define void @vselect_legalize_regression(<vscale x 16 x double> %a, <vscale x 16 x i1> %ma, <vscale x 16 x i1> %mb, ptr %out) {
515 ; CHECK-LABEL: vselect_legalize_regression:
517 ; CHECK-NEXT: vsetvli a2, zero, e8, m2, ta, ma
518 ; CHECK-NEXT: vlm.v v24, (a0)
519 ; CHECK-NEXT: csrr a0, vlenb
520 ; CHECK-NEXT: srli a2, a0, 3
521 ; CHECK-NEXT: slli a0, a0, 3
522 ; CHECK-NEXT: vmand.mm v7, v0, v24
523 ; CHECK-NEXT: vsetvli a3, zero, e8, mf4, ta, ma
524 ; CHECK-NEXT: vslidedown.vx v0, v7, a2
525 ; CHECK-NEXT: add a0, a1, a0
526 ; CHECK-NEXT: vsetvli a2, zero, e64, m8, ta, ma
527 ; CHECK-NEXT: vmv.v.i v24, 0
528 ; CHECK-NEXT: vmerge.vvm v16, v24, v16, v0
529 ; CHECK-NEXT: vmv1r.v v0, v7
530 ; CHECK-NEXT: vmv.v.i v24, 0
531 ; CHECK-NEXT: vmerge.vvm v8, v24, v8, v0
532 ; CHECK-NEXT: vs8r.v v8, (a1)
533 ; CHECK-NEXT: vs8r.v v16, (a0)
535 %cond = and <vscale x 16 x i1> %ma, %mb
536 %sel = select <vscale x 16 x i1> %cond, <vscale x 16 x double> %a, <vscale x 16 x double> zeroinitializer
537 store <vscale x 16 x double> %sel, ptr %out