[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / CodeGen / ARM / cmse-clear.ll
bloba20e33e1d891fc4f9186db05f7ba2fd80cc3e76a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc %s -o - -mtriple=thumbv8m.base | \
3 ; RUN:   FileCheck %s --check-prefix=CHECK-8B
4 ; RUN: llc %s -o - -mtriple=thumbebv8m.base | \
5 ; RUN:   FileCheck %s --check-prefix=CHECK-8B
6 ; RUN: llc %s -o - -mtriple=thumbv8m.main -mattr=-fpregs,+dsp | \
7 ; RUN:   FileCheck %s --check-prefix=CHECK-8M-SOFT
8 ; RUN: llc %s -o - -mtriple=thumbebv8m.main -mattr=-fpregs,+dsp | \
9 ; RUN:   FileCheck %s --check-prefix=CHECK-8M-SOFT
10 ; RUN: llc %s -o - -mtriple=thumbv8m.main -mattr=+fp-armv8d16sp,+dsp | \
11 ; RUN:   FileCheck %s --check-prefix=CHECK-8M-SOFTFP
12 ; RUN: llc %s -o - -mtriple=thumbebv8m.main -mattr=+fp-armv8d16sp,+dsp | \
13 ; RUN:   FileCheck %s --check-prefix=CHECK-8M-SOFTFP
14 ; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=-fpregs,+dsp | \
15 ; RUN:   FileCheck %s --check-prefix=CHECK-81M-SOFT
16 ; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=-fpregs,+dsp | \
17 ; RUN:   FileCheck %s --check-prefix=CHECK-81M-SOFT
18 ; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+fp-armv8d16sp,+dsp | \
19 ; RUN:   FileCheck %s --check-prefix=CHECK-81M-SOFTFP
20 ; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+fp-armv8d16sp,+dsp | \
21 ; RUN:   FileCheck %s --check-prefix=CHECK-81M-SOFTFP
22 ; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+mve | \
23 ; RUN:   FileCheck %s --check-prefix=CHECK-81M-SOFTFP
24 ; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=mve | \
25 ; RUN:   FileCheck %s --check-prefix=CHECK-81M-SOFTFP
27 define i32 @ns_entry(ptr nocapture %fptr) #0 {
28 ; CHECK-8B-LABEL: ns_entry:
29 ; CHECK-8B:       @ %bb.0: @ %entry
30 ; CHECK-8B-NEXT:    push {r7, lr}
31 ; CHECK-8B-NEXT:    mov r1, r0
32 ; CHECK-8B-NEXT:    movs r0, #10
33 ; CHECK-8B-NEXT:    blx r1
34 ; CHECK-8B-NEXT:    pop {r7}
35 ; CHECK-8B-NEXT:    pop {r1}
36 ; CHECK-8B-NEXT:    mov lr, r1
37 ; CHECK-8B-NEXT:    mov r1, lr
38 ; CHECK-8B-NEXT:    mov r2, lr
39 ; CHECK-8B-NEXT:    mov r3, lr
40 ; CHECK-8B-NEXT:    mov r12, lr
41 ; CHECK-8B-NEXT:    msr apsr, lr
42 ; CHECK-8B-NEXT:    bxns lr
44 ; CHECK-8M-SOFT-LABEL: ns_entry:
45 ; CHECK-8M-SOFT:       @ %bb.0: @ %entry
46 ; CHECK-8M-SOFT-NEXT:    push {r7, lr}
47 ; CHECK-8M-SOFT-NEXT:    mov r1, r0
48 ; CHECK-8M-SOFT-NEXT:    movs r0, #10
49 ; CHECK-8M-SOFT-NEXT:    blx r1
50 ; CHECK-8M-SOFT-NEXT:    pop.w {r7, lr}
51 ; CHECK-8M-SOFT-NEXT:    mov r1, lr
52 ; CHECK-8M-SOFT-NEXT:    mov r2, lr
53 ; CHECK-8M-SOFT-NEXT:    mov r3, lr
54 ; CHECK-8M-SOFT-NEXT:    mov r12, lr
55 ; CHECK-8M-SOFT-NEXT:    msr apsr_nzcvqg, lr
56 ; CHECK-8M-SOFT-NEXT:    bxns lr
58 ; CHECK-8M-SOFTFP-LABEL: ns_entry:
59 ; CHECK-8M-SOFTFP:       @ %bb.0: @ %entry
60 ; CHECK-8M-SOFTFP-NEXT:    push {r7, lr}
61 ; CHECK-8M-SOFTFP-NEXT:    mov r1, r0
62 ; CHECK-8M-SOFTFP-NEXT:    movs r0, #10
63 ; CHECK-8M-SOFTFP-NEXT:    blx r1
64 ; CHECK-8M-SOFTFP-NEXT:    pop.w {r7, lr}
65 ; CHECK-8M-SOFTFP-NEXT:    mrs r12, control
66 ; CHECK-8M-SOFTFP-NEXT:    tst.w r12, #8
67 ; CHECK-8M-SOFTFP-NEXT:    beq .LBB0_2
68 ; CHECK-8M-SOFTFP-NEXT:  @ %bb.1: @ %entry
69 ; CHECK-8M-SOFTFP-NEXT:    vmrs r12, fpscr
70 ; CHECK-8M-SOFTFP-NEXT:    vmov d0, lr, lr
71 ; CHECK-8M-SOFTFP-NEXT:    vmov d1, lr, lr
72 ; CHECK-8M-SOFTFP-NEXT:    vmov d2, lr, lr
73 ; CHECK-8M-SOFTFP-NEXT:    vmov d3, lr, lr
74 ; CHECK-8M-SOFTFP-NEXT:    vmov d4, lr, lr
75 ; CHECK-8M-SOFTFP-NEXT:    vmov d5, lr, lr
76 ; CHECK-8M-SOFTFP-NEXT:    vmov d6, lr, lr
77 ; CHECK-8M-SOFTFP-NEXT:    vmov d7, lr, lr
78 ; CHECK-8M-SOFTFP-NEXT:    bic r12, r12, #159
79 ; CHECK-8M-SOFTFP-NEXT:    bic r12, r12, #4026531840
80 ; CHECK-8M-SOFTFP-NEXT:    vmsr fpscr, r12
81 ; CHECK-8M-SOFTFP-NEXT:  .LBB0_2: @ %entry
82 ; CHECK-8M-SOFTFP-NEXT:    mov r1, lr
83 ; CHECK-8M-SOFTFP-NEXT:    mov r2, lr
84 ; CHECK-8M-SOFTFP-NEXT:    mov r3, lr
85 ; CHECK-8M-SOFTFP-NEXT:    mov r12, lr
86 ; CHECK-8M-SOFTFP-NEXT:    msr apsr_nzcvqg, lr
87 ; CHECK-8M-SOFTFP-NEXT:    bxns lr
89 ; CHECK-81M-SOFT-LABEL: ns_entry:
90 ; CHECK-81M-SOFT:       @ %bb.0: @ %entry
91 ; CHECK-81M-SOFT-NEXT:    vstr fpcxtns, [sp, #-4]!
92 ; CHECK-81M-SOFT-NEXT:    push {r7, lr}
93 ; CHECK-81M-SOFT-NEXT:    sub sp, #4
94 ; CHECK-81M-SOFT-NEXT:    mov r1, r0
95 ; CHECK-81M-SOFT-NEXT:    movs r0, #10
96 ; CHECK-81M-SOFT-NEXT:    blx r1
97 ; CHECK-81M-SOFT-NEXT:    add sp, #4
98 ; CHECK-81M-SOFT-NEXT:    pop.w {r7, lr}
99 ; CHECK-81M-SOFT-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
100 ; CHECK-81M-SOFT-NEXT:    vldr fpcxtns, [sp], #4
101 ; CHECK-81M-SOFT-NEXT:    clrm {r1, r2, r3, r12, apsr}
102 ; CHECK-81M-SOFT-NEXT:    bxns lr
104 ; CHECK-81M-SOFTFP-LABEL: ns_entry:
105 ; CHECK-81M-SOFTFP:       @ %bb.0: @ %entry
106 ; CHECK-81M-SOFTFP-NEXT:    vstr fpcxtns, [sp, #-4]!
107 ; CHECK-81M-SOFTFP-NEXT:    push {r7, lr}
108 ; CHECK-81M-SOFTFP-NEXT:    sub sp, #4
109 ; CHECK-81M-SOFTFP-NEXT:    mov r1, r0
110 ; CHECK-81M-SOFTFP-NEXT:    movs r0, #10
111 ; CHECK-81M-SOFTFP-NEXT:    blx r1
112 ; CHECK-81M-SOFTFP-NEXT:    add sp, #4
113 ; CHECK-81M-SOFTFP-NEXT:    pop.w {r7, lr}
114 ; CHECK-81M-SOFTFP-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
115 ; CHECK-81M-SOFTFP-NEXT:    vldr fpcxtns, [sp], #4
116 ; CHECK-81M-SOFTFP-NEXT:    clrm {r1, r2, r3, r12, apsr}
117 ; CHECK-81M-SOFTFP-NEXT:    bxns lr
118 entry:
119   %call = call i32 %fptr(i32 10) #1
120   ret i32 %call
123 attributes #0 = { "cmse_nonsecure_entry" nounwind }
124 attributes #1 = { nounwind }
127 define i32 @ns_call(ptr nocapture %fptr) #2 {
128 ; CHECK-8B-LABEL: ns_call:
129 ; CHECK-8B:       @ %bb.0: @ %entry
130 ; CHECK-8B-NEXT:    push {r7, lr}
131 ; CHECK-8B-NEXT:    mov r1, r0
132 ; CHECK-8B-NEXT:    movs r0, #10
133 ; CHECK-8B-NEXT:    push {r4, r5, r6, r7}
134 ; CHECK-8B-NEXT:    mov r7, r11
135 ; CHECK-8B-NEXT:    mov r6, r10
136 ; CHECK-8B-NEXT:    mov r5, r9
137 ; CHECK-8B-NEXT:    mov r4, r8
138 ; CHECK-8B-NEXT:    push {r4, r5, r6, r7}
139 ; CHECK-8B-NEXT:    mov r2, #1
140 ; CHECK-8B-NEXT:    bics r1, r2
141 ; CHECK-8B-NEXT:    mov r2, r1
142 ; CHECK-8B-NEXT:    mov r3, r1
143 ; CHECK-8B-NEXT:    mov r4, r1
144 ; CHECK-8B-NEXT:    mov r5, r1
145 ; CHECK-8B-NEXT:    mov r6, r1
146 ; CHECK-8B-NEXT:    mov r7, r1
147 ; CHECK-8B-NEXT:    mov r8, r1
148 ; CHECK-8B-NEXT:    mov r9, r1
149 ; CHECK-8B-NEXT:    mov r10, r1
150 ; CHECK-8B-NEXT:    mov r11, r1
151 ; CHECK-8B-NEXT:    mov r12, r1
152 ; CHECK-8B-NEXT:    msr apsr, r1
153 ; CHECK-8B-NEXT:    blxns r1
154 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
155 ; CHECK-8B-NEXT:    mov r8, r4
156 ; CHECK-8B-NEXT:    mov r9, r5
157 ; CHECK-8B-NEXT:    mov r10, r6
158 ; CHECK-8B-NEXT:    mov r11, r7
159 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
160 ; CHECK-8B-NEXT:    pop {r7, pc}
162 ; CHECK-8M-SOFT-LABEL: ns_call:
163 ; CHECK-8M-SOFT:       @ %bb.0: @ %entry
164 ; CHECK-8M-SOFT-NEXT:    push {r7, lr}
165 ; CHECK-8M-SOFT-NEXT:    mov r1, r0
166 ; CHECK-8M-SOFT-NEXT:    movs r0, #10
167 ; CHECK-8M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
168 ; CHECK-8M-SOFT-NEXT:    bic r1, r1, #1
169 ; CHECK-8M-SOFT-NEXT:    sub sp, #136
170 ; CHECK-8M-SOFT-NEXT:    vlstm sp
171 ; CHECK-8M-SOFT-NEXT:    mov r2, r1
172 ; CHECK-8M-SOFT-NEXT:    mov r3, r1
173 ; CHECK-8M-SOFT-NEXT:    mov r4, r1
174 ; CHECK-8M-SOFT-NEXT:    mov r5, r1
175 ; CHECK-8M-SOFT-NEXT:    mov r6, r1
176 ; CHECK-8M-SOFT-NEXT:    mov r7, r1
177 ; CHECK-8M-SOFT-NEXT:    mov r8, r1
178 ; CHECK-8M-SOFT-NEXT:    mov r9, r1
179 ; CHECK-8M-SOFT-NEXT:    mov r10, r1
180 ; CHECK-8M-SOFT-NEXT:    mov r11, r1
181 ; CHECK-8M-SOFT-NEXT:    mov r12, r1
182 ; CHECK-8M-SOFT-NEXT:    msr apsr_nzcvqg, r1
183 ; CHECK-8M-SOFT-NEXT:    blxns r1
184 ; CHECK-8M-SOFT-NEXT:    vlldm sp
185 ; CHECK-8M-SOFT-NEXT:    add sp, #136
186 ; CHECK-8M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
187 ; CHECK-8M-SOFT-NEXT:    pop {r7, pc}
189 ; CHECK-8M-SOFTFP-LABEL: ns_call:
190 ; CHECK-8M-SOFTFP:       @ %bb.0: @ %entry
191 ; CHECK-8M-SOFTFP-NEXT:    push {r7, lr}
192 ; CHECK-8M-SOFTFP-NEXT:    mov r1, r0
193 ; CHECK-8M-SOFTFP-NEXT:    movs r0, #10
194 ; CHECK-8M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
195 ; CHECK-8M-SOFTFP-NEXT:    bic r1, r1, #1
196 ; CHECK-8M-SOFTFP-NEXT:    sub sp, #136
197 ; CHECK-8M-SOFTFP-NEXT:    vlstm sp
198 ; CHECK-8M-SOFTFP-NEXT:    mov r2, r1
199 ; CHECK-8M-SOFTFP-NEXT:    mov r3, r1
200 ; CHECK-8M-SOFTFP-NEXT:    mov r4, r1
201 ; CHECK-8M-SOFTFP-NEXT:    mov r5, r1
202 ; CHECK-8M-SOFTFP-NEXT:    mov r6, r1
203 ; CHECK-8M-SOFTFP-NEXT:    mov r7, r1
204 ; CHECK-8M-SOFTFP-NEXT:    mov r8, r1
205 ; CHECK-8M-SOFTFP-NEXT:    mov r9, r1
206 ; CHECK-8M-SOFTFP-NEXT:    mov r10, r1
207 ; CHECK-8M-SOFTFP-NEXT:    mov r11, r1
208 ; CHECK-8M-SOFTFP-NEXT:    mov r12, r1
209 ; CHECK-8M-SOFTFP-NEXT:    msr apsr_nzcvqg, r1
210 ; CHECK-8M-SOFTFP-NEXT:    blxns r1
211 ; CHECK-8M-SOFTFP-NEXT:    vlldm sp
212 ; CHECK-8M-SOFTFP-NEXT:    add sp, #136
213 ; CHECK-8M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
214 ; CHECK-8M-SOFTFP-NEXT:    pop {r7, pc}
216 ; CHECK-81M-SOFT-LABEL: ns_call:
217 ; CHECK-81M-SOFT:       @ %bb.0: @ %entry
218 ; CHECK-81M-SOFT-NEXT:    push {r7, lr}
219 ; CHECK-81M-SOFT-NEXT:    mov r1, r0
220 ; CHECK-81M-SOFT-NEXT:    movs r0, #10
221 ; CHECK-81M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
222 ; CHECK-81M-SOFT-NEXT:    bic r1, r1, #1
223 ; CHECK-81M-SOFT-NEXT:    sub sp, #136
224 ; CHECK-81M-SOFT-NEXT:    vlstm sp
225 ; CHECK-81M-SOFT-NEXT:    clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
226 ; CHECK-81M-SOFT-NEXT:    blxns r1
227 ; CHECK-81M-SOFT-NEXT:    vlldm sp
228 ; CHECK-81M-SOFT-NEXT:    add sp, #136
229 ; CHECK-81M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
230 ; CHECK-81M-SOFT-NEXT:    pop {r7, pc}
232 ; CHECK-81M-SOFTFP-LABEL: ns_call:
233 ; CHECK-81M-SOFTFP:       @ %bb.0: @ %entry
234 ; CHECK-81M-SOFTFP-NEXT:    push {r7, lr}
235 ; CHECK-81M-SOFTFP-NEXT:    mov r1, r0
236 ; CHECK-81M-SOFTFP-NEXT:    movs r0, #10
237 ; CHECK-81M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
238 ; CHECK-81M-SOFTFP-NEXT:    bic r1, r1, #1
239 ; CHECK-81M-SOFTFP-NEXT:    sub sp, #136
240 ; CHECK-81M-SOFTFP-NEXT:    vlstm sp
241 ; CHECK-81M-SOFTFP-NEXT:    clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
242 ; CHECK-81M-SOFTFP-NEXT:    blxns r1
243 ; CHECK-81M-SOFTFP-NEXT:    vlldm sp
244 ; CHECK-81M-SOFTFP-NEXT:    add sp, #136
245 ; CHECK-81M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
246 ; CHECK-81M-SOFTFP-NEXT:    pop {r7, pc}
247 entry:
248   %call = call i32 %fptr(i32 10) #3
249   ret i32 %call
252 attributes #2 = { nounwind }
253 attributes #3 = { "cmse_nonsecure_call" nounwind }
256 define i32 @ns_tail_call(ptr nocapture %fptr) #4 {
257 ; CHECK-8B-LABEL: ns_tail_call:
258 ; CHECK-8B:       @ %bb.0: @ %entry
259 ; CHECK-8B-NEXT:    push {r7, lr}
260 ; CHECK-8B-NEXT:    mov r1, r0
261 ; CHECK-8B-NEXT:    movs r0, #10
262 ; CHECK-8B-NEXT:    push {r4, r5, r6, r7}
263 ; CHECK-8B-NEXT:    mov r7, r11
264 ; CHECK-8B-NEXT:    mov r6, r10
265 ; CHECK-8B-NEXT:    mov r5, r9
266 ; CHECK-8B-NEXT:    mov r4, r8
267 ; CHECK-8B-NEXT:    push {r4, r5, r6, r7}
268 ; CHECK-8B-NEXT:    mov r2, #1
269 ; CHECK-8B-NEXT:    bics r1, r2
270 ; CHECK-8B-NEXT:    mov r2, r1
271 ; CHECK-8B-NEXT:    mov r3, r1
272 ; CHECK-8B-NEXT:    mov r4, r1
273 ; CHECK-8B-NEXT:    mov r5, r1
274 ; CHECK-8B-NEXT:    mov r6, r1
275 ; CHECK-8B-NEXT:    mov r7, r1
276 ; CHECK-8B-NEXT:    mov r8, r1
277 ; CHECK-8B-NEXT:    mov r9, r1
278 ; CHECK-8B-NEXT:    mov r10, r1
279 ; CHECK-8B-NEXT:    mov r11, r1
280 ; CHECK-8B-NEXT:    mov r12, r1
281 ; CHECK-8B-NEXT:    msr apsr, r1
282 ; CHECK-8B-NEXT:    blxns r1
283 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
284 ; CHECK-8B-NEXT:    mov r8, r4
285 ; CHECK-8B-NEXT:    mov r9, r5
286 ; CHECK-8B-NEXT:    mov r10, r6
287 ; CHECK-8B-NEXT:    mov r11, r7
288 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
289 ; CHECK-8B-NEXT:    pop {r7, pc}
291 ; CHECK-8M-SOFT-LABEL: ns_tail_call:
292 ; CHECK-8M-SOFT:       @ %bb.0: @ %entry
293 ; CHECK-8M-SOFT-NEXT:    push {r7, lr}
294 ; CHECK-8M-SOFT-NEXT:    mov r1, r0
295 ; CHECK-8M-SOFT-NEXT:    movs r0, #10
296 ; CHECK-8M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
297 ; CHECK-8M-SOFT-NEXT:    bic r1, r1, #1
298 ; CHECK-8M-SOFT-NEXT:    sub sp, #136
299 ; CHECK-8M-SOFT-NEXT:    vlstm sp
300 ; CHECK-8M-SOFT-NEXT:    mov r2, r1
301 ; CHECK-8M-SOFT-NEXT:    mov r3, r1
302 ; CHECK-8M-SOFT-NEXT:    mov r4, r1
303 ; CHECK-8M-SOFT-NEXT:    mov r5, r1
304 ; CHECK-8M-SOFT-NEXT:    mov r6, r1
305 ; CHECK-8M-SOFT-NEXT:    mov r7, r1
306 ; CHECK-8M-SOFT-NEXT:    mov r8, r1
307 ; CHECK-8M-SOFT-NEXT:    mov r9, r1
308 ; CHECK-8M-SOFT-NEXT:    mov r10, r1
309 ; CHECK-8M-SOFT-NEXT:    mov r11, r1
310 ; CHECK-8M-SOFT-NEXT:    mov r12, r1
311 ; CHECK-8M-SOFT-NEXT:    msr apsr_nzcvqg, r1
312 ; CHECK-8M-SOFT-NEXT:    blxns r1
313 ; CHECK-8M-SOFT-NEXT:    vlldm sp
314 ; CHECK-8M-SOFT-NEXT:    add sp, #136
315 ; CHECK-8M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
316 ; CHECK-8M-SOFT-NEXT:    pop {r7, pc}
318 ; CHECK-8M-SOFTFP-LABEL: ns_tail_call:
319 ; CHECK-8M-SOFTFP:       @ %bb.0: @ %entry
320 ; CHECK-8M-SOFTFP-NEXT:    push {r7, lr}
321 ; CHECK-8M-SOFTFP-NEXT:    mov r1, r0
322 ; CHECK-8M-SOFTFP-NEXT:    movs r0, #10
323 ; CHECK-8M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
324 ; CHECK-8M-SOFTFP-NEXT:    bic r1, r1, #1
325 ; CHECK-8M-SOFTFP-NEXT:    sub sp, #136
326 ; CHECK-8M-SOFTFP-NEXT:    vlstm sp
327 ; CHECK-8M-SOFTFP-NEXT:    mov r2, r1
328 ; CHECK-8M-SOFTFP-NEXT:    mov r3, r1
329 ; CHECK-8M-SOFTFP-NEXT:    mov r4, r1
330 ; CHECK-8M-SOFTFP-NEXT:    mov r5, r1
331 ; CHECK-8M-SOFTFP-NEXT:    mov r6, r1
332 ; CHECK-8M-SOFTFP-NEXT:    mov r7, r1
333 ; CHECK-8M-SOFTFP-NEXT:    mov r8, r1
334 ; CHECK-8M-SOFTFP-NEXT:    mov r9, r1
335 ; CHECK-8M-SOFTFP-NEXT:    mov r10, r1
336 ; CHECK-8M-SOFTFP-NEXT:    mov r11, r1
337 ; CHECK-8M-SOFTFP-NEXT:    mov r12, r1
338 ; CHECK-8M-SOFTFP-NEXT:    msr apsr_nzcvqg, r1
339 ; CHECK-8M-SOFTFP-NEXT:    blxns r1
340 ; CHECK-8M-SOFTFP-NEXT:    vlldm sp
341 ; CHECK-8M-SOFTFP-NEXT:    add sp, #136
342 ; CHECK-8M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
343 ; CHECK-8M-SOFTFP-NEXT:    pop {r7, pc}
345 ; CHECK-81M-SOFT-LABEL: ns_tail_call:
346 ; CHECK-81M-SOFT:       @ %bb.0: @ %entry
347 ; CHECK-81M-SOFT-NEXT:    push {r7, lr}
348 ; CHECK-81M-SOFT-NEXT:    mov r1, r0
349 ; CHECK-81M-SOFT-NEXT:    movs r0, #10
350 ; CHECK-81M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
351 ; CHECK-81M-SOFT-NEXT:    bic r1, r1, #1
352 ; CHECK-81M-SOFT-NEXT:    sub sp, #136
353 ; CHECK-81M-SOFT-NEXT:    vlstm sp
354 ; CHECK-81M-SOFT-NEXT:    clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
355 ; CHECK-81M-SOFT-NEXT:    blxns r1
356 ; CHECK-81M-SOFT-NEXT:    vlldm sp
357 ; CHECK-81M-SOFT-NEXT:    add sp, #136
358 ; CHECK-81M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
359 ; CHECK-81M-SOFT-NEXT:    pop {r7, pc}
361 ; CHECK-81M-SOFTFP-LABEL: ns_tail_call:
362 ; CHECK-81M-SOFTFP:       @ %bb.0: @ %entry
363 ; CHECK-81M-SOFTFP-NEXT:    push {r7, lr}
364 ; CHECK-81M-SOFTFP-NEXT:    mov r1, r0
365 ; CHECK-81M-SOFTFP-NEXT:    movs r0, #10
366 ; CHECK-81M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
367 ; CHECK-81M-SOFTFP-NEXT:    bic r1, r1, #1
368 ; CHECK-81M-SOFTFP-NEXT:    sub sp, #136
369 ; CHECK-81M-SOFTFP-NEXT:    vlstm sp
370 ; CHECK-81M-SOFTFP-NEXT:    clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
371 ; CHECK-81M-SOFTFP-NEXT:    blxns r1
372 ; CHECK-81M-SOFTFP-NEXT:    vlldm sp
373 ; CHECK-81M-SOFTFP-NEXT:    add sp, #136
374 ; CHECK-81M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
375 ; CHECK-81M-SOFTFP-NEXT:    pop {r7, pc}
376 entry:
377   %call = tail call i32 %fptr(i32 10) #5
378   ret i32 %call
381 attributes #4 = { nounwind }
382 attributes #5 = { "cmse_nonsecure_call" nounwind }
385 define ptr @ns_tail_call_many_args(ptr %f, i32 %a, i32 %b, i32 %c, i32 %d) #6 {
386 ; CHECK-8B-LABEL: ns_tail_call_many_args:
387 ; CHECK-8B:       @ %bb.0:
388 ; CHECK-8B-NEXT:    push {r4, r5, r7, lr}
389 ; CHECK-8B-NEXT:    mov r5, r3
390 ; CHECK-8B-NEXT:    mov r4, r0
391 ; CHECK-8B-NEXT:    ldr r3, [sp, #16]
392 ; CHECK-8B-NEXT:    mov r0, r1
393 ; CHECK-8B-NEXT:    mov r1, r2
394 ; CHECK-8B-NEXT:    mov r2, r5
395 ; CHECK-8B-NEXT:    push {r4, r5, r6, r7}
396 ; CHECK-8B-NEXT:    mov r7, r11
397 ; CHECK-8B-NEXT:    mov r6, r10
398 ; CHECK-8B-NEXT:    mov r5, r9
399 ; CHECK-8B-NEXT:    push {r5, r6, r7}
400 ; CHECK-8B-NEXT:    mov r5, r8
401 ; CHECK-8B-NEXT:    push {r5}
402 ; CHECK-8B-NEXT:    mov r5, #1
403 ; CHECK-8B-NEXT:    bics r4, r5
404 ; CHECK-8B-NEXT:    mov r5, r4
405 ; CHECK-8B-NEXT:    mov r6, r4
406 ; CHECK-8B-NEXT:    mov r7, r4
407 ; CHECK-8B-NEXT:    mov r8, r4
408 ; CHECK-8B-NEXT:    mov r9, r4
409 ; CHECK-8B-NEXT:    mov r10, r4
410 ; CHECK-8B-NEXT:    mov r11, r4
411 ; CHECK-8B-NEXT:    mov r12, r4
412 ; CHECK-8B-NEXT:    msr apsr, r4
413 ; CHECK-8B-NEXT:    blxns r4
414 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
415 ; CHECK-8B-NEXT:    mov r8, r4
416 ; CHECK-8B-NEXT:    mov r9, r5
417 ; CHECK-8B-NEXT:    mov r10, r6
418 ; CHECK-8B-NEXT:    mov r11, r7
419 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
420 ; CHECK-8B-NEXT:    mov r0, r4
421 ; CHECK-8B-NEXT:    pop {r4, r5, r7, pc}
423 ; CHECK-8M-SOFT-LABEL: ns_tail_call_many_args:
424 ; CHECK-8M-SOFT:       @ %bb.0:
425 ; CHECK-8M-SOFT-NEXT:    push {r4, lr}
426 ; CHECK-8M-SOFT-NEXT:    mov r4, r0
427 ; CHECK-8M-SOFT-NEXT:    mov r12, r3
428 ; CHECK-8M-SOFT-NEXT:    mov r0, r1
429 ; CHECK-8M-SOFT-NEXT:    mov r1, r2
430 ; CHECK-8M-SOFT-NEXT:    ldr r3, [sp, #8]
431 ; CHECK-8M-SOFT-NEXT:    mov r2, r12
432 ; CHECK-8M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
433 ; CHECK-8M-SOFT-NEXT:    bic r4, r4, #1
434 ; CHECK-8M-SOFT-NEXT:    sub sp, #136
435 ; CHECK-8M-SOFT-NEXT:    vlstm sp
436 ; CHECK-8M-SOFT-NEXT:    mov r5, r4
437 ; CHECK-8M-SOFT-NEXT:    mov r6, r4
438 ; CHECK-8M-SOFT-NEXT:    mov r7, r4
439 ; CHECK-8M-SOFT-NEXT:    mov r8, r4
440 ; CHECK-8M-SOFT-NEXT:    mov r9, r4
441 ; CHECK-8M-SOFT-NEXT:    mov r10, r4
442 ; CHECK-8M-SOFT-NEXT:    mov r11, r4
443 ; CHECK-8M-SOFT-NEXT:    mov r12, r4
444 ; CHECK-8M-SOFT-NEXT:    msr apsr_nzcvqg, r4
445 ; CHECK-8M-SOFT-NEXT:    blxns r4
446 ; CHECK-8M-SOFT-NEXT:    vlldm sp
447 ; CHECK-8M-SOFT-NEXT:    add sp, #136
448 ; CHECK-8M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
449 ; CHECK-8M-SOFT-NEXT:    mov r0, r4
450 ; CHECK-8M-SOFT-NEXT:    pop {r4, pc}
452 ; CHECK-8M-SOFTFP-LABEL: ns_tail_call_many_args:
453 ; CHECK-8M-SOFTFP:       @ %bb.0:
454 ; CHECK-8M-SOFTFP-NEXT:    push {r4, lr}
455 ; CHECK-8M-SOFTFP-NEXT:    mov r4, r0
456 ; CHECK-8M-SOFTFP-NEXT:    mov r12, r3
457 ; CHECK-8M-SOFTFP-NEXT:    mov r0, r1
458 ; CHECK-8M-SOFTFP-NEXT:    mov r1, r2
459 ; CHECK-8M-SOFTFP-NEXT:    ldr r3, [sp, #8]
460 ; CHECK-8M-SOFTFP-NEXT:    mov r2, r12
461 ; CHECK-8M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
462 ; CHECK-8M-SOFTFP-NEXT:    bic r4, r4, #1
463 ; CHECK-8M-SOFTFP-NEXT:    sub sp, #136
464 ; CHECK-8M-SOFTFP-NEXT:    vlstm sp
465 ; CHECK-8M-SOFTFP-NEXT:    mov r5, r4
466 ; CHECK-8M-SOFTFP-NEXT:    mov r6, r4
467 ; CHECK-8M-SOFTFP-NEXT:    mov r7, r4
468 ; CHECK-8M-SOFTFP-NEXT:    mov r8, r4
469 ; CHECK-8M-SOFTFP-NEXT:    mov r9, r4
470 ; CHECK-8M-SOFTFP-NEXT:    mov r10, r4
471 ; CHECK-8M-SOFTFP-NEXT:    mov r11, r4
472 ; CHECK-8M-SOFTFP-NEXT:    mov r12, r4
473 ; CHECK-8M-SOFTFP-NEXT:    msr apsr_nzcvqg, r4
474 ; CHECK-8M-SOFTFP-NEXT:    blxns r4
475 ; CHECK-8M-SOFTFP-NEXT:    vlldm sp
476 ; CHECK-8M-SOFTFP-NEXT:    add sp, #136
477 ; CHECK-8M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
478 ; CHECK-8M-SOFTFP-NEXT:    mov r0, r4
479 ; CHECK-8M-SOFTFP-NEXT:    pop {r4, pc}
481 ; CHECK-81M-SOFT-LABEL: ns_tail_call_many_args:
482 ; CHECK-81M-SOFT:       @ %bb.0:
483 ; CHECK-81M-SOFT-NEXT:    push {r4, lr}
484 ; CHECK-81M-SOFT-NEXT:    mov r4, r0
485 ; CHECK-81M-SOFT-NEXT:    mov r12, r3
486 ; CHECK-81M-SOFT-NEXT:    mov r0, r1
487 ; CHECK-81M-SOFT-NEXT:    mov r1, r2
488 ; CHECK-81M-SOFT-NEXT:    ldr r3, [sp, #8]
489 ; CHECK-81M-SOFT-NEXT:    mov r2, r12
490 ; CHECK-81M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
491 ; CHECK-81M-SOFT-NEXT:    bic r4, r4, #1
492 ; CHECK-81M-SOFT-NEXT:    sub sp, #136
493 ; CHECK-81M-SOFT-NEXT:    vlstm sp
494 ; CHECK-81M-SOFT-NEXT:    clrm {r5, r6, r7, r8, r9, r10, r11, r12, apsr}
495 ; CHECK-81M-SOFT-NEXT:    blxns r4
496 ; CHECK-81M-SOFT-NEXT:    vlldm sp
497 ; CHECK-81M-SOFT-NEXT:    add sp, #136
498 ; CHECK-81M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
499 ; CHECK-81M-SOFT-NEXT:    mov r0, r4
500 ; CHECK-81M-SOFT-NEXT:    pop {r4, pc}
502 ; CHECK-81M-SOFTFP-LABEL: ns_tail_call_many_args:
503 ; CHECK-81M-SOFTFP:       @ %bb.0:
504 ; CHECK-81M-SOFTFP-NEXT:    push {r4, lr}
505 ; CHECK-81M-SOFTFP-NEXT:    mov r4, r0
506 ; CHECK-81M-SOFTFP-NEXT:    mov r12, r3
507 ; CHECK-81M-SOFTFP-NEXT:    mov r0, r1
508 ; CHECK-81M-SOFTFP-NEXT:    mov r1, r2
509 ; CHECK-81M-SOFTFP-NEXT:    ldr r3, [sp, #8]
510 ; CHECK-81M-SOFTFP-NEXT:    mov r2, r12
511 ; CHECK-81M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
512 ; CHECK-81M-SOFTFP-NEXT:    bic r4, r4, #1
513 ; CHECK-81M-SOFTFP-NEXT:    sub sp, #136
514 ; CHECK-81M-SOFTFP-NEXT:    vlstm sp
515 ; CHECK-81M-SOFTFP-NEXT:    clrm {r5, r6, r7, r8, r9, r10, r11, r12, apsr}
516 ; CHECK-81M-SOFTFP-NEXT:    blxns r4
517 ; CHECK-81M-SOFTFP-NEXT:    vlldm sp
518 ; CHECK-81M-SOFTFP-NEXT:    add sp, #136
519 ; CHECK-81M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
520 ; CHECK-81M-SOFTFP-NEXT:    mov r0, r4
521 ; CHECK-81M-SOFTFP-NEXT:    pop {r4, pc}
522   tail call void %f(i32 %a, i32 %b, i32 %c, i32 %d) #7
523   ret ptr %f
526 attributes #6 = { nounwind }
527 attributes #7 = { "cmse_nonsecure_call" nounwind }
530 define i32 @ns_call_void(i32 %reg0, ptr nocapture %fptr) #8 {
531 ; CHECK-8B-LABEL: ns_call_void:
532 ; CHECK-8B:       @ %bb.0: @ %entry
533 ; CHECK-8B-NEXT:    push {r7, lr}
534 ; CHECK-8B-NEXT:    push {r4, r5, r6, r7}
535 ; CHECK-8B-NEXT:    mov r7, r11
536 ; CHECK-8B-NEXT:    mov r6, r10
537 ; CHECK-8B-NEXT:    mov r5, r9
538 ; CHECK-8B-NEXT:    mov r4, r8
539 ; CHECK-8B-NEXT:    push {r4, r5, r6, r7}
540 ; CHECK-8B-NEXT:    mov r0, #1
541 ; CHECK-8B-NEXT:    bics r1, r0
542 ; CHECK-8B-NEXT:    mov r0, r1
543 ; CHECK-8B-NEXT:    mov r2, r1
544 ; CHECK-8B-NEXT:    mov r3, r1
545 ; CHECK-8B-NEXT:    mov r4, r1
546 ; CHECK-8B-NEXT:    mov r5, r1
547 ; CHECK-8B-NEXT:    mov r6, r1
548 ; CHECK-8B-NEXT:    mov r7, r1
549 ; CHECK-8B-NEXT:    mov r8, r1
550 ; CHECK-8B-NEXT:    mov r9, r1
551 ; CHECK-8B-NEXT:    mov r10, r1
552 ; CHECK-8B-NEXT:    mov r11, r1
553 ; CHECK-8B-NEXT:    mov r12, r1
554 ; CHECK-8B-NEXT:    msr apsr, r1
555 ; CHECK-8B-NEXT:    blxns r1
556 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
557 ; CHECK-8B-NEXT:    mov r8, r4
558 ; CHECK-8B-NEXT:    mov r9, r5
559 ; CHECK-8B-NEXT:    mov r10, r6
560 ; CHECK-8B-NEXT:    mov r11, r7
561 ; CHECK-8B-NEXT:    pop {r4, r5, r6, r7}
562 ; CHECK-8B-NEXT:    pop {r7, pc}
564 ; CHECK-8M-SOFT-LABEL: ns_call_void:
565 ; CHECK-8M-SOFT:       @ %bb.0: @ %entry
566 ; CHECK-8M-SOFT-NEXT:    push {r7, lr}
567 ; CHECK-8M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
568 ; CHECK-8M-SOFT-NEXT:    bic r1, r1, #1
569 ; CHECK-8M-SOFT-NEXT:    sub sp, #136
570 ; CHECK-8M-SOFT-NEXT:    vlstm sp
571 ; CHECK-8M-SOFT-NEXT:    mov r0, r1
572 ; CHECK-8M-SOFT-NEXT:    mov r2, r1
573 ; CHECK-8M-SOFT-NEXT:    mov r3, r1
574 ; CHECK-8M-SOFT-NEXT:    mov r4, r1
575 ; CHECK-8M-SOFT-NEXT:    mov r5, r1
576 ; CHECK-8M-SOFT-NEXT:    mov r6, r1
577 ; CHECK-8M-SOFT-NEXT:    mov r7, r1
578 ; CHECK-8M-SOFT-NEXT:    mov r8, r1
579 ; CHECK-8M-SOFT-NEXT:    mov r9, r1
580 ; CHECK-8M-SOFT-NEXT:    mov r10, r1
581 ; CHECK-8M-SOFT-NEXT:    mov r11, r1
582 ; CHECK-8M-SOFT-NEXT:    mov r12, r1
583 ; CHECK-8M-SOFT-NEXT:    msr apsr_nzcvqg, r1
584 ; CHECK-8M-SOFT-NEXT:    blxns r1
585 ; CHECK-8M-SOFT-NEXT:    vlldm sp
586 ; CHECK-8M-SOFT-NEXT:    add sp, #136
587 ; CHECK-8M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
588 ; CHECK-8M-SOFT-NEXT:    pop {r7, pc}
590 ; CHECK-8M-SOFTFP-LABEL: ns_call_void:
591 ; CHECK-8M-SOFTFP:       @ %bb.0: @ %entry
592 ; CHECK-8M-SOFTFP-NEXT:    push {r7, lr}
593 ; CHECK-8M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
594 ; CHECK-8M-SOFTFP-NEXT:    bic r1, r1, #1
595 ; CHECK-8M-SOFTFP-NEXT:    sub sp, #136
596 ; CHECK-8M-SOFTFP-NEXT:    vlstm sp
597 ; CHECK-8M-SOFTFP-NEXT:    mov r0, r1
598 ; CHECK-8M-SOFTFP-NEXT:    mov r2, r1
599 ; CHECK-8M-SOFTFP-NEXT:    mov r3, r1
600 ; CHECK-8M-SOFTFP-NEXT:    mov r4, r1
601 ; CHECK-8M-SOFTFP-NEXT:    mov r5, r1
602 ; CHECK-8M-SOFTFP-NEXT:    mov r6, r1
603 ; CHECK-8M-SOFTFP-NEXT:    mov r7, r1
604 ; CHECK-8M-SOFTFP-NEXT:    mov r8, r1
605 ; CHECK-8M-SOFTFP-NEXT:    mov r9, r1
606 ; CHECK-8M-SOFTFP-NEXT:    mov r10, r1
607 ; CHECK-8M-SOFTFP-NEXT:    mov r11, r1
608 ; CHECK-8M-SOFTFP-NEXT:    mov r12, r1
609 ; CHECK-8M-SOFTFP-NEXT:    msr apsr_nzcvqg, r1
610 ; CHECK-8M-SOFTFP-NEXT:    blxns r1
611 ; CHECK-8M-SOFTFP-NEXT:    vlldm sp
612 ; CHECK-8M-SOFTFP-NEXT:    add sp, #136
613 ; CHECK-8M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
614 ; CHECK-8M-SOFTFP-NEXT:    pop {r7, pc}
616 ; CHECK-81M-SOFT-LABEL: ns_call_void:
617 ; CHECK-81M-SOFT:       @ %bb.0: @ %entry
618 ; CHECK-81M-SOFT-NEXT:    push {r7, lr}
619 ; CHECK-81M-SOFT-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
620 ; CHECK-81M-SOFT-NEXT:    bic r1, r1, #1
621 ; CHECK-81M-SOFT-NEXT:    sub sp, #136
622 ; CHECK-81M-SOFT-NEXT:    vlstm sp
623 ; CHECK-81M-SOFT-NEXT:    clrm {r0, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
624 ; CHECK-81M-SOFT-NEXT:    blxns r1
625 ; CHECK-81M-SOFT-NEXT:    vlldm sp
626 ; CHECK-81M-SOFT-NEXT:    add sp, #136
627 ; CHECK-81M-SOFT-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
628 ; CHECK-81M-SOFT-NEXT:    pop {r7, pc}
630 ; CHECK-81M-SOFTFP-LABEL: ns_call_void:
631 ; CHECK-81M-SOFTFP:       @ %bb.0: @ %entry
632 ; CHECK-81M-SOFTFP-NEXT:    push {r7, lr}
633 ; CHECK-81M-SOFTFP-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
634 ; CHECK-81M-SOFTFP-NEXT:    bic r1, r1, #1
635 ; CHECK-81M-SOFTFP-NEXT:    sub sp, #136
636 ; CHECK-81M-SOFTFP-NEXT:    vlstm sp
637 ; CHECK-81M-SOFTFP-NEXT:    clrm {r0, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
638 ; CHECK-81M-SOFTFP-NEXT:    blxns r1
639 ; CHECK-81M-SOFTFP-NEXT:    vlldm sp
640 ; CHECK-81M-SOFTFP-NEXT:    add sp, #136
641 ; CHECK-81M-SOFTFP-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
642 ; CHECK-81M-SOFTFP-NEXT:    pop {r7, pc}
643 entry:
644   %call = call i32 %fptr() #9
645   ret i32 %call
648 attributes #8 = { nounwind }
649 attributes #9 = { "cmse_nonsecure_call" nounwind }