xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/vext.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - -lower-interleaved-accesses=false | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vextd(<8 x i8>* %A, <8 x i8>* %B) nounwind {
4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextd:
5*9880d681SAndroid Build Coastguard Worker;CHECK: vext
6*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
7*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <8 x i8>, <8 x i8>* %B
8*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <8 x i8> %tmp1, <8 x i8> %tmp2, <8 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10>
9*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp3
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vextRd(<8 x i8>* %A, <8 x i8>* %B) nounwind {
13*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextRd:
14*9880d681SAndroid Build Coastguard Worker;CHECK: vext
15*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
16*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <8 x i8>, <8 x i8>* %B
17*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <8 x i8> %tmp1, <8 x i8> %tmp2, <8 x i32> <i32 13, i32 14, i32 15, i32 0, i32 1, i32 2, i32 3, i32 4>
18*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp3
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vextq(<16 x i8>* %A, <16 x i8>* %B) nounwind {
22*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextq:
23*9880d681SAndroid Build Coastguard Worker;CHECK: vext
24*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <16 x i8>, <16 x i8>* %A
25*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <16 x i8>, <16 x i8>* %B
26*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <16 x i8> %tmp1, <16 x i8> %tmp2, <16 x i32> <i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18>
27*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp3
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vextRq(<16 x i8>* %A, <16 x i8>* %B) nounwind {
31*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextRq:
32*9880d681SAndroid Build Coastguard Worker;CHECK: vext
33*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <16 x i8>, <16 x i8>* %A
34*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <16 x i8>, <16 x i8>* %B
35*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <16 x i8> %tmp1, <16 x i8> %tmp2, <16 x i32> <i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>
36*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp3
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vextd16(<4 x i16>* %A, <4 x i16>* %B) nounwind {
40*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextd16:
41*9880d681SAndroid Build Coastguard Worker;CHECK: vext
42*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
43*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i16>, <4 x i16>* %B
44*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <4 x i16> %tmp1, <4 x i16> %tmp2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
45*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp3
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vextq32(<4 x i32>* %A, <4 x i32>* %B) nounwind {
49*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextq32:
50*9880d681SAndroid Build Coastguard Worker;CHECK: vext
51*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i32>, <4 x i32>* %A
52*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <4 x i32>, <4 x i32>* %B
53*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <4 x i32> %tmp1, <4 x i32> %tmp2, <4 x i32> <i32 3, i32 4, i32 5, i32 6>
54*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp3
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; Undef shuffle indices should not prevent matching to VEXT:
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vextd_undef(<8 x i8>* %A, <8 x i8>* %B) nounwind {
60*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextd_undef:
61*9880d681SAndroid Build Coastguard Worker;CHECK: vext
62*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
63*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <8 x i8>, <8 x i8>* %B
64*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <8 x i8> %tmp1, <8 x i8> %tmp2, <8 x i32> <i32 3, i32 undef, i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10>
65*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp3
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vextRq_undef(<16 x i8>* %A, <16 x i8>* %B) nounwind {
69*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextRq_undef:
70*9880d681SAndroid Build Coastguard Worker;CHECK: vext
71*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <16 x i8>, <16 x i8>* %A
72*9880d681SAndroid Build Coastguard Worker	%tmp2 = load <16 x i8>, <16 x i8>* %B
73*9880d681SAndroid Build Coastguard Worker	%tmp3 = shufflevector <16 x i8> %tmp1, <16 x i8> %tmp2, <16 x i32> <i32 23, i32 24, i32 25, i32 26, i32 undef, i32 undef, i32 29, i32 30, i32 31, i32 0, i32 1, i32 2, i32 3, i32 4, i32 undef, i32 6>
74*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp3
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vextq_undef_op2(<16 x i8> %a) nounwind {
78*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextq_undef_op2:
79*9880d681SAndroid Build Coastguard Worker;CHECK: vext
80*9880d681SAndroid Build Coastguard Workerentry:
81*9880d681SAndroid Build Coastguard Worker  %tmp1 = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1>
82*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %tmp1
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vextd_undef_op2(<8 x i8> %a) nounwind {
86*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextd_undef_op2:
87*9880d681SAndroid Build Coastguard Worker;CHECK: vext
88*9880d681SAndroid Build Coastguard Workerentry:
89*9880d681SAndroid Build Coastguard Worker  %tmp1 = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 1>
90*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %tmp1
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vextq_undef_op2_undef(<16 x i8> %a) nounwind {
95*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextq_undef_op2_undef:
96*9880d681SAndroid Build Coastguard Worker;CHECK: vext
97*9880d681SAndroid Build Coastguard Workerentry:
98*9880d681SAndroid Build Coastguard Worker  %tmp1 = shufflevector <16 x i8> %a, <16 x i8> undef, <16 x i32> <i32 2, i32 3, i32 4, i32 undef, i32 undef, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 0, i32 1>
99*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %tmp1
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vextd_undef_op2_undef(<8 x i8> %a) nounwind {
103*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vextd_undef_op2_undef:
104*9880d681SAndroid Build Coastguard Worker;CHECK: vext
105*9880d681SAndroid Build Coastguard Workerentry:
106*9880d681SAndroid Build Coastguard Worker  %tmp1 = shufflevector <8 x i8> %a, <8 x i8> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 6, i32 7, i32 undef, i32 1>
107*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %tmp1
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; Tests for ReconstructShuffle function. Indices have to be carefully
111*9880d681SAndroid Build Coastguard Worker; chosen to reach lowering phase as a BUILD_VECTOR.
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; One vector needs vext, the other can be handled by extract_subvector
114*9880d681SAndroid Build Coastguard Worker; Also checks interleaving of sources is handled correctly.
115*9880d681SAndroid Build Coastguard Worker; Essence: a vext is used on %A and something saner than stack load/store for final result.
116*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_interleaved(<8 x i16>* %A, <8 x i16>* %B) nounwind {
117*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_interleaved:
118*9880d681SAndroid Build Coastguard Worker;CHECK: vext.16
119*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: vext.16
120*9880d681SAndroid Build Coastguard Worker;CHECK: vzip.16
121*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
122*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i16>, <8 x i16>* %B
123*9880d681SAndroid Build Coastguard Worker        %tmp3 = shufflevector <8 x i16> %tmp1, <8 x i16> %tmp2, <4 x i32> <i32 3, i32 8, i32 5, i32 9>
124*9880d681SAndroid Build Coastguard Worker        ret <4 x i16> %tmp3
125*9880d681SAndroid Build Coastguard Worker}
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker; An undef in the shuffle list should still be optimizable
128*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_undef(<8 x i16>* %A, <8 x i16>* %B) nounwind {
129*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_undef:
130*9880d681SAndroid Build Coastguard Worker;CHECK: vzip.16
131*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %A
132*9880d681SAndroid Build Coastguard Worker        %tmp2 = load <8 x i16>, <8 x i16>* %B
133*9880d681SAndroid Build Coastguard Worker        %tmp3 = shufflevector <8 x i16> %tmp1, <8 x i16> %tmp2, <4 x i32> <i32 undef, i32 8, i32 5, i32 9>
134*9880d681SAndroid Build Coastguard Worker        ret <4 x i16> %tmp3
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; We should ignore a build_vector with more than two sources.
138*9880d681SAndroid Build Coastguard Worker; Use illegal <32 x i16> type to produce such a shuffle after legalizing types.
139*9880d681SAndroid Build Coastguard Worker; Try to look for fallback to by-element inserts.
140*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_multisource(<32 x i16>* %B) nounwind {
141*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_multisource:
142*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG:d[0-9]+]][0]
143*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][1]
144*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][2]
145*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][3]
146*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <32 x i16>, <32 x i16>* %B
147*9880d681SAndroid Build Coastguard Worker        %tmp2 = shufflevector <32 x i16> %tmp1, <32 x i16> undef, <4 x i32> <i32 0, i32 8, i32 16, i32 24>
148*9880d681SAndroid Build Coastguard Worker        ret <4 x i16> %tmp2
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; We don't handle shuffles using more than half of a 128-bit vector.
152*9880d681SAndroid Build Coastguard Worker; Again, test for fallback to by-element inserts.
153*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_largespan(<8 x i16>* %B) nounwind {
154*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_largespan:
155*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG:d[0-9]+]][0]
156*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][1]
157*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][2]
158*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][3]
159*9880d681SAndroid Build Coastguard Worker        %tmp1 = load <8 x i16>, <8 x i16>* %B
160*9880d681SAndroid Build Coastguard Worker        %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
161*9880d681SAndroid Build Coastguard Worker        ret <4 x i16> %tmp2
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; The actual shuffle code only handles some cases, make sure we check
165*9880d681SAndroid Build Coastguard Worker; this rather than blindly emitting a VECTOR_SHUFFLE (infinite
166*9880d681SAndroid Build Coastguard Worker; lowering loop can result otherwise).
167*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_illegal(<8 x i16>* %A, <8 x i16>* %B) nounwind {
168*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_illegal:
169*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG:d[0-9]+]][0]
170*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][1]
171*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][2]
172*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG]][3]
173*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG2:d[0-9]+]][0]
174*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG2]][1]
175*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG2]][2]
176*9880d681SAndroid Build Coastguard Worker;CHECK: vmov.16 [[REG2]][3]
177*9880d681SAndroid Build Coastguard Worker       %tmp1 = load <8 x i16>, <8 x i16>* %A
178*9880d681SAndroid Build Coastguard Worker       %tmp2 = load <8 x i16>, <8 x i16>* %B
179*9880d681SAndroid Build Coastguard Worker       %tmp3 = shufflevector <8 x i16> %tmp1, <8 x i16> %tmp2, <8 x i32> <i32 0, i32 7, i32 5, i32 13, i32 3, i32 2, i32 2, i32 9>
180*9880d681SAndroid Build Coastguard Worker       ret <8 x i16> %tmp3
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; PR11129
184*9880d681SAndroid Build Coastguard Worker; Make sure this doesn't crash
185*9880d681SAndroid Build Coastguard Workerdefine arm_aapcscc void @test_elem_mismatch(<2 x i64>* nocapture %src, <4 x i16>* nocapture %dest) nounwind {
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_elem_mismatch:
187*9880d681SAndroid Build Coastguard Worker; CHECK: vstr
188*9880d681SAndroid Build Coastguard Worker  %tmp0 = load <2 x i64>, <2 x i64>* %src, align 16
189*9880d681SAndroid Build Coastguard Worker  %tmp1 = bitcast <2 x i64> %tmp0 to <4 x i32>
190*9880d681SAndroid Build Coastguard Worker  %tmp2 = extractelement <4 x i32> %tmp1, i32 0
191*9880d681SAndroid Build Coastguard Worker  %tmp3 = extractelement <4 x i32> %tmp1, i32 2
192*9880d681SAndroid Build Coastguard Worker  %tmp4 = trunc i32 %tmp2 to i16
193*9880d681SAndroid Build Coastguard Worker  %tmp5 = trunc i32 %tmp3 to i16
194*9880d681SAndroid Build Coastguard Worker  %tmp6 = insertelement <4 x i16> undef, i16 %tmp4, i32 0
195*9880d681SAndroid Build Coastguard Worker  %tmp7 = insertelement <4 x i16> %tmp6, i16 %tmp5, i32 1
196*9880d681SAndroid Build Coastguard Worker  store <4 x i16> %tmp7, <4 x i16>* %dest, align 4
197*9880d681SAndroid Build Coastguard Worker  ret void
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_reverse_and_extract(<2 x i32>* %A) {
201*9880d681SAndroid Build Coastguard Workerentry:
202*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_reverse_and_extract
203*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vtrn
204*9880d681SAndroid Build Coastguard Worker  ; CHECK: vrev
205*9880d681SAndroid Build Coastguard Worker  ; CHECK: vext
206*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
207*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <4 x i32> <i32 undef, i32 undef, i32 1, i32 0>
208*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %0
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_dup_and_extract(<2 x i32>* %A) {
212*9880d681SAndroid Build Coastguard Workerentry:
213*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_dup_and_extract
214*9880d681SAndroid Build Coastguard Worker  ; CHECK-NOT: vtrn
215*9880d681SAndroid Build Coastguard Worker  ; CHECK: vdup
216*9880d681SAndroid Build Coastguard Worker  ; CHECK: vext
217*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
218*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 1>
219*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %0
220*9880d681SAndroid Build Coastguard Worker}
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_zip_and_extract(<2 x i32>* %A) {
223*9880d681SAndroid Build Coastguard Workerentry:
224*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: test_zip_and_extract
225*9880d681SAndroid Build Coastguard Worker  ; CHECK: vzip
226*9880d681SAndroid Build Coastguard Worker  ; CHECK: vext
227*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
228*9880d681SAndroid Build Coastguard Worker  %0 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 0, i32 1>
229*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %0
230*9880d681SAndroid Build Coastguard Worker}
231