[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vselect-fp.ll
blobbe2fc6955294d5873ffd50b683261707abcd075c
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:    vsetivli zero, 1, e8, m1, ta, ma
179 ; CHECK-NEXT:    vmv2r.v v8, v10
180 ; CHECK-NEXT:    ret
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:
187 ; CHECK:       # %bb.0:
188 ; CHECK-NEXT:    vsetvli a0, zero, e16, m4, ta, ma
189 ; CHECK-NEXT:    vmerge.vvm v8, v12, v8, v0
190 ; CHECK-NEXT:    ret
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:
217 ; CHECK:       # %bb.0:
218 ; CHECK-NEXT:    vsetvli a0, zero, e16, m8, ta, ma
219 ; CHECK-NEXT:    vmerge.vvm v8, v16, v8, v0
220 ; CHECK-NEXT:    ret
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:
247 ; CHECK:       # %bb.0:
248 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
249 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
250 ; CHECK-NEXT:    ret
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:
257 ; CHECK:       # %bb.0:
258 ; CHECK-NEXT:    vsetvli a0, zero, e32, mf2, ta, ma
259 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
260 ; CHECK-NEXT:    ret
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:
269 ; CHECK:       # %bb.0:
270 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
271 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
272 ; CHECK-NEXT:    ret
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:
279 ; CHECK:       # %bb.0:
280 ; CHECK-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
281 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
282 ; CHECK-NEXT:    ret
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:
291 ; CHECK:       # %bb.0:
292 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
293 ; CHECK-NEXT:    vmerge.vvm v8, v10, v8, v0
294 ; CHECK-NEXT:    ret
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:
301 ; CHECK:       # %bb.0:
302 ; CHECK-NEXT:    vsetvli a0, zero, e32, m2, ta, ma
303 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
304 ; CHECK-NEXT:    ret
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:
313 ; CHECK:       # %bb.0:
314 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
315 ; CHECK-NEXT:    vmerge.vvm v8, v12, v8, v0
316 ; CHECK-NEXT:    ret
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:
323 ; CHECK:       # %bb.0:
324 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
325 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
326 ; CHECK-NEXT:    ret
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:
335 ; CHECK:       # %bb.0:
336 ; CHECK-NEXT:    vsetvli a0, zero, e32, m4, ta, ma
337 ; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
338 ; CHECK-NEXT:    ret
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:
345 ; CHECK:       # %bb.0:
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
349 ; CHECK-NEXT:    ret
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:
356 ; CHECK:       # %bb.0:
357 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
358 ; CHECK-NEXT:    vmerge.vvm v8, v16, v8, v0
359 ; CHECK-NEXT:    ret
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:
366 ; CHECK:       # %bb.0:
367 ; CHECK-NEXT:    vsetvli a0, zero, e32, m8, ta, ma
368 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
369 ; CHECK-NEXT:    ret
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:
378 ; CHECK:       # %bb.0:
379 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
380 ; CHECK-NEXT:    vmerge.vvm v8, v9, v8, v0
381 ; CHECK-NEXT:    ret
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:
388 ; CHECK:       # %bb.0:
389 ; CHECK-NEXT:    vsetvli a0, zero, e64, m1, ta, ma
390 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
391 ; CHECK-NEXT:    ret
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:
400 ; CHECK:       # %bb.0:
401 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
402 ; CHECK-NEXT:    vmerge.vvm v8, v10, v8, v0
403 ; CHECK-NEXT:    ret
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:
410 ; CHECK:       # %bb.0:
411 ; CHECK-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
412 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
413 ; CHECK-NEXT:    ret
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:
422 ; CHECK:       # %bb.0:
423 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
424 ; CHECK-NEXT:    vmerge.vvm v8, v12, v8, v0
425 ; CHECK-NEXT:    ret
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:
432 ; CHECK:       # %bb.0:
433 ; CHECK-NEXT:    vsetvli a0, zero, e64, m4, ta, ma
434 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
435 ; CHECK-NEXT:    ret
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:
444 ; CHECK:       # %bb.0:
445 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
446 ; CHECK-NEXT:    vmerge.vvm v8, v16, v8, v0
447 ; CHECK-NEXT:    ret
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:
454 ; CHECK:       # %bb.0:
455 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
456 ; CHECK-NEXT:    vfmerge.vfm v8, v8, fa0, v0
457 ; CHECK-NEXT:    ret
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:
466 ; CHECK:       # %bb.0:
467 ; CHECK-NEXT:    vsetvli a0, zero, e64, m8, ta, ma
468 ; CHECK-NEXT:    vmerge.vim v8, v8, 0, v0
469 ; CHECK-NEXT:    ret
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:
476 ; RV32:       # %bb.0:
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
481 ; RV32-NEXT:    ret
483 ; RV64-LABEL: vfmerge_nzv_nxv8f64:
484 ; RV64:       # %bb.0:
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
489 ; RV64-NEXT:    ret
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:
496 ; CHECK:       # %bb.0:
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
508 ; CHECK-NEXT:    ret
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:
516 ; CHECK:       # %bb.0:
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)
534 ; CHECK-NEXT:    ret
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
538   ret void