xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-dup.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple -asm-verbose=false | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_dup8(i8 %A) nounwind {
4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup8:
5*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8b
6*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i8> zeroinitializer, i8 %A, i32 0
7*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <8 x i8> %tmp1, i8 %A, i32 1
8*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <8 x i8> %tmp2, i8 %A, i32 2
9*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <8 x i8> %tmp3, i8 %A, i32 3
10*9880d681SAndroid Build Coastguard Worker	%tmp5 = insertelement <8 x i8> %tmp4, i8 %A, i32 4
11*9880d681SAndroid Build Coastguard Worker	%tmp6 = insertelement <8 x i8> %tmp5, i8 %A, i32 5
12*9880d681SAndroid Build Coastguard Worker	%tmp7 = insertelement <8 x i8> %tmp6, i8 %A, i32 6
13*9880d681SAndroid Build Coastguard Worker	%tmp8 = insertelement <8 x i8> %tmp7, i8 %A, i32 7
14*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp8
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_dup16(i16 %A) nounwind {
18*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup16:
19*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4h
20*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i16> zeroinitializer, i16 %A, i32 0
21*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <4 x i16> %tmp1, i16 %A, i32 1
22*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <4 x i16> %tmp2, i16 %A, i32 2
23*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <4 x i16> %tmp3, i16 %A, i32 3
24*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp4
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_dup32(i32 %A) nounwind {
28*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dup32:
29*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s
30*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x i32> zeroinitializer, i32 %A, i32 0
31*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <2 x i32> %tmp1, i32 %A, i32 1
32*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp2
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_dupfloat(float %A) nounwind {
36*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupfloat:
37*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s
38*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x float> zeroinitializer, float %A, i32 0
39*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <2 x float> %tmp1, float %A, i32 1
40*9880d681SAndroid Build Coastguard Worker	ret <2 x float> %tmp2
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_dupQ8(i8 %A) nounwind {
44*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ8:
45*9880d681SAndroid Build Coastguard Worker;CHECK: dup.16b
46*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <16 x i8> zeroinitializer, i8 %A, i32 0
47*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <16 x i8> %tmp1, i8 %A, i32 1
48*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <16 x i8> %tmp2, i8 %A, i32 2
49*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <16 x i8> %tmp3, i8 %A, i32 3
50*9880d681SAndroid Build Coastguard Worker	%tmp5 = insertelement <16 x i8> %tmp4, i8 %A, i32 4
51*9880d681SAndroid Build Coastguard Worker	%tmp6 = insertelement <16 x i8> %tmp5, i8 %A, i32 5
52*9880d681SAndroid Build Coastguard Worker	%tmp7 = insertelement <16 x i8> %tmp6, i8 %A, i32 6
53*9880d681SAndroid Build Coastguard Worker	%tmp8 = insertelement <16 x i8> %tmp7, i8 %A, i32 7
54*9880d681SAndroid Build Coastguard Worker	%tmp9 = insertelement <16 x i8> %tmp8, i8 %A, i32 8
55*9880d681SAndroid Build Coastguard Worker	%tmp10 = insertelement <16 x i8> %tmp9, i8 %A, i32 9
56*9880d681SAndroid Build Coastguard Worker	%tmp11 = insertelement <16 x i8> %tmp10, i8 %A, i32 10
57*9880d681SAndroid Build Coastguard Worker	%tmp12 = insertelement <16 x i8> %tmp11, i8 %A, i32 11
58*9880d681SAndroid Build Coastguard Worker	%tmp13 = insertelement <16 x i8> %tmp12, i8 %A, i32 12
59*9880d681SAndroid Build Coastguard Worker	%tmp14 = insertelement <16 x i8> %tmp13, i8 %A, i32 13
60*9880d681SAndroid Build Coastguard Worker	%tmp15 = insertelement <16 x i8> %tmp14, i8 %A, i32 14
61*9880d681SAndroid Build Coastguard Worker	%tmp16 = insertelement <16 x i8> %tmp15, i8 %A, i32 15
62*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp16
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_dupQ16(i16 %A) nounwind {
66*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ16:
67*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8h
68*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i16> zeroinitializer, i16 %A, i32 0
69*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <8 x i16> %tmp1, i16 %A, i32 1
70*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <8 x i16> %tmp2, i16 %A, i32 2
71*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <8 x i16> %tmp3, i16 %A, i32 3
72*9880d681SAndroid Build Coastguard Worker	%tmp5 = insertelement <8 x i16> %tmp4, i16 %A, i32 4
73*9880d681SAndroid Build Coastguard Worker	%tmp6 = insertelement <8 x i16> %tmp5, i16 %A, i32 5
74*9880d681SAndroid Build Coastguard Worker	%tmp7 = insertelement <8 x i16> %tmp6, i16 %A, i32 6
75*9880d681SAndroid Build Coastguard Worker	%tmp8 = insertelement <8 x i16> %tmp7, i16 %A, i32 7
76*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp8
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_dupQ32(i32 %A) nounwind {
80*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQ32:
81*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s
82*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i32> zeroinitializer, i32 %A, i32 0
83*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <4 x i32> %tmp1, i32 %A, i32 1
84*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <4 x i32> %tmp2, i32 %A, i32 2
85*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <4 x i32> %tmp3, i32 %A, i32 3
86*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp4
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_dupQfloat(float %A) nounwind {
90*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_dupQfloat:
91*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s
92*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x float> zeroinitializer, float %A, i32 0
93*9880d681SAndroid Build Coastguard Worker	%tmp2 = insertelement <4 x float> %tmp1, float %A, i32 1
94*9880d681SAndroid Build Coastguard Worker	%tmp3 = insertelement <4 x float> %tmp2, float %A, i32 2
95*9880d681SAndroid Build Coastguard Worker	%tmp4 = insertelement <4 x float> %tmp3, float %A, i32 3
96*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp4
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker; Check to make sure it works with shuffles, too.
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @v_shuffledup8(i8 %A) nounwind {
102*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup8:
103*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8b
104*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i8> undef, i8 %A, i32 0
105*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> zeroinitializer
106*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @v_shuffledup16(i16 %A) nounwind {
110*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup16:
111*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4h
112*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i16> undef, i16 %A, i32 0
113*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer
114*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp2
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @v_shuffledup32(i32 %A) nounwind {
118*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledup32:
119*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s
120*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x i32> undef, i32 %A, i32 0
121*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer
122*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp2
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @v_shuffledupfloat(float %A) nounwind {
126*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupfloat:
127*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s
128*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <2 x float> undef, float %A, i32 0
129*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
130*9880d681SAndroid Build Coastguard Worker	ret <2 x float> %tmp2
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @v_shuffledupQ8(i8 %A) nounwind {
134*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ8:
135*9880d681SAndroid Build Coastguard Worker;CHECK: dup.16b
136*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <16 x i8> undef, i8 %A, i32 0
137*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> zeroinitializer
138*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp2
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @v_shuffledupQ16(i16 %A) nounwind {
142*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ16:
143*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8h
144*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <8 x i16> undef, i16 %A, i32 0
145*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> zeroinitializer
146*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp2
147*9880d681SAndroid Build Coastguard Worker}
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @v_shuffledupQ32(i32 %A) nounwind {
150*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQ32:
151*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s
152*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x i32> undef, i32 %A, i32 0
153*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer
154*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp2
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @v_shuffledupQfloat(float %A) nounwind {
158*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: v_shuffledupQfloat:
159*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s
160*9880d681SAndroid Build Coastguard Worker	%tmp1 = insertelement <4 x float> undef, float %A, i32 0
161*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
162*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp2
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @vduplane8(<8 x i8>* %A) nounwind {
166*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane8:
167*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8b
168*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
169*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 >
170*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @vduplane16(<4 x i16>* %A) nounwind {
174*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane16:
175*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4h
176*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
177*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 >
178*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp2
179*9880d681SAndroid Build Coastguard Worker}
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vduplane32(<2 x i32>* %A) nounwind {
182*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplane32:
183*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s
184*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
185*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> < i32 1, i32 1 >
186*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp2
187*9880d681SAndroid Build Coastguard Worker}
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @vduplanefloat(<2 x float>* %A) nounwind {
190*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplanefloat:
191*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2s
192*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
193*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> < i32 1, i32 1 >
194*9880d681SAndroid Build Coastguard Worker	ret <2 x float> %tmp2
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @vduplaneQ8(<8 x i8>* %A) nounwind {
198*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ8:
199*9880d681SAndroid Build Coastguard Worker;CHECK: dup.16b
200*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
201*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 >
202*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp2
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @vduplaneQ16(<4 x i16>* %A) nounwind {
206*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ16:
207*9880d681SAndroid Build Coastguard Worker;CHECK: dup.8h
208*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
209*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 >
210*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp2
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @vduplaneQ32(<2 x i32>* %A) nounwind {
214*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQ32:
215*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s
216*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
217*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 >
218*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp2
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vduplaneQfloat(<2 x float>* %A) nounwind {
222*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: vduplaneQfloat:
223*9880d681SAndroid Build Coastguard Worker;CHECK: dup.4s
224*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
225*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 >
226*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp2
227*9880d681SAndroid Build Coastguard Worker}
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @foo(<2 x i64> %arg0_int64x1_t) nounwind readnone {
230*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: foo:
231*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d
232*9880d681SAndroid Build Coastguard Workerentry:
233*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
234*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %0
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @bar(<2 x i64> %arg0_int64x1_t) nounwind readnone {
238*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: bar:
239*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d
240*9880d681SAndroid Build Coastguard Workerentry:
241*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i64> %arg0_int64x1_t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
242*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %0
243*9880d681SAndroid Build Coastguard Worker}
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @baz(<2 x double> %arg0_int64x1_t) nounwind readnone {
246*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: baz:
247*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d
248*9880d681SAndroid Build Coastguard Workerentry:
249*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 1, i32 1>
250*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %0
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @qux(<2 x double> %arg0_int64x1_t) nounwind readnone {
254*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: qux:
255*9880d681SAndroid Build Coastguard Worker;CHECK: dup.2d
256*9880d681SAndroid Build Coastguard Workerentry:
257*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x double> %arg0_int64x1_t, <2 x double> undef, <2 x i32> <i32 0, i32 0>
258*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %0
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @f(i32 %a, i32 %b) nounwind readnone  {
262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f:
263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov s0, w0
264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], w1
265*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
266*9880d681SAndroid Build Coastguard Worker  %vecinit = insertelement <2 x i32> undef, i32 %a, i32 0
267*9880d681SAndroid Build Coastguard Worker  %vecinit1 = insertelement <2 x i32> %vecinit, i32 %b, i32 1
268*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vecinit1
269*9880d681SAndroid Build Coastguard Worker}
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @g(i32 %a, i32 %b) nounwind readnone  {
272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: g:
273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov s0, w0
274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[1], w1
275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[2], w1
276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.s v0[3], w0
277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
278*9880d681SAndroid Build Coastguard Worker  %vecinit = insertelement <4 x i32> undef, i32 %a, i32 0
279*9880d681SAndroid Build Coastguard Worker  %vecinit1 = insertelement <4 x i32> %vecinit, i32 %b, i32 1
280*9880d681SAndroid Build Coastguard Worker  %vecinit2 = insertelement <4 x i32> %vecinit1, i32 %b, i32 2
281*9880d681SAndroid Build Coastguard Worker  %vecinit3 = insertelement <4 x i32> %vecinit2, i32 %a, i32 3
282*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vecinit3
283*9880d681SAndroid Build Coastguard Worker}
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @h(i64 %a, i64 %b) nounwind readnone  {
286*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: h:
287*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fmov d0, x0
288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ins.d v0[1], x1
289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
290*9880d681SAndroid Build Coastguard Worker  %vecinit = insertelement <2 x i64> undef, i64 %a, i32 0
291*9880d681SAndroid Build Coastguard Worker  %vecinit1 = insertelement <2 x i64> %vecinit, i64 %b, i32 1
292*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vecinit1
293*9880d681SAndroid Build Coastguard Worker}
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker; We used to spot this as a BUILD_VECTOR implementable by dup, but assume that
296*9880d681SAndroid Build Coastguard Worker; the single value needed was of the same type as the vector. This is false if
297*9880d681SAndroid Build Coastguard Worker; the scalar corresponding to the vector type is illegal (e.g. a <4 x i16>
298*9880d681SAndroid Build Coastguard Worker; BUILD_VECTOR will have an i32 as its source). In that case, the operation is
299*9880d681SAndroid Build Coastguard Worker; not a simple "dup vD.4h, vN.h[idx]" after all, and we crashed.
300*9880d681SAndroid Build Coastguard Worker;
301*9880d681SAndroid Build Coastguard Worker; *However*, it is a dup vD.4h, vN.h[2*idx].
302*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_build_illegal(<4 x i32> %in) {
303*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_build_illegal:
304*9880d681SAndroid Build Coastguard Worker; CHECK: dup.4h v0, v0[6]
305*9880d681SAndroid Build Coastguard Worker  %val = extractelement <4 x i32> %in, i32 3
306*9880d681SAndroid Build Coastguard Worker  %smallval = trunc i32 %val to i16
307*9880d681SAndroid Build Coastguard Worker  %vec = insertelement <4x i16> undef, i16 %smallval, i32 3
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vec
310*9880d681SAndroid Build Coastguard Worker}
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker; We used to inherit an already extract_subvectored v4i16 from
313*9880d681SAndroid Build Coastguard Worker; SelectionDAGBuilder here. We then added a DUPLANE on top of that, preventing
314*9880d681SAndroid Build Coastguard Worker; the formation of an indexed-by-7 MLS.
315*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_high_splat(<4 x i16> %a, <4 x i16> %b, <8 x i16> %v) #0 {
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_high_splat:
317*9880d681SAndroid Build Coastguard Worker; CHECK: mls.4h v0, v1, v2[7]
318*9880d681SAndroid Build Coastguard Workerentry:
319*9880d681SAndroid Build Coastguard Worker  %shuffle = shufflevector <8 x i16> %v, <8 x i16> undef, <4 x i32> <i32 7, i32 7, i32 7, i32 7>
320*9880d681SAndroid Build Coastguard Worker  %mul = mul <4 x i16> %shuffle, %b
321*9880d681SAndroid Build Coastguard Worker  %sub = sub <4 x i16> %a, %mul
322*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %sub
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker; Also test the DUP path in the PerfectShuffle generator.
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4i16:
328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4h v0, v0[0]
329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.8b v0, v0, v1, #4
330*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_perfectshuffle_dupext_v4i16(<4 x i16> %a, <4 x i16> %b) nounwind {
331*9880d681SAndroid Build Coastguard Worker  %r = shufflevector <4 x i16> %a, <4 x i16> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5>
332*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %r
333*9880d681SAndroid Build Coastguard Worker}
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4f16:
336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4h v0, v0[0]
337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.8b v0, v0, v1, #4
338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
339*9880d681SAndroid Build Coastguard Workerdefine <4 x half> @test_perfectshuffle_dupext_v4f16(<4 x half> %a, <4 x half> %b) nounwind {
340*9880d681SAndroid Build Coastguard Worker  %r = shufflevector <4 x half> %a, <4 x half> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5>
341*9880d681SAndroid Build Coastguard Worker  ret <4 x half> %r
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4i32:
345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4s v0, v0[0]
346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.16b v0, v0, v1, #8
347*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
348*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_perfectshuffle_dupext_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
349*9880d681SAndroid Build Coastguard Worker  %r = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5>
350*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %r
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_perfectshuffle_dupext_v4f32:
354*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: dup.4s v0, v0[0]
355*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ext.16b v0, v0, v1, #8
356*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
357*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_perfectshuffle_dupext_v4f32(<4 x float> %a, <4 x float> %b) nounwind {
358*9880d681SAndroid Build Coastguard Worker  %r = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 4, i32 5>
359*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %r
360*9880d681SAndroid Build Coastguard Worker}
361