xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-rev.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-neon-syntax=apple | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine i32 @test_rev_w(i32 %a) nounwind {
4*9880d681SAndroid Build Coastguard Workerentry:
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_w:
6*9880d681SAndroid Build Coastguard Worker; CHECK: rev w0, w0
7*9880d681SAndroid Build Coastguard Worker  %0 = tail call i32 @llvm.bswap.i32(i32 %a)
8*9880d681SAndroid Build Coastguard Worker  ret i32 %0
9*9880d681SAndroid Build Coastguard Worker}
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev_x(i64 %a) nounwind {
12*9880d681SAndroid Build Coastguard Workerentry:
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_x:
14*9880d681SAndroid Build Coastguard Worker; CHECK: rev x0, x0
15*9880d681SAndroid Build Coastguard Worker  %0 = tail call i64 @llvm.bswap.i64(i64 %a)
16*9880d681SAndroid Build Coastguard Worker  ret i64 %0
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker; Canonicalize (srl (bswap x), 16) to (rotr (bswap x), 16) if the high 16-bits
20*9880d681SAndroid Build Coastguard Worker; of %a are zero. This optimizes rev + lsr 16 to rev16.
21*9880d681SAndroid Build Coastguard Workerdefine i32 @test_rev_w_srl16(i16 %a) {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_w_srl16:
24*9880d681SAndroid Build Coastguard Worker; CHECK: and [[REG:w[0-9]+]], w0, #0xffff
25*9880d681SAndroid Build Coastguard Worker; CHECK: rev16 w0, [[REG]]
26*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: lsr
27*9880d681SAndroid Build Coastguard Worker  %0 = zext i16 %a to i32
28*9880d681SAndroid Build Coastguard Worker  %1 = tail call i32 @llvm.bswap.i32(i32 %0)
29*9880d681SAndroid Build Coastguard Worker  %2 = lshr i32 %1, 16
30*9880d681SAndroid Build Coastguard Worker  ret i32 %2
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; Canonicalize (srl (bswap x), 32) to (rotr (bswap x), 32) if the high 32-bits
34*9880d681SAndroid Build Coastguard Worker; of %a are zero. This optimizes rev + lsr 32 to rev32.
35*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev_x_srl32(i32 %a) {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev_x_srl32:
38*9880d681SAndroid Build Coastguard Worker; CHECK: rev32 x0, {{x[0-9]+}}
39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: lsr
40*9880d681SAndroid Build Coastguard Worker  %0 = zext i32 %a to i64
41*9880d681SAndroid Build Coastguard Worker  %1 = tail call i64 @llvm.bswap.i64(i64 %0)
42*9880d681SAndroid Build Coastguard Worker  %2 = lshr i64 %1, 32
43*9880d681SAndroid Build Coastguard Worker  ret i64 %2
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.bswap.i32(i32) nounwind readnone
47*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.bswap.i64(i64) nounwind readnone
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine i32 @test_rev16_w(i32 %X) nounwind {
50*9880d681SAndroid Build Coastguard Workerentry:
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev16_w:
52*9880d681SAndroid Build Coastguard Worker; CHECK: rev16 w0, w0
53*9880d681SAndroid Build Coastguard Worker  %tmp1 = lshr i32 %X, 8
54*9880d681SAndroid Build Coastguard Worker  %X15 = bitcast i32 %X to i32
55*9880d681SAndroid Build Coastguard Worker  %tmp4 = shl i32 %X15, 8
56*9880d681SAndroid Build Coastguard Worker  %tmp2 = and i32 %tmp1, 16711680
57*9880d681SAndroid Build Coastguard Worker  %tmp5 = and i32 %tmp4, -16777216
58*9880d681SAndroid Build Coastguard Worker  %tmp9 = and i32 %tmp1, 255
59*9880d681SAndroid Build Coastguard Worker  %tmp13 = and i32 %tmp4, 65280
60*9880d681SAndroid Build Coastguard Worker  %tmp6 = or i32 %tmp5, %tmp2
61*9880d681SAndroid Build Coastguard Worker  %tmp10 = or i32 %tmp6, %tmp13
62*9880d681SAndroid Build Coastguard Worker  %tmp14 = or i32 %tmp10, %tmp9
63*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp14
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; 64-bit REV16 is *not* a swap then a 16-bit rotation:
67*9880d681SAndroid Build Coastguard Worker;   01234567 ->(bswap) 76543210 ->(rotr) 10765432
68*9880d681SAndroid Build Coastguard Worker;   01234567 ->(rev16) 10325476
69*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev16_x(i64 %a) nounwind {
70*9880d681SAndroid Build Coastguard Workerentry:
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev16_x:
72*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rev16 x0, x0
73*9880d681SAndroid Build Coastguard Worker  %0 = tail call i64 @llvm.bswap.i64(i64 %a)
74*9880d681SAndroid Build Coastguard Worker  %1 = lshr i64 %0, 16
75*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %0, 48
76*9880d681SAndroid Build Coastguard Worker  %3 = or i64 %1, %2
77*9880d681SAndroid Build Coastguard Worker  ret i64 %3
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine i64 @test_rev32_x(i64 %a) nounwind {
81*9880d681SAndroid Build Coastguard Workerentry:
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_rev32_x:
83*9880d681SAndroid Build Coastguard Worker; CHECK: rev32 x0, x0
84*9880d681SAndroid Build Coastguard Worker  %0 = tail call i64 @llvm.bswap.i64(i64 %a)
85*9880d681SAndroid Build Coastguard Worker  %1 = lshr i64 %0, 32
86*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %0, 32
87*9880d681SAndroid Build Coastguard Worker  %3 = or i64 %1, %2
88*9880d681SAndroid Build Coastguard Worker  ret i64 %3
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev64D8(<8 x i8>* %A) nounwind {
92*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D8:
93*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.8b
94*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
95*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
96*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vrev64D16(<4 x i16>* %A) nounwind {
100*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D16:
101*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.4h
102*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
103*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
104*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp2
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vrev64D32(<2 x i32>* %A) nounwind {
108*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D32:
109*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.2s
110*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x i32>, <2 x i32>* %A
111*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> <i32 1, i32 0>
112*9880d681SAndroid Build Coastguard Worker	ret <2 x i32> %tmp2
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_vrev64Df(<2 x float>* %A) nounwind {
116*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Df:
117*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.2s
118*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <2 x float>, <2 x float>* %A
119*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> <i32 1, i32 0>
120*9880d681SAndroid Build Coastguard Worker	ret <2 x float> %tmp2
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrev64Q8(<16 x i8>* %A) nounwind {
124*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Q8:
125*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.16b
126*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <16 x i8>, <16 x i8>* %A
127*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8>
128*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp2
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrev64Q16(<8 x i16>* %A) nounwind {
132*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Q16:
133*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.8h
134*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i16>, <8 x i16>* %A
135*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
136*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp2
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vrev64Q32(<4 x i32>* %A) nounwind {
140*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Q32:
141*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.4s
142*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i32>, <4 x i32>* %A
143*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
144*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %tmp2
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_vrev64Qf(<4 x float>* %A) nounwind {
148*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64Qf:
149*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.4s
150*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x float>, <4 x float>* %A
151*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
152*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %tmp2
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev32D8(<8 x i8>* %A) nounwind {
156*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32D8:
157*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.8b
158*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
159*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4>
160*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vrev32D16(<4 x i16>* %A) nounwind {
164*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32D16:
165*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.4h
166*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <4 x i16>, <4 x i16>* %A
167*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> <i32 1, i32 0, i32 3, i32 2>
168*9880d681SAndroid Build Coastguard Worker	ret <4 x i16> %tmp2
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrev32Q8(<16 x i8>* %A) nounwind {
172*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32Q8:
173*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.16b
174*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <16 x i8>, <16 x i8>* %A
175*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> <i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 11, i32 10, i32 9, i32 8, i32 15, i32 14, i32 13, i32 12>
176*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp2
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrev32Q16(<8 x i16>* %A) nounwind {
180*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32Q16:
181*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.8h
182*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i16>, <8 x i16>* %A
183*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
184*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp2
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev16D8(<8 x i8>* %A) nounwind {
188*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev16D8:
189*9880d681SAndroid Build Coastguard Worker;CHECK: rev16.8b
190*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
191*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6>
192*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vrev16Q8(<16 x i8>* %A) nounwind {
196*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev16Q8:
197*9880d681SAndroid Build Coastguard Worker;CHECK: rev16.16b
198*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <16 x i8>, <16 x i8>* %A
199*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 5, i32 4, i32 7, i32 6, i32 9, i32 8, i32 11, i32 10, i32 13, i32 12, i32 15, i32 14>
200*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %tmp2
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker; Undef shuffle indices should not prevent matching to VREV:
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vrev64D8_undef(<8 x i8>* %A) nounwind {
206*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev64D8_undef:
207*9880d681SAndroid Build Coastguard Worker;CHECK: rev64.8b
208*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i8>, <8 x i8>* %A
209*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> <i32 7, i32 undef, i32 undef, i32 4, i32 3, i32 2, i32 1, i32 0>
210*9880d681SAndroid Build Coastguard Worker	ret <8 x i8> %tmp2
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vrev32Q16_undef(<8 x i16>* %A) nounwind {
214*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: test_vrev32Q16_undef:
215*9880d681SAndroid Build Coastguard Worker;CHECK: rev32.8h
216*9880d681SAndroid Build Coastguard Worker	%tmp1 = load <8 x i16>, <8 x i16>* %A
217*9880d681SAndroid Build Coastguard Worker	%tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 undef, i32 2, i32 5, i32 4, i32 7, i32 undef>
218*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %tmp2
219*9880d681SAndroid Build Coastguard Worker}
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker; vrev <4 x i16> should use REV32 and not REV64
222*9880d681SAndroid Build Coastguard Workerdefine void @test_vrev64(<4 x i16>* nocapture %source, <2 x i16>* nocapture %dst) nounwind ssp {
223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrev64:
224*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]],
225*9880d681SAndroid Build Coastguard Worker; CHECK: st1.h
226*9880d681SAndroid Build Coastguard Worker; CHECK: st1.h
227*9880d681SAndroid Build Coastguard Workerentry:
228*9880d681SAndroid Build Coastguard Worker  %0 = bitcast <4 x i16>* %source to <8 x i16>*
229*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <8 x i16>, <8 x i16>* %0, align 4
230*9880d681SAndroid Build Coastguard Worker  %tmp3 = extractelement <8 x i16> %tmp2, i32 6
231*9880d681SAndroid Build Coastguard Worker  %tmp5 = insertelement <2 x i16> undef, i16 %tmp3, i32 0
232*9880d681SAndroid Build Coastguard Worker  %tmp9 = extractelement <8 x i16> %tmp2, i32 5
233*9880d681SAndroid Build Coastguard Worker  %tmp11 = insertelement <2 x i16> %tmp5, i16 %tmp9, i32 1
234*9880d681SAndroid Build Coastguard Worker  store <2 x i16> %tmp11, <2 x i16>* %dst, align 4
235*9880d681SAndroid Build Coastguard Worker  ret void
236*9880d681SAndroid Build Coastguard Worker}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker; Test vrev of float4
239*9880d681SAndroid Build Coastguard Workerdefine void @float_vrev64(float* nocapture %source, <4 x float>* nocapture %dest) nounwind noinline ssp {
240*9880d681SAndroid Build Coastguard Worker; CHECK: float_vrev64
241*9880d681SAndroid Build Coastguard Worker; CHECK: ldr [[DEST:q[0-9]+]],
242*9880d681SAndroid Build Coastguard Worker; CHECK: rev64.4s
243*9880d681SAndroid Build Coastguard Workerentry:
244*9880d681SAndroid Build Coastguard Worker  %0 = bitcast float* %source to <4 x float>*
245*9880d681SAndroid Build Coastguard Worker  %tmp2 = load <4 x float>, <4 x float>* %0, align 4
246*9880d681SAndroid Build Coastguard Worker  %tmp5 = shufflevector <4 x float> <float 0.000000e+00, float undef, float undef, float undef>, <4 x float> %tmp2, <4 x i32> <i32 0, i32 7, i32 0, i32 0>
247*9880d681SAndroid Build Coastguard Worker  %arrayidx8 = getelementptr inbounds <4 x float>, <4 x float>* %dest, i32 11
248*9880d681SAndroid Build Coastguard Worker  store <4 x float> %tmp5, <4 x float>* %arrayidx8, align 4
249*9880d681SAndroid Build Coastguard Worker  ret void
250*9880d681SAndroid Build Coastguard Worker}
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vrev32_bswap(<4 x i32> %source) nounwind {
254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vrev32_bswap:
255*9880d681SAndroid Build Coastguard Worker; CHECK: rev32.16b
256*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: rev
257*9880d681SAndroid Build Coastguard Worker; CHECK: ret
258*9880d681SAndroid Build Coastguard Worker  %bswap = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %source)
259*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %bswap
260*9880d681SAndroid Build Coastguard Worker}
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.bswap.v4i32(<4 x i32>) nounwind readnone
263