1 // RUN: %clang_cc1 -triple thumbv8m.main -O0 -mcmse -emit-llvm %s -o - | \
2 // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-NOPT,CHECK-SOFT
3 // RUN: %clang_cc1 -triple thumbebv8m.main -O0 -mcmse -emit-llvm %s -o - | \
4 // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-SOFT
5 // RUN: %clang_cc1 -triple thumbv8m.main -O2 -mcmse -emit-llvm %s -o - | \
6 // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-OPT,CHECK-SOFT
7 // RUN: %clang_cc1 -triple thumbebv8m.main -O2 -mcmse -emit-llvm %s -o - | \
8 // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-BE,CHECK-BE-OPT,CHECK-SOFT
9 // RUN: %clang_cc1 -triple thumbv8m.main -O0 -mcmse -emit-llvm %s -o - \
10 // RUN: -mfloat-abi hard | \
11 // RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LE,CHECK-LE-NOPT,CHECK-HARD
14 // : Memory layout | Mask
15 // LE: .......1 ........ ........ ........ | 0x00000001/1
16 // BE: 1....... ........ ........ ........ | 0x80000000/-2147483648
22 __attribute__((cmse_nonsecure_entry
)) T0
f0(void) { return t0
; }
23 // CHECK: define {{.*}} @f0()
24 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 1
25 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -2147483648
26 // CHECK: ret i32 %[[R]]
28 // LE: ......1. ........ ........ ........ 0x00000002/2
29 // BE: .1...... ........ ........ ........ 0x40000000/1073741824
35 __attribute__((cmse_nonsecure_entry
)) T1
f1(void) { return t1
; }
36 // CHECK: define {{.*}} @f1()
37 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 2
38 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 1073741824
39 // CHECK: ret i32 %[[R]]
41 // LE: ........ .......1 ........ ........ 0x00000100/256
42 // BE: ........ 1....... ........ ........ 0x00800000/8388608
48 __attribute__((cmse_nonsecure_entry
)) T2
f2(void) { return t2
; }
49 // CHECK: define {{.*}} @f2()
50 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 256
51 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 8388608
52 // CHECK: ret i32 %[[R]]
54 // LE: ........ .....1.. ........ ........ 0x00000400/1024
55 // BE: ........ ..1..... ........ ........ 0x00200000/2097152
61 __attribute__((cmse_nonsecure_entry
)) T3
f3(void) { return t3
; }
62 // CHECK: define {{.*}} @f3()
63 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 1024
64 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2097152
65 // CHECK: ret i32 %[[R]]
67 // LE: 11111111 ........ ........ ........ 0x000000ff/255
68 // BE: 11111111 ........ ........ ........ 0xff000000/-16777216
74 __attribute__((cmse_nonsecure_entry
)) T4
f4(void) { return t4
; }
75 // CHECK: define {{.*}} @f4()
76 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 255
77 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -16777216
78 // CHECK: ret i32 %[[R]]
80 // LE: 1111111. .......1 ........ ........ 0x000001fe/510
81 // BE: .1111111 1....... ........ ........ 0x7f800000/2139095040
87 __attribute__((cmse_nonsecure_entry
)) T5
f5(void) { return t5
; }
88 // CHECK: define {{.*}} @f5()
89 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 510
90 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2139095040
91 // CHECK: ret i32 %[[R]]
93 // LE: 1111111. 11111111 ........ ........ 0x0000fffe/65534
94 // BE: .1111111 11111111 ........ ........ 0x7fff0000/2147418112
96 int : 1, a
: 15, : 16;
100 __attribute__((cmse_nonsecure_entry
)) T6
f6(void) { return t6
; }
101 // CHECK: define {{.*}} @f6()
102 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 65534
103 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2147418112
104 // CHECK: ret i32 %[[R]]
106 // LE: 1111111. 11111111 .......1 ........ 0x0001fffe/131070
107 // BE: .1111111 11111111 1....... ........ 0x7fff8000/2147450880
109 int : 1, a
: 16, : 15;
113 __attribute__((cmse_nonsecure_entry
)) T7
f7(void) { return t7
; }
114 // CHECK: define {{.*}} @f7()
115 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 131070
116 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, 2147450880
117 // CHECK: ret i32 %[[R]]
119 // LE: 11111111 111111.. 11111111 11111111 0xfffffcff/-769
120 // BE: 11111111 ..111111 11111111 11111111 0xff3fffff/-12582913
130 __attribute__((cmse_nonsecure_entry
)) T8
f8(void) { return t8
; }
131 // CHECK: define {{.*}} @f8()
132 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, -769
133 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -12582913
134 // CHECK: ret i32 %[[R]]
136 // LE: ......11 ..111111 ...11111 ........ 0x001f3f03/2047747
137 // BE: 11...... 111111.. 11111... ........ 0xc0fcf800/-1057163264
148 __attribute__((cmse_nonsecure_entry
)) T9
f9(void) { return t9
; }
149 // CHECK: define {{.*}} @f9()
150 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 2047747
151 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -1057163264
152 // CHECK: ret i32 %[[R]]
154 T9
f91(void) { return t9
; }
155 // CHECK: define {{.*}} @f91()
156 // CHECK: %[[R:.*]] = load i32
157 // CHECK: ret i32 %[[R]]
159 // LE: 11111111 ........ 11111111 11111111 0xffff00ff/-65281
160 // BE: 11111111 ........ 11111111 11111111 0xff00ffff/16711681
167 __attribute__((cmse_nonsecure_entry
)) T10
f10(void) { return t10
; }
168 // CHECK: define {{.*}} @f10()
169 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, -65281
170 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -16711681
171 // CHECK: ret i32 %[[R]]
173 // LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215
174 // BE: 11111111 11111111 11111111 ........ 0xffffff00/-256
181 __attribute__((cmse_nonsecure_entry
)) T11
f11(void) { return t11
; }
182 // CHECK: define {{.*}} @f11()
183 // CHECK-LE: %[[R:.*]] = and i32 %{{.*}}, 16777215
184 // CHECK-BE: %[[R:.*]] = and i32 %{{.*}}, -256
185 // CHECK: ret i32 %[[R]]
187 // LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215
188 // BE: 11111111 11111111 11111111 ........ 0xffffff00/-256
194 __attribute__((cmse_nonsecure_entry
)) T12
f12(void) { return t12
; }
195 // CHECK: define {{.*}} @f12()
196 // CHECK-LE-OPT: %[[V0:.*]] = load i24, ptr @t12
197 // CHECK-LE-OPT: %[[R:.*]] = zext i24 %[[V0]] to i32
198 // CHECK-LE-NOPT: %[[R:.*]] = and i32 %{{.*}}, 16777215
200 // CHECK-BE-OPT: %[[V0:.*]] = load i24, ptr @t12
201 // CHECK-BE-OPT: %[[V1:.*]] = zext i24 %[[V0]] to i32
202 // CHECK-BE-OPT: %[[R:.*]] = shl nuw i32 %[[V1]], 8
203 // CHECK: ret i32 %[[R]]
205 // LE: 11111111 11111111 11111111 ........ 0x00ffffff/16777215
206 // BE: 11111111 11111111 11111111 ........ 0xffffff00/-256
207 typedef struct __attribute__((packed
)) T13
{
213 __attribute__((cmse_nonsecure_entry
)) T13
f13(void) { return t13
; }
214 // CHECK: define {{.*}} @f13()
215 // CHECK-LE-OPT: %[[V0:.*]] = load i24, ptr @t13
216 // CHECK-LE-OPT: %[[R:.*]] = zext i24 %[[V0]] to i32
217 // CHECK-LE-NOPT: %[[R:.*]] = and i32 %{{.*}}, 16777215
219 // CHECK-BE-OPT: %[[V0:.*]] = load i24, ptr @t13
220 // CHECK-BE-OPT: %[[V1:.*]] = zext i24 %[[V0]] to i32
221 // CHECK-BE-OPT: %[[R:.*]] = shl nuw i32 %[[V1]], 8
222 // CHECK: ret i32 %[[R]]
224 typedef struct __attribute__((packed
)) T14
{
230 __attribute__((cmse_nonsecure_entry
)) T14
f14(void) { return t14
; }
231 // CHECK: define {{.*}} @f14()
232 // CHECK: [[R:%.*]] = load
233 // CHECK-LE-OPT: ret i32 [[R]]
234 // CHECK-LE-NOPT: [[AND:%.+]] = and i32 [[R]], -1
235 // CHECK-LE-NOPT: ret i32 [[AND]]
236 // CHECK-BE-OPT: ret i32 [[R]]
238 // LE: 1111..11 1111..11 11111111 11111111 0xfffff3f3/-3085
239 // BE: 11..1111 11..1111 11111111 11111111 0xcfcfffff/-808452097
250 __attribute__((cmse_nonsecure_entry
)) T17
f17(void) { return t17
; }
251 // CHECK: define {{.*}} @f17()
252 // CHECK-LE: %[[R:.*]] = and i32 {{.*}}, -3085
253 // CHECK-BE: %[[R:.*]] = and i32 {{.*}}, -808452097
254 // CHECK: ret i32 %[[R]]
261 __attribute__((cmse_nonsecure_entry
)) T21
f21(void) { return t21
; }
262 // CHECK: define {{.*}} @f21()
263 // CHECK-SOFT: ret i32
264 // CHECK-HARD: ret %struct.T21
266 __attribute__((cmse_nonsecure_entry
)) float f22(void) { return 1.0f
; }
267 // CHECK: define {{.*}} @f22()