xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vp-splat.ll (revision 97982a8c605fac7c86d02e641a6cd7898b3ca343)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=riscv32 -mattr=+v,+d,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,NOZFMIN,ZVFH
3; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,NOZFMIN,ZVFH
4; RUN: llc -mtriple=riscv32 -mattr=+v,+d,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,NOZFMIN,ZVFHMIN
5; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,NOZFMIN,ZVFHMIN
6; RUN: llc -mtriple=riscv32 -mattr=+v,+d,+zfhmin,+zfbfmin,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,ZFMIN
7; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zfhmin,+zfbfmin,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,ZFMIN
8
9define <vscale x 1 x i8> @vp_splat_nxv1i8(i8 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
10; CHECK-LABEL: vp_splat_nxv1i8:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    vsetvli zero, a1, e8, mf8, ta, ma
13; CHECK-NEXT:    vmv.v.x v8, a0
14; CHECK-NEXT:    ret
15  %splat = call <vscale x 1 x i8> @llvm.experimental.vp.splat.nxv1i8(i8 %val, <vscale x 1 x i1> %m, i32 %evl)
16  ret <vscale x 1 x i8> %splat
17}
18
19define <vscale x 2 x i8> @vp_splat_nxv2i8(i8 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
20; CHECK-LABEL: vp_splat_nxv2i8:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    vsetvli zero, a1, e8, mf4, ta, ma
23; CHECK-NEXT:    vmv.v.x v8, a0
24; CHECK-NEXT:    ret
25  %splat = call <vscale x 2 x i8> @llvm.experimental.vp.splat.nxv2i8(i8 %val, <vscale x 2 x i1> %m, i32 %evl)
26  ret <vscale x 2 x i8> %splat
27}
28
29define <vscale x 4 x i8> @vp_splat_nxv4i8(i8 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
30; CHECK-LABEL: vp_splat_nxv4i8:
31; CHECK:       # %bb.0:
32; CHECK-NEXT:    vsetvli zero, a1, e8, mf2, ta, ma
33; CHECK-NEXT:    vmv.v.x v8, a0
34; CHECK-NEXT:    ret
35  %splat = call <vscale x 4 x i8> @llvm.experimental.vp.splat.nxv4i8(i8 %val, <vscale x 4 x i1> %m, i32 %evl)
36  ret <vscale x 4 x i8> %splat
37}
38
39define <vscale x 8 x i8> @vp_splat_nxv8i8(i8 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
40; CHECK-LABEL: vp_splat_nxv8i8:
41; CHECK:       # %bb.0:
42; CHECK-NEXT:    vsetvli zero, a1, e8, m1, ta, ma
43; CHECK-NEXT:    vmv.v.x v8, a0
44; CHECK-NEXT:    ret
45  %splat = call <vscale x 8 x i8> @llvm.experimental.vp.splat.nxv8i8(i8 %val, <vscale x 8 x i1> %m, i32 %evl)
46  ret <vscale x 8 x i8> %splat
47}
48
49define <vscale x 16 x i8> @vp_splat_nxv16i8(i8 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) {
50; CHECK-LABEL: vp_splat_nxv16i8:
51; CHECK:       # %bb.0:
52; CHECK-NEXT:    vsetvli zero, a1, e8, m2, ta, ma
53; CHECK-NEXT:    vmv.v.x v8, a0
54; CHECK-NEXT:    ret
55  %splat = call <vscale x 16 x i8> @llvm.experimental.vp.splat.nxv16i8(i8 %val, <vscale x 16 x i1> %m, i32 %evl)
56  ret <vscale x 16 x i8> %splat
57}
58
59define <vscale x 32 x i8> @vp_splat_nxv32i8(i8 %val, <vscale x 32 x i1> %m, i32 zeroext %evl) {
60; CHECK-LABEL: vp_splat_nxv32i8:
61; CHECK:       # %bb.0:
62; CHECK-NEXT:    vsetvli zero, a1, e8, m4, ta, ma
63; CHECK-NEXT:    vmv.v.x v8, a0
64; CHECK-NEXT:    ret
65  %splat = call <vscale x 32 x i8> @llvm.experimental.vp.splat.nxv32i8(i8 %val, <vscale x 32 x i1> %m, i32 %evl)
66  ret <vscale x 32 x i8> %splat
67}
68
69define <vscale x 64 x i8> @vp_splat_nxv64i8(i8 %val, <vscale x 64 x i1> %m, i32 zeroext %evl) {
70; CHECK-LABEL: vp_splat_nxv64i8:
71; CHECK:       # %bb.0:
72; CHECK-NEXT:    vsetvli zero, a1, e8, m8, ta, ma
73; CHECK-NEXT:    vmv.v.x v8, a0
74; CHECK-NEXT:    ret
75  %splat = call <vscale x 64 x i8> @llvm.experimental.vp.splat.nxv64i8(i8 %val, <vscale x 64 x i1> %m, i32 %evl)
76  ret <vscale x 64 x i8> %splat
77}
78
79define <vscale x 1 x i16> @vp_splat_nxv1i16(i16 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
80; CHECK-LABEL: vp_splat_nxv1i16:
81; CHECK:       # %bb.0:
82; CHECK-NEXT:    vsetvli zero, a1, e16, mf4, ta, ma
83; CHECK-NEXT:    vmv.v.x v8, a0
84; CHECK-NEXT:    ret
85  %splat = call <vscale x 1 x i16> @llvm.experimental.vp.splat.nxv1i16(i16 %val, <vscale x 1 x i1> %m, i32 %evl)
86  ret <vscale x 1 x i16> %splat
87}
88
89define <vscale x 2 x i16> @vp_splat_nxv2i16(i16 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
90; CHECK-LABEL: vp_splat_nxv2i16:
91; CHECK:       # %bb.0:
92; CHECK-NEXT:    vsetvli zero, a1, e16, mf2, ta, ma
93; CHECK-NEXT:    vmv.v.x v8, a0
94; CHECK-NEXT:    ret
95  %splat = call <vscale x 2 x i16> @llvm.experimental.vp.splat.nxv2i16(i16 %val, <vscale x 2 x i1> %m, i32 %evl)
96  ret <vscale x 2 x i16> %splat
97}
98
99define <vscale x 4 x i16> @vp_splat_nxv4i16(i16 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
100; CHECK-LABEL: vp_splat_nxv4i16:
101; CHECK:       # %bb.0:
102; CHECK-NEXT:    vsetvli zero, a1, e16, m1, ta, ma
103; CHECK-NEXT:    vmv.v.x v8, a0
104; CHECK-NEXT:    ret
105  %splat = call <vscale x 4 x i16> @llvm.experimental.vp.splat.nxv4i16(i16 %val, <vscale x 4 x i1> %m, i32 %evl)
106  ret <vscale x 4 x i16> %splat
107}
108
109define <vscale x 8 x i16> @vp_splat_nxv8i16(i16 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
110; CHECK-LABEL: vp_splat_nxv8i16:
111; CHECK:       # %bb.0:
112; CHECK-NEXT:    vsetvli zero, a1, e16, m2, ta, ma
113; CHECK-NEXT:    vmv.v.x v8, a0
114; CHECK-NEXT:    ret
115  %splat = call <vscale x 8 x i16> @llvm.experimental.vp.splat.nxv8i16(i16 %val, <vscale x 8 x i1> %m, i32 %evl)
116  ret <vscale x 8 x i16> %splat
117}
118
119define <vscale x 16 x i16> @vp_splat_nxv16i16(i16 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) {
120; CHECK-LABEL: vp_splat_nxv16i16:
121; CHECK:       # %bb.0:
122; CHECK-NEXT:    vsetvli zero, a1, e16, m4, ta, ma
123; CHECK-NEXT:    vmv.v.x v8, a0
124; CHECK-NEXT:    ret
125  %splat = call <vscale x 16 x i16> @llvm.experimental.vp.splat.nxv16i16(i16 %val, <vscale x 16 x i1> %m, i32 %evl)
126  ret <vscale x 16 x i16> %splat
127}
128
129define <vscale x 32 x i16> @vp_splat_nxv32i16(i16 %val, <vscale x 32 x i1> %m, i32 zeroext %evl) {
130; CHECK-LABEL: vp_splat_nxv32i16:
131; CHECK:       # %bb.0:
132; CHECK-NEXT:    vsetvli zero, a1, e16, m8, ta, ma
133; CHECK-NEXT:    vmv.v.x v8, a0
134; CHECK-NEXT:    ret
135  %splat = call <vscale x 32 x i16> @llvm.experimental.vp.splat.nxv32i16(i16 %val, <vscale x 32 x i1> %m, i32 %evl)
136  ret <vscale x 32 x i16> %splat
137}
138
139define <vscale x 1 x i32> @vp_splat_nxv1i32(i32 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
140; CHECK-LABEL: vp_splat_nxv1i32:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    vsetvli zero, a1, e32, mf2, ta, ma
143; CHECK-NEXT:    vmv.v.x v8, a0
144; CHECK-NEXT:    ret
145  %splat = call <vscale x 1 x i32> @llvm.experimental.vp.splat.nxv1i32(i32 %val, <vscale x 1 x i1> %m, i32 %evl)
146  ret <vscale x 1 x i32> %splat
147}
148
149define <vscale x 2 x i32> @vp_splat_nxv2i32(i32 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
150; CHECK-LABEL: vp_splat_nxv2i32:
151; CHECK:       # %bb.0:
152; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma
153; CHECK-NEXT:    vmv.v.x v8, a0
154; CHECK-NEXT:    ret
155  %splat = call <vscale x 2 x i32> @llvm.experimental.vp.splat.nxv2i32(i32 %val, <vscale x 2 x i1> %m, i32 %evl)
156  ret <vscale x 2 x i32> %splat
157}
158
159define <vscale x 4 x i32> @vp_splat_nxv4i32(i32 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
160; CHECK-LABEL: vp_splat_nxv4i32:
161; CHECK:       # %bb.0:
162; CHECK-NEXT:    vsetvli zero, a1, e32, m2, ta, ma
163; CHECK-NEXT:    vmv.v.x v8, a0
164; CHECK-NEXT:    ret
165  %splat = call <vscale x 4 x i32> @llvm.experimental.vp.splat.nxv4i32(i32 %val, <vscale x 4 x i1> %m, i32 %evl)
166  ret <vscale x 4 x i32> %splat
167}
168
169define <vscale x 8 x i32> @vp_splat_nxv8i32(i32 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
170; CHECK-LABEL: vp_splat_nxv8i32:
171; CHECK:       # %bb.0:
172; CHECK-NEXT:    vsetvli zero, a1, e32, m4, ta, ma
173; CHECK-NEXT:    vmv.v.x v8, a0
174; CHECK-NEXT:    ret
175  %splat = call <vscale x 8 x i32> @llvm.experimental.vp.splat.nxv8i32(i32 %val, <vscale x 8 x i1> %m, i32 %evl)
176  ret <vscale x 8 x i32> %splat
177}
178
179define <vscale x 16 x i32> @vp_splat_nxv16i32(i32 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) {
180; CHECK-LABEL: vp_splat_nxv16i32:
181; CHECK:       # %bb.0:
182; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
183; CHECK-NEXT:    vmv.v.x v8, a0
184; CHECK-NEXT:    ret
185  %splat = call <vscale x 16 x i32> @llvm.experimental.vp.splat.nxv16i32(i32 %val, <vscale x 16 x i1> %m, i32 %evl)
186  ret <vscale x 16 x i32> %splat
187}
188
189define <vscale x 1 x i64> @vp_splat_nxv1i64(i64 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
190; RV32-LABEL: vp_splat_nxv1i64:
191; RV32:       # %bb.0:
192; RV32-NEXT:    addi sp, sp, -16
193; RV32-NEXT:    .cfi_def_cfa_offset 16
194; RV32-NEXT:    sw a0, 8(sp)
195; RV32-NEXT:    sw a1, 12(sp)
196; RV32-NEXT:    addi a0, sp, 8
197; RV32-NEXT:    vsetvli a1, zero, e64, m1, ta, ma
198; RV32-NEXT:    vlse64.v v8, (a0), zero
199; RV32-NEXT:    addi sp, sp, 16
200; RV32-NEXT:    .cfi_def_cfa_offset 0
201; RV32-NEXT:    ret
202;
203; RV64-LABEL: vp_splat_nxv1i64:
204; RV64:       # %bb.0:
205; RV64-NEXT:    vsetvli zero, a1, e64, m1, ta, ma
206; RV64-NEXT:    vmv.v.x v8, a0
207; RV64-NEXT:    ret
208  %splat = call <vscale x 1 x i64> @llvm.experimental.vp.splat.nxv1i64(i64 %val, <vscale x 1 x i1> %m, i32 %evl)
209  ret <vscale x 1 x i64> %splat
210}
211
212define <vscale x 2 x i64> @vp_splat_nxv2i64(i64 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
213; RV32-LABEL: vp_splat_nxv2i64:
214; RV32:       # %bb.0:
215; RV32-NEXT:    addi sp, sp, -16
216; RV32-NEXT:    .cfi_def_cfa_offset 16
217; RV32-NEXT:    sw a0, 8(sp)
218; RV32-NEXT:    sw a1, 12(sp)
219; RV32-NEXT:    addi a0, sp, 8
220; RV32-NEXT:    vsetvli a1, zero, e64, m2, ta, ma
221; RV32-NEXT:    vlse64.v v8, (a0), zero
222; RV32-NEXT:    addi sp, sp, 16
223; RV32-NEXT:    .cfi_def_cfa_offset 0
224; RV32-NEXT:    ret
225;
226; RV64-LABEL: vp_splat_nxv2i64:
227; RV64:       # %bb.0:
228; RV64-NEXT:    vsetvli zero, a1, e64, m2, ta, ma
229; RV64-NEXT:    vmv.v.x v8, a0
230; RV64-NEXT:    ret
231  %splat = call <vscale x 2 x i64> @llvm.experimental.vp.splat.nxv2i64(i64 %val, <vscale x 2 x i1> %m, i32 %evl)
232  ret <vscale x 2 x i64> %splat
233}
234
235define <vscale x 4 x i64> @vp_splat_nxv4i64(i64 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
236; RV32-LABEL: vp_splat_nxv4i64:
237; RV32:       # %bb.0:
238; RV32-NEXT:    addi sp, sp, -16
239; RV32-NEXT:    .cfi_def_cfa_offset 16
240; RV32-NEXT:    sw a0, 8(sp)
241; RV32-NEXT:    sw a1, 12(sp)
242; RV32-NEXT:    addi a0, sp, 8
243; RV32-NEXT:    vsetvli a1, zero, e64, m4, ta, ma
244; RV32-NEXT:    vlse64.v v8, (a0), zero
245; RV32-NEXT:    addi sp, sp, 16
246; RV32-NEXT:    .cfi_def_cfa_offset 0
247; RV32-NEXT:    ret
248;
249; RV64-LABEL: vp_splat_nxv4i64:
250; RV64:       # %bb.0:
251; RV64-NEXT:    vsetvli zero, a1, e64, m4, ta, ma
252; RV64-NEXT:    vmv.v.x v8, a0
253; RV64-NEXT:    ret
254  %splat = call <vscale x 4 x i64> @llvm.experimental.vp.splat.nxv4i64(i64 %val, <vscale x 4 x i1> %m, i32 %evl)
255  ret <vscale x 4 x i64> %splat
256}
257
258define <vscale x 8 x i64> @vp_splat_nxv8i64(i64 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
259; RV32-LABEL: vp_splat_nxv8i64:
260; RV32:       # %bb.0:
261; RV32-NEXT:    addi sp, sp, -16
262; RV32-NEXT:    .cfi_def_cfa_offset 16
263; RV32-NEXT:    sw a0, 8(sp)
264; RV32-NEXT:    sw a1, 12(sp)
265; RV32-NEXT:    addi a0, sp, 8
266; RV32-NEXT:    vsetvli a1, zero, e64, m8, ta, ma
267; RV32-NEXT:    vlse64.v v8, (a0), zero
268; RV32-NEXT:    addi sp, sp, 16
269; RV32-NEXT:    .cfi_def_cfa_offset 0
270; RV32-NEXT:    ret
271;
272; RV64-LABEL: vp_splat_nxv8i64:
273; RV64:       # %bb.0:
274; RV64-NEXT:    vsetvli zero, a1, e64, m8, ta, ma
275; RV64-NEXT:    vmv.v.x v8, a0
276; RV64-NEXT:    ret
277  %splat = call <vscale x 8 x i64> @llvm.experimental.vp.splat.nxv8i64(i64 %val, <vscale x 8 x i1> %m, i32 %evl)
278  ret <vscale x 8 x i64> %splat
279}
280
281define <vscale x 1 x bfloat> @vp_splat_nxv1bf16(bfloat %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
282; NOZFMIN-LABEL: vp_splat_nxv1bf16:
283; NOZFMIN:       # %bb.0:
284; NOZFMIN-NEXT:    fmv.x.w a1, fa0
285; NOZFMIN-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
286; NOZFMIN-NEXT:    vmv.v.x v8, a1
287; NOZFMIN-NEXT:    ret
288;
289; ZFMIN-LABEL: vp_splat_nxv1bf16:
290; ZFMIN:       # %bb.0:
291; ZFMIN-NEXT:    fmv.x.h a1, fa0
292; ZFMIN-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
293; ZFMIN-NEXT:    vmv.v.x v8, a1
294; ZFMIN-NEXT:    ret
295  %splat = call <vscale x 1 x bfloat> @llvm.experimental.vp.splat.nxv1bf16(bfloat %val, <vscale x 1 x i1> %m, i32 %evl)
296  ret <vscale x 1 x bfloat> %splat
297}
298
299define <vscale x 2 x bfloat> @vp_splat_nxv2bf16(bfloat %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
300; NOZFMIN-LABEL: vp_splat_nxv2bf16:
301; NOZFMIN:       # %bb.0:
302; NOZFMIN-NEXT:    fmv.x.w a1, fa0
303; NOZFMIN-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
304; NOZFMIN-NEXT:    vmv.v.x v8, a1
305; NOZFMIN-NEXT:    ret
306;
307; ZFMIN-LABEL: vp_splat_nxv2bf16:
308; ZFMIN:       # %bb.0:
309; ZFMIN-NEXT:    fmv.x.h a1, fa0
310; ZFMIN-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
311; ZFMIN-NEXT:    vmv.v.x v8, a1
312; ZFMIN-NEXT:    ret
313  %splat = call <vscale x 2 x bfloat> @llvm.experimental.vp.splat.nxv2bf16(bfloat %val, <vscale x 2 x i1> %m, i32 %evl)
314  ret <vscale x 2 x bfloat> %splat
315}
316
317define <vscale x 4 x bfloat> @vp_splat_nxv4bf16(bfloat %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
318; NOZFMIN-LABEL: vp_splat_nxv4bf16:
319; NOZFMIN:       # %bb.0:
320; NOZFMIN-NEXT:    fmv.x.w a1, fa0
321; NOZFMIN-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
322; NOZFMIN-NEXT:    vmv.v.x v8, a1
323; NOZFMIN-NEXT:    ret
324;
325; ZFMIN-LABEL: vp_splat_nxv4bf16:
326; ZFMIN:       # %bb.0:
327; ZFMIN-NEXT:    fmv.x.h a1, fa0
328; ZFMIN-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
329; ZFMIN-NEXT:    vmv.v.x v8, a1
330; ZFMIN-NEXT:    ret
331  %splat = call <vscale x 4 x bfloat> @llvm.experimental.vp.splat.nxv4bf16(bfloat %val, <vscale x 4 x i1> %m, i32 %evl)
332  ret <vscale x 4 x bfloat> %splat
333}
334
335define <vscale x 8 x bfloat> @vp_splat_nxv8bf16(bfloat %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
336; NOZFMIN-LABEL: vp_splat_nxv8bf16:
337; NOZFMIN:       # %bb.0:
338; NOZFMIN-NEXT:    fmv.x.w a1, fa0
339; NOZFMIN-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
340; NOZFMIN-NEXT:    vmv.v.x v8, a1
341; NOZFMIN-NEXT:    ret
342;
343; ZFMIN-LABEL: vp_splat_nxv8bf16:
344; ZFMIN:       # %bb.0:
345; ZFMIN-NEXT:    fmv.x.h a1, fa0
346; ZFMIN-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
347; ZFMIN-NEXT:    vmv.v.x v8, a1
348; ZFMIN-NEXT:    ret
349  %splat = call <vscale x 8 x bfloat> @llvm.experimental.vp.splat.nxv8bf16(bfloat %val, <vscale x 8 x i1> %m, i32 %evl)
350  ret <vscale x 8 x bfloat> %splat
351}
352
353define <vscale x 16 x bfloat> @vp_splat_nxv16bf16(bfloat %val, <vscale x 16 x i1> %m, i32 zeroext %evl) {
354; NOZFMIN-LABEL: vp_splat_nxv16bf16:
355; NOZFMIN:       # %bb.0:
356; NOZFMIN-NEXT:    fmv.x.w a1, fa0
357; NOZFMIN-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
358; NOZFMIN-NEXT:    vmv.v.x v8, a1
359; NOZFMIN-NEXT:    ret
360;
361; ZFMIN-LABEL: vp_splat_nxv16bf16:
362; ZFMIN:       # %bb.0:
363; ZFMIN-NEXT:    fmv.x.h a1, fa0
364; ZFMIN-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
365; ZFMIN-NEXT:    vmv.v.x v8, a1
366; ZFMIN-NEXT:    ret
367  %splat = call <vscale x 16 x bfloat> @llvm.experimental.vp.splat.nxv16bf16(bfloat %val, <vscale x 16 x i1> %m, i32 %evl)
368  ret <vscale x 16 x bfloat> %splat
369}
370
371define <vscale x 32 x bfloat> @vp_splat_nxv32bf16(bfloat %val, <vscale x 32 x i1> %m, i32 zeroext %evl) {
372; NOZFMIN-LABEL: vp_splat_nxv32bf16:
373; NOZFMIN:       # %bb.0:
374; NOZFMIN-NEXT:    fmv.x.w a1, fa0
375; NOZFMIN-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
376; NOZFMIN-NEXT:    vmv.v.x v8, a1
377; NOZFMIN-NEXT:    ret
378;
379; ZFMIN-LABEL: vp_splat_nxv32bf16:
380; ZFMIN:       # %bb.0:
381; ZFMIN-NEXT:    fmv.x.h a1, fa0
382; ZFMIN-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
383; ZFMIN-NEXT:    vmv.v.x v8, a1
384; ZFMIN-NEXT:    ret
385  %splat = call <vscale x 32 x bfloat> @llvm.experimental.vp.splat.nxv32bf16(bfloat %val, <vscale x 32 x i1> %m, i32 %evl)
386  ret <vscale x 32 x bfloat> %splat
387}
388
389define <vscale x 1 x half> @vp_splat_nxv1f16(half %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
390; ZVFH-LABEL: vp_splat_nxv1f16:
391; ZVFH:       # %bb.0:
392; ZVFH-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
393; ZVFH-NEXT:    vfmv.v.f v8, fa0
394; ZVFH-NEXT:    ret
395;
396; ZVFHMIN-LABEL: vp_splat_nxv1f16:
397; ZVFHMIN:       # %bb.0:
398; ZVFHMIN-NEXT:    fmv.x.w a1, fa0
399; ZVFHMIN-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
400; ZVFHMIN-NEXT:    vmv.v.x v8, a1
401; ZVFHMIN-NEXT:    ret
402;
403; ZFMIN-LABEL: vp_splat_nxv1f16:
404; ZFMIN:       # %bb.0:
405; ZFMIN-NEXT:    fmv.x.h a1, fa0
406; ZFMIN-NEXT:    vsetvli zero, a0, e16, mf4, ta, ma
407; ZFMIN-NEXT:    vmv.v.x v8, a1
408; ZFMIN-NEXT:    ret
409  %splat = call <vscale x 1 x half> @llvm.experimental.vp.splat.nxv1f16(half %val, <vscale x 1 x i1> %m, i32 %evl)
410  ret <vscale x 1 x half> %splat
411}
412
413define <vscale x 2 x half> @vp_splat_nxv2f16(half %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
414; ZVFH-LABEL: vp_splat_nxv2f16:
415; ZVFH:       # %bb.0:
416; ZVFH-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
417; ZVFH-NEXT:    vfmv.v.f v8, fa0
418; ZVFH-NEXT:    ret
419;
420; ZVFHMIN-LABEL: vp_splat_nxv2f16:
421; ZVFHMIN:       # %bb.0:
422; ZVFHMIN-NEXT:    fmv.x.w a1, fa0
423; ZVFHMIN-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
424; ZVFHMIN-NEXT:    vmv.v.x v8, a1
425; ZVFHMIN-NEXT:    ret
426;
427; ZFMIN-LABEL: vp_splat_nxv2f16:
428; ZFMIN:       # %bb.0:
429; ZFMIN-NEXT:    fmv.x.h a1, fa0
430; ZFMIN-NEXT:    vsetvli zero, a0, e16, mf2, ta, ma
431; ZFMIN-NEXT:    vmv.v.x v8, a1
432; ZFMIN-NEXT:    ret
433  %splat = call <vscale x 2 x half> @llvm.experimental.vp.splat.nxv2f16(half %val, <vscale x 2 x i1> %m, i32 %evl)
434  ret <vscale x 2 x half> %splat
435}
436
437define <vscale x 4 x half> @vp_splat_nxv4f16(half %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
438; ZVFH-LABEL: vp_splat_nxv4f16:
439; ZVFH:       # %bb.0:
440; ZVFH-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
441; ZVFH-NEXT:    vfmv.v.f v8, fa0
442; ZVFH-NEXT:    ret
443;
444; ZVFHMIN-LABEL: vp_splat_nxv4f16:
445; ZVFHMIN:       # %bb.0:
446; ZVFHMIN-NEXT:    fmv.x.w a1, fa0
447; ZVFHMIN-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
448; ZVFHMIN-NEXT:    vmv.v.x v8, a1
449; ZVFHMIN-NEXT:    ret
450;
451; ZFMIN-LABEL: vp_splat_nxv4f16:
452; ZFMIN:       # %bb.0:
453; ZFMIN-NEXT:    fmv.x.h a1, fa0
454; ZFMIN-NEXT:    vsetvli zero, a0, e16, m1, ta, ma
455; ZFMIN-NEXT:    vmv.v.x v8, a1
456; ZFMIN-NEXT:    ret
457  %splat = call <vscale x 4 x half> @llvm.experimental.vp.splat.nxv4f16(half %val, <vscale x 4 x i1> %m, i32 %evl)
458  ret <vscale x 4 x half> %splat
459}
460
461define <vscale x 8 x half> @vp_splat_nxv8f16(half %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
462; ZVFH-LABEL: vp_splat_nxv8f16:
463; ZVFH:       # %bb.0:
464; ZVFH-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
465; ZVFH-NEXT:    vfmv.v.f v8, fa0
466; ZVFH-NEXT:    ret
467;
468; ZVFHMIN-LABEL: vp_splat_nxv8f16:
469; ZVFHMIN:       # %bb.0:
470; ZVFHMIN-NEXT:    fmv.x.w a1, fa0
471; ZVFHMIN-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
472; ZVFHMIN-NEXT:    vmv.v.x v8, a1
473; ZVFHMIN-NEXT:    ret
474;
475; ZFMIN-LABEL: vp_splat_nxv8f16:
476; ZFMIN:       # %bb.0:
477; ZFMIN-NEXT:    fmv.x.h a1, fa0
478; ZFMIN-NEXT:    vsetvli zero, a0, e16, m2, ta, ma
479; ZFMIN-NEXT:    vmv.v.x v8, a1
480; ZFMIN-NEXT:    ret
481  %splat = call <vscale x 8 x half> @llvm.experimental.vp.splat.nxv8f16(half %val, <vscale x 8 x i1> %m, i32 %evl)
482  ret <vscale x 8 x half> %splat
483}
484
485define <vscale x 16 x half> @vp_splat_nxv16f16(half %val, <vscale x 16 x i1> %m, i32 zeroext %evl) {
486; ZVFH-LABEL: vp_splat_nxv16f16:
487; ZVFH:       # %bb.0:
488; ZVFH-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
489; ZVFH-NEXT:    vfmv.v.f v8, fa0
490; ZVFH-NEXT:    ret
491;
492; ZVFHMIN-LABEL: vp_splat_nxv16f16:
493; ZVFHMIN:       # %bb.0:
494; ZVFHMIN-NEXT:    fmv.x.w a1, fa0
495; ZVFHMIN-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
496; ZVFHMIN-NEXT:    vmv.v.x v8, a1
497; ZVFHMIN-NEXT:    ret
498;
499; ZFMIN-LABEL: vp_splat_nxv16f16:
500; ZFMIN:       # %bb.0:
501; ZFMIN-NEXT:    fmv.x.h a1, fa0
502; ZFMIN-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
503; ZFMIN-NEXT:    vmv.v.x v8, a1
504; ZFMIN-NEXT:    ret
505  %splat = call <vscale x 16 x half> @llvm.experimental.vp.splat.nxv16f16(half %val, <vscale x 16 x i1> %m, i32 %evl)
506  ret <vscale x 16 x half> %splat
507}
508
509define <vscale x 32 x half> @vp_splat_nxv32f16(half %val, <vscale x 32 x i1> %m, i32 zeroext %evl) {
510; ZVFH-LABEL: vp_splat_nxv32f16:
511; ZVFH:       # %bb.0:
512; ZVFH-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
513; ZVFH-NEXT:    vfmv.v.f v8, fa0
514; ZVFH-NEXT:    ret
515;
516; ZVFHMIN-LABEL: vp_splat_nxv32f16:
517; ZVFHMIN:       # %bb.0:
518; ZVFHMIN-NEXT:    fmv.x.w a1, fa0
519; ZVFHMIN-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
520; ZVFHMIN-NEXT:    vmv.v.x v8, a1
521; ZVFHMIN-NEXT:    ret
522;
523; ZFMIN-LABEL: vp_splat_nxv32f16:
524; ZFMIN:       # %bb.0:
525; ZFMIN-NEXT:    fmv.x.h a1, fa0
526; ZFMIN-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
527; ZFMIN-NEXT:    vmv.v.x v8, a1
528; ZFMIN-NEXT:    ret
529  %splat = call <vscale x 32 x half> @llvm.experimental.vp.splat.nxv32f16(half %val, <vscale x 32 x i1> %m, i32 %evl)
530  ret <vscale x 32 x half> %splat
531}
532
533define <vscale x 1 x float> @vp_splat_nxv1f32(float %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
534; CHECK-LABEL: vp_splat_nxv1f32:
535; CHECK:       # %bb.0:
536; CHECK-NEXT:    vsetvli zero, a0, e32, mf2, ta, ma
537; CHECK-NEXT:    vfmv.v.f v8, fa0
538; CHECK-NEXT:    ret
539  %splat = call <vscale x 1 x float> @llvm.experimental.vp.splat.nxv1f32(float %val, <vscale x 1 x i1> %m, i32 %evl)
540  ret <vscale x 1 x float> %splat
541}
542
543define <vscale x 2 x float> @vp_splat_nxv2f32(float %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
544; CHECK-LABEL: vp_splat_nxv2f32:
545; CHECK:       # %bb.0:
546; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma
547; CHECK-NEXT:    vfmv.v.f v8, fa0
548; CHECK-NEXT:    ret
549  %splat = call <vscale x 2 x float> @llvm.experimental.vp.splat.nxv2f32(float %val, <vscale x 2 x i1> %m, i32 %evl)
550  ret <vscale x 2 x float> %splat
551}
552
553define <vscale x 4 x float> @vp_splat_nxv4f32(float %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
554; CHECK-LABEL: vp_splat_nxv4f32:
555; CHECK:       # %bb.0:
556; CHECK-NEXT:    vsetvli zero, a0, e32, m2, ta, ma
557; CHECK-NEXT:    vfmv.v.f v8, fa0
558; CHECK-NEXT:    ret
559  %splat = call <vscale x 4 x float> @llvm.experimental.vp.splat.nxv4f32(float %val, <vscale x 4 x i1> %m, i32 %evl)
560  ret <vscale x 4 x float> %splat
561}
562
563define <vscale x 8 x float> @vp_splat_nxv8f32(float %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
564; CHECK-LABEL: vp_splat_nxv8f32:
565; CHECK:       # %bb.0:
566; CHECK-NEXT:    vsetvli zero, a0, e32, m4, ta, ma
567; CHECK-NEXT:    vfmv.v.f v8, fa0
568; CHECK-NEXT:    ret
569  %splat = call <vscale x 8 x float> @llvm.experimental.vp.splat.nxv8f32(float %val, <vscale x 8 x i1> %m, i32 %evl)
570  ret <vscale x 8 x float> %splat
571}
572
573define <vscale x 16 x float> @vp_splat_nxv16f32(float %val, <vscale x 16 x i1> %m, i32 zeroext %evl) {
574; CHECK-LABEL: vp_splat_nxv16f32:
575; CHECK:       # %bb.0:
576; CHECK-NEXT:    vsetvli zero, a0, e32, m8, ta, ma
577; CHECK-NEXT:    vfmv.v.f v8, fa0
578; CHECK-NEXT:    ret
579  %splat = call <vscale x 16 x float> @llvm.experimental.vp.splat.nxv16f32(float %val, <vscale x 16 x i1> %m, i32 %evl)
580  ret <vscale x 16 x float> %splat
581}
582
583define <vscale x 1 x double> @vp_splat_nxv1f64(double %val, <vscale x 1 x i1> %m, i32 zeroext %evl) {
584; CHECK-LABEL: vp_splat_nxv1f64:
585; CHECK:       # %bb.0:
586; CHECK-NEXT:    vsetvli zero, a0, e64, m1, ta, ma
587; CHECK-NEXT:    vfmv.v.f v8, fa0
588; CHECK-NEXT:    ret
589  %splat = call <vscale x 1 x double> @llvm.experimental.vp.splat.nxv1f64(double %val, <vscale x 1 x i1> %m, i32 %evl)
590  ret <vscale x 1 x double> %splat
591}
592
593define <vscale x 2 x double> @vp_splat_nxv2f64(double %val, <vscale x 2 x i1> %m, i32 zeroext %evl) {
594; CHECK-LABEL: vp_splat_nxv2f64:
595; CHECK:       # %bb.0:
596; CHECK-NEXT:    vsetvli zero, a0, e64, m2, ta, ma
597; CHECK-NEXT:    vfmv.v.f v8, fa0
598; CHECK-NEXT:    ret
599  %splat = call <vscale x 2 x double> @llvm.experimental.vp.splat.nxv2f64(double %val, <vscale x 2 x i1> %m, i32 %evl)
600  ret <vscale x 2 x double> %splat
601}
602
603define <vscale x 4 x double> @vp_splat_nxv4f64(double %val, <vscale x 4 x i1> %m, i32 zeroext %evl) {
604; CHECK-LABEL: vp_splat_nxv4f64:
605; CHECK:       # %bb.0:
606; CHECK-NEXT:    vsetvli zero, a0, e64, m4, ta, ma
607; CHECK-NEXT:    vfmv.v.f v8, fa0
608; CHECK-NEXT:    ret
609  %splat = call <vscale x 4 x double> @llvm.experimental.vp.splat.nxv4f64(double %val, <vscale x 4 x i1> %m, i32 %evl)
610  ret <vscale x 4 x double> %splat
611}
612
613define <vscale x 8 x double> @vp_splat_nxv8f64(double %val, <vscale x 8 x i1> %m, i32 zeroext %evl) {
614; CHECK-LABEL: vp_splat_nxv8f64:
615; CHECK:       # %bb.0:
616; CHECK-NEXT:    vsetvli zero, a0, e64, m8, ta, ma
617; CHECK-NEXT:    vfmv.v.f v8, fa0
618; CHECK-NEXT:    ret
619  %splat = call <vscale x 8 x double> @llvm.experimental.vp.splat.nxv8f64(double %val, <vscale x 8 x i1> %m, i32 %evl)
620  ret <vscale x 8 x double> %splat
621}
622
623define <vscale x 16 x i31> @vp_splat_nxv16i31(i31 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) {
624; CHECK-LABEL: vp_splat_nxv16i31:
625; CHECK:       # %bb.0:
626; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
627; CHECK-NEXT:    vmv.v.x v8, a0
628; CHECK-NEXT:    ret
629  %splat = call <vscale x 16 x i31> @llvm.experimental.vp.splat.nxv16i31(i31 %val, <vscale x 16 x i1> %m, i32 %evl)
630  ret <vscale x 16 x i31> %splat
631}
632
633define <vscale x 15 x i32> @vp_splat_nxv15i32(i32 %val, <vscale x 15 x i1> %m, i32 zeroext %evl) {
634; CHECK-LABEL: vp_splat_nxv15i32:
635; CHECK:       # %bb.0:
636; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
637; CHECK-NEXT:    vmv.v.x v8, a0
638; CHECK-NEXT:    ret
639  %splat = call <vscale x 15 x i32> @llvm.experimental.vp.splat.nxv15i32(i32 %val, <vscale x 15 x i1> %m, i32 %evl)
640  ret <vscale x 15 x i32> %splat
641}
642
643; Split case.
644define <vscale x 32 x i32> @vp_splat_nxv32i32(i32 %val, <vscale x 32 x i1> %m, i32 zeroext %evl) {
645; CHECK-LABEL: vp_splat_nxv32i32:
646; CHECK:       # %bb.0:
647; CHECK-NEXT:    csrr a2, vlenb
648; CHECK-NEXT:    slli a2, a2, 1
649; CHECK-NEXT:    sub a3, a1, a2
650; CHECK-NEXT:    sltu a4, a1, a3
651; CHECK-NEXT:    addi a4, a4, -1
652; CHECK-NEXT:    and a3, a4, a3
653; CHECK-NEXT:    vsetvli zero, a3, e32, m8, ta, ma
654; CHECK-NEXT:    vmv.v.x v16, a0
655; CHECK-NEXT:    bltu a1, a2, .LBB45_2
656; CHECK-NEXT:  # %bb.1:
657; CHECK-NEXT:    mv a1, a2
658; CHECK-NEXT:  .LBB45_2:
659; CHECK-NEXT:    vsetvli zero, a1, e32, m8, ta, ma
660; CHECK-NEXT:    vmv.v.x v8, a0
661; CHECK-NEXT:    ret
662  %splat = call <vscale x 32 x i32> @llvm.experimental.vp.splat.nxv32i32(i32 %val, <vscale x 32 x i1> %m, i32 %evl)
663  ret <vscale x 32 x i32> %splat
664}
665