Revert "[InstCombine] Support gep nuw in icmp folds" (#118698)
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vselect-fp.ll
blob1fc33dc73a27dcb4403e3b106e938362cfd601b1
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:
13 ; CHECK:       # %bb.0:
14 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf4, ta, ma
15 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
16 ; CHECK-NEXT:    ret
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:
43 ; CHECK:       # %bb.0:
44 ; CHECK-NEXT:    vsetvli a0, zero, e16, mf2, ta, ma
45 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
46 ; CHECK-NEXT:    ret
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:
73 ; CHECK:       # %bb.0:
74 ; CHECK-NEXT:    vsetvli a0, zero, e16, m1, ta, ma
75 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
76 ; CHECK-NEXT:    ret
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:
103 ; CHECK:       # %bb.0:
104 ; CHECK-NEXT:    vsetvli a0, zero, e16, m2, ta, ma
105 ; CHECK-NEXT:    vmerge.vvm v8, v10, v8, v0
106 ; CHECK-NEXT:    ret
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:
169 ; CHECK:       # %bb.0:
170 ; CHECK-NEXT:    ret
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:
177 ; CHECK:       # %bb.0:
178 ; CHECK-NEXT:    vmv2r.v v8, v10
179 ; CHECK-NEXT:    ret
180   %vc = select <vscale x 8 x i1> zeroinitializer, <vscale x 8 x half> %va, <vscale x 8 x half> %vb
181   ret <vscale x 8 x half> %vc
184 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) {
185 ; CHECK-LABEL: vfmerge_vv_nxv16f16:
186 ; CHECK:       # %bb.0:
187 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
188 ; CHECK-NEXT:    vmerge.vvm v8, v12, v8, v0
189 ; CHECK-NEXT:    ret
190   %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x half> %va, <vscale x 16 x half> %vb
191   ret <vscale x 16 x half> %vc
194 define <vscale x 16 x half> @vfmerge_fv_nxv16f16(<vscale x 16 x half> %va, half %b, <vscale x 16 x i1> %cond) {
195 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv16f16:
196 ; CHECK-ZVFH:       # %bb.0:
197 ; CHECK-ZVFH-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
198 ; CHECK-ZVFH-NEXT:    vfmerge.vfm v8, v8, fa0, v0
199 ; CHECK-ZVFH-NEXT:    ret
201 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv16f16:
202 ; CHECK-ZVFHMIN:       # %bb.0:
203 ; CHECK-ZVFHMIN-NEXT:    fmv.x.h a0, fa0
204 ; CHECK-ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m4, ta, ma
205 ; CHECK-ZVFHMIN-NEXT:    vmv.v.x v12, a0
206 ; CHECK-ZVFHMIN-NEXT:    vmerge.vvm v8, v8, v12, v0
207 ; CHECK-ZVFHMIN-NEXT:    ret
208   %head = insertelement <vscale x 16 x half> poison, half %b, i32 0
209   %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer
210   %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x half> %splat, <vscale x 16 x half> %va
211   ret <vscale x 16 x half> %vc
214 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) {
215 ; CHECK-LABEL: vfmerge_vv_nxv32f16:
216 ; CHECK:       # %bb.0:
217 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
218 ; CHECK-NEXT:    vmerge.vvm v8, v16, v8, v0
219 ; CHECK-NEXT:    ret
220   %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x half> %va, <vscale x 32 x half> %vb
221   ret <vscale x 32 x half> %vc
224 define <vscale x 32 x half> @vfmerge_fv_nxv32f16(<vscale x 32 x half> %va, half %b, <vscale x 32 x i1> %cond) {
225 ; CHECK-ZVFH-LABEL: vfmerge_fv_nxv32f16:
226 ; CHECK-ZVFH:       # %bb.0:
227 ; CHECK-ZVFH-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
228 ; CHECK-ZVFH-NEXT:    vfmerge.vfm v8, v8, fa0, v0
229 ; CHECK-ZVFH-NEXT:    ret
231 ; CHECK-ZVFHMIN-LABEL: vfmerge_fv_nxv32f16:
232 ; CHECK-ZVFHMIN:       # %bb.0:
233 ; CHECK-ZVFHMIN-NEXT:    fmv.x.h a0, fa0
234 ; CHECK-ZVFHMIN-NEXT:    vsetvli a1, zero, e16, m8, ta, ma
235 ; CHECK-ZVFHMIN-NEXT:    vmv.v.x v16, a0
236 ; CHECK-ZVFHMIN-NEXT:    vmerge.vvm v8, v8, v16, v0
237 ; CHECK-ZVFHMIN-NEXT:    ret
238   %head = insertelement <vscale x 32 x half> poison, half %b, i32 0
239   %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer
240   %vc = select <vscale x 32 x i1> %cond, <vscale x 32 x half> %splat, <vscale x 32 x half> %va
241   ret <vscale x 32 x half> %vc
244 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) {
245 ; CHECK-LABEL: vfmerge_vv_nxv1f32:
246 ; CHECK:       # %bb.0:
247 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
248 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
249 ; CHECK-NEXT:    ret
250   %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x float> %va, <vscale x 1 x float> %vb
251   ret <vscale x 1 x float> %vc
254 define <vscale x 1 x float> @vfmerge_fv_nxv1f32(<vscale x 1 x float> %va, float %b, <vscale x 1 x i1> %cond) {
255 ; CHECK-LABEL: vfmerge_fv_nxv1f32:
256 ; CHECK:       # %bb.0:
257 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
258 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
259 ; CHECK-NEXT:    ret
260   %head = insertelement <vscale x 1 x float> poison, float %b, i32 0
261   %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer
262   %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x float> %splat, <vscale x 1 x float> %va
263   ret <vscale x 1 x float> %vc
266 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) {
267 ; CHECK-LABEL: vfmerge_vv_nxv2f32:
268 ; CHECK:       # %bb.0:
269 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
270 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
271 ; CHECK-NEXT:    ret
272   %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x float> %va, <vscale x 2 x float> %vb
273   ret <vscale x 2 x float> %vc
276 define <vscale x 2 x float> @vfmerge_fv_nxv2f32(<vscale x 2 x float> %va, float %b, <vscale x 2 x i1> %cond) {
277 ; CHECK-LABEL: vfmerge_fv_nxv2f32:
278 ; CHECK:       # %bb.0:
279 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
280 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
281 ; CHECK-NEXT:    ret
282   %head = insertelement <vscale x 2 x float> poison, float %b, i32 0
283   %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer
284   %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x float> %splat, <vscale x 2 x float> %va
285   ret <vscale x 2 x float> %vc
288 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) {
289 ; CHECK-LABEL: vfmerge_vv_nxv4f32:
290 ; CHECK:       # %bb.0:
291 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
292 ; CHECK-NEXT:    vmerge.vvm v8, v10, v8, v0
293 ; CHECK-NEXT:    ret
294   %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x float> %va, <vscale x 4 x float> %vb
295   ret <vscale x 4 x float> %vc
298 define <vscale x 4 x float> @vfmerge_fv_nxv4f32(<vscale x 4 x float> %va, float %b, <vscale x 4 x i1> %cond) {
299 ; CHECK-LABEL: vfmerge_fv_nxv4f32:
300 ; CHECK:       # %bb.0:
301 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
302 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
303 ; CHECK-NEXT:    ret
304   %head = insertelement <vscale x 4 x float> poison, float %b, i32 0
305   %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
306   %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x float> %splat, <vscale x 4 x float> %va
307   ret <vscale x 4 x float> %vc
310 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) {
311 ; CHECK-LABEL: vfmerge_vv_nxv8f32:
312 ; CHECK:       # %bb.0:
313 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
314 ; CHECK-NEXT:    vmerge.vvm v8, v12, v8, v0
315 ; CHECK-NEXT:    ret
316   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> %va, <vscale x 8 x float> %vb
317   ret <vscale x 8 x float> %vc
320 define <vscale x 8 x float> @vfmerge_fv_nxv8f32(<vscale x 8 x float> %va, float %b, <vscale x 8 x i1> %cond) {
321 ; CHECK-LABEL: vfmerge_fv_nxv8f32:
322 ; CHECK:       # %bb.0:
323 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
324 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
325 ; CHECK-NEXT:    ret
326   %head = insertelement <vscale x 8 x float> poison, float %b, i32 0
327   %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer
328   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> %splat, <vscale x 8 x float> %va
329   ret <vscale x 8 x float> %vc
332 define <vscale x 8 x float> @vfmerge_zv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x i1> %cond) {
333 ; CHECK-LABEL: vfmerge_zv_nxv8f32:
334 ; CHECK:       # %bb.0:
335 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
336 ; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
337 ; CHECK-NEXT:    ret
338   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> splat (float zeroinitializer), <vscale x 8 x float> %va
339   ret <vscale x 8 x float> %vc
342 define <vscale x 8 x float> @vfmerge_nzv_nxv8f32(<vscale x 8 x float> %va, <vscale x 8 x i1> %cond) {
343 ; CHECK-LABEL: vfmerge_nzv_nxv8f32:
344 ; CHECK:       # %bb.0:
345 ; CHECK-NEXT:    lui a0, 524288
346 ; CHECK-NEXT:    vsetvli a1, zero, e32, m4, ta, ma
347 ; CHECK-NEXT:    vmerge.vxm v8, v8, a0, v0
348 ; CHECK-NEXT:    ret
349   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x float> splat (float -0.0), <vscale x 8 x float> %va
350   ret <vscale x 8 x float> %vc
353 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) {
354 ; CHECK-LABEL: vfmerge_vv_nxv16f32:
355 ; CHECK:       # %bb.0:
356 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
357 ; CHECK-NEXT:    vmerge.vvm v8, v16, v8, v0
358 ; CHECK-NEXT:    ret
359   %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x float> %va, <vscale x 16 x float> %vb
360   ret <vscale x 16 x float> %vc
363 define <vscale x 16 x float> @vfmerge_fv_nxv16f32(<vscale x 16 x float> %va, float %b, <vscale x 16 x i1> %cond) {
364 ; CHECK-LABEL: vfmerge_fv_nxv16f32:
365 ; CHECK:       # %bb.0:
366 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
367 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
368 ; CHECK-NEXT:    ret
369   %head = insertelement <vscale x 16 x float> poison, float %b, i32 0
370   %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer
371   %vc = select <vscale x 16 x i1> %cond, <vscale x 16 x float> %splat, <vscale x 16 x float> %va
372   ret <vscale x 16 x float> %vc
375 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) {
376 ; CHECK-LABEL: vfmerge_vv_nxv1f64:
377 ; CHECK:       # %bb.0:
378 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
379 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
380 ; CHECK-NEXT:    ret
381   %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x double> %va, <vscale x 1 x double> %vb
382   ret <vscale x 1 x double> %vc
385 define <vscale x 1 x double> @vfmerge_fv_nxv1f64(<vscale x 1 x double> %va, double %b, <vscale x 1 x i1> %cond) {
386 ; CHECK-LABEL: vfmerge_fv_nxv1f64:
387 ; CHECK:       # %bb.0:
388 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
389 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
390 ; CHECK-NEXT:    ret
391   %head = insertelement <vscale x 1 x double> poison, double %b, i32 0
392   %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer
393   %vc = select <vscale x 1 x i1> %cond, <vscale x 1 x double> %splat, <vscale x 1 x double> %va
394   ret <vscale x 1 x double> %vc
397 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) {
398 ; CHECK-LABEL: vfmerge_vv_nxv2f64:
399 ; CHECK:       # %bb.0:
400 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
401 ; CHECK-NEXT:    vmerge.vvm v8, v10, v8, v0
402 ; CHECK-NEXT:    ret
403   %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x double> %va, <vscale x 2 x double> %vb
404   ret <vscale x 2 x double> %vc
407 define <vscale x 2 x double> @vfmerge_fv_nxv2f64(<vscale x 2 x double> %va, double %b, <vscale x 2 x i1> %cond) {
408 ; CHECK-LABEL: vfmerge_fv_nxv2f64:
409 ; CHECK:       # %bb.0:
410 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
411 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
412 ; CHECK-NEXT:    ret
413   %head = insertelement <vscale x 2 x double> poison, double %b, i32 0
414   %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer
415   %vc = select <vscale x 2 x i1> %cond, <vscale x 2 x double> %splat, <vscale x 2 x double> %va
416   ret <vscale x 2 x double> %vc
419 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) {
420 ; CHECK-LABEL: vfmerge_vv_nxv4f64:
421 ; CHECK:       # %bb.0:
422 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
423 ; CHECK-NEXT:    vmerge.vvm v8, v12, v8, v0
424 ; CHECK-NEXT:    ret
425   %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x double> %va, <vscale x 4 x double> %vb
426   ret <vscale x 4 x double> %vc
429 define <vscale x 4 x double> @vfmerge_fv_nxv4f64(<vscale x 4 x double> %va, double %b, <vscale x 4 x i1> %cond) {
430 ; CHECK-LABEL: vfmerge_fv_nxv4f64:
431 ; CHECK:       # %bb.0:
432 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
433 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
434 ; CHECK-NEXT:    ret
435   %head = insertelement <vscale x 4 x double> poison, double %b, i32 0
436   %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer
437   %vc = select <vscale x 4 x i1> %cond, <vscale x 4 x double> %splat, <vscale x 4 x double> %va
438   ret <vscale x 4 x double> %vc
441 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) {
442 ; CHECK-LABEL: vfmerge_vv_nxv8f64:
443 ; CHECK:       # %bb.0:
444 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
445 ; CHECK-NEXT:    vmerge.vvm v8, v16, v8, v0
446 ; CHECK-NEXT:    ret
447   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> %va, <vscale x 8 x double> %vb
448   ret <vscale x 8 x double> %vc
451 define <vscale x 8 x double> @vfmerge_fv_nxv8f64(<vscale x 8 x double> %va, double %b, <vscale x 8 x i1> %cond) {
452 ; CHECK-LABEL: vfmerge_fv_nxv8f64:
453 ; CHECK:       # %bb.0:
454 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
455 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
456 ; CHECK-NEXT:    ret
457   %head = insertelement <vscale x 8 x double> poison, double %b, i32 0
458   %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer
459   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> %splat, <vscale x 8 x double> %va
460   ret <vscale x 8 x double> %vc
463 define <vscale x 8 x double> @vfmerge_zv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x i1> %cond) {
464 ; CHECK-LABEL: vfmerge_zv_nxv8f64:
465 ; CHECK:       # %bb.0:
466 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
467 ; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
468 ; CHECK-NEXT:    ret
469   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> splat (double zeroinitializer), <vscale x 8 x double> %va
470   ret <vscale x 8 x double> %vc
473 define <vscale x 8 x double> @vfmerge_nzv_nxv8f64(<vscale x 8 x double> %va, <vscale x 8 x i1> %cond) {
474 ; RV32-LABEL: vfmerge_nzv_nxv8f64:
475 ; RV32:       # %bb.0:
476 ; RV32-NEXT:    fcvt.d.w fa5, zero
477 ; RV32-NEXT:    fneg.d fa5, fa5
478 ; RV32-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
479 ; RV32-NEXT:    vfmerge.vfm v8, v8, fa5, v0
480 ; RV32-NEXT:    ret
482 ; RV64-LABEL: vfmerge_nzv_nxv8f64:
483 ; RV64:       # %bb.0:
484 ; RV64-NEXT:    li a0, -1
485 ; RV64-NEXT:    slli a0, a0, 63
486 ; RV64-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
487 ; RV64-NEXT:    vmerge.vxm v8, v8, a0, v0
488 ; RV64-NEXT:    ret
489   %vc = select <vscale x 8 x i1> %cond, <vscale x 8 x double> splat (double -0.0), <vscale x 8 x double> %va
490   ret <vscale x 8 x double> %vc
493 define <vscale x 16 x double> @vselect_combine_regression(<vscale x 16 x i64> %va, <vscale x 16 x double> %vb) {
494 ; CHECK-LABEL: vselect_combine_regression:
495 ; CHECK:       # %bb.0:
496 ; CHECK-NEXT:    csrr a1, vlenb
497 ; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, mu
498 ; CHECK-NEXT:    vmseq.vi v24, v16, 0
499 ; CHECK-NEXT:    vmseq.vi v0, v8, 0
500 ; CHECK-NEXT:    vmv.v.i v16, 0
501 ; CHECK-NEXT:    slli a1, a1, 3
502 ; CHECK-NEXT:    vmv.v.i v8, 0
503 ; CHECK-NEXT:    add a1, a0, a1
504 ; CHECK-NEXT:    vle64.v v8, (a0), v0.t
505 ; CHECK-NEXT:    vmv1r.v v0, v24
506 ; CHECK-NEXT:    vle64.v v16, (a1), v0.t
507 ; CHECK-NEXT:    ret
508   %cond = icmp eq <vscale x 16 x i64> %va, zeroinitializer
509   %sel = select <vscale x 16 x i1> %cond, <vscale x 16 x double> %vb, <vscale x 16 x double> zeroinitializer
510   ret <vscale x 16 x double> %sel
513 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) {
514 ; CHECK-LABEL: vselect_legalize_regression:
515 ; CHECK:       # %bb.0:
516 ; CHECK-NEXT:    vsetvli a2, zero, e8, m2, ta, ma
517 ; CHECK-NEXT:    vlm.v v24, (a0)
518 ; CHECK-NEXT:    csrr a0, vlenb
519 ; CHECK-NEXT:    srli a2, a0, 3
520 ; CHECK-NEXT:    slli a0, a0, 3
521 ; CHECK-NEXT:    vmand.mm v7, v0, v24
522 ; CHECK-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
523 ; CHECK-NEXT:    vslidedown.vx v0, v7, a2
524 ; CHECK-NEXT:    add a0, a1, a0
525 ; CHECK-NEXT:    vsetvli a2, zero, e64, m8, ta, ma
526 ; CHECK-NEXT:    vmv.v.i v24, 0
527 ; CHECK-NEXT:    vmerge.vvm v16, v24, v16, v0
528 ; CHECK-NEXT:    vmv1r.v v0, v7
529 ; CHECK-NEXT:    vmv.v.i v24, 0
530 ; CHECK-NEXT:    vmerge.vvm v8, v24, v8, v0
531 ; CHECK-NEXT:    vs8r.v v8, (a1)
532 ; CHECK-NEXT:    vs8r.v v16, (a0)
533 ; CHECK-NEXT:    ret
534   %cond = and <vscale x 16 x i1> %ma, %mb
535   %sel = select <vscale x 16 x i1> %cond, <vscale x 16 x double> %a, <vscale x 16 x double> zeroinitializer
536   store <vscale x 16 x double> %sel, ptr %out
537   ret void