1*67e74705SXin Li // RUN: %clang_cc1 -ffreestanding -triple armv8-eabi -target-cpu cortex-a57 -O -S -emit-llvm -o - %s | FileCheck %s -check-prefix=ARM -check-prefix=AArch32
2*67e74705SXin Li // RUN: %clang_cc1 -ffreestanding -triple aarch64-eabi -target-cpu cortex-a57 -target-feature +neon -target-feature +crc -target-feature +crypto -O -S -emit-llvm -o - %s | FileCheck %s -check-prefix=ARM -check-prefix=AArch64
3*67e74705SXin Li
4*67e74705SXin Li #include <arm_acle.h>
5*67e74705SXin Li
6*67e74705SXin Li /* 8 SYNCHRONIZATION, BARRIER AND HINT INTRINSICS */
7*67e74705SXin Li /* 8.3 Memory Barriers */
8*67e74705SXin Li // ARM-LABEL: test_dmb
9*67e74705SXin Li // AArch32: call void @llvm.arm.dmb(i32 1)
10*67e74705SXin Li // AArch64: call void @llvm.aarch64.dmb(i32 1)
test_dmb(void)11*67e74705SXin Li void test_dmb(void) {
12*67e74705SXin Li __dmb(1);
13*67e74705SXin Li }
14*67e74705SXin Li
15*67e74705SXin Li // ARM-LABEL: test_dsb
16*67e74705SXin Li // AArch32: call void @llvm.arm.dsb(i32 2)
17*67e74705SXin Li // AArch64: call void @llvm.aarch64.dsb(i32 2)
test_dsb(void)18*67e74705SXin Li void test_dsb(void) {
19*67e74705SXin Li __dsb(2);
20*67e74705SXin Li }
21*67e74705SXin Li
22*67e74705SXin Li // ARM-LABEL: test_isb
23*67e74705SXin Li // AArch32: call void @llvm.arm.isb(i32 3)
24*67e74705SXin Li // AArch64: call void @llvm.aarch64.isb(i32 3)
test_isb(void)25*67e74705SXin Li void test_isb(void) {
26*67e74705SXin Li __isb(3);
27*67e74705SXin Li }
28*67e74705SXin Li
29*67e74705SXin Li /* 8.4 Hints */
30*67e74705SXin Li // ARM-LABEL: test_yield
31*67e74705SXin Li // AArch32: call void @llvm.arm.hint(i32 1)
32*67e74705SXin Li // AArch64: call void @llvm.aarch64.hint(i32 1)
test_yield(void)33*67e74705SXin Li void test_yield(void) {
34*67e74705SXin Li __yield();
35*67e74705SXin Li }
36*67e74705SXin Li
37*67e74705SXin Li // ARM-LABEL: test_wfe
38*67e74705SXin Li // AArch32: call void @llvm.arm.hint(i32 2)
39*67e74705SXin Li // AArch64: call void @llvm.aarch64.hint(i32 2)
test_wfe(void)40*67e74705SXin Li void test_wfe(void) {
41*67e74705SXin Li __wfe();
42*67e74705SXin Li }
43*67e74705SXin Li
44*67e74705SXin Li // ARM-LABEL: test_wfi
45*67e74705SXin Li // AArch32: call void @llvm.arm.hint(i32 3)
46*67e74705SXin Li // AArch64: call void @llvm.aarch64.hint(i32 3)
test_wfi(void)47*67e74705SXin Li void test_wfi(void) {
48*67e74705SXin Li __wfi();
49*67e74705SXin Li }
50*67e74705SXin Li
51*67e74705SXin Li // ARM-LABEL: test_sev
52*67e74705SXin Li // AArch32: call void @llvm.arm.hint(i32 4)
53*67e74705SXin Li // AArch64: call void @llvm.aarch64.hint(i32 4)
test_sev(void)54*67e74705SXin Li void test_sev(void) {
55*67e74705SXin Li __sev();
56*67e74705SXin Li }
57*67e74705SXin Li
58*67e74705SXin Li // ARM-LABEL: test_sevl
59*67e74705SXin Li // AArch32: call void @llvm.arm.hint(i32 5)
60*67e74705SXin Li // AArch64: call void @llvm.aarch64.hint(i32 5)
test_sevl(void)61*67e74705SXin Li void test_sevl(void) {
62*67e74705SXin Li __sevl();
63*67e74705SXin Li }
64*67e74705SXin Li
65*67e74705SXin Li #if __ARM_32BIT_STATE
66*67e74705SXin Li // AArch32-LABEL: test_dbg
67*67e74705SXin Li // AArch32: call void @llvm.arm.dbg(i32 0)
test_dbg(void)68*67e74705SXin Li void test_dbg(void) {
69*67e74705SXin Li __dbg(0);
70*67e74705SXin Li }
71*67e74705SXin Li #endif
72*67e74705SXin Li
73*67e74705SXin Li /* 8.5 Swap */
74*67e74705SXin Li // ARM-LABEL: test_swp
75*67e74705SXin Li // AArch32: call i32 @llvm.arm.ldrex
76*67e74705SXin Li // AArch32: call i32 @llvm.arm.strex
77*67e74705SXin Li // AArch64: call i64 @llvm.aarch64.ldxr
78*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.stxr
test_swp(uint32_t x,volatile void * p)79*67e74705SXin Li uint32_t test_swp(uint32_t x, volatile void *p) {
80*67e74705SXin Li __swp(x, p);
81*67e74705SXin Li }
82*67e74705SXin Li
83*67e74705SXin Li /* 8.6 Memory prefetch intrinsics */
84*67e74705SXin Li /* 8.6.1 Data prefetch */
85*67e74705SXin Li // ARM-LABEL: test_pld
86*67e74705SXin Li // ARM: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 1)
test_pld()87*67e74705SXin Li void test_pld() {
88*67e74705SXin Li __pld(0);
89*67e74705SXin Li }
90*67e74705SXin Li
91*67e74705SXin Li // ARM-LABEL: test_pldx
92*67e74705SXin Li // AArch32: call void @llvm.prefetch(i8* null, i32 1, i32 3, i32 1)
93*67e74705SXin Li // AArch64: call void @llvm.prefetch(i8* null, i32 1, i32 1, i32 1)
test_pldx()94*67e74705SXin Li void test_pldx() {
95*67e74705SXin Li __pldx(1, 2, 0, 0);
96*67e74705SXin Li }
97*67e74705SXin Li
98*67e74705SXin Li /* 8.6.2 Instruction prefetch */
99*67e74705SXin Li // ARM-LABEL: test_pli
100*67e74705SXin Li // ARM: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 0)
test_pli()101*67e74705SXin Li void test_pli() {
102*67e74705SXin Li __pli(0);
103*67e74705SXin Li }
104*67e74705SXin Li
105*67e74705SXin Li // ARM-LABEL: test_plix
106*67e74705SXin Li // AArch32: call void @llvm.prefetch(i8* null, i32 0, i32 3, i32 0)
107*67e74705SXin Li // AArch64: call void @llvm.prefetch(i8* null, i32 0, i32 1, i32 0)
test_plix()108*67e74705SXin Li void test_plix() {
109*67e74705SXin Li __plix(2, 0, 0);
110*67e74705SXin Li }
111*67e74705SXin Li
112*67e74705SXin Li /* 8.7 NOP */
113*67e74705SXin Li // ARM-LABEL: test_nop
114*67e74705SXin Li // AArch32: call void @llvm.arm.hint(i32 0)
115*67e74705SXin Li // AArch64: call void @llvm.aarch64.hint(i32 0)
test_nop(void)116*67e74705SXin Li void test_nop(void) {
117*67e74705SXin Li __nop();
118*67e74705SXin Li }
119*67e74705SXin Li
120*67e74705SXin Li /* 9 DATA-PROCESSING INTRINSICS */
121*67e74705SXin Li /* 9.2 Miscellaneous data-processing intrinsics */
122*67e74705SXin Li // ARM-LABEL: test_ror
123*67e74705SXin Li // ARM: lshr
124*67e74705SXin Li // ARM: sub
125*67e74705SXin Li // ARM: shl
126*67e74705SXin Li // ARM: or
test_ror(uint32_t x,uint32_t y)127*67e74705SXin Li uint32_t test_ror(uint32_t x, uint32_t y) {
128*67e74705SXin Li return __ror(x, y);
129*67e74705SXin Li }
130*67e74705SXin Li
131*67e74705SXin Li // ARM-LABEL: test_rorl
132*67e74705SXin Li // ARM: lshr
133*67e74705SXin Li // ARM: sub
134*67e74705SXin Li // ARM: shl
135*67e74705SXin Li // ARM: or
test_rorl(unsigned long x,uint32_t y)136*67e74705SXin Li unsigned long test_rorl(unsigned long x, uint32_t y) {
137*67e74705SXin Li return __rorl(x, y);
138*67e74705SXin Li }
139*67e74705SXin Li
140*67e74705SXin Li // ARM-LABEL: test_rorll
141*67e74705SXin Li // ARM: lshr
142*67e74705SXin Li // ARM: sub
143*67e74705SXin Li // ARM: shl
144*67e74705SXin Li // ARM: or
test_rorll(uint64_t x,uint32_t y)145*67e74705SXin Li uint64_t test_rorll(uint64_t x, uint32_t y) {
146*67e74705SXin Li return __rorll(x, y);
147*67e74705SXin Li }
148*67e74705SXin Li
149*67e74705SXin Li // ARM-LABEL: test_clz
150*67e74705SXin Li // ARM: call i32 @llvm.ctlz.i32(i32 %t, i1 false)
test_clz(uint32_t t)151*67e74705SXin Li uint32_t test_clz(uint32_t t) {
152*67e74705SXin Li return __clz(t);
153*67e74705SXin Li }
154*67e74705SXin Li
155*67e74705SXin Li // ARM-LABEL: test_clzl
156*67e74705SXin Li // AArch32: call i32 @llvm.ctlz.i32(i32 %t, i1 false)
157*67e74705SXin Li // AArch64: call i64 @llvm.ctlz.i64(i64 %t, i1 false)
test_clzl(long t)158*67e74705SXin Li long test_clzl(long t) {
159*67e74705SXin Li return __clzl(t);
160*67e74705SXin Li }
161*67e74705SXin Li
162*67e74705SXin Li // ARM-LABEL: test_clzll
163*67e74705SXin Li // ARM: call i64 @llvm.ctlz.i64(i64 %t, i1 false)
test_clzll(uint64_t t)164*67e74705SXin Li uint64_t test_clzll(uint64_t t) {
165*67e74705SXin Li return __clzll(t);
166*67e74705SXin Li }
167*67e74705SXin Li
168*67e74705SXin Li // ARM-LABEL: test_rev
169*67e74705SXin Li // ARM: call i32 @llvm.bswap.i32(i32 %t)
test_rev(uint32_t t)170*67e74705SXin Li uint32_t test_rev(uint32_t t) {
171*67e74705SXin Li return __rev(t);
172*67e74705SXin Li }
173*67e74705SXin Li
174*67e74705SXin Li // ARM-LABEL: test_revl
175*67e74705SXin Li // AArch32: call i32 @llvm.bswap.i32(i32 %t)
176*67e74705SXin Li // AArch64: call i64 @llvm.bswap.i64(i64 %t)
test_revl(long t)177*67e74705SXin Li long test_revl(long t) {
178*67e74705SXin Li return __revl(t);
179*67e74705SXin Li }
180*67e74705SXin Li
181*67e74705SXin Li // ARM-LABEL: test_revll
182*67e74705SXin Li // ARM: call i64 @llvm.bswap.i64(i64 %t)
test_revll(uint64_t t)183*67e74705SXin Li uint64_t test_revll(uint64_t t) {
184*67e74705SXin Li return __revll(t);
185*67e74705SXin Li }
186*67e74705SXin Li
187*67e74705SXin Li // ARM-LABEL: test_rev16
188*67e74705SXin Li // ARM: llvm.bswap
189*67e74705SXin Li // ARM: lshr {{.*}}, 16
190*67e74705SXin Li // ARM: shl {{.*}}, 16
191*67e74705SXin Li // ARM: or
test_rev16(uint32_t t)192*67e74705SXin Li uint32_t test_rev16(uint32_t t) {
193*67e74705SXin Li return __rev16(t);
194*67e74705SXin Li }
195*67e74705SXin Li
196*67e74705SXin Li // ARM-LABEL: test_rev16l
197*67e74705SXin Li // AArch32: llvm.bswap
198*67e74705SXin Li // AArch32: lshr {{.*}}, 16
199*67e74705SXin Li // AArch32: shl {{.*}}, 16
200*67e74705SXin Li // AArch32: or
201*67e74705SXin Li // AArch64: [[T1:%.*]] = lshr i64 [[IN:%.*]], 32
202*67e74705SXin Li // AArch64: [[T2:%.*]] = trunc i64 [[T1]] to i32
203*67e74705SXin Li // AArch64: [[T3:%.*]] = tail call i32 @llvm.bswap.i32(i32 [[T2]])
204*67e74705SXin Li // AArch64: [[T4:%.*]] = lshr i32 [[T3]], 16
205*67e74705SXin Li // AArch64: [[T5:%.*]] = shl i32 [[T3]], 16
206*67e74705SXin Li // AArch64: [[T6:%.*]] = or i32 [[T5]], [[T4]]
207*67e74705SXin Li // AArch64: [[T7:%.*]] = zext i32 [[T6]] to i64
208*67e74705SXin Li // AArch64: [[T8:%.*]] = shl nuw i64 [[T7]], 32
209*67e74705SXin Li // AArch64: [[T9:%.*]] = trunc i64 [[IN]] to i32
210*67e74705SXin Li // AArch64: [[T10:%.*]] = tail call i32 @llvm.bswap.i32(i32 [[T9]])
211*67e74705SXin Li // AArch64: [[T11:%.*]] = lshr i32 [[T10]], 16
212*67e74705SXin Li // AArch64: [[T12:%.*]] = shl i32 [[T10]], 16
213*67e74705SXin Li // AArch64: [[T13:%.*]] = or i32 [[T12]], [[T11]]
214*67e74705SXin Li // AArch64: [[T14:%.*]] = zext i32 [[T13]] to i64
215*67e74705SXin Li // AArch64: [[T15:%.*]] = or i64 [[T8]], [[T14]]
test_rev16l(long t)216*67e74705SXin Li long test_rev16l(long t) {
217*67e74705SXin Li return __rev16l(t);
218*67e74705SXin Li }
219*67e74705SXin Li
220*67e74705SXin Li // ARM-LABEL: test_rev16ll
221*67e74705SXin Li // ARM: [[T1:%.*]] = lshr i64 [[IN:%.*]], 32
222*67e74705SXin Li // ARM: [[T2:%.*]] = trunc i64 [[T1]] to i32
223*67e74705SXin Li // ARM: [[T3:%.*]] = tail call i32 @llvm.bswap.i32(i32 [[T2]])
224*67e74705SXin Li // ARM: [[T4:%.*]] = lshr i32 [[T3]], 16
225*67e74705SXin Li // ARM: [[T5:%.*]] = shl i32 [[T3]], 16
226*67e74705SXin Li // ARM: [[T6:%.*]] = or i32 [[T5]], [[T4]]
227*67e74705SXin Li // ARM: [[T7:%.*]] = zext i32 [[T6]] to i64
228*67e74705SXin Li // ARM: [[T8:%.*]] = shl nuw i64 [[T7]], 32
229*67e74705SXin Li // ARM: [[T9:%.*]] = trunc i64 [[IN]] to i32
230*67e74705SXin Li // ARM: [[T10:%.*]] = tail call i32 @llvm.bswap.i32(i32 [[T9]])
231*67e74705SXin Li // ARM: [[T11:%.*]] = lshr i32 [[T10]], 16
232*67e74705SXin Li // ARM: [[T12:%.*]] = shl i32 [[T10]], 16
233*67e74705SXin Li // ARM: [[T13:%.*]] = or i32 [[T12]], [[T11]]
234*67e74705SXin Li // ARM: [[T14:%.*]] = zext i32 [[T13]] to i64
235*67e74705SXin Li // ARM: [[T15:%.*]] = or i64 [[T8]], [[T14]]
test_rev16ll(uint64_t t)236*67e74705SXin Li uint64_t test_rev16ll(uint64_t t) {
237*67e74705SXin Li return __rev16ll(t);
238*67e74705SXin Li }
239*67e74705SXin Li
240*67e74705SXin Li // ARM-LABEL: test_revsh
241*67e74705SXin Li // ARM: call i16 @llvm.bswap.i16(i16 %t)
test_revsh(int16_t t)242*67e74705SXin Li int16_t test_revsh(int16_t t) {
243*67e74705SXin Li return __revsh(t);
244*67e74705SXin Li }
245*67e74705SXin Li
246*67e74705SXin Li // ARM-LABEL: test_rbit
247*67e74705SXin Li // AArch32: call i32 @llvm.arm.rbit
248*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.rbit.i32
test_rbit(uint32_t t)249*67e74705SXin Li uint32_t test_rbit(uint32_t t) {
250*67e74705SXin Li return __rbit(t);
251*67e74705SXin Li }
252*67e74705SXin Li
253*67e74705SXin Li // ARM-LABEL: test_rbitl
254*67e74705SXin Li // AArch32: call i32 @llvm.arm.rbit
255*67e74705SXin Li // AArch64: call i64 @llvm.aarch64.rbit.i64
test_rbitl(long t)256*67e74705SXin Li long test_rbitl(long t) {
257*67e74705SXin Li return __rbitl(t);
258*67e74705SXin Li }
259*67e74705SXin Li
260*67e74705SXin Li // ARM-LABEL: test_rbitll
261*67e74705SXin Li // AArch32: call i32 @llvm.arm.rbit
262*67e74705SXin Li // AArch32: call i32 @llvm.arm.rbit
263*67e74705SXin Li // AArch64: call i64 @llvm.aarch64.rbit.i64
test_rbitll(uint64_t t)264*67e74705SXin Li uint64_t test_rbitll(uint64_t t) {
265*67e74705SXin Li return __rbitll(t);
266*67e74705SXin Li }
267*67e74705SXin Li
268*67e74705SXin Li /* 9.4 Saturating intrinsics */
269*67e74705SXin Li #ifdef __ARM_32BIT_STATE
270*67e74705SXin Li
271*67e74705SXin Li /* 9.4.1 Width-specified saturation intrinsics */
272*67e74705SXin Li // AArch32-LABEL: test_ssat
273*67e74705SXin Li // AArch32: call i32 @llvm.arm.ssat(i32 %t, i32 1)
test_ssat(int32_t t)274*67e74705SXin Li int32_t test_ssat(int32_t t) {
275*67e74705SXin Li return __ssat(t, 1);
276*67e74705SXin Li }
277*67e74705SXin Li
278*67e74705SXin Li // AArch32-LABEL: test_usat
279*67e74705SXin Li // AArch32: call i32 @llvm.arm.usat(i32 %t, i32 2)
test_usat(int32_t t)280*67e74705SXin Li int32_t test_usat(int32_t t) {
281*67e74705SXin Li return __usat(t, 2);
282*67e74705SXin Li }
283*67e74705SXin Li
284*67e74705SXin Li /* 9.4.2 Saturating addition and subtraction intrinsics */
285*67e74705SXin Li // AArch32-LABEL: test_qadd
286*67e74705SXin Li // AArch32: call i32 @llvm.arm.qadd(i32 %a, i32 %b)
test_qadd(int32_t a,int32_t b)287*67e74705SXin Li int32_t test_qadd(int32_t a, int32_t b) {
288*67e74705SXin Li return __qadd(a, b);
289*67e74705SXin Li }
290*67e74705SXin Li
291*67e74705SXin Li // AArch32-LABEL: test_qsub
292*67e74705SXin Li // AArch32: call i32 @llvm.arm.qsub(i32 %a, i32 %b)
test_qsub(int32_t a,int32_t b)293*67e74705SXin Li int32_t test_qsub(int32_t a, int32_t b) {
294*67e74705SXin Li return __qsub(a, b);
295*67e74705SXin Li }
296*67e74705SXin Li
297*67e74705SXin Li extern int32_t f();
298*67e74705SXin Li // AArch32-LABEL: test_qdbl
299*67e74705SXin Li // AArch32: [[VAR:%[a-z0-9]+]] = {{.*}} call {{.*}} @f
300*67e74705SXin Li // AArch32-NOT: call {{.*}} @f
301*67e74705SXin Li // AArch32: call i32 @llvm.arm.qadd(i32 [[VAR]], i32 [[VAR]])
test_qdbl()302*67e74705SXin Li int32_t test_qdbl() {
303*67e74705SXin Li return __qdbl(f());
304*67e74705SXin Li }
305*67e74705SXin Li #endif
306*67e74705SXin Li
307*67e74705SXin Li /* 9.7 CRC32 intrinsics */
308*67e74705SXin Li // ARM-LABEL: test_crc32b
309*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32b
310*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32b
test_crc32b(uint32_t a,uint8_t b)311*67e74705SXin Li uint32_t test_crc32b(uint32_t a, uint8_t b) {
312*67e74705SXin Li return __crc32b(a, b);
313*67e74705SXin Li }
314*67e74705SXin Li
315*67e74705SXin Li // ARM-LABEL: test_crc32h
316*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32h
317*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32h
test_crc32h(uint32_t a,uint16_t b)318*67e74705SXin Li uint32_t test_crc32h(uint32_t a, uint16_t b) {
319*67e74705SXin Li return __crc32h(a, b);
320*67e74705SXin Li }
321*67e74705SXin Li
322*67e74705SXin Li // ARM-LABEL: test_crc32w
323*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32w
324*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32w
test_crc32w(uint32_t a,uint32_t b)325*67e74705SXin Li uint32_t test_crc32w(uint32_t a, uint32_t b) {
326*67e74705SXin Li return __crc32w(a, b);
327*67e74705SXin Li }
328*67e74705SXin Li
329*67e74705SXin Li // ARM-LABEL: test_crc32d
330*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32w
331*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32w
332*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32x
test_crc32d(uint32_t a,uint64_t b)333*67e74705SXin Li uint32_t test_crc32d(uint32_t a, uint64_t b) {
334*67e74705SXin Li return __crc32d(a, b);
335*67e74705SXin Li }
336*67e74705SXin Li
337*67e74705SXin Li // ARM-LABEL: test_crc32cb
338*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32cb
339*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32cb
test_crc32cb(uint32_t a,uint8_t b)340*67e74705SXin Li uint32_t test_crc32cb(uint32_t a, uint8_t b) {
341*67e74705SXin Li return __crc32cb(a, b);
342*67e74705SXin Li }
343*67e74705SXin Li
344*67e74705SXin Li // ARM-LABEL: test_crc32ch
345*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32ch
346*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32ch
test_crc32ch(uint32_t a,uint16_t b)347*67e74705SXin Li uint32_t test_crc32ch(uint32_t a, uint16_t b) {
348*67e74705SXin Li return __crc32ch(a, b);
349*67e74705SXin Li }
350*67e74705SXin Li
351*67e74705SXin Li // ARM-LABEL: test_crc32cw
352*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32cw
353*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32cw
test_crc32cw(uint32_t a,uint32_t b)354*67e74705SXin Li uint32_t test_crc32cw(uint32_t a, uint32_t b) {
355*67e74705SXin Li return __crc32cw(a, b);
356*67e74705SXin Li }
357*67e74705SXin Li
358*67e74705SXin Li // ARM-LABEL: test_crc32cd
359*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32cw
360*67e74705SXin Li // AArch32: call i32 @llvm.arm.crc32cw
361*67e74705SXin Li // AArch64: call i32 @llvm.aarch64.crc32cx
test_crc32cd(uint32_t a,uint64_t b)362*67e74705SXin Li uint32_t test_crc32cd(uint32_t a, uint64_t b) {
363*67e74705SXin Li return __crc32cd(a, b);
364*67e74705SXin Li }
365*67e74705SXin Li
366*67e74705SXin Li /* 10.1 Special register intrinsics */
367*67e74705SXin Li // ARM-LABEL: test_rsr
368*67e74705SXin Li // AArch64: call i64 @llvm.read_register.i64(metadata ![[M0:[0-9]]])
369*67e74705SXin Li // AArch32: call i32 @llvm.read_register.i32(metadata ![[M2:[0-9]]])
test_rsr()370*67e74705SXin Li uint32_t test_rsr() {
371*67e74705SXin Li #ifdef __ARM_32BIT_STATE
372*67e74705SXin Li return __arm_rsr("cp1:2:c3:c4:5");
373*67e74705SXin Li #else
374*67e74705SXin Li return __arm_rsr("1:2:3:4:5");
375*67e74705SXin Li #endif
376*67e74705SXin Li }
377*67e74705SXin Li
378*67e74705SXin Li // ARM-LABEL: test_rsr64
379*67e74705SXin Li // AArch64: call i64 @llvm.read_register.i64(metadata ![[M0:[0-9]]])
380*67e74705SXin Li // AArch32: call i64 @llvm.read_register.i64(metadata ![[M3:[0-9]]])
test_rsr64()381*67e74705SXin Li uint64_t test_rsr64() {
382*67e74705SXin Li #ifdef __ARM_32BIT_STATE
383*67e74705SXin Li return __arm_rsr64("cp1:2:c3");
384*67e74705SXin Li #else
385*67e74705SXin Li return __arm_rsr64("1:2:3:4:5");
386*67e74705SXin Li #endif
387*67e74705SXin Li }
388*67e74705SXin Li
389*67e74705SXin Li // ARM-LABEL: test_rsrp
390*67e74705SXin Li // AArch64: call i64 @llvm.read_register.i64(metadata ![[M1:[0-9]]])
391*67e74705SXin Li // AArch32: call i32 @llvm.read_register.i32(metadata ![[M4:[0-9]]])
test_rsrp()392*67e74705SXin Li void *test_rsrp() {
393*67e74705SXin Li return __arm_rsrp("sysreg");
394*67e74705SXin Li }
395*67e74705SXin Li
396*67e74705SXin Li // ARM-LABEL: test_wsr
397*67e74705SXin Li // AArch64: call void @llvm.write_register.i64(metadata ![[M0:[0-9]]], i64 %{{.*}})
398*67e74705SXin Li // AArch32: call void @llvm.write_register.i32(metadata ![[M2:[0-9]]], i32 %{{.*}})
test_wsr(uint32_t v)399*67e74705SXin Li void test_wsr(uint32_t v) {
400*67e74705SXin Li #ifdef __ARM_32BIT_STATE
401*67e74705SXin Li __arm_wsr("cp1:2:c3:c4:5", v);
402*67e74705SXin Li #else
403*67e74705SXin Li __arm_wsr("1:2:3:4:5", v);
404*67e74705SXin Li #endif
405*67e74705SXin Li }
406*67e74705SXin Li
407*67e74705SXin Li // ARM-LABEL: test_wsr64
408*67e74705SXin Li // AArch64: call void @llvm.write_register.i64(metadata ![[M0:[0-9]]], i64 %{{.*}})
409*67e74705SXin Li // AArch32: call void @llvm.write_register.i64(metadata ![[M3:[0-9]]], i64 %{{.*}})
test_wsr64(uint64_t v)410*67e74705SXin Li void test_wsr64(uint64_t v) {
411*67e74705SXin Li #ifdef __ARM_32BIT_STATE
412*67e74705SXin Li __arm_wsr64("cp1:2:c3", v);
413*67e74705SXin Li #else
414*67e74705SXin Li __arm_wsr64("1:2:3:4:5", v);
415*67e74705SXin Li #endif
416*67e74705SXin Li }
417*67e74705SXin Li
418*67e74705SXin Li // ARM-LABEL: test_wsrp
419*67e74705SXin Li // AArch64: call void @llvm.write_register.i64(metadata ![[M1:[0-9]]], i64 %{{.*}})
420*67e74705SXin Li // AArch32: call void @llvm.write_register.i32(metadata ![[M4:[0-9]]], i32 %{{.*}})
test_wsrp(void * v)421*67e74705SXin Li void test_wsrp(void *v) {
422*67e74705SXin Li __arm_wsrp("sysreg", v);
423*67e74705SXin Li }
424*67e74705SXin Li
425*67e74705SXin Li // AArch32: ![[M2]] = !{!"cp1:2:c3:c4:5"}
426*67e74705SXin Li // AArch32: ![[M3]] = !{!"cp1:2:c3"}
427*67e74705SXin Li // AArch32: ![[M4]] = !{!"sysreg"}
428*67e74705SXin Li
429*67e74705SXin Li // AArch64: ![[M0]] = !{!"1:2:3:4:5"}
430*67e74705SXin Li // AArch64: ![[M1]] = !{!"sysreg"}
431