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