xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/vsplats-i1.ll (revision d8d131dfa99762ccdd2116661980b7d0493cd7b5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
4
5define <vscale x 1 x i1> @vsplat_nxv1i1_0() {
6; CHECK-LABEL: vsplat_nxv1i1_0:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
9; CHECK-NEXT:    vmclr.m v0
10; CHECK-NEXT:    ret
11  ret <vscale x 1 x i1> splat (i1 0)
12}
13
14define <vscale x 1 x i1> @vsplat_nxv1i1_1() {
15; CHECK-LABEL: vsplat_nxv1i1_1:
16; CHECK:       # %bb.0:
17; CHECK-NEXT:    vsetvli a0, zero, e8, mf8, ta, ma
18; CHECK-NEXT:    vmset.m v0
19; CHECK-NEXT:    ret
20  ret <vscale x 1 x i1> splat (i1 -1)
21}
22
23define <vscale x 1 x i1> @vsplat_nxv1i1_2(i1 %x) {
24; CHECK-LABEL: vsplat_nxv1i1_2:
25; CHECK:       # %bb.0:
26; CHECK-NEXT:    andi a0, a0, 1
27; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, ma
28; CHECK-NEXT:    vmv.v.x v8, a0
29; CHECK-NEXT:    vmsne.vi v0, v8, 0
30; CHECK-NEXT:    ret
31  %head = insertelement <vscale x 1 x i1> poison, i1 %x, i32 0
32  %splat = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
33  ret <vscale x 1 x i1> %splat
34}
35
36define <vscale x 1 x i1> @vsplat_nxv1i1_3(i32 signext %x, i32 signext %y) {
37; CHECK-LABEL: vsplat_nxv1i1_3:
38; CHECK:       # %bb.0:
39; CHECK-NEXT:    xor a0, a0, a1
40; CHECK-NEXT:    snez a0, a0
41; CHECK-NEXT:    vsetvli a1, zero, e8, mf8, ta, ma
42; CHECK-NEXT:    vmv.v.x v8, a0
43; CHECK-NEXT:    vmsne.vi v0, v8, 0
44; CHECK-NEXT:    ret
45  %c = icmp ne i32 %x, %y
46  %head = insertelement <vscale x 1 x i1> poison, i1 %c, i32 0
47  %splat = shufflevector <vscale x 1 x i1> %head, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer
48  ret <vscale x 1 x i1> %splat
49}
50
51define <vscale x 2 x i1> @vsplat_nxv2i1_0() {
52; CHECK-LABEL: vsplat_nxv2i1_0:
53; CHECK:       # %bb.0:
54; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
55; CHECK-NEXT:    vmclr.m v0
56; CHECK-NEXT:    ret
57  ret <vscale x 2 x i1> splat (i1 0)
58}
59
60define <vscale x 2 x i1> @vsplat_nxv2i1_1() {
61; CHECK-LABEL: vsplat_nxv2i1_1:
62; CHECK:       # %bb.0:
63; CHECK-NEXT:    vsetvli a0, zero, e8, mf4, ta, ma
64; CHECK-NEXT:    vmset.m v0
65; CHECK-NEXT:    ret
66  ret <vscale x 2 x i1> splat (i1 -1)
67}
68
69define <vscale x 2 x i1> @vsplat_nxv2i1_2(i1 %x) {
70; CHECK-LABEL: vsplat_nxv2i1_2:
71; CHECK:       # %bb.0:
72; CHECK-NEXT:    andi a0, a0, 1
73; CHECK-NEXT:    vsetvli a1, zero, e8, mf4, ta, ma
74; CHECK-NEXT:    vmv.v.x v8, a0
75; CHECK-NEXT:    vmsne.vi v0, v8, 0
76; CHECK-NEXT:    ret
77  %head = insertelement <vscale x 2 x i1> poison, i1 %x, i32 0
78  %splat = shufflevector <vscale x 2 x i1> %head, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer
79  ret <vscale x 2 x i1> %splat
80}
81
82define <vscale x 4 x i1> @vsplat_nxv4i1_0() {
83; CHECK-LABEL: vsplat_nxv4i1_0:
84; CHECK:       # %bb.0:
85; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
86; CHECK-NEXT:    vmclr.m v0
87; CHECK-NEXT:    ret
88  ret <vscale x 4 x i1> splat (i1 0)
89}
90
91define <vscale x 4 x i1> @vsplat_nxv4i1_1() {
92; CHECK-LABEL: vsplat_nxv4i1_1:
93; CHECK:       # %bb.0:
94; CHECK-NEXT:    vsetvli a0, zero, e8, mf2, ta, ma
95; CHECK-NEXT:    vmset.m v0
96; CHECK-NEXT:    ret
97  ret <vscale x 4 x i1> splat (i1 -1)
98}
99
100define <vscale x 4 x i1> @vsplat_nxv4i1_2(i1 %x) {
101; CHECK-LABEL: vsplat_nxv4i1_2:
102; CHECK:       # %bb.0:
103; CHECK-NEXT:    andi a0, a0, 1
104; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, ma
105; CHECK-NEXT:    vmv.v.x v8, a0
106; CHECK-NEXT:    vmsne.vi v0, v8, 0
107; CHECK-NEXT:    ret
108  %head = insertelement <vscale x 4 x i1> poison, i1 %x, i32 0
109  %splat = shufflevector <vscale x 4 x i1> %head, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
110  ret <vscale x 4 x i1> %splat
111}
112
113define <vscale x 8 x i1> @vsplat_nxv8i1_0() {
114; CHECK-LABEL: vsplat_nxv8i1_0:
115; CHECK:       # %bb.0:
116; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
117; CHECK-NEXT:    vmclr.m v0
118; CHECK-NEXT:    ret
119  ret <vscale x 8 x i1> splat (i1 0)
120}
121
122define <vscale x 8 x i1> @vsplat_nxv8i1_1() {
123; CHECK-LABEL: vsplat_nxv8i1_1:
124; CHECK:       # %bb.0:
125; CHECK-NEXT:    vsetvli a0, zero, e8, m1, ta, ma
126; CHECK-NEXT:    vmset.m v0
127; CHECK-NEXT:    ret
128  ret <vscale x 8 x i1> splat (i1 -1)
129}
130
131define <vscale x 8 x i1> @vsplat_nxv8i1_2(i1 %x) {
132; CHECK-LABEL: vsplat_nxv8i1_2:
133; CHECK:       # %bb.0:
134; CHECK-NEXT:    andi a0, a0, 1
135; CHECK-NEXT:    vsetvli a1, zero, e8, m1, ta, ma
136; CHECK-NEXT:    vmv.v.x v8, a0
137; CHECK-NEXT:    vmsne.vi v0, v8, 0
138; CHECK-NEXT:    ret
139  %head = insertelement <vscale x 8 x i1> poison, i1 %x, i32 0
140  %splat = shufflevector <vscale x 8 x i1> %head, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer
141  ret <vscale x 8 x i1> %splat
142}
143
144define <vscale x 16 x i1> @vsplat_nxv16i1_0() {
145; CHECK-LABEL: vsplat_nxv16i1_0:
146; CHECK:       # %bb.0:
147; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
148; CHECK-NEXT:    vmclr.m v0
149; CHECK-NEXT:    ret
150  ret <vscale x 16 x i1> splat (i1 0)
151}
152
153define <vscale x 16 x i1> @vsplat_nxv16i1_1() {
154; CHECK-LABEL: vsplat_nxv16i1_1:
155; CHECK:       # %bb.0:
156; CHECK-NEXT:    vsetvli a0, zero, e8, m2, ta, ma
157; CHECK-NEXT:    vmset.m v0
158; CHECK-NEXT:    ret
159  ret <vscale x 16 x i1> splat (i1 -1)
160}
161
162define <vscale x 16 x i1> @vsplat_nxv16i1_2(i1 %x) {
163; CHECK-LABEL: vsplat_nxv16i1_2:
164; CHECK:       # %bb.0:
165; CHECK-NEXT:    andi a0, a0, 1
166; CHECK-NEXT:    vsetvli a1, zero, e8, m2, ta, ma
167; CHECK-NEXT:    vmv.v.x v8, a0
168; CHECK-NEXT:    vmsne.vi v0, v8, 0
169; CHECK-NEXT:    ret
170  %head = insertelement <vscale x 16 x i1> poison, i1 %x, i32 0
171  %splat = shufflevector <vscale x 16 x i1> %head, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer
172  ret <vscale x 16 x i1> %splat
173}
174
175define <vscale x 4 x i1> @splat_idx_nxv4i32(<vscale x 4 x i1> %v, i64 %idx) {
176; CHECK-LABEL: splat_idx_nxv4i32:
177; CHECK:       # %bb.0:
178; CHECK-NEXT:    vsetvli a1, zero, e8, mf2, ta, ma
179; CHECK-NEXT:    vmv.v.i v8, 0
180; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
181; CHECK-NEXT:    vslidedown.vx v8, v8, a0
182; CHECK-NEXT:    vmv.x.s a0, v8
183; CHECK-NEXT:    andi a0, a0, 1
184; CHECK-NEXT:    vmv.v.x v8, a0
185; CHECK-NEXT:    vmsne.vi v0, v8, 0
186; CHECK-NEXT:    ret
187  %x = extractelement <vscale x 4 x i1> %v, i64 %idx
188  %ins = insertelement <vscale x 4 x i1> poison, i1 %x, i32 0
189  %splat = shufflevector <vscale x 4 x i1> %ins, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer
190  ret <vscale x 4 x i1> %splat
191}
192