xref: /llvm-project/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-mask-splat.ll (revision 675e7bd1b94f78f0567b4327f187841c0cde36f9)
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 --check-prefixes=CHECK,RV32
3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
4
5define void @splat_ones_v1i1(ptr %x) {
6; CHECK-LABEL: splat_ones_v1i1:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    li a1, 1
9; CHECK-NEXT:    sb a1, 0(a0)
10; CHECK-NEXT:    ret
11  store <1 x i1> <i1 1>, ptr %x
12  ret void
13}
14
15define void @splat_zeros_v2i1(ptr %x) {
16; CHECK-LABEL: splat_zeros_v2i1:
17; CHECK:       # %bb.0:
18; CHECK-NEXT:    sb zero, 0(a0)
19; CHECK-NEXT:    ret
20  store <2 x i1> zeroinitializer, ptr %x
21  ret void
22}
23
24define void @splat_v1i1(ptr %x, i1 %y) {
25; CHECK-LABEL: splat_v1i1:
26; CHECK:       # %bb.0:
27; CHECK-NEXT:    andi a1, a1, 1
28; CHECK-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
29; CHECK-NEXT:    vmv.s.x v8, a1
30; CHECK-NEXT:    vmsne.vi v0, v8, 0
31; CHECK-NEXT:    vmv.s.x v8, zero
32; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
33; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
34; CHECK-NEXT:    vmv.v.i v9, 0
35; CHECK-NEXT:    vsetivli zero, 1, e8, mf2, tu, ma
36; CHECK-NEXT:    vmv.v.v v9, v8
37; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
38; CHECK-NEXT:    vmsne.vi v8, v9, 0
39; CHECK-NEXT:    vsm.v v8, (a0)
40; CHECK-NEXT:    ret
41  %a = insertelement <1 x i1> poison, i1 %y, i32 0
42  %b = shufflevector <1 x i1> %a, <1 x i1> poison, <1 x i32> zeroinitializer
43  store <1 x i1> %b, ptr %x
44  ret void
45}
46
47define void @splat_v1i1_icmp(ptr %x, i32 signext %y, i32 signext %z) {
48; CHECK-LABEL: splat_v1i1_icmp:
49; CHECK:       # %bb.0:
50; CHECK-NEXT:    xor a1, a1, a2
51; CHECK-NEXT:    seqz a1, a1
52; CHECK-NEXT:    vsetivli zero, 1, e8, mf8, ta, ma
53; CHECK-NEXT:    vmv.s.x v8, a1
54; CHECK-NEXT:    vmsne.vi v0, v8, 0
55; CHECK-NEXT:    vmv.s.x v8, zero
56; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
57; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
58; CHECK-NEXT:    vmv.v.i v9, 0
59; CHECK-NEXT:    vsetivli zero, 1, e8, mf2, tu, ma
60; CHECK-NEXT:    vmv.v.v v9, v8
61; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
62; CHECK-NEXT:    vmsne.vi v8, v9, 0
63; CHECK-NEXT:    vsm.v v8, (a0)
64; CHECK-NEXT:    ret
65  %c = icmp eq i32 %y, %z
66  %a = insertelement <1 x i1> poison, i1 %c, i32 0
67  %b = shufflevector <1 x i1> %a, <1 x i1> poison, <1 x i32> zeroinitializer
68  store <1 x i1> %b, ptr %x
69  ret void
70}
71
72define void @splat_ones_v4i1(ptr %x) {
73; CHECK-LABEL: splat_ones_v4i1:
74; CHECK:       # %bb.0:
75; CHECK-NEXT:    li a1, 15
76; CHECK-NEXT:    sb a1, 0(a0)
77; CHECK-NEXT:    ret
78  store <4 x i1> <i1 1, i1 1, i1 1, i1 1>, ptr %x
79  ret void
80}
81
82define void @splat_v4i1(ptr %x, i1 %y) {
83; CHECK-LABEL: splat_v4i1:
84; CHECK:       # %bb.0:
85; CHECK-NEXT:    andi a1, a1, 1
86; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
87; CHECK-NEXT:    vmv.v.x v8, a1
88; CHECK-NEXT:    vmsne.vi v0, v8, 0
89; CHECK-NEXT:    vmv.v.i v8, 0
90; CHECK-NEXT:    vmerge.vim v8, v8, 1, v0
91; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
92; CHECK-NEXT:    vmv.v.i v9, 0
93; CHECK-NEXT:    vsetivli zero, 4, e8, mf2, tu, ma
94; CHECK-NEXT:    vmv.v.v v9, v8
95; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
96; CHECK-NEXT:    vmsne.vi v8, v9, 0
97; CHECK-NEXT:    vsm.v v8, (a0)
98; CHECK-NEXT:    ret
99  %a = insertelement <4 x i1> poison, i1 %y, i32 0
100  %b = shufflevector <4 x i1> %a, <4 x i1> poison, <4 x i32> zeroinitializer
101  store <4 x i1> %b, ptr %x
102  ret void
103}
104
105define void @splat_zeros_v8i1(ptr %x) {
106; CHECK-LABEL: splat_zeros_v8i1:
107; CHECK:       # %bb.0:
108; CHECK-NEXT:    sb zero, 0(a0)
109; CHECK-NEXT:    ret
110  store <8 x i1> zeroinitializer, ptr %x
111  ret void
112}
113
114define void @splat_v8i1(ptr %x, i1 %y) {
115; CHECK-LABEL: splat_v8i1:
116; CHECK:       # %bb.0:
117; CHECK-NEXT:    andi a1, a1, 1
118; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
119; CHECK-NEXT:    vmv.v.x v8, a1
120; CHECK-NEXT:    vmsne.vi v8, v8, 0
121; CHECK-NEXT:    vsm.v v8, (a0)
122; CHECK-NEXT:    ret
123  %a = insertelement <8 x i1> poison, i1 %y, i32 0
124  %b = shufflevector <8 x i1> %a, <8 x i1> poison, <8 x i32> zeroinitializer
125  store <8 x i1> %b, ptr %x
126  ret void
127}
128
129define void @splat_ones_v16i1(ptr %x) {
130; CHECK-LABEL: splat_ones_v16i1:
131; CHECK:       # %bb.0:
132; CHECK-NEXT:    li a1, -1
133; CHECK-NEXT:    sh a1, 0(a0)
134; CHECK-NEXT:    ret
135  store <16 x i1> <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, ptr %x
136  ret void
137}
138
139define void @splat_v16i1(ptr %x, i1 %y) {
140; CHECK-LABEL: splat_v16i1:
141; CHECK:       # %bb.0:
142; CHECK-NEXT:    andi a1, a1, 1
143; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
144; CHECK-NEXT:    vmv.v.x v8, a1
145; CHECK-NEXT:    vmsne.vi v8, v8, 0
146; CHECK-NEXT:    vsm.v v8, (a0)
147; CHECK-NEXT:    ret
148  %a = insertelement <16 x i1> poison, i1 %y, i32 0
149  %b = shufflevector <16 x i1> %a, <16 x i1> poison, <16 x i32> zeroinitializer
150  store <16 x i1> %b, ptr %x
151  ret void
152}
153
154define void @splat_zeros_v32i1(ptr %x) {
155; CHECK-LABEL: splat_zeros_v32i1:
156; CHECK:       # %bb.0:
157; CHECK-NEXT:    sw zero, 0(a0)
158; CHECK-NEXT:    ret
159  store <32 x i1> zeroinitializer, ptr %x
160  ret void
161}
162
163define void @splat_v32i1(ptr %x, i1 %y) {
164; CHECK-LABEL: splat_v32i1:
165; CHECK:       # %bb.0:
166; CHECK-NEXT:    andi a1, a1, 1
167; CHECK-NEXT:    li a2, 32
168; CHECK-NEXT:    vsetvli zero, a2, e8, m2, ta, ma
169; CHECK-NEXT:    vmv.v.x v8, a1
170; CHECK-NEXT:    vmsne.vi v10, v8, 0
171; CHECK-NEXT:    vsm.v v10, (a0)
172; CHECK-NEXT:    ret
173  %a = insertelement <32 x i1> poison, i1 %y, i32 0
174  %b = shufflevector <32 x i1> %a, <32 x i1> poison, <32 x i32> zeroinitializer
175  store <32 x i1> %b, ptr %x
176  ret void
177}
178
179define void @splat_ones_v64i1(ptr %x) {
180; RV32-LABEL: splat_ones_v64i1:
181; RV32:       # %bb.0:
182; RV32-NEXT:    li a1, 64
183; RV32-NEXT:    vsetvli zero, a1, e8, m4, ta, ma
184; RV32-NEXT:    vmset.m v8
185; RV32-NEXT:    vsm.v v8, (a0)
186; RV32-NEXT:    ret
187;
188; RV64-LABEL: splat_ones_v64i1:
189; RV64:       # %bb.0:
190; RV64-NEXT:    li a1, -1
191; RV64-NEXT:    sd a1, 0(a0)
192; RV64-NEXT:    ret
193  store <64 x i1> <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, ptr %x
194  ret void
195}
196
197define void @splat_v64i1(ptr %x, i1 %y) {
198; CHECK-LABEL: splat_v64i1:
199; CHECK:       # %bb.0:
200; CHECK-NEXT:    andi a1, a1, 1
201; CHECK-NEXT:    li a2, 64
202; CHECK-NEXT:    vsetvli zero, a2, e8, m4, ta, ma
203; CHECK-NEXT:    vmv.v.x v8, a1
204; CHECK-NEXT:    vmsne.vi v12, v8, 0
205; CHECK-NEXT:    vsm.v v12, (a0)
206; CHECK-NEXT:    ret
207  %a = insertelement <64 x i1> poison, i1 %y, i32 0
208  %b = shufflevector <64 x i1> %a, <64 x i1> poison, <64 x i32> zeroinitializer
209  store <64 x i1> %b, ptr %x
210  ret void
211}
212