xref: /llvm-project/llvm/test/CodeGen/ARM/cmse-clear.ll (revision bed1c7f061aa12417aa081e334afdba45767b938)
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
26
27define 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
43;
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
57;
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
88;
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
103;
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
118entry:
119  %call = call i32 %fptr(i32 10) #1
120  ret i32 %call
121}
122
123attributes #0 = { "cmse_nonsecure_entry" nounwind }
124attributes #1 = { nounwind }
125
126
127define 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}
161;
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}
188;
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}
215;
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}
231;
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}
247entry:
248  %call = call i32 %fptr(i32 10) #3
249  ret i32 %call
250}
251
252attributes #2 = { nounwind }
253attributes #3 = { "cmse_nonsecure_call" nounwind }
254
255
256define 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}
290;
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}
317;
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}
344;
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}
360;
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}
376entry:
377  %call = tail call i32 %fptr(i32 10) #5
378  ret i32 %call
379}
380
381attributes #4 = { nounwind }
382attributes #5 = { "cmse_nonsecure_call" nounwind }
383
384
385define 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}
422;
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}
451;
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}
480;
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}
501;
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
524}
525
526attributes #6 = { nounwind }
527attributes #7 = { "cmse_nonsecure_call" nounwind }
528
529
530define 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}
563;
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}
589;
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}
615;
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}
629;
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}
643entry:
644  %call = call i32 %fptr() #9
645  ret i32 %call
646}
647
648attributes #8 = { nounwind }
649attributes #9 = { "cmse_nonsecure_call" nounwind }
650
651