1; RUN: llc < %s -mtriple=ve-unknown-unknown -mattr=+vpu | FileCheck %s
2
3; ISA-compatible vector broadcasts
4define fastcc <256 x i64> @brd_v256i64(i64 %s) {
5; CHECK-LABEL: brd_v256i64:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    lea %s1, 256
8; CHECK-NEXT:    lvl %s1
9; CHECK-NEXT:    vbrd %v0, %s0
10; CHECK-NEXT:    b.l.t (, %s10)
11  %val = insertelement <256 x i64> undef, i64 %s, i32 0
12  %ret = shufflevector <256 x i64> %val, <256 x i64> undef, <256 x i32> zeroinitializer
13  ret <256 x i64> %ret
14}
15
16define fastcc <256 x i64> @brdi_v256i64() {
17; CHECK-LABEL: brdi_v256i64:
18; CHECK:       # %bb.0:
19; CHECK-NEXT:    lea %s0, 256
20; CHECK-NEXT:    lvl %s0
21; CHECK-NEXT:    vbrd %v0, 1
22; CHECK-NEXT:    b.l.t (, %s10)
23  %val = insertelement <256 x i64> undef, i64 1, i32 0
24  %ret = shufflevector <256 x i64> %val, <256 x i64> undef, <256 x i32> zeroinitializer
25  ret <256 x i64> %ret
26}
27
28define fastcc <256 x double> @brd_v256f64(double %s) {
29; CHECK-LABEL: brd_v256f64:
30; CHECK:       # %bb.0:
31; CHECK-NEXT:    lea %s1, 256
32; CHECK-NEXT:    lvl %s1
33; CHECK-NEXT:    vbrd %v0, %s0
34; CHECK-NEXT:    b.l.t (, %s10)
35  %val = insertelement <256 x double> undef, double %s, i32 0
36  %ret = shufflevector <256 x double> %val, <256 x double> undef, <256 x i32> zeroinitializer
37  ret <256 x double> %ret
38}
39
40define fastcc <256 x double> @brdi_v256f64() {
41; CHECK-LABEL: brdi_v256f64:
42; CHECK:       # %bb.0:
43; CHECK-NEXT:    lea %s0, 256
44; CHECK-NEXT:    lvl %s0
45; CHECK-NEXT:    vbrd %v0, 0
46; CHECK-NEXT:    b.l.t (, %s10)
47  %val = insertelement <256 x double> undef, double 0.e+00, i32 0
48  %ret = shufflevector <256 x double> %val, <256 x double> undef, <256 x i32> zeroinitializer
49  ret <256 x double> %ret
50}
51
52define fastcc <256 x i32> @brd_v256i32(i32 %s) {
53; CHECK-LABEL: brd_v256i32:
54; CHECK:       # %bb.0:
55; CHECK-NEXT:    and %s0, %s0, (32)0
56; CHECK-NEXT:    lea %s1, 256
57; CHECK-NEXT:    lvl %s1
58; CHECK-NEXT:    vbrd %v0, %s0
59; CHECK-NEXT:    b.l.t (, %s10)
60  %val = insertelement <256 x i32> undef, i32 %s, i32 0
61  %ret = shufflevector <256 x i32> %val, <256 x i32> undef, <256 x i32> zeroinitializer
62  ret <256 x i32> %ret
63}
64
65define fastcc <256 x i32> @brdi_v256i32(i32 %s) {
66; CHECK-LABEL: brdi_v256i32:
67; CHECK:       # %bb.0:
68; CHECK-NEXT:    lea %s0, 256
69; CHECK-NEXT:    lvl %s0
70; CHECK-NEXT:    vbrd %v0, 13
71; CHECK-NEXT:    b.l.t (, %s10)
72  %val = insertelement <256 x i32> undef, i32 13, i32 0
73  %ret = shufflevector <256 x i32> %val, <256 x i32> undef, <256 x i32> zeroinitializer
74  ret <256 x i32> %ret
75}
76
77define fastcc <256 x float> @brd_v256f32(float %s) {
78; CHECK-LABEL: brd_v256f32:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    lea %s1, 256
81; CHECK-NEXT:    lvl %s1
82; CHECK-NEXT:    vbrd %v0, %s0
83; CHECK-NEXT:    b.l.t (, %s10)
84  %val = insertelement <256 x float> undef, float %s, i32 0
85  %ret = shufflevector <256 x float> %val, <256 x float> undef, <256 x i32> zeroinitializer
86  ret <256 x float> %ret
87}
88
89define fastcc <256 x float> @brdi_v256f32(float %s) {
90; CHECK-LABEL: brdi_v256f32:
91; CHECK:       # %bb.0:
92; CHECK-NEXT:    lea %s0, 256
93; CHECK-NEXT:    lvl %s0
94; CHECK-NEXT:    vbrd %v0, 0
95; CHECK-NEXT:    b.l.t (, %s10)
96  %val = insertelement <256 x float> undef, float 0.e+00, i32 0
97  %ret = shufflevector <256 x float> %val, <256 x float> undef, <256 x i32> zeroinitializer
98  ret <256 x float> %ret
99}
100
101
102; Shorter vectors, we expect these to be widened (for now).
103define fastcc <128 x i64> @brd_v128i64(i64 %s) {
104; CHECK-LABEL: brd_v128i64:
105; CHECK:       # %bb.0:
106; CHECK-NEXT:    lea %s1, 256
107; CHECK-NEXT:    lvl %s1
108; CHECK-NEXT:    vbrd %v0, %s0
109; CHECK-NEXT:    b.l.t (, %s10)
110  %val = insertelement <128 x i64> undef, i64 %s, i32 0
111  %ret = shufflevector <128 x i64> %val, <128 x i64> undef, <128 x i32> zeroinitializer
112  ret <128 x i64> %ret
113}
114
115define fastcc <128 x double> @brd_v128f64(double %s) {
116; CHECK-LABEL: brd_v128f64:
117; CHECK:       # %bb.0:
118; CHECK-NEXT:    lea %s1, 256
119; CHECK-NEXT:    lvl %s1
120; CHECK-NEXT:    vbrd %v0, %s0
121; CHECK-NEXT:    b.l.t (, %s10)
122  %val = insertelement <128 x double> undef, double %s, i32 0
123  %ret = shufflevector <128 x double> %val, <128 x double> undef, <128 x i32> zeroinitializer
124  ret <128 x double> %ret
125}
126
127define fastcc <128 x i32> @brd_v128i32(i32 %s) {
128; CHECK-LABEL: brd_v128i32:
129; CHECK:       # %bb.0:
130; CHECK-NEXT:    and %s0, %s0, (32)0
131; CHECK-NEXT:    lea %s1, 256
132; CHECK-NEXT:    lvl %s1
133; CHECK-NEXT:    vbrd %v0, %s0
134; CHECK-NEXT:    b.l.t (, %s10)
135  %val = insertelement <128 x i32> undef, i32 %s, i32 0
136  %ret = shufflevector <128 x i32> %val, <128 x i32> undef, <128 x i32> zeroinitializer
137  ret <128 x i32> %ret
138}
139
140define fastcc <128 x i32> @brdi_v128i32(i32 %s) {
141; CHECK-LABEL: brdi_v128i32:
142; CHECK:       # %bb.0:
143; CHECK-NEXT:    lea %s0, 256
144; CHECK-NEXT:    lvl %s0
145; CHECK-NEXT:    vbrd %v0, 13
146; CHECK-NEXT:    b.l.t (, %s10)
147  %val = insertelement <128 x i32> undef, i32 13, i32 0
148  %ret = shufflevector <128 x i32> %val, <128 x i32> undef, <128 x i32> zeroinitializer
149  ret <128 x i32> %ret
150}
151
152define fastcc <128 x float> @brd_v128f32(float %s) {
153; CHECK-LABEL: brd_v128f32:
154; CHECK:       # %bb.0:
155; CHECK-NEXT:    lea %s1, 256
156; CHECK-NEXT:    lvl %s1
157; CHECK-NEXT:    vbrd %v0, %s0
158; CHECK-NEXT:    b.l.t (, %s10)
159  %val = insertelement <128 x float> undef, float %s, i32 0
160  %ret = shufflevector <128 x float> %val, <128 x float> undef, <128 x i32> zeroinitializer
161  ret <128 x float> %ret
162}
163
164define fastcc <128 x float> @brdi_v128f32(float %s) {
165; CHECK-LABEL: brdi_v128f32:
166; CHECK:       # %bb.0:
167; CHECK-NEXT:    lea %s0, 256
168; CHECK-NEXT:    lvl %s0
169; CHECK-NEXT:    vbrd %v0, 0
170; CHECK-NEXT:    b.l.t (, %s10)
171  %val = insertelement <128 x float> undef, float 0.e+00, i32 0
172  %ret = shufflevector <128 x float> %val, <128 x float> undef, <128 x i32> zeroinitializer
173  ret <128 x float> %ret
174}
175
176; Vectors with small element types and valid element count, we expect those to be promoted.
177define fastcc <256 x i16> @brd_v256i16(i16 %s) {
178; CHECK-LABEL: brd_v256i16:
179; CHECK:       # %bb.0:
180; CHECK-NEXT:    and %s0, %s0, (32)0
181; CHECK-NEXT:    lea %s1, 256
182; CHECK-NEXT:    lvl %s1
183; CHECK-NEXT:    vbrd %v0, %s0
184; CHECK-NEXT:    b.l.t (, %s10)
185  %val = insertelement <256 x i16> undef, i16 %s, i32 0
186  %ret = shufflevector <256 x i16> %val, <256 x i16> undef, <256 x i32> zeroinitializer
187  ret <256 x i16> %ret
188}
189
190; Vectors with small element types and low element count, these are scalarized for now.
191; FIXME Promote + Widen
192define fastcc <128 x i16> @brd_v128i16(i16 %s) {
193; CHECK-LABEL: brd_v128i16:
194; CHECK:       # %bb.0:
195; CHECK-NEXT:    and %s1, %s1, (32)0
196; CHECK-NEXT:    st2b %s1, 254(, %s0)
197; CHECK-NEXT:    st2b %s1, 252(, %s0)
198; CHECK-NEXT:    st2b %s1, 250(, %s0)
199; CHECK-NEXT:    st2b %s1, 248(, %s0)
200; CHECK-NEXT:    st2b %s1, 246(, %s0)
201; CHECK-NEXT:    st2b %s1, 244(, %s0)
202; CHECK-NEXT:    st2b %s1, 242(, %s0)
203; CHECK-NEXT:    st2b %s1, 240(, %s0)
204; CHECK-NEXT:    st2b %s1, 238(, %s0)
205; CHECK-NEXT:    st2b %s1, 236(, %s0)
206; CHECK-NEXT:    st2b %s1, 234(, %s0)
207; CHECK-NEXT:    st2b %s1, 232(, %s0)
208; CHECK-NEXT:    st2b %s1, 230(, %s0)
209; CHECK-NEXT:    st2b %s1, 228(, %s0)
210; CHECK-NEXT:    st2b %s1, 226(, %s0)
211; CHECK-NEXT:    st2b %s1, 224(, %s0)
212; CHECK-NEXT:    st2b %s1, 222(, %s0)
213; CHECK-NEXT:    st2b %s1, 220(, %s0)
214; CHECK-NEXT:    st2b %s1, 218(, %s0)
215; CHECK-NEXT:    st2b %s1, 216(, %s0)
216; CHECK-NEXT:    st2b %s1, 214(, %s0)
217; CHECK-NEXT:    st2b %s1, 212(, %s0)
218; CHECK-NEXT:    st2b %s1, 210(, %s0)
219; CHECK-NEXT:    st2b %s1, 208(, %s0)
220; CHECK-NEXT:    st2b %s1, 206(, %s0)
221; CHECK-NEXT:    st2b %s1, 204(, %s0)
222; CHECK-NEXT:    st2b %s1, 202(, %s0)
223; CHECK-NEXT:    st2b %s1, 200(, %s0)
224; CHECK-NEXT:    st2b %s1, 198(, %s0)
225; CHECK-NEXT:    st2b %s1, 196(, %s0)
226; CHECK-NEXT:    st2b %s1, 194(, %s0)
227; CHECK-NEXT:    st2b %s1, 192(, %s0)
228; CHECK-NEXT:    st2b %s1, 190(, %s0)
229; CHECK-NEXT:    st2b %s1, 188(, %s0)
230; CHECK-NEXT:    st2b %s1, 186(, %s0)
231; CHECK-NEXT:    st2b %s1, 184(, %s0)
232; CHECK-NEXT:    st2b %s1, 182(, %s0)
233; CHECK-NEXT:    st2b %s1, 180(, %s0)
234; CHECK-NEXT:    st2b %s1, 178(, %s0)
235; CHECK-NEXT:    st2b %s1, 176(, %s0)
236; CHECK-NEXT:    st2b %s1, 174(, %s0)
237; CHECK-NEXT:    st2b %s1, 172(, %s0)
238; CHECK-NEXT:    st2b %s1, 170(, %s0)
239; CHECK-NEXT:    st2b %s1, 168(, %s0)
240; CHECK-NEXT:    st2b %s1, 166(, %s0)
241; CHECK-NEXT:    st2b %s1, 164(, %s0)
242; CHECK-NEXT:    st2b %s1, 162(, %s0)
243; CHECK-NEXT:    st2b %s1, 160(, %s0)
244; CHECK-NEXT:    st2b %s1, 158(, %s0)
245; CHECK-NEXT:    st2b %s1, 156(, %s0)
246; CHECK-NEXT:    st2b %s1, 154(, %s0)
247; CHECK-NEXT:    st2b %s1, 152(, %s0)
248; CHECK-NEXT:    st2b %s1, 150(, %s0)
249; CHECK-NEXT:    st2b %s1, 148(, %s0)
250; CHECK-NEXT:    st2b %s1, 146(, %s0)
251; CHECK-NEXT:    st2b %s1, 144(, %s0)
252; CHECK-NEXT:    st2b %s1, 142(, %s0)
253; CHECK-NEXT:    st2b %s1, 140(, %s0)
254; CHECK-NEXT:    st2b %s1, 138(, %s0)
255; CHECK-NEXT:    st2b %s1, 136(, %s0)
256; CHECK-NEXT:    st2b %s1, 134(, %s0)
257; CHECK-NEXT:    st2b %s1, 132(, %s0)
258; CHECK-NEXT:    st2b %s1, 130(, %s0)
259; CHECK-NEXT:    st2b %s1, 128(, %s0)
260; CHECK-NEXT:    st2b %s1, 126(, %s0)
261; CHECK-NEXT:    st2b %s1, 124(, %s0)
262; CHECK-NEXT:    st2b %s1, 122(, %s0)
263; CHECK-NEXT:    st2b %s1, 120(, %s0)
264; CHECK-NEXT:    st2b %s1, 118(, %s0)
265; CHECK-NEXT:    st2b %s1, 116(, %s0)
266; CHECK-NEXT:    st2b %s1, 114(, %s0)
267; CHECK-NEXT:    st2b %s1, 112(, %s0)
268; CHECK-NEXT:    st2b %s1, 110(, %s0)
269; CHECK-NEXT:    st2b %s1, 108(, %s0)
270; CHECK-NEXT:    st2b %s1, 106(, %s0)
271; CHECK-NEXT:    st2b %s1, 104(, %s0)
272; CHECK-NEXT:    st2b %s1, 102(, %s0)
273; CHECK-NEXT:    st2b %s1, 100(, %s0)
274; CHECK-NEXT:    st2b %s1, 98(, %s0)
275; CHECK-NEXT:    st2b %s1, 96(, %s0)
276; CHECK-NEXT:    st2b %s1, 94(, %s0)
277; CHECK-NEXT:    st2b %s1, 92(, %s0)
278; CHECK-NEXT:    st2b %s1, 90(, %s0)
279; CHECK-NEXT:    st2b %s1, 88(, %s0)
280; CHECK-NEXT:    st2b %s1, 86(, %s0)
281; CHECK-NEXT:    st2b %s1, 84(, %s0)
282; CHECK-NEXT:    st2b %s1, 82(, %s0)
283; CHECK-NEXT:    st2b %s1, 80(, %s0)
284; CHECK-NEXT:    st2b %s1, 78(, %s0)
285; CHECK-NEXT:    st2b %s1, 76(, %s0)
286; CHECK-NEXT:    st2b %s1, 74(, %s0)
287; CHECK-NEXT:    st2b %s1, 72(, %s0)
288; CHECK-NEXT:    st2b %s1, 70(, %s0)
289; CHECK-NEXT:    st2b %s1, 68(, %s0)
290; CHECK-NEXT:    st2b %s1, 66(, %s0)
291; CHECK-NEXT:    st2b %s1, 64(, %s0)
292; CHECK-NEXT:    st2b %s1, 62(, %s0)
293; CHECK-NEXT:    st2b %s1, 60(, %s0)
294; CHECK-NEXT:    st2b %s1, 58(, %s0)
295; CHECK-NEXT:    st2b %s1, 56(, %s0)
296; CHECK-NEXT:    st2b %s1, 54(, %s0)
297; CHECK-NEXT:    st2b %s1, 52(, %s0)
298; CHECK-NEXT:    st2b %s1, 50(, %s0)
299; CHECK-NEXT:    st2b %s1, 48(, %s0)
300; CHECK-NEXT:    st2b %s1, 46(, %s0)
301; CHECK-NEXT:    st2b %s1, 44(, %s0)
302; CHECK-NEXT:    st2b %s1, 42(, %s0)
303; CHECK-NEXT:    st2b %s1, 40(, %s0)
304; CHECK-NEXT:    st2b %s1, 38(, %s0)
305; CHECK-NEXT:    st2b %s1, 36(, %s0)
306; CHECK-NEXT:    st2b %s1, 34(, %s0)
307; CHECK-NEXT:    st2b %s1, 32(, %s0)
308; CHECK-NEXT:    st2b %s1, 30(, %s0)
309; CHECK-NEXT:    st2b %s1, 28(, %s0)
310; CHECK-NEXT:    st2b %s1, 26(, %s0)
311; CHECK-NEXT:    st2b %s1, 24(, %s0)
312; CHECK-NEXT:    st2b %s1, 22(, %s0)
313; CHECK-NEXT:    st2b %s1, 20(, %s0)
314; CHECK-NEXT:    st2b %s1, 18(, %s0)
315; CHECK-NEXT:    st2b %s1, 16(, %s0)
316; CHECK-NEXT:    st2b %s1, 14(, %s0)
317; CHECK-NEXT:    st2b %s1, 12(, %s0)
318; CHECK-NEXT:    st2b %s1, 10(, %s0)
319; CHECK-NEXT:    st2b %s1, 8(, %s0)
320; CHECK-NEXT:    st2b %s1, 6(, %s0)
321; CHECK-NEXT:    st2b %s1, 4(, %s0)
322; CHECK-NEXT:    st2b %s1, 2(, %s0)
323; CHECK-NEXT:    st2b %s1, (, %s0)
324; CHECK-NEXT:    b.l.t (, %s10)
325  %val = insertelement <128 x i16> undef, i16 %s, i32 0
326  %ret = shufflevector <128 x i16> %val, <128 x i16> undef, <128 x i32> zeroinitializer
327  ret <128 x i16> %ret
328}
329