xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/vdup.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -float-abi=soft -mattr=+neon -verify-machineinstrs %s -o - \
2*9880d681SAndroid Build Coastguard Worker; RUN:	| FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_dup8(i8 %A) nounwind {
5*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup8:
6*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8
7*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i8> zeroinitializer, i8 %A, i32 0
8*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <8 x i8> %tmp1, i8 %A, i32 1
9*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <8 x i8> %tmp2, i8 %A, i32 2
10*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <8 x i8> %tmp3, i8 %A, i32 3
11*9880d681SAndroid Build Coastguard Worker	%tmp5 = insertelement <8 x i8> %tmp4, i8 %A, i32 4
12*9880d681SAndroid Build Coastguard Worker	%tmp6 = insertelement <8 x i8> %tmp5, i8 %A, i32 5
13*9880d681SAndroid Build Coastguard Worker	%tmp7 = insertelement <8 x i8> %tmp6, i8 %A, i32 6
14*9880d681SAndroid Build Coastguard Worker	%tmp8 = insertelement <8 x i8> %tmp7, i8 %A, i32 7
15*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp8
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_dup16(i16 %A) nounwind {
19*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup16:
20*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16
21*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i16> zeroinitializer, i16 %A, i32 0
22*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <4 x i16> %tmp1, i16 %A, i32 1
23*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <4 x i16> %tmp2, i16 %A, i32 2
24*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <4 x i16> %tmp3, i16 %A, i32 3
25*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp4
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_dup32(i32 %A) nounwind {
29*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup32:
30*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
31*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x i32> zeroinitializer, i32 %A, i32 0
32*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <2 x i32> %tmp1, i32 %A, i32 1
33*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp2
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_dupfloat(float %A) nounwind {
37*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupfloat:
38*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
39*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x float> zeroinitializer, float %A, i32 0
40*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <2 x float> %tmp1, float %A, i32 1
41*9880d681SAndroid Build Coastguard Worker	ret <2 x float> %tmp2
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_dupQ8(i8 %A) nounwind {
45*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ8:
46*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8
47*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <16 x i8> zeroinitializer, i8 %A, i32 0
48*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <16 x i8> %tmp1, i8 %A, i32 1
49*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <16 x i8> %tmp2, i8 %A, i32 2
50*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <16 x i8> %tmp3, i8 %A, i32 3
51*9880d681SAndroid Build Coastguard Worker	%tmp5 = insertelement <16 x i8> %tmp4, i8 %A, i32 4
52*9880d681SAndroid Build Coastguard Worker	%tmp6 = insertelement <16 x i8> %tmp5, i8 %A, i32 5
53*9880d681SAndroid Build Coastguard Worker	%tmp7 = insertelement <16 x i8> %tmp6, i8 %A, i32 6
54*9880d681SAndroid Build Coastguard Worker	%tmp8 = insertelement <16 x i8> %tmp7, i8 %A, i32 7
55*9880d681SAndroid Build Coastguard Worker	%tmp9 = insertelement <16 x i8> %tmp8, i8 %A, i32 8
56*9880d681SAndroid Build Coastguard Worker	%tmp10 = insertelement <16 x i8> %tmp9, i8 %A, i32 9
57*9880d681SAndroid Build Coastguard Worker	%tmp11 = insertelement <16 x i8> %tmp10, i8 %A, i32 10
58*9880d681SAndroid Build Coastguard Worker	%tmp12 = insertelement <16 x i8> %tmp11, i8 %A, i32 11
59*9880d681SAndroid Build Coastguard Worker	%tmp13 = insertelement <16 x i8> %tmp12, i8 %A, i32 12
60*9880d681SAndroid Build Coastguard Worker	%tmp14 = insertelement <16 x i8> %tmp13, i8 %A, i32 13
61*9880d681SAndroid Build Coastguard Worker	%tmp15 = insertelement <16 x i8> %tmp14, i8 %A, i32 14
62*9880d681SAndroid Build Coastguard Worker	%tmp16 = insertelement <16 x i8> %tmp15, i8 %A, i32 15
63*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp16
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_dupQ16(i16 %A) nounwind {
67*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ16:
68*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16
69*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i16> zeroinitializer, i16 %A, i32 0
70*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <8 x i16> %tmp1, i16 %A, i32 1
71*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <8 x i16> %tmp2, i16 %A, i32 2
72*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <8 x i16> %tmp3, i16 %A, i32 3
73*9880d681SAndroid Build Coastguard Worker	%tmp5 = insertelement <8 x i16> %tmp4, i16 %A, i32 4
74*9880d681SAndroid Build Coastguard Worker	%tmp6 = insertelement <8 x i16> %tmp5, i16 %A, i32 5
75*9880d681SAndroid Build Coastguard Worker	%tmp7 = insertelement <8 x i16> %tmp6, i16 %A, i32 6
76*9880d681SAndroid Build Coastguard Worker	%tmp8 = insertelement <8 x i16> %tmp7, i16 %A, i32 7
77*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp8
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_dupQ32(i32 %A) nounwind {
81*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ32:
82*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
83*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i32> zeroinitializer, i32 %A, i32 0
84*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <4 x i32> %tmp1, i32 %A, i32 1
85*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <4 x i32> %tmp2, i32 %A, i32 2
86*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <4 x i32> %tmp3, i32 %A, i32 3
87*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp4
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_dupQfloat(float %A) nounwind {
91*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQfloat:
92*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
93*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x float> zeroinitializer, float %A, i32 0
94*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <4 x float> %tmp1, float %A, i32 1
95*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <4 x float> %tmp2, float %A, i32 2
96*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <4 x float> %tmp3, float %A, i32 3
97*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp4
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; Check to make sure it works with shuffles, too.
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_shuffledup8(i8 %A) nounwind {
103*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup8:
104*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8
105*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i8> undef, i8 %A, i32 0
106*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> zeroinitializer
107*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_shuffledup16(i16 %A) nounwind {
111*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup16:
112*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16
113*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i16> undef, i16 %A, i32 0
114*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer
115*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp2
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_shuffledup32(i32 %A) nounwind {
119*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup32:
120*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
121*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x i32> undef, i32 %A, i32 0
122*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer
123*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp2
124*9880d681SAndroid Build Coastguard Worker}
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_shuffledupfloat(float %A) nounwind {
127*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupfloat:
128*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
129*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x float> undef, float %A, i32 0
130*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
131*9880d681SAndroid Build Coastguard Worker	ret <2 x float> %tmp2
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_shuffledupQ8(i8 %A) nounwind {
135*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ8:
136*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8
137*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <16 x i8> undef, i8 %A, i32 0
138*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> zeroinitializer
139*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp2
140*9880d681SAndroid Build Coastguard Worker}
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_shuffledupQ16(i16 %A) nounwind {
143*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ16:
144*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16
145*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i16> undef, i16 %A, i32 0
146*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> zeroinitializer
147*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp2
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_shuffledupQ32(i32 %A) nounwind {
151*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ32:
152*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
153*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i32> undef, i32 %A, i32 0
154*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer
155*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp2
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_shuffledupQfloat(float %A) nounwind {
159*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQfloat:
160*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
161*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x float> undef, float %A, i32 0
162*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
163*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp2
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vduplane8(<8 x i8>* %A) nounwind {
167*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane8:
168*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8
169*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
170*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
171*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
172*9880d681SAndroid Build Coastguard Worker}
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vduplane16(<4 x i16>* %A) nounwind {
175*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane16:
176*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16
177*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
178*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 >
179*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp2
180*9880d681SAndroid Build Coastguard Worker}
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vduplane32(<2 x i32>* %A) nounwind {
183*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane32:
184*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
185*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
186*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> < i32 1, i32 1 >
187*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp2
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @vduplanefloat(<2 x float>* %A) nounwind {
191*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplanefloat:
192*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
193*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
194*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> < i32 1, i32 1 >
195*9880d681SAndroid Build Coastguard Worker	ret <2 x float> %tmp2
196*9880d681SAndroid Build Coastguard Worker}
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @vduplaneQ8(<8 x i8>* %A) nounwind {
199*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ8:
200*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8
201*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
202*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <16 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
203*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp2
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vduplaneQ16(<4 x i16>* %A) nounwind {
207*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ16:
208*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16
209*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
210*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <8 x i32> < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
211*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp2
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vduplaneQ32(<2 x i32>* %A) nounwind {
215*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ32:
216*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
217*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
218*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 >
219*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp2
220*9880d681SAndroid Build Coastguard Worker}
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vduplaneQfloat(<2 x float>* %A) nounwind {
223*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQfloat:
224*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
225*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
226*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <4 x i32> < i32 1, i32 1, i32 1, i32 1 >
227*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp2
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @foo(<2 x i64> %arg0_int64x1_t) nounwind readnone {
231*9880d681SAndroid Build Coastguard Workerentry:
232*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
233*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %0
234*9880d681SAndroid Build Coastguard Worker}
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bar(<2 x i64> %arg0_int64x1_t) nounwind readnone {
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
239*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %0
240*9880d681SAndroid Build Coastguard Worker}
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @baz(<2 x double> %arg0_int64x1_t) nounwind readnone {
243*9880d681SAndroid Build Coastguard Workerentry:
244*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 1, i32 1>
245*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %0
246*9880d681SAndroid Build Coastguard Worker}
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @qux(<2 x double> %arg0_int64x1_t) nounwind readnone {
249*9880d681SAndroid Build Coastguard Workerentry:
250*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 0, i32 0>
251*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %0
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker; Radar 7373643
255*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: redundantVdup:
256*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.i8
257*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: vdup.8
258*9880d681SAndroid Build Coastguard Worker;CHECK: vstr
259*9880d681SAndroid Build Coastguard Workerdefine void @redundantVdup(<8 x i8>* %ptr) nounwind {
260*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <8 x i8> undef, i8 -128, i32 0
261*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <8 x i8> %1, <8 x i8> undef, <8 x i32> zeroinitializer
262*9880d681SAndroid Build Coastguard Worker  store <8 x i8> %2, <8 x i8>* %ptr, align 8
263*9880d681SAndroid Build Coastguard Worker  ret void
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @tdupi(i32 %x, i32 %y) {
267*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: tdupi:
268*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
269*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x i32> undef, i32 %x, i32 0
270*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x i32> %1, i32 %x, i32 1
271*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x i32> %2, i32 %x, i32 2
272*9880d681SAndroid Build Coastguard Worker  %4 = insertelement <4 x i32> %3, i32 %y, i32 3
273*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %4
274*9880d681SAndroid Build Coastguard Worker}
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @tdupf(float %x, float %y) {
277*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: tdupf:
278*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32
279*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x float> undef, float %x, i32 0
280*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x float> %1, float %x, i32 1
281*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x float> %2, float %x, i32 2
282*9880d681SAndroid Build Coastguard Worker  %4 = insertelement <4 x float> %3, float %y, i32 3
283*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %4
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker; This test checks that when splatting an element from a vector into another,
287*9880d681SAndroid Build Coastguard Worker; the value isn't moved out to GPRs first.
288*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @tduplane(<4 x i32> %invec) {
289*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: tduplane:
290*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: vmov {{.*}}, d16[1]
291*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 {{.*}}, d16[1]
292*9880d681SAndroid Build Coastguard Worker  %in = extractelement <4 x i32> %invec, i32 1
293*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x i32> undef, i32 %in, i32 0
294*9880d681SAndroid Build Coastguard Worker  %2 = insertelement <4 x i32> %1, i32 %in, i32 1
295*9880d681SAndroid Build Coastguard Worker  %3 = insertelement <4 x i32> %2, i32 %in, i32 2
296*9880d681SAndroid Build Coastguard Worker  %4 = insertelement <4 x i32> %3, i32 255, i32 3
297*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %4
298*9880d681SAndroid Build Coastguard Worker}
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @check_f32(<4 x float> %v) nounwind {
301*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_f32:
302*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 {{.*}}, d{{..}}[1]
303*9880d681SAndroid Build Coastguard Worker  %x = extractelement <4 x float> %v, i32 3
304*9880d681SAndroid Build Coastguard Worker  %1 = insertelement  <2 x float> undef, float %x, i32 0
305*9880d681SAndroid Build Coastguard Worker  %2 = insertelement  <2 x float> %1, float %x, i32 1
306*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %2
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @check_i32(<4 x i32> %v) nounwind {
310*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_i32:
311*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 {{.*}}, d{{..}}[1]
312*9880d681SAndroid Build Coastguard Worker  %x = extractelement <4 x i32> %v, i32 3
313*9880d681SAndroid Build Coastguard Worker  %1 = insertelement  <2 x i32> undef, i32 %x, i32 0
314*9880d681SAndroid Build Coastguard Worker  %2 = insertelement  <2 x i32> %1, i32 %x, i32 1
315*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %2
316*9880d681SAndroid Build Coastguard Worker}
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @check_i16(<8 x i16> %v) nounwind {
319*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_i16:
320*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.16 {{.*}}, d{{..}}[3]
321*9880d681SAndroid Build Coastguard Worker  %x = extractelement <8 x i16> %v, i32 3
322*9880d681SAndroid Build Coastguard Worker  %1 = insertelement  <4 x i16> undef, i16 %x, i32 0
323*9880d681SAndroid Build Coastguard Worker  %2 = insertelement  <4 x i16> %1, i16 %x, i32 1
324*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %2
325*9880d681SAndroid Build Coastguard Worker}
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @check_i8(<16 x i8> %v) nounwind {
328*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_i8:
329*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.8 {{.*}}, d{{..}}[3]
330*9880d681SAndroid Build Coastguard Worker  %x = extractelement <16 x i8> %v, i32 3
331*9880d681SAndroid Build Coastguard Worker  %1 = insertelement  <8  x i8> undef, i8 %x, i32 0
332*9880d681SAndroid Build Coastguard Worker  %2 = insertelement  <8  x i8> %1, i8 %x, i32 1
333*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %2
334*9880d681SAndroid Build Coastguard Worker}
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker; Check that an SPR splat produces a vdup.
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @check_spr_splat2(<2 x float> %p, i16 %q) {
339*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_spr_splat2:
340*9880d681SAndroid Build Coastguard Worker;CHECK: vdup.32 d
341*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i16 %q to float
342*9880d681SAndroid Build Coastguard Worker  %splat.splatinsert = insertelement <2 x float> undef, float %conv, i32 0
343*9880d681SAndroid Build Coastguard Worker  %splat.splat = shufflevector <2 x float> %splat.splatinsert, <2 x float> undef, <2 x i32> zeroinitializer
344*9880d681SAndroid Build Coastguard Worker  %sub = fsub <2 x float> %splat.splat, %p
345*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %sub
346*9880d681SAndroid Build Coastguard Worker}
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @check_spr_splat4(<4 x float> %p, i16 %q) {
349*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_spr_splat4:
350*9880d681SAndroid Build Coastguard Worker;CHECK: vld1.16
351*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i16 %q to float
352*9880d681SAndroid Build Coastguard Worker  %splat.splatinsert = insertelement <4 x float> undef, float %conv, i32 0
353*9880d681SAndroid Build Coastguard Worker  %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> zeroinitializer
354*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x float> %splat.splat, %p
355*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %sub
356*9880d681SAndroid Build Coastguard Worker}
357*9880d681SAndroid Build Coastguard Worker; Same codegen as above test; scalar is splatted using vld1, so shuffle index is irrelevant.
358*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @check_spr_splat4_lane1(<4 x float> %p, i16 %q) {
359*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: check_spr_splat4_lane1:
360*9880d681SAndroid Build Coastguard Worker;CHECK: vld1.16
361*9880d681SAndroid Build Coastguard Worker  %conv = sitofp i16 %q to float
362*9880d681SAndroid Build Coastguard Worker  %splat.splatinsert = insertelement <4 x float> undef, float %conv, i32 1
363*9880d681SAndroid Build Coastguard Worker  %splat.splat = shufflevector <4 x float> %splat.splatinsert, <4 x float> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1>
364*9880d681SAndroid Build Coastguard Worker  %sub = fsub <4 x float> %splat.splat, %p
365*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %sub
366*9880d681SAndroid Build Coastguard Worker}
367*9880d681SAndroid Build Coastguard Worker
368*9880d681SAndroid Build Coastguard Worker; Also make sure we don't barf on variable-index extractelts, where we almost
369*9880d681SAndroid Build Coastguard Worker; could have generated a vdup.
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @check_i8_varidx(<16 x i8> %v, i32 %idx) {
372*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: check_i8_varidx:
373*9880d681SAndroid Build Coastguard Worker; CHECK: mov r[[FP:[0-9]+]], sp
374*9880d681SAndroid Build Coastguard Worker; CHECK: ldr r[[IDX:[0-9]+]], [r[[FP]], #4]
375*9880d681SAndroid Build Coastguard Worker; CHECK: mov r[[SPCOPY:[0-9]+]], sp
376*9880d681SAndroid Build Coastguard Worker; CHECK: vst1.64 {d{{.*}}, d{{.*}}}, [r[[SPCOPY]]:128], r[[IDX]]
377*9880d681SAndroid Build Coastguard Worker; CHECK: vld1.8 {d{{.*}}[]}, [r[[SPCOPY]]]
378*9880d681SAndroid Build Coastguard Worker  %x = extractelement <16 x i8> %v, i32 %idx
379*9880d681SAndroid Build Coastguard Worker  %1 = insertelement  <8 x i8> undef, i8 %x, i32 0
380*9880d681SAndroid Build Coastguard Worker  %2 = insertelement  <8 x i8> %1, i8 %x, i32 1
381*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %2
382*9880d681SAndroid Build Coastguard Worker}
383