xref: /aosp_15_r20/external/clang/test/CodeGen/builtins-arm.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -Wall -Werror -triple thumbv7-eabi -target-cpu cortex-a8 -emit-llvm -o - %s | opt -S -mem2reg | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li #include <stdint.h>
4*67e74705SXin Li 
f0()5*67e74705SXin Li void *f0()
6*67e74705SXin Li {
7*67e74705SXin Li   return __builtin_thread_pointer();
8*67e74705SXin Li }
9*67e74705SXin Li 
f1(char * a,char * b)10*67e74705SXin Li void f1(char *a, char *b) {
11*67e74705SXin Li 	__clear_cache(a,b);
12*67e74705SXin Li }
13*67e74705SXin Li 
14*67e74705SXin Li // CHECK: call {{.*}} @__clear_cache
15*67e74705SXin Li 
test_eh_return_data_regno()16*67e74705SXin Li void test_eh_return_data_regno()
17*67e74705SXin Li {
18*67e74705SXin Li   volatile int res;
19*67e74705SXin Li   res = __builtin_eh_return_data_regno(0);  // CHECK: store volatile i32 0
20*67e74705SXin Li   res = __builtin_eh_return_data_regno(1);  // CHECK: store volatile i32 1
21*67e74705SXin Li }
22*67e74705SXin Li 
nop()23*67e74705SXin Li void nop() {
24*67e74705SXin Li   __builtin_arm_nop();
25*67e74705SXin Li }
26*67e74705SXin Li 
27*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.hint(i32 0)
28*67e74705SXin Li 
yield()29*67e74705SXin Li void yield() {
30*67e74705SXin Li   __builtin_arm_yield();
31*67e74705SXin Li }
32*67e74705SXin Li 
33*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.hint(i32 1)
34*67e74705SXin Li 
wfe()35*67e74705SXin Li void wfe() {
36*67e74705SXin Li   __builtin_arm_wfe();
37*67e74705SXin Li }
38*67e74705SXin Li 
39*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.hint(i32 2)
40*67e74705SXin Li 
wfi()41*67e74705SXin Li void wfi() {
42*67e74705SXin Li   __builtin_arm_wfi();
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.hint(i32 3)
46*67e74705SXin Li 
sev()47*67e74705SXin Li void sev() {
48*67e74705SXin Li   __builtin_arm_sev();
49*67e74705SXin Li }
50*67e74705SXin Li 
51*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.hint(i32 4)
52*67e74705SXin Li 
sevl()53*67e74705SXin Li void sevl() {
54*67e74705SXin Li   __builtin_arm_sevl();
55*67e74705SXin Li }
56*67e74705SXin Li 
57*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.hint(i32 5)
58*67e74705SXin Li 
dbg()59*67e74705SXin Li void dbg() {
60*67e74705SXin Li   __builtin_arm_dbg(0);
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.dbg(i32 0)
64*67e74705SXin Li 
test_barrier()65*67e74705SXin Li void test_barrier() {
66*67e74705SXin Li   __builtin_arm_dmb(1); //CHECK: call {{.*}} @llvm.arm.dmb(i32 1)
67*67e74705SXin Li   __builtin_arm_dsb(2); //CHECK: call {{.*}} @llvm.arm.dsb(i32 2)
68*67e74705SXin Li   __builtin_arm_isb(3); //CHECK: call {{.*}} @llvm.arm.isb(i32 3)
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li // CHECK: call {{.*}} @llvm.arm.rbit(i32 %a)
72*67e74705SXin Li 
rbit(unsigned a)73*67e74705SXin Li unsigned rbit(unsigned a) {
74*67e74705SXin Li   return __builtin_arm_rbit(a);
75*67e74705SXin Li }
76*67e74705SXin Li 
prefetch(int i)77*67e74705SXin Li void prefetch(int i) {
78*67e74705SXin Li   __builtin_arm_prefetch(&i, 0, 1);
79*67e74705SXin Li // CHECK: call {{.*}} @llvm.prefetch(i8* %{{.*}}, i32 0, i32 3, i32 1)
80*67e74705SXin Li 
81*67e74705SXin Li   __builtin_arm_prefetch(&i, 1, 1);
82*67e74705SXin Li // CHECK: call {{.*}} @llvm.prefetch(i8* %{{.*}}, i32 1, i32 3, i32 1)
83*67e74705SXin Li 
84*67e74705SXin Li 
85*67e74705SXin Li   __builtin_arm_prefetch(&i, 1, 0);
86*67e74705SXin Li // CHECK: call {{.*}} @llvm.prefetch(i8* %{{.*}}, i32 1, i32 3, i32 0)
87*67e74705SXin Li }
88*67e74705SXin Li 
ldc(const void * i)89*67e74705SXin Li void ldc(const void *i) {
90*67e74705SXin Li   // CHECK: define void @ldc(i8* %i)
91*67e74705SXin Li   // CHECK: call void @llvm.arm.ldc(i32 1, i32 2, i8* %i)
92*67e74705SXin Li   // CHECK-NEXT: ret void
93*67e74705SXin Li   __builtin_arm_ldc(1, 2, i);
94*67e74705SXin Li }
95*67e74705SXin Li 
ldcl(const void * i)96*67e74705SXin Li void ldcl(const void *i) {
97*67e74705SXin Li   // CHECK: define void @ldcl(i8* %i)
98*67e74705SXin Li   // CHECK: call void @llvm.arm.ldcl(i32 1, i32 2, i8* %i)
99*67e74705SXin Li   // CHECK-NEXT: ret void
100*67e74705SXin Li   __builtin_arm_ldcl(1, 2, i);
101*67e74705SXin Li }
102*67e74705SXin Li 
ldc2(const void * i)103*67e74705SXin Li void ldc2(const void *i) {
104*67e74705SXin Li   // CHECK: define void @ldc2(i8* %i)
105*67e74705SXin Li   // CHECK: call void @llvm.arm.ldc2(i32 1, i32 2, i8* %i)
106*67e74705SXin Li   // CHECK-NEXT: ret void
107*67e74705SXin Li   __builtin_arm_ldc2(1, 2, i);
108*67e74705SXin Li }
109*67e74705SXin Li 
ldc2l(const void * i)110*67e74705SXin Li void ldc2l(const void *i) {
111*67e74705SXin Li   // CHECK: define void @ldc2l(i8* %i)
112*67e74705SXin Li   // CHECK: call void @llvm.arm.ldc2l(i32 1, i32 2, i8* %i)
113*67e74705SXin Li   // CHECK-NEXT: ret void
114*67e74705SXin Li   __builtin_arm_ldc2l(1, 2, i);
115*67e74705SXin Li }
116*67e74705SXin Li 
stc(void * i)117*67e74705SXin Li void stc(void *i) {
118*67e74705SXin Li   // CHECK: define void @stc(i8* %i)
119*67e74705SXin Li   // CHECK: call void @llvm.arm.stc(i32 1, i32 2, i8* %i)
120*67e74705SXin Li   // CHECK-NEXT: ret void
121*67e74705SXin Li   __builtin_arm_stc(1, 2, i);
122*67e74705SXin Li }
123*67e74705SXin Li 
stcl(void * i)124*67e74705SXin Li void stcl(void *i) {
125*67e74705SXin Li   // CHECK: define void @stcl(i8* %i)
126*67e74705SXin Li   // CHECK: call void @llvm.arm.stcl(i32 1, i32 2, i8* %i)
127*67e74705SXin Li   // CHECK-NEXT: ret void
128*67e74705SXin Li   __builtin_arm_stcl(1, 2, i);
129*67e74705SXin Li }
130*67e74705SXin Li 
stc2(void * i)131*67e74705SXin Li void stc2(void *i) {
132*67e74705SXin Li   // CHECK: define void @stc2(i8* %i)
133*67e74705SXin Li   // CHECK: call void @llvm.arm.stc2(i32 1, i32 2, i8* %i)
134*67e74705SXin Li   // CHECK-NEXT: ret void
135*67e74705SXin Li   __builtin_arm_stc2(1, 2, i);
136*67e74705SXin Li }
137*67e74705SXin Li 
stc2l(void * i)138*67e74705SXin Li void stc2l(void *i) {
139*67e74705SXin Li   // CHECK: define void @stc2l(i8* %i)
140*67e74705SXin Li   // CHECK: call void @llvm.arm.stc2l(i32 1, i32 2, i8* %i)
141*67e74705SXin Li   // CHECK-NEXT: ret void
142*67e74705SXin Li   __builtin_arm_stc2l(1, 2, i);
143*67e74705SXin Li }
144*67e74705SXin Li 
cdp()145*67e74705SXin Li void cdp() {
146*67e74705SXin Li   // CHECK: define void @cdp()
147*67e74705SXin Li   // CHECK: call void @llvm.arm.cdp(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6)
148*67e74705SXin Li   // CHECK-NEXT: ret void
149*67e74705SXin Li   __builtin_arm_cdp(1, 2, 3, 4, 5, 6);
150*67e74705SXin Li }
151*67e74705SXin Li 
cdp2()152*67e74705SXin Li void cdp2() {
153*67e74705SXin Li   // CHECK: define void @cdp2()
154*67e74705SXin Li   // CHECK: call void @llvm.arm.cdp2(i32 1, i32 2, i32 3, i32 4, i32 5, i32 6)
155*67e74705SXin Li   // CHECK-NEXT: ret void
156*67e74705SXin Li   __builtin_arm_cdp2(1, 2, 3, 4, 5, 6);
157*67e74705SXin Li }
158*67e74705SXin Li 
mrc()159*67e74705SXin Li unsigned mrc() {
160*67e74705SXin Li   // CHECK: define i32 @mrc()
161*67e74705SXin Li   // CHECK: [[R:%.*]] = call i32 @llvm.arm.mrc(i32 15, i32 0, i32 13, i32 0, i32 3)
162*67e74705SXin Li   // CHECK-NEXT: ret i32 [[R]]
163*67e74705SXin Li   return __builtin_arm_mrc(15, 0, 13, 0, 3);
164*67e74705SXin Li }
165*67e74705SXin Li 
mrc2()166*67e74705SXin Li unsigned mrc2() {
167*67e74705SXin Li   // CHECK: define i32 @mrc2()
168*67e74705SXin Li   // CHECK: [[R:%.*]] = call i32 @llvm.arm.mrc2(i32 15, i32 0, i32 13, i32 0, i32 3)
169*67e74705SXin Li   // CHECK-NEXT: ret i32 [[R]]
170*67e74705SXin Li   return __builtin_arm_mrc2(15, 0, 13, 0, 3);
171*67e74705SXin Li }
172*67e74705SXin Li 
mcr(unsigned a)173*67e74705SXin Li void mcr(unsigned a) {
174*67e74705SXin Li   // CHECK: define void @mcr(i32 [[A:%.*]])
175*67e74705SXin Li   // CHECK: call void @llvm.arm.mcr(i32 15, i32 0, i32 [[A]], i32 13, i32 0, i32 3)
176*67e74705SXin Li   __builtin_arm_mcr(15, 0, a, 13, 0, 3);
177*67e74705SXin Li }
178*67e74705SXin Li 
mcr2(unsigned a)179*67e74705SXin Li void mcr2(unsigned a) {
180*67e74705SXin Li   // CHECK: define void @mcr2(i32 [[A:%.*]])
181*67e74705SXin Li   // CHECK: call void @llvm.arm.mcr2(i32 15, i32 0, i32 [[A]], i32 13, i32 0, i32 3)
182*67e74705SXin Li   __builtin_arm_mcr2(15, 0, a, 13, 0, 3);
183*67e74705SXin Li }
184*67e74705SXin Li 
mcrr(uint64_t a)185*67e74705SXin Li void mcrr(uint64_t a) {
186*67e74705SXin Li   // CHECK: define void @mcrr(i64 %{{.*}})
187*67e74705SXin Li   // CHECK: call void @llvm.arm.mcrr(i32 15, i32 0, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 0)
188*67e74705SXin Li   __builtin_arm_mcrr(15, 0, a, 0);
189*67e74705SXin Li }
190*67e74705SXin Li 
mcrr2(uint64_t a)191*67e74705SXin Li void mcrr2(uint64_t a) {
192*67e74705SXin Li   // CHECK: define void @mcrr2(i64 %{{.*}})
193*67e74705SXin Li   // CHECK: call void @llvm.arm.mcrr2(i32 15, i32 0, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 0)
194*67e74705SXin Li   __builtin_arm_mcrr2(15, 0, a, 0);
195*67e74705SXin Li }
196*67e74705SXin Li 
mrrc()197*67e74705SXin Li uint64_t mrrc() {
198*67e74705SXin Li   // CHECK: define i64 @mrrc()
199*67e74705SXin Li   // CHECK: call { i32, i32 } @llvm.arm.mrrc(i32 15, i32 0, i32 0)
200*67e74705SXin Li   return __builtin_arm_mrrc(15, 0, 0);
201*67e74705SXin Li }
202*67e74705SXin Li 
mrrc2()203*67e74705SXin Li uint64_t mrrc2() {
204*67e74705SXin Li   // CHECK: define i64 @mrrc2()
205*67e74705SXin Li   // CHECK: call { i32, i32 } @llvm.arm.mrrc2(i32 15, i32 0, i32 0)
206*67e74705SXin Li   return __builtin_arm_mrrc2(15, 0, 0);
207*67e74705SXin Li }
208*67e74705SXin Li 
rsr()209*67e74705SXin Li unsigned rsr() {
210*67e74705SXin Li   // CHECK: [[V0:[%A-Za-z0-9.]+]] = call i32 @llvm.read_register.i32(metadata ![[M0:.*]])
211*67e74705SXin Li   // CHECK-NEXT: ret i32 [[V0]]
212*67e74705SXin Li   return __builtin_arm_rsr("cp1:2:c3:c4:5");
213*67e74705SXin Li }
214*67e74705SXin Li 
rsr64()215*67e74705SXin Li unsigned long long rsr64() {
216*67e74705SXin Li   // CHECK: [[V0:[%A-Za-z0-9.]+]] = call i64 @llvm.read_register.i64(metadata ![[M1:.*]])
217*67e74705SXin Li   // CHECK-NEXT: ret i64 [[V0]]
218*67e74705SXin Li   return __builtin_arm_rsr64("cp1:2:c3");
219*67e74705SXin Li }
220*67e74705SXin Li 
rsrp()221*67e74705SXin Li void *rsrp() {
222*67e74705SXin Li   // CHECK: [[V0:[%A-Za-z0-9.]+]] = call i32 @llvm.read_register.i32(metadata ![[M2:.*]])
223*67e74705SXin Li   // CHECK-NEXT: [[V1:[%A-Za-z0-9.]+]] = inttoptr i32 [[V0]] to i8*
224*67e74705SXin Li   // CHECK-NEXT: ret i8* [[V1]]
225*67e74705SXin Li   return __builtin_arm_rsrp("sysreg");
226*67e74705SXin Li }
227*67e74705SXin Li 
wsr(unsigned v)228*67e74705SXin Li void wsr(unsigned v) {
229*67e74705SXin Li   // CHECK: call void @llvm.write_register.i32(metadata ![[M0]], i32 %v)
230*67e74705SXin Li   __builtin_arm_wsr("cp1:2:c3:c4:5", v);
231*67e74705SXin Li }
232*67e74705SXin Li 
wsr64(unsigned long long v)233*67e74705SXin Li void wsr64(unsigned long long v) {
234*67e74705SXin Li   // CHECK: call void @llvm.write_register.i64(metadata ![[M1]], i64 %v)
235*67e74705SXin Li   __builtin_arm_wsr64("cp1:2:c3", v);
236*67e74705SXin Li }
237*67e74705SXin Li 
wsrp(void * v)238*67e74705SXin Li void wsrp(void *v) {
239*67e74705SXin Li   // CHECK: [[V0:[%A-Za-z0-9.]+]] = ptrtoint i8* %v to i32
240*67e74705SXin Li   // CHECK-NEXT: call void @llvm.write_register.i32(metadata ![[M2]], i32 [[V0]])
241*67e74705SXin Li   __builtin_arm_wsrp("sysreg", v);
242*67e74705SXin Li }
243*67e74705SXin Li 
244*67e74705SXin Li // CHECK: ![[M0]] = !{!"cp1:2:c3:c4:5"}
245*67e74705SXin Li // CHECK: ![[M1]] = !{!"cp1:2:c3"}
246*67e74705SXin Li // CHECK: ![[M2]] = !{!"sysreg"}
247