[rtsan] Add fork/execve interceptors (#117198)
[llvm-project.git] / llvm / test / CodeGen / ARM / cmse-clear-float-hard.ll
blobf97fc51a0c4575057ed9448675cb05822ea37b2b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc %s -o - -mtriple=thumbv8m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \
3 ; RUN:   FileCheck %s --check-prefix=CHECK-8M --check-prefix=CHECK-8M-LE
4 ; RUN: llc %s -o - -mtriple=thumbebv8m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \
5 ; RUN:   FileCheck %s --check-prefix=CHECK-8M --check-prefix=CHECK-8M-BE
6 ; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \
7 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-NO-MVE --check-prefix=CHECK-81M-LE
8 ; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+fp-armv8d16sp,+dsp -float-abi=hard | \
9 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-NO-MVE --check-prefix=CHECK-81M-BE
10 ; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+mve.fp -float-abi=hard | \
11 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-MVE --check-prefix=CHECK-81M-LE
12 ; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+mve.fp -float-abi=hard | \
13 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-MVE --check-prefix=CHECK-81M-BE
15 define float @f1(ptr nocapture %fptr) #0 {
16 ; CHECK-8M-LABEL: f1:
17 ; CHECK-8M:       @ %bb.0: @ %entry
18 ; CHECK-8M-NEXT:    push {r7, lr}
19 ; CHECK-8M-NEXT:    vmov.f32 s0, #1.000000e+01
20 ; CHECK-8M-NEXT:    blx r0
21 ; CHECK-8M-NEXT:    pop.w {r7, lr}
22 ; CHECK-8M-NEXT:    mrs r12, control
23 ; CHECK-8M-NEXT:    tst.w r12, #8
24 ; CHECK-8M-NEXT:    beq .LBB0_2
25 ; CHECK-8M-NEXT:  @ %bb.1: @ %entry
26 ; CHECK-8M-NEXT:    vmrs r12, fpscr
27 ; CHECK-8M-NEXT:    vmov s1, lr
28 ; CHECK-8M-NEXT:    vmov d1, lr, lr
29 ; CHECK-8M-NEXT:    vmov d2, lr, lr
30 ; CHECK-8M-NEXT:    vmov d3, lr, lr
31 ; CHECK-8M-NEXT:    vmov d4, lr, lr
32 ; CHECK-8M-NEXT:    vmov d5, lr, lr
33 ; CHECK-8M-NEXT:    vmov d6, lr, lr
34 ; CHECK-8M-NEXT:    vmov d7, lr, lr
35 ; CHECK-8M-NEXT:    bic r12, r12, #159
36 ; CHECK-8M-NEXT:    bic r12, r12, #4026531840
37 ; CHECK-8M-NEXT:    vmsr fpscr, r12
38 ; CHECK-8M-NEXT:  .LBB0_2: @ %entry
39 ; CHECK-8M-NEXT:    mov r0, lr
40 ; CHECK-8M-NEXT:    mov r1, lr
41 ; CHECK-8M-NEXT:    mov r2, lr
42 ; CHECK-8M-NEXT:    mov r3, lr
43 ; CHECK-8M-NEXT:    mov r12, lr
44 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, lr
45 ; CHECK-8M-NEXT:    bxns lr
47 ; CHECK-81M-LABEL: f1:
48 ; CHECK-81M:       @ %bb.0: @ %entry
49 ; CHECK-81M-NEXT:    vstr fpcxtns, [sp, #-4]!
50 ; CHECK-81M-NEXT:    push {r7, lr}
51 ; CHECK-81M-NEXT:    sub sp, #4
52 ; CHECK-81M-NEXT:    vmov.f32 s0, #1.000000e+01
53 ; CHECK-81M-NEXT:    blx r0
54 ; CHECK-81M-NEXT:    add sp, #4
55 ; CHECK-81M-NEXT:    pop.w {r7, lr}
56 ; CHECK-81M-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
57 ; CHECK-81M-NEXT:    vldr fpcxtns, [sp], #4
58 ; CHECK-81M-NEXT:    clrm {r0, r1, r2, r3, r12, apsr}
59 ; CHECK-81M-NEXT:    bxns lr
60 entry:
61   %call = call float %fptr(float 10.0) #1
62   ret float %call
65 attributes #0 = { "cmse_nonsecure_entry" nounwind }
66 attributes #1 = { nounwind }
68 define double @d1(ptr nocapture %fptr) #0 {
69 ; CHECK-8M-LE-LABEL: d1:
70 ; CHECK-8M-LE:       @ %bb.0: @ %entry
71 ; CHECK-8M-LE-NEXT:    push {r7, lr}
72 ; CHECK-8M-LE-NEXT:    vldr d0, .LCPI1_0
73 ; CHECK-8M-LE-NEXT:    blx r0
74 ; CHECK-8M-LE-NEXT:    pop.w {r7, lr}
75 ; CHECK-8M-LE-NEXT:    mrs r12, control
76 ; CHECK-8M-LE-NEXT:    tst.w r12, #8
77 ; CHECK-8M-LE-NEXT:    beq .LBB1_2
78 ; CHECK-8M-LE-NEXT:  @ %bb.1: @ %entry
79 ; CHECK-8M-LE-NEXT:    vmrs r12, fpscr
80 ; CHECK-8M-LE-NEXT:    vmov d1, lr, lr
81 ; CHECK-8M-LE-NEXT:    vmov d2, lr, lr
82 ; CHECK-8M-LE-NEXT:    vmov d3, lr, lr
83 ; CHECK-8M-LE-NEXT:    vmov d4, lr, lr
84 ; CHECK-8M-LE-NEXT:    vmov d5, lr, lr
85 ; CHECK-8M-LE-NEXT:    vmov d6, lr, lr
86 ; CHECK-8M-LE-NEXT:    vmov d7, lr, lr
87 ; CHECK-8M-LE-NEXT:    bic r12, r12, #159
88 ; CHECK-8M-LE-NEXT:    bic r12, r12, #4026531840
89 ; CHECK-8M-LE-NEXT:    vmsr fpscr, r12
90 ; CHECK-8M-LE-NEXT:  .LBB1_2: @ %entry
91 ; CHECK-8M-LE-NEXT:    mov r0, lr
92 ; CHECK-8M-LE-NEXT:    mov r1, lr
93 ; CHECK-8M-LE-NEXT:    mov r2, lr
94 ; CHECK-8M-LE-NEXT:    mov r3, lr
95 ; CHECK-8M-LE-NEXT:    mov r12, lr
96 ; CHECK-8M-LE-NEXT:    msr apsr_nzcvqg, lr
97 ; CHECK-8M-LE-NEXT:    bxns lr
98 ; CHECK-8M-LE-NEXT:    .p2align 3
99 ; CHECK-8M-LE-NEXT:  @ %bb.3:
100 ; CHECK-8M-LE-NEXT:  .LCPI1_0:
101 ; CHECK-8M-LE-NEXT:    .long 0 @ double 10
102 ; CHECK-8M-LE-NEXT:    .long 1076101120
104 ; CHECK-8M-BE-LABEL: d1:
105 ; CHECK-8M-BE:       @ %bb.0: @ %entry
106 ; CHECK-8M-BE-NEXT:    push {r7, lr}
107 ; CHECK-8M-BE-NEXT:    vldr d0, .LCPI1_0
108 ; CHECK-8M-BE-NEXT:    blx r0
109 ; CHECK-8M-BE-NEXT:    pop.w {r7, lr}
110 ; CHECK-8M-BE-NEXT:    mrs r12, control
111 ; CHECK-8M-BE-NEXT:    tst.w r12, #8
112 ; CHECK-8M-BE-NEXT:    beq .LBB1_2
113 ; CHECK-8M-BE-NEXT:  @ %bb.1: @ %entry
114 ; CHECK-8M-BE-NEXT:    vmrs r12, fpscr
115 ; CHECK-8M-BE-NEXT:    vmov d1, lr, lr
116 ; CHECK-8M-BE-NEXT:    vmov d2, lr, lr
117 ; CHECK-8M-BE-NEXT:    vmov d3, lr, lr
118 ; CHECK-8M-BE-NEXT:    vmov d4, lr, lr
119 ; CHECK-8M-BE-NEXT:    vmov d5, lr, lr
120 ; CHECK-8M-BE-NEXT:    vmov d6, lr, lr
121 ; CHECK-8M-BE-NEXT:    vmov d7, lr, lr
122 ; CHECK-8M-BE-NEXT:    bic r12, r12, #159
123 ; CHECK-8M-BE-NEXT:    bic r12, r12, #4026531840
124 ; CHECK-8M-BE-NEXT:    vmsr fpscr, r12
125 ; CHECK-8M-BE-NEXT:  .LBB1_2: @ %entry
126 ; CHECK-8M-BE-NEXT:    mov r0, lr
127 ; CHECK-8M-BE-NEXT:    mov r1, lr
128 ; CHECK-8M-BE-NEXT:    mov r2, lr
129 ; CHECK-8M-BE-NEXT:    mov r3, lr
130 ; CHECK-8M-BE-NEXT:    mov r12, lr
131 ; CHECK-8M-BE-NEXT:    msr apsr_nzcvqg, lr
132 ; CHECK-8M-BE-NEXT:    bxns lr
133 ; CHECK-8M-BE-NEXT:    .p2align 3
134 ; CHECK-8M-BE-NEXT:  @ %bb.3:
135 ; CHECK-8M-BE-NEXT:  .LCPI1_0:
136 ; CHECK-8M-BE-NEXT:    .long 1076101120 @ double 10
137 ; CHECK-8M-BE-NEXT:    .long 0
139 ; CHECK-81M-LE-LABEL: d1:
140 ; CHECK-81M-LE:       @ %bb.0: @ %entry
141 ; CHECK-81M-LE-NEXT:    vstr fpcxtns, [sp, #-4]!
142 ; CHECK-81M-LE-NEXT:    push {r7, lr}
143 ; CHECK-81M-LE-NEXT:    sub sp, #4
144 ; CHECK-81M-LE-NEXT:    vldr d0, .LCPI1_0
145 ; CHECK-81M-LE-NEXT:    blx r0
146 ; CHECK-81M-LE-NEXT:    add sp, #4
147 ; CHECK-81M-LE-NEXT:    pop.w {r7, lr}
148 ; CHECK-81M-LE-NEXT:    vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
149 ; CHECK-81M-LE-NEXT:    vldr fpcxtns, [sp], #4
150 ; CHECK-81M-LE-NEXT:    clrm {r0, r1, r2, r3, r12, apsr}
151 ; CHECK-81M-LE-NEXT:    bxns lr
152 ; CHECK-81M-LE-NEXT:    .p2align 3
153 ; CHECK-81M-LE-NEXT:  @ %bb.1:
154 ; CHECK-81M-LE-NEXT:  .LCPI1_0:
155 ; CHECK-81M-LE-NEXT:    .long 0 @ double 10
156 ; CHECK-81M-LE-NEXT:    .long 1076101120
158 ; CHECK-81M-BE-LABEL: d1:
159 ; CHECK-81M-BE:       @ %bb.0: @ %entry
160 ; CHECK-81M-BE-NEXT:    vstr fpcxtns, [sp, #-4]!
161 ; CHECK-81M-BE-NEXT:    push {r7, lr}
162 ; CHECK-81M-BE-NEXT:    sub sp, #4
163 ; CHECK-81M-BE-NEXT:    vldr d0, .LCPI1_0
164 ; CHECK-81M-BE-NEXT:    blx r0
165 ; CHECK-81M-BE-NEXT:    add sp, #4
166 ; CHECK-81M-BE-NEXT:    pop.w {r7, lr}
167 ; CHECK-81M-BE-NEXT:    vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
168 ; CHECK-81M-BE-NEXT:    vldr fpcxtns, [sp], #4
169 ; CHECK-81M-BE-NEXT:    clrm {r0, r1, r2, r3, r12, apsr}
170 ; CHECK-81M-BE-NEXT:    bxns lr
171 ; CHECK-81M-BE-NEXT:    .p2align 3
172 ; CHECK-81M-BE-NEXT:  @ %bb.1:
173 ; CHECK-81M-BE-NEXT:  .LCPI1_0:
174 ; CHECK-81M-BE-NEXT:    .long 1076101120 @ double 10
175 ; CHECK-81M-BE-NEXT:    .long 0
176 entry:
177   %call = call double %fptr(double 10.0) #1
178   ret double %call
181 define float @f2(ptr nocapture %fptr) #2 {
182 ; CHECK-8M-LABEL: f2:
183 ; CHECK-8M:       @ %bb.0: @ %entry
184 ; CHECK-8M-NEXT:    push {r7, lr}
185 ; CHECK-8M-NEXT:    vmov.f32 s0, #1.000000e+01
186 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
187 ; CHECK-8M-NEXT:    bic r0, r0, #1
188 ; CHECK-8M-NEXT:    sub sp, #136
189 ; CHECK-8M-NEXT:    vmov r12, s0
190 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
191 ; CHECK-8M-NEXT:    vmov s0, r12
192 ; CHECK-8M-NEXT:    ldr r1, [sp, #64]
193 ; CHECK-8M-NEXT:    bic r1, r1, #159
194 ; CHECK-8M-NEXT:    bic r1, r1, #4026531840
195 ; CHECK-8M-NEXT:    vmsr fpscr, r1
196 ; CHECK-8M-NEXT:    mov r1, r0
197 ; CHECK-8M-NEXT:    mov r2, r0
198 ; CHECK-8M-NEXT:    mov r3, r0
199 ; CHECK-8M-NEXT:    mov r4, r0
200 ; CHECK-8M-NEXT:    mov r5, r0
201 ; CHECK-8M-NEXT:    mov r6, r0
202 ; CHECK-8M-NEXT:    mov r7, r0
203 ; CHECK-8M-NEXT:    mov r8, r0
204 ; CHECK-8M-NEXT:    mov r9, r0
205 ; CHECK-8M-NEXT:    mov r10, r0
206 ; CHECK-8M-NEXT:    mov r11, r0
207 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
208 ; CHECK-8M-NEXT:    blxns r0
209 ; CHECK-8M-NEXT:    vmov r12, s0
210 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
211 ; CHECK-8M-NEXT:    vmov s0, r12
212 ; CHECK-8M-NEXT:    add sp, #136
213 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
214 ; CHECK-8M-NEXT:    pop {r7, pc}
216 ; CHECK-81M-LABEL: f2:
217 ; CHECK-81M:       @ %bb.0: @ %entry
218 ; CHECK-81M-NEXT:    push {r7, lr}
219 ; CHECK-81M-NEXT:    vmov.f32 s0, #1.000000e+01
220 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
221 ; CHECK-81M-NEXT:    bic r0, r0, #1
222 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
223 ; CHECK-81M-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
224 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
225 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
226 ; CHECK-81M-NEXT:    blxns r0
227 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
228 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
229 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
230 ; CHECK-81M-NEXT:    pop {r7, pc}
231 entry:
232   %call = call float %fptr(float 10.0) #3
233   ret float %call
236 attributes #2 = { nounwind }
237 attributes #3 = { "cmse_nonsecure_call" nounwind }
239 define double @d2(ptr nocapture %fptr) #2 {
240 ; CHECK-8M-LE-LABEL: d2:
241 ; CHECK-8M-LE:       @ %bb.0: @ %entry
242 ; CHECK-8M-LE-NEXT:    push {r7, lr}
243 ; CHECK-8M-LE-NEXT:    vldr d0, .LCPI3_0
244 ; CHECK-8M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
245 ; CHECK-8M-LE-NEXT:    bic r0, r0, #1
246 ; CHECK-8M-LE-NEXT:    sub sp, #136
247 ; CHECK-8M-LE-NEXT:    vmov r11, r12, d0
248 ; CHECK-8M-LE-NEXT:    vlstm sp, {d0 - d15}
249 ; CHECK-8M-LE-NEXT:    vmov d0, r11, r12
250 ; CHECK-8M-LE-NEXT:    ldr r1, [sp, #64]
251 ; CHECK-8M-LE-NEXT:    bic r1, r1, #159
252 ; CHECK-8M-LE-NEXT:    bic r1, r1, #4026531840
253 ; CHECK-8M-LE-NEXT:    vmsr fpscr, r1
254 ; CHECK-8M-LE-NEXT:    mov r1, r0
255 ; CHECK-8M-LE-NEXT:    mov r2, r0
256 ; CHECK-8M-LE-NEXT:    mov r3, r0
257 ; CHECK-8M-LE-NEXT:    mov r4, r0
258 ; CHECK-8M-LE-NEXT:    mov r5, r0
259 ; CHECK-8M-LE-NEXT:    mov r6, r0
260 ; CHECK-8M-LE-NEXT:    mov r7, r0
261 ; CHECK-8M-LE-NEXT:    mov r8, r0
262 ; CHECK-8M-LE-NEXT:    mov r9, r0
263 ; CHECK-8M-LE-NEXT:    mov r10, r0
264 ; CHECK-8M-LE-NEXT:    msr apsr_nzcvqg, r0
265 ; CHECK-8M-LE-NEXT:    blxns r0
266 ; CHECK-8M-LE-NEXT:    vmov r11, r12, d0
267 ; CHECK-8M-LE-NEXT:    vlldm sp, {d0 - d15}
268 ; CHECK-8M-LE-NEXT:    vmov d0, r11, r12
269 ; CHECK-8M-LE-NEXT:    add sp, #136
270 ; CHECK-8M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
271 ; CHECK-8M-LE-NEXT:    pop {r7, pc}
272 ; CHECK-8M-LE-NEXT:    .p2align 3
273 ; CHECK-8M-LE-NEXT:  @ %bb.1:
274 ; CHECK-8M-LE-NEXT:  .LCPI3_0:
275 ; CHECK-8M-LE-NEXT:    .long 0 @ double 10
276 ; CHECK-8M-LE-NEXT:    .long 1076101120
278 ; CHECK-8M-BE-LABEL: d2:
279 ; CHECK-8M-BE:       @ %bb.0: @ %entry
280 ; CHECK-8M-BE-NEXT:    push {r7, lr}
281 ; CHECK-8M-BE-NEXT:    vldr d0, .LCPI3_0
282 ; CHECK-8M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
283 ; CHECK-8M-BE-NEXT:    bic r0, r0, #1
284 ; CHECK-8M-BE-NEXT:    sub sp, #136
285 ; CHECK-8M-BE-NEXT:    vmov r11, r12, d0
286 ; CHECK-8M-BE-NEXT:    vlstm sp, {d0 - d15}
287 ; CHECK-8M-BE-NEXT:    vmov d0, r11, r12
288 ; CHECK-8M-BE-NEXT:    ldr r1, [sp, #64]
289 ; CHECK-8M-BE-NEXT:    bic r1, r1, #159
290 ; CHECK-8M-BE-NEXT:    bic r1, r1, #4026531840
291 ; CHECK-8M-BE-NEXT:    vmsr fpscr, r1
292 ; CHECK-8M-BE-NEXT:    mov r1, r0
293 ; CHECK-8M-BE-NEXT:    mov r2, r0
294 ; CHECK-8M-BE-NEXT:    mov r3, r0
295 ; CHECK-8M-BE-NEXT:    mov r4, r0
296 ; CHECK-8M-BE-NEXT:    mov r5, r0
297 ; CHECK-8M-BE-NEXT:    mov r6, r0
298 ; CHECK-8M-BE-NEXT:    mov r7, r0
299 ; CHECK-8M-BE-NEXT:    mov r8, r0
300 ; CHECK-8M-BE-NEXT:    mov r9, r0
301 ; CHECK-8M-BE-NEXT:    mov r10, r0
302 ; CHECK-8M-BE-NEXT:    msr apsr_nzcvqg, r0
303 ; CHECK-8M-BE-NEXT:    blxns r0
304 ; CHECK-8M-BE-NEXT:    vmov r11, r12, d0
305 ; CHECK-8M-BE-NEXT:    vlldm sp, {d0 - d15}
306 ; CHECK-8M-BE-NEXT:    vmov d0, r11, r12
307 ; CHECK-8M-BE-NEXT:    add sp, #136
308 ; CHECK-8M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
309 ; CHECK-8M-BE-NEXT:    pop {r7, pc}
310 ; CHECK-8M-BE-NEXT:    .p2align 3
311 ; CHECK-8M-BE-NEXT:  @ %bb.1:
312 ; CHECK-8M-BE-NEXT:  .LCPI3_0:
313 ; CHECK-8M-BE-NEXT:    .long 1076101120 @ double 10
314 ; CHECK-8M-BE-NEXT:    .long 0
316 ; CHECK-81M-LE-LABEL: d2:
317 ; CHECK-81M-LE:       @ %bb.0: @ %entry
318 ; CHECK-81M-LE-NEXT:    push {r7, lr}
319 ; CHECK-81M-LE-NEXT:    vldr d0, .LCPI3_0
320 ; CHECK-81M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
321 ; CHECK-81M-LE-NEXT:    bic r0, r0, #1
322 ; CHECK-81M-LE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
323 ; CHECK-81M-LE-NEXT:    vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
324 ; CHECK-81M-LE-NEXT:    vstr fpcxts, [sp, #-8]!
325 ; CHECK-81M-LE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
326 ; CHECK-81M-LE-NEXT:    blxns r0
327 ; CHECK-81M-LE-NEXT:    vldr fpcxts, [sp], #8
328 ; CHECK-81M-LE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
329 ; CHECK-81M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
330 ; CHECK-81M-LE-NEXT:    pop {r7, pc}
331 ; CHECK-81M-LE-NEXT:    .p2align 3
332 ; CHECK-81M-LE-NEXT:  @ %bb.1:
333 ; CHECK-81M-LE-NEXT:  .LCPI3_0:
334 ; CHECK-81M-LE-NEXT:    .long 0 @ double 10
335 ; CHECK-81M-LE-NEXT:    .long 1076101120
337 ; CHECK-81M-BE-LABEL: d2:
338 ; CHECK-81M-BE:       @ %bb.0: @ %entry
339 ; CHECK-81M-BE-NEXT:    push {r7, lr}
340 ; CHECK-81M-BE-NEXT:    vldr d0, .LCPI3_0
341 ; CHECK-81M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
342 ; CHECK-81M-BE-NEXT:    bic r0, r0, #1
343 ; CHECK-81M-BE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
344 ; CHECK-81M-BE-NEXT:    vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
345 ; CHECK-81M-BE-NEXT:    vstr fpcxts, [sp, #-8]!
346 ; CHECK-81M-BE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
347 ; CHECK-81M-BE-NEXT:    blxns r0
348 ; CHECK-81M-BE-NEXT:    vldr fpcxts, [sp], #8
349 ; CHECK-81M-BE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
350 ; CHECK-81M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
351 ; CHECK-81M-BE-NEXT:    pop {r7, pc}
352 ; CHECK-81M-BE-NEXT:    .p2align 3
353 ; CHECK-81M-BE-NEXT:  @ %bb.1:
354 ; CHECK-81M-BE-NEXT:  .LCPI3_0:
355 ; CHECK-81M-BE-NEXT:    .long 1076101120 @ double 10
356 ; CHECK-81M-BE-NEXT:    .long 0
357 entry:
358   %call = call double %fptr(double 10.0) #3
359   ret double %call
362 define float @f3(ptr nocapture %fptr) #4 {
363 ; CHECK-8M-LABEL: f3:
364 ; CHECK-8M:       @ %bb.0: @ %entry
365 ; CHECK-8M-NEXT:    push {r7, lr}
366 ; CHECK-8M-NEXT:    vmov.f32 s0, #1.000000e+01
367 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
368 ; CHECK-8M-NEXT:    bic r0, r0, #1
369 ; CHECK-8M-NEXT:    sub sp, #136
370 ; CHECK-8M-NEXT:    vmov r12, s0
371 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
372 ; CHECK-8M-NEXT:    vmov s0, r12
373 ; CHECK-8M-NEXT:    ldr r1, [sp, #64]
374 ; CHECK-8M-NEXT:    bic r1, r1, #159
375 ; CHECK-8M-NEXT:    bic r1, r1, #4026531840
376 ; CHECK-8M-NEXT:    vmsr fpscr, r1
377 ; CHECK-8M-NEXT:    mov r1, r0
378 ; CHECK-8M-NEXT:    mov r2, r0
379 ; CHECK-8M-NEXT:    mov r3, r0
380 ; CHECK-8M-NEXT:    mov r4, r0
381 ; CHECK-8M-NEXT:    mov r5, r0
382 ; CHECK-8M-NEXT:    mov r6, r0
383 ; CHECK-8M-NEXT:    mov r7, r0
384 ; CHECK-8M-NEXT:    mov r8, r0
385 ; CHECK-8M-NEXT:    mov r9, r0
386 ; CHECK-8M-NEXT:    mov r10, r0
387 ; CHECK-8M-NEXT:    mov r11, r0
388 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
389 ; CHECK-8M-NEXT:    blxns r0
390 ; CHECK-8M-NEXT:    vmov r12, s0
391 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
392 ; CHECK-8M-NEXT:    vmov s0, r12
393 ; CHECK-8M-NEXT:    add sp, #136
394 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
395 ; CHECK-8M-NEXT:    pop {r7, pc}
397 ; CHECK-81M-LABEL: f3:
398 ; CHECK-81M:       @ %bb.0: @ %entry
399 ; CHECK-81M-NEXT:    push {r7, lr}
400 ; CHECK-81M-NEXT:    vmov.f32 s0, #1.000000e+01
401 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
402 ; CHECK-81M-NEXT:    bic r0, r0, #1
403 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
404 ; CHECK-81M-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
405 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
406 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
407 ; CHECK-81M-NEXT:    blxns r0
408 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
409 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
410 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
411 ; CHECK-81M-NEXT:    pop {r7, pc}
412 entry:
413   %call = tail call float %fptr(float 10.0) #5
414   ret float %call
417 attributes #4 = { nounwind }
418 attributes #5 = { "cmse_nonsecure_call" nounwind }
420 define double @d3(ptr nocapture %fptr) #4 {
421 ; CHECK-8M-LE-LABEL: d3:
422 ; CHECK-8M-LE:       @ %bb.0: @ %entry
423 ; CHECK-8M-LE-NEXT:    push {r7, lr}
424 ; CHECK-8M-LE-NEXT:    vldr d0, .LCPI5_0
425 ; CHECK-8M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
426 ; CHECK-8M-LE-NEXT:    bic r0, r0, #1
427 ; CHECK-8M-LE-NEXT:    sub sp, #136
428 ; CHECK-8M-LE-NEXT:    vmov r11, r12, d0
429 ; CHECK-8M-LE-NEXT:    vlstm sp, {d0 - d15}
430 ; CHECK-8M-LE-NEXT:    vmov d0, r11, r12
431 ; CHECK-8M-LE-NEXT:    ldr r1, [sp, #64]
432 ; CHECK-8M-LE-NEXT:    bic r1, r1, #159
433 ; CHECK-8M-LE-NEXT:    bic r1, r1, #4026531840
434 ; CHECK-8M-LE-NEXT:    vmsr fpscr, r1
435 ; CHECK-8M-LE-NEXT:    mov r1, r0
436 ; CHECK-8M-LE-NEXT:    mov r2, r0
437 ; CHECK-8M-LE-NEXT:    mov r3, r0
438 ; CHECK-8M-LE-NEXT:    mov r4, r0
439 ; CHECK-8M-LE-NEXT:    mov r5, r0
440 ; CHECK-8M-LE-NEXT:    mov r6, r0
441 ; CHECK-8M-LE-NEXT:    mov r7, r0
442 ; CHECK-8M-LE-NEXT:    mov r8, r0
443 ; CHECK-8M-LE-NEXT:    mov r9, r0
444 ; CHECK-8M-LE-NEXT:    mov r10, r0
445 ; CHECK-8M-LE-NEXT:    msr apsr_nzcvqg, r0
446 ; CHECK-8M-LE-NEXT:    blxns r0
447 ; CHECK-8M-LE-NEXT:    vmov r11, r12, d0
448 ; CHECK-8M-LE-NEXT:    vlldm sp, {d0 - d15}
449 ; CHECK-8M-LE-NEXT:    vmov d0, r11, r12
450 ; CHECK-8M-LE-NEXT:    add sp, #136
451 ; CHECK-8M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
452 ; CHECK-8M-LE-NEXT:    pop {r7, pc}
453 ; CHECK-8M-LE-NEXT:    .p2align 3
454 ; CHECK-8M-LE-NEXT:  @ %bb.1:
455 ; CHECK-8M-LE-NEXT:  .LCPI5_0:
456 ; CHECK-8M-LE-NEXT:    .long 0 @ double 10
457 ; CHECK-8M-LE-NEXT:    .long 1076101120
459 ; CHECK-8M-BE-LABEL: d3:
460 ; CHECK-8M-BE:       @ %bb.0: @ %entry
461 ; CHECK-8M-BE-NEXT:    push {r7, lr}
462 ; CHECK-8M-BE-NEXT:    vldr d0, .LCPI5_0
463 ; CHECK-8M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
464 ; CHECK-8M-BE-NEXT:    bic r0, r0, #1
465 ; CHECK-8M-BE-NEXT:    sub sp, #136
466 ; CHECK-8M-BE-NEXT:    vmov r11, r12, d0
467 ; CHECK-8M-BE-NEXT:    vlstm sp, {d0 - d15}
468 ; CHECK-8M-BE-NEXT:    vmov d0, r11, r12
469 ; CHECK-8M-BE-NEXT:    ldr r1, [sp, #64]
470 ; CHECK-8M-BE-NEXT:    bic r1, r1, #159
471 ; CHECK-8M-BE-NEXT:    bic r1, r1, #4026531840
472 ; CHECK-8M-BE-NEXT:    vmsr fpscr, r1
473 ; CHECK-8M-BE-NEXT:    mov r1, r0
474 ; CHECK-8M-BE-NEXT:    mov r2, r0
475 ; CHECK-8M-BE-NEXT:    mov r3, r0
476 ; CHECK-8M-BE-NEXT:    mov r4, r0
477 ; CHECK-8M-BE-NEXT:    mov r5, r0
478 ; CHECK-8M-BE-NEXT:    mov r6, r0
479 ; CHECK-8M-BE-NEXT:    mov r7, r0
480 ; CHECK-8M-BE-NEXT:    mov r8, r0
481 ; CHECK-8M-BE-NEXT:    mov r9, r0
482 ; CHECK-8M-BE-NEXT:    mov r10, r0
483 ; CHECK-8M-BE-NEXT:    msr apsr_nzcvqg, r0
484 ; CHECK-8M-BE-NEXT:    blxns r0
485 ; CHECK-8M-BE-NEXT:    vmov r11, r12, d0
486 ; CHECK-8M-BE-NEXT:    vlldm sp, {d0 - d15}
487 ; CHECK-8M-BE-NEXT:    vmov d0, r11, r12
488 ; CHECK-8M-BE-NEXT:    add sp, #136
489 ; CHECK-8M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
490 ; CHECK-8M-BE-NEXT:    pop {r7, pc}
491 ; CHECK-8M-BE-NEXT:    .p2align 3
492 ; CHECK-8M-BE-NEXT:  @ %bb.1:
493 ; CHECK-8M-BE-NEXT:  .LCPI5_0:
494 ; CHECK-8M-BE-NEXT:    .long 1076101120 @ double 10
495 ; CHECK-8M-BE-NEXT:    .long 0
497 ; CHECK-81M-LE-LABEL: d3:
498 ; CHECK-81M-LE:       @ %bb.0: @ %entry
499 ; CHECK-81M-LE-NEXT:    push {r7, lr}
500 ; CHECK-81M-LE-NEXT:    vldr d0, .LCPI5_0
501 ; CHECK-81M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
502 ; CHECK-81M-LE-NEXT:    bic r0, r0, #1
503 ; CHECK-81M-LE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
504 ; CHECK-81M-LE-NEXT:    vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
505 ; CHECK-81M-LE-NEXT:    vstr fpcxts, [sp, #-8]!
506 ; CHECK-81M-LE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
507 ; CHECK-81M-LE-NEXT:    blxns r0
508 ; CHECK-81M-LE-NEXT:    vldr fpcxts, [sp], #8
509 ; CHECK-81M-LE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
510 ; CHECK-81M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
511 ; CHECK-81M-LE-NEXT:    pop {r7, pc}
512 ; CHECK-81M-LE-NEXT:    .p2align 3
513 ; CHECK-81M-LE-NEXT:  @ %bb.1:
514 ; CHECK-81M-LE-NEXT:  .LCPI5_0:
515 ; CHECK-81M-LE-NEXT:    .long 0 @ double 10
516 ; CHECK-81M-LE-NEXT:    .long 1076101120
518 ; CHECK-81M-BE-LABEL: d3:
519 ; CHECK-81M-BE:       @ %bb.0: @ %entry
520 ; CHECK-81M-BE-NEXT:    push {r7, lr}
521 ; CHECK-81M-BE-NEXT:    vldr d0, .LCPI5_0
522 ; CHECK-81M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
523 ; CHECK-81M-BE-NEXT:    bic r0, r0, #1
524 ; CHECK-81M-BE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
525 ; CHECK-81M-BE-NEXT:    vscclrm {s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
526 ; CHECK-81M-BE-NEXT:    vstr fpcxts, [sp, #-8]!
527 ; CHECK-81M-BE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
528 ; CHECK-81M-BE-NEXT:    blxns r0
529 ; CHECK-81M-BE-NEXT:    vldr fpcxts, [sp], #8
530 ; CHECK-81M-BE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
531 ; CHECK-81M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
532 ; CHECK-81M-BE-NEXT:    pop {r7, pc}
533 ; CHECK-81M-BE-NEXT:    .p2align 3
534 ; CHECK-81M-BE-NEXT:  @ %bb.1:
535 ; CHECK-81M-BE-NEXT:  .LCPI5_0:
536 ; CHECK-81M-BE-NEXT:    .long 1076101120 @ double 10
537 ; CHECK-81M-BE-NEXT:    .long 0
538 entry:
539   %call = tail call double %fptr(double 10.0) #5
540   ret double %call
543 define float @f4(ptr nocapture %fptr) #6 {
544 ; CHECK-8M-LABEL: f4:
545 ; CHECK-8M:       @ %bb.0: @ %entry
546 ; CHECK-8M-NEXT:    push {r7, lr}
547 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
548 ; CHECK-8M-NEXT:    bic r0, r0, #1
549 ; CHECK-8M-NEXT:    sub sp, #136
550 ; CHECK-8M-NEXT:    vmov.f32 s0, s0
551 ; CHECK-8M-NEXT:    mov r1, r0
552 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
553 ; CHECK-8M-NEXT:    mov r2, r0
554 ; CHECK-8M-NEXT:    mov r3, r0
555 ; CHECK-8M-NEXT:    mov r4, r0
556 ; CHECK-8M-NEXT:    mov r5, r0
557 ; CHECK-8M-NEXT:    mov r6, r0
558 ; CHECK-8M-NEXT:    mov r7, r0
559 ; CHECK-8M-NEXT:    mov r8, r0
560 ; CHECK-8M-NEXT:    mov r9, r0
561 ; CHECK-8M-NEXT:    mov r10, r0
562 ; CHECK-8M-NEXT:    mov r11, r0
563 ; CHECK-8M-NEXT:    mov r12, r0
564 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
565 ; CHECK-8M-NEXT:    blxns r0
566 ; CHECK-8M-NEXT:    vmov r12, s0
567 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
568 ; CHECK-8M-NEXT:    vmov s0, r12
569 ; CHECK-8M-NEXT:    add sp, #136
570 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
571 ; CHECK-8M-NEXT:    pop {r7, pc}
573 ; CHECK-81M-LABEL: f4:
574 ; CHECK-81M:       @ %bb.0: @ %entry
575 ; CHECK-81M-NEXT:    push {r7, lr}
576 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
577 ; CHECK-81M-NEXT:    bic r0, r0, #1
578 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
579 ; CHECK-81M-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
580 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
581 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
582 ; CHECK-81M-NEXT:    blxns r0
583 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
584 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
585 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
586 ; CHECK-81M-NEXT:    pop {r7, pc}
587 entry:
588   %call = call float %fptr() #7
589   ret float %call
592 attributes #6 = { nounwind }
593 attributes #7 = { "cmse_nonsecure_call" nounwind }
595 define double @d4(ptr nocapture %fptr) #6 {
596 ; CHECK-8M-LABEL: d4:
597 ; CHECK-8M:       @ %bb.0: @ %entry
598 ; CHECK-8M-NEXT:    push {r7, lr}
599 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
600 ; CHECK-8M-NEXT:    bic r0, r0, #1
601 ; CHECK-8M-NEXT:    sub sp, #136
602 ; CHECK-8M-NEXT:    vmov.f32 s0, s0
603 ; CHECK-8M-NEXT:    mov r1, r0
604 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
605 ; CHECK-8M-NEXT:    mov r2, r0
606 ; CHECK-8M-NEXT:    mov r3, r0
607 ; CHECK-8M-NEXT:    mov r4, r0
608 ; CHECK-8M-NEXT:    mov r5, r0
609 ; CHECK-8M-NEXT:    mov r6, r0
610 ; CHECK-8M-NEXT:    mov r7, r0
611 ; CHECK-8M-NEXT:    mov r8, r0
612 ; CHECK-8M-NEXT:    mov r9, r0
613 ; CHECK-8M-NEXT:    mov r10, r0
614 ; CHECK-8M-NEXT:    mov r11, r0
615 ; CHECK-8M-NEXT:    mov r12, r0
616 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
617 ; CHECK-8M-NEXT:    blxns r0
618 ; CHECK-8M-NEXT:    vmov r11, r12, d0
619 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
620 ; CHECK-8M-NEXT:    vmov d0, r11, r12
621 ; CHECK-8M-NEXT:    add sp, #136
622 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
623 ; CHECK-8M-NEXT:    pop {r7, pc}
625 ; CHECK-81M-LABEL: d4:
626 ; CHECK-81M:       @ %bb.0: @ %entry
627 ; CHECK-81M-NEXT:    push {r7, lr}
628 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
629 ; CHECK-81M-NEXT:    bic r0, r0, #1
630 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
631 ; CHECK-81M-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
632 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
633 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
634 ; CHECK-81M-NEXT:    blxns r0
635 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
636 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
637 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
638 ; CHECK-81M-NEXT:    pop {r7, pc}
639 entry:
640   %call = call double %fptr() #7
641   ret double %call
644 define void @fd(ptr %f, float %a, double %b) #8 {
645 ; CHECK-8M-LABEL: fd:
646 ; CHECK-8M:       @ %bb.0: @ %entry
647 ; CHECK-8M-NEXT:    push {r7, lr}
648 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
649 ; CHECK-8M-NEXT:    bic r0, r0, #1
650 ; CHECK-8M-NEXT:    sub sp, #136
651 ; CHECK-8M-NEXT:    vmov r12, s0
652 ; CHECK-8M-NEXT:    mov r2, r0
653 ; CHECK-8M-NEXT:    vmov r10, r11, d1
654 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
655 ; CHECK-8M-NEXT:    vmov s0, r12
656 ; CHECK-8M-NEXT:    vmov d1, r10, r11
657 ; CHECK-8M-NEXT:    ldr r1, [sp, #64]
658 ; CHECK-8M-NEXT:    bic r1, r1, #159
659 ; CHECK-8M-NEXT:    bic r1, r1, #4026531840
660 ; CHECK-8M-NEXT:    vmsr fpscr, r1
661 ; CHECK-8M-NEXT:    mov r1, r0
662 ; CHECK-8M-NEXT:    mov r3, r0
663 ; CHECK-8M-NEXT:    mov r4, r0
664 ; CHECK-8M-NEXT:    mov r5, r0
665 ; CHECK-8M-NEXT:    mov r6, r0
666 ; CHECK-8M-NEXT:    mov r7, r0
667 ; CHECK-8M-NEXT:    mov r8, r0
668 ; CHECK-8M-NEXT:    mov r9, r0
669 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
670 ; CHECK-8M-NEXT:    blxns r0
671 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
672 ; CHECK-8M-NEXT:    add sp, #136
673 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
674 ; CHECK-8M-NEXT:    pop {r7, pc}
676 ; CHECK-81M-LABEL: fd:
677 ; CHECK-81M:       @ %bb.0: @ %entry
678 ; CHECK-81M-NEXT:    push {r7, lr}
679 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
680 ; CHECK-81M-NEXT:    bic r0, r0, #1
681 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
682 ; CHECK-81M-NEXT:    vscclrm {s1, vpr}
683 ; CHECK-81M-NEXT:    vscclrm {s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
684 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
685 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
686 ; CHECK-81M-NEXT:    blxns r0
687 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
688 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
689 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
690 ; CHECK-81M-NEXT:    pop {r7, pc}
691 entry:
692   call void %f(float %a, double %b) #9
693   ret void
696 attributes #8 = { nounwind }
697 attributes #9 = { "cmse_nonsecure_call" nounwind }
699 define void @fdff(ptr %f, float %a, double %b, float %c, float %d) #8 {
700 ; CHECK-8M-LABEL: fdff:
701 ; CHECK-8M:       @ %bb.0: @ %entry
702 ; CHECK-8M-NEXT:    push {r7, lr}
703 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
704 ; CHECK-8M-NEXT:    bic r0, r0, #1
705 ; CHECK-8M-NEXT:    sub sp, #136
706 ; CHECK-8M-NEXT:    vmov r12, s0
707 ; CHECK-8M-NEXT:    mov r2, r0
708 ; CHECK-8M-NEXT:    vmov r10, r11, d1
709 ; CHECK-8M-NEXT:    mov r3, r0
710 ; CHECK-8M-NEXT:    vmov r9, s1
711 ; CHECK-8M-NEXT:    mov r4, r0
712 ; CHECK-8M-NEXT:    vmov r8, s4
713 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
714 ; CHECK-8M-NEXT:    vmov s0, r12
715 ; CHECK-8M-NEXT:    vmov d1, r10, r11
716 ; CHECK-8M-NEXT:    vmov s1, r9
717 ; CHECK-8M-NEXT:    vmov s4, r8
718 ; CHECK-8M-NEXT:    ldr r1, [sp, #64]
719 ; CHECK-8M-NEXT:    bic r1, r1, #159
720 ; CHECK-8M-NEXT:    bic r1, r1, #4026531840
721 ; CHECK-8M-NEXT:    vmsr fpscr, r1
722 ; CHECK-8M-NEXT:    mov r1, r0
723 ; CHECK-8M-NEXT:    mov r5, r0
724 ; CHECK-8M-NEXT:    mov r6, r0
725 ; CHECK-8M-NEXT:    mov r7, r0
726 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
727 ; CHECK-8M-NEXT:    blxns r0
728 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
729 ; CHECK-8M-NEXT:    add sp, #136
730 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
731 ; CHECK-8M-NEXT:    pop {r7, pc}
733 ; CHECK-81M-LABEL: fdff:
734 ; CHECK-81M:       @ %bb.0: @ %entry
735 ; CHECK-81M-NEXT:    push {r7, lr}
736 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
737 ; CHECK-81M-NEXT:    bic r0, r0, #1
738 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
739 ; CHECK-81M-NEXT:    vscclrm {s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
740 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
741 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
742 ; CHECK-81M-NEXT:    blxns r0
743 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
744 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
745 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
746 ; CHECK-81M-NEXT:    pop {r7, pc}
747 entry:
748   call void %f(float %a, double %b, float %c, float %d) #9
749   ret void
752 define void @fidififid(ptr %fu, float %a, i32 %b, double %c, i32 %d, float %e, i32 %f, float %g, i32 %h, double %i) #8 {
753 ; CHECK-8M-LABEL: fidififid:
754 ; CHECK-8M:       @ %bb.0: @ %entry
755 ; CHECK-8M-NEXT:    push {r7, lr}
756 ; CHECK-8M-NEXT:    mov lr, r3
757 ; CHECK-8M-NEXT:    mov r12, r0
758 ; CHECK-8M-NEXT:    mov r0, r1
759 ; CHECK-8M-NEXT:    mov r1, r2
760 ; CHECK-8M-NEXT:    ldr r3, [sp, #8]
761 ; CHECK-8M-NEXT:    mov r2, lr
762 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
763 ; CHECK-8M-NEXT:    bic r12, r12, #1
764 ; CHECK-8M-NEXT:    sub sp, #136
765 ; CHECK-8M-NEXT:    vmov r11, s0
766 ; CHECK-8M-NEXT:    vmov r9, r10, d1
767 ; CHECK-8M-NEXT:    vmov r8, s1
768 ; CHECK-8M-NEXT:    vmov r7, s4
769 ; CHECK-8M-NEXT:    vmov r5, r6, d3
770 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
771 ; CHECK-8M-NEXT:    vmov s0, r11
772 ; CHECK-8M-NEXT:    vmov d1, r9, r10
773 ; CHECK-8M-NEXT:    vmov s1, r8
774 ; CHECK-8M-NEXT:    vmov s4, r7
775 ; CHECK-8M-NEXT:    vmov d3, r5, r6
776 ; CHECK-8M-NEXT:    ldr r4, [sp, #64]
777 ; CHECK-8M-NEXT:    bic r4, r4, #159
778 ; CHECK-8M-NEXT:    bic r4, r4, #4026531840
779 ; CHECK-8M-NEXT:    vmsr fpscr, r4
780 ; CHECK-8M-NEXT:    mov r4, r12
781 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r12
782 ; CHECK-8M-NEXT:    blxns r12
783 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
784 ; CHECK-8M-NEXT:    add sp, #136
785 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
786 ; CHECK-8M-NEXT:    pop {r7, pc}
788 ; CHECK-81M-LABEL: fidififid:
789 ; CHECK-81M:       @ %bb.0: @ %entry
790 ; CHECK-81M-NEXT:    push {r7, lr}
791 ; CHECK-81M-NEXT:    mov lr, r3
792 ; CHECK-81M-NEXT:    mov r12, r0
793 ; CHECK-81M-NEXT:    mov r0, r1
794 ; CHECK-81M-NEXT:    mov r1, r2
795 ; CHECK-81M-NEXT:    ldr r3, [sp, #8]
796 ; CHECK-81M-NEXT:    mov r2, lr
797 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
798 ; CHECK-81M-NEXT:    bic r12, r12, #1
799 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
800 ; CHECK-81M-NEXT:    vscclrm {s5, vpr}
801 ; CHECK-81M-NEXT:    vscclrm {s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
802 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
803 ; CHECK-81M-NEXT:    clrm {r4, r5, r6, r7, r8, r9, r10, r11, apsr}
804 ; CHECK-81M-NEXT:    blxns r12
805 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
806 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
807 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
808 ; CHECK-81M-NEXT:    pop {r7, pc}
809 entry:
810   call void %fu(float %a, i32 %b, double %c, i32 %d, float %e, i32 %f, float %g, i32 %h, double %i) #9
811   ret void
814 define half @h1(ptr nocapture %hptr) "cmse_nonsecure_entry" nounwind {
815 ; CHECK-8M-LABEL: h1:
816 ; CHECK-8M:       @ %bb.0:
817 ; CHECK-8M-NEXT:    push {r7, lr}
818 ; CHECK-8M-NEXT:    vldr s0, .LCPI11_0
819 ; CHECK-8M-NEXT:    blx r0
820 ; CHECK-8M-NEXT:    vmov r0, s0
821 ; CHECK-8M-NEXT:    uxth r0, r0
822 ; CHECK-8M-NEXT:    vmov s0, r0
823 ; CHECK-8M-NEXT:    pop.w {r7, lr}
824 ; CHECK-8M-NEXT:    mrs r12, control
825 ; CHECK-8M-NEXT:    tst.w r12, #8
826 ; CHECK-8M-NEXT:    beq .LBB11_2
827 ; CHECK-8M-NEXT:  @ %bb.1:
828 ; CHECK-8M-NEXT:    vmrs r12, fpscr
829 ; CHECK-8M-NEXT:    vmov s1, lr
830 ; CHECK-8M-NEXT:    vmov d1, lr, lr
831 ; CHECK-8M-NEXT:    vmov d2, lr, lr
832 ; CHECK-8M-NEXT:    vmov d3, lr, lr
833 ; CHECK-8M-NEXT:    vmov d4, lr, lr
834 ; CHECK-8M-NEXT:    vmov d5, lr, lr
835 ; CHECK-8M-NEXT:    vmov d6, lr, lr
836 ; CHECK-8M-NEXT:    vmov d7, lr, lr
837 ; CHECK-8M-NEXT:    bic r12, r12, #159
838 ; CHECK-8M-NEXT:    bic r12, r12, #4026531840
839 ; CHECK-8M-NEXT:    vmsr fpscr, r12
840 ; CHECK-8M-NEXT:  .LBB11_2:
841 ; CHECK-8M-NEXT:    mov r0, lr
842 ; CHECK-8M-NEXT:    mov r1, lr
843 ; CHECK-8M-NEXT:    mov r2, lr
844 ; CHECK-8M-NEXT:    mov r3, lr
845 ; CHECK-8M-NEXT:    mov r12, lr
846 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, lr
847 ; CHECK-8M-NEXT:    bxns lr
848 ; CHECK-8M-NEXT:    .p2align 2
849 ; CHECK-8M-NEXT:  @ %bb.3:
850 ; CHECK-8M-NEXT:  .LCPI11_0:
851 ; CHECK-8M-NEXT:    .long 0x00004900 @ float 2.61874657E-41
853 ; CHECK-NO-MVE-LABEL: h1:
854 ; CHECK-NO-MVE:       @ %bb.0:
855 ; CHECK-NO-MVE-NEXT:    vstr fpcxtns, [sp, #-4]!
856 ; CHECK-NO-MVE-NEXT:    push {r7, lr}
857 ; CHECK-NO-MVE-NEXT:    sub sp, #4
858 ; CHECK-NO-MVE-NEXT:    vldr s0, .LCPI11_0
859 ; CHECK-NO-MVE-NEXT:    blx r0
860 ; CHECK-NO-MVE-NEXT:    vmov r0, s0
861 ; CHECK-NO-MVE-NEXT:    uxth r0, r0
862 ; CHECK-NO-MVE-NEXT:    vmov s0, r0
863 ; CHECK-NO-MVE-NEXT:    add sp, #4
864 ; CHECK-NO-MVE-NEXT:    pop.w {r7, lr}
865 ; CHECK-NO-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
866 ; CHECK-NO-MVE-NEXT:    vldr fpcxtns, [sp], #4
867 ; CHECK-NO-MVE-NEXT:    clrm {r0, r1, r2, r3, r12, apsr}
868 ; CHECK-NO-MVE-NEXT:    bxns lr
869 ; CHECK-NO-MVE-NEXT:    .p2align 2
870 ; CHECK-NO-MVE-NEXT:  @ %bb.1:
871 ; CHECK-NO-MVE-NEXT:  .LCPI11_0:
872 ; CHECK-NO-MVE-NEXT:    .long 0x00004900 @ float 2.61874657E-41
874 ; CHECK-MVE-LABEL: h1:
875 ; CHECK-MVE:       @ %bb.0:
876 ; CHECK-MVE-NEXT:    vstr fpcxtns, [sp, #-4]!
877 ; CHECK-MVE-NEXT:    push {r7, lr}
878 ; CHECK-MVE-NEXT:    sub sp, #4
879 ; CHECK-MVE-NEXT:    vmov.f16 s0, #1.000000e+01
880 ; CHECK-MVE-NEXT:    blx r0
881 ; CHECK-MVE-NEXT:    vmov.f16 r0, s0
882 ; CHECK-MVE-NEXT:    vmov s0, r0
883 ; CHECK-MVE-NEXT:    add sp, #4
884 ; CHECK-MVE-NEXT:    pop.w {r7, lr}
885 ; CHECK-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
886 ; CHECK-MVE-NEXT:    vldr fpcxtns, [sp], #4
887 ; CHECK-MVE-NEXT:    clrm {r0, r1, r2, r3, r12, apsr}
888 ; CHECK-MVE-NEXT:    bxns lr
889   %call = call half %hptr(half 10.0) nounwind
890   ret half %call
893 define half @h2(ptr nocapture %hptr) nounwind {
894 ; CHECK-8M-LABEL: h2:
895 ; CHECK-8M:       @ %bb.0: @ %entry
896 ; CHECK-8M-NEXT:    push {r7, lr}
897 ; CHECK-8M-NEXT:    vldr s0, .LCPI12_0
898 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
899 ; CHECK-8M-NEXT:    bic r0, r0, #1
900 ; CHECK-8M-NEXT:    sub sp, #136
901 ; CHECK-8M-NEXT:    vmov r12, s0
902 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
903 ; CHECK-8M-NEXT:    vmov s0, r12
904 ; CHECK-8M-NEXT:    ldr r1, [sp, #64]
905 ; CHECK-8M-NEXT:    bic r1, r1, #159
906 ; CHECK-8M-NEXT:    bic r1, r1, #4026531840
907 ; CHECK-8M-NEXT:    vmsr fpscr, r1
908 ; CHECK-8M-NEXT:    mov r1, r0
909 ; CHECK-8M-NEXT:    mov r2, r0
910 ; CHECK-8M-NEXT:    mov r3, r0
911 ; CHECK-8M-NEXT:    mov r4, r0
912 ; CHECK-8M-NEXT:    mov r5, r0
913 ; CHECK-8M-NEXT:    mov r6, r0
914 ; CHECK-8M-NEXT:    mov r7, r0
915 ; CHECK-8M-NEXT:    mov r8, r0
916 ; CHECK-8M-NEXT:    mov r9, r0
917 ; CHECK-8M-NEXT:    mov r10, r0
918 ; CHECK-8M-NEXT:    mov r11, r0
919 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
920 ; CHECK-8M-NEXT:    blxns r0
921 ; CHECK-8M-NEXT:    vmov r12, s0
922 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
923 ; CHECK-8M-NEXT:    vmov s0, r12
924 ; CHECK-8M-NEXT:    add sp, #136
925 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
926 ; CHECK-8M-NEXT:    pop {r7, pc}
927 ; CHECK-8M-NEXT:    .p2align 2
928 ; CHECK-8M-NEXT:  @ %bb.1:
929 ; CHECK-8M-NEXT:  .LCPI12_0:
930 ; CHECK-8M-NEXT:    .long 0x00004900 @ float 2.61874657E-41
932 ; CHECK-NO-MVE-LABEL: h2:
933 ; CHECK-NO-MVE:       @ %bb.0: @ %entry
934 ; CHECK-NO-MVE-NEXT:    push {r7, lr}
935 ; CHECK-NO-MVE-NEXT:    vldr s0, .LCPI12_0
936 ; CHECK-NO-MVE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
937 ; CHECK-NO-MVE-NEXT:    bic r0, r0, #1
938 ; CHECK-NO-MVE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
939 ; CHECK-NO-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
940 ; CHECK-NO-MVE-NEXT:    vstr fpcxts, [sp, #-8]!
941 ; CHECK-NO-MVE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
942 ; CHECK-NO-MVE-NEXT:    blxns r0
943 ; CHECK-NO-MVE-NEXT:    vldr fpcxts, [sp], #8
944 ; CHECK-NO-MVE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
945 ; CHECK-NO-MVE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
946 ; CHECK-NO-MVE-NEXT:    pop {r7, pc}
947 ; CHECK-NO-MVE-NEXT:    .p2align 2
948 ; CHECK-NO-MVE-NEXT:  @ %bb.1:
949 ; CHECK-NO-MVE-NEXT:  .LCPI12_0:
950 ; CHECK-NO-MVE-NEXT:    .long 0x00004900 @ float 2.61874657E-41
952 ; CHECK-MVE-LABEL: h2:
953 ; CHECK-MVE:       @ %bb.0: @ %entry
954 ; CHECK-MVE-NEXT:    push {r7, lr}
955 ; CHECK-MVE-NEXT:    vmov.f16 s0, #1.000000e+01
956 ; CHECK-MVE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
957 ; CHECK-MVE-NEXT:    bic r0, r0, #1
958 ; CHECK-MVE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
959 ; CHECK-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
960 ; CHECK-MVE-NEXT:    vstr fpcxts, [sp, #-8]!
961 ; CHECK-MVE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
962 ; CHECK-MVE-NEXT:    blxns r0
963 ; CHECK-MVE-NEXT:    vldr fpcxts, [sp], #8
964 ; CHECK-MVE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
965 ; CHECK-MVE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
966 ; CHECK-MVE-NEXT:    pop {r7, pc}
967 entry:
968   %call = call half %hptr(half 10.0) "cmse_nonsecure_call" nounwind
969   ret half %call
972 define half @h3(ptr nocapture %hptr) nounwind {
973 ; CHECK-8M-LABEL: h3:
974 ; CHECK-8M:       @ %bb.0: @ %entry
975 ; CHECK-8M-NEXT:    push {r7, lr}
976 ; CHECK-8M-NEXT:    vldr s0, .LCPI13_0
977 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
978 ; CHECK-8M-NEXT:    bic r0, r0, #1
979 ; CHECK-8M-NEXT:    sub sp, #136
980 ; CHECK-8M-NEXT:    vmov r12, s0
981 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
982 ; CHECK-8M-NEXT:    vmov s0, r12
983 ; CHECK-8M-NEXT:    ldr r1, [sp, #64]
984 ; CHECK-8M-NEXT:    bic r1, r1, #159
985 ; CHECK-8M-NEXT:    bic r1, r1, #4026531840
986 ; CHECK-8M-NEXT:    vmsr fpscr, r1
987 ; CHECK-8M-NEXT:    mov r1, r0
988 ; CHECK-8M-NEXT:    mov r2, r0
989 ; CHECK-8M-NEXT:    mov r3, r0
990 ; CHECK-8M-NEXT:    mov r4, r0
991 ; CHECK-8M-NEXT:    mov r5, r0
992 ; CHECK-8M-NEXT:    mov r6, r0
993 ; CHECK-8M-NEXT:    mov r7, r0
994 ; CHECK-8M-NEXT:    mov r8, r0
995 ; CHECK-8M-NEXT:    mov r9, r0
996 ; CHECK-8M-NEXT:    mov r10, r0
997 ; CHECK-8M-NEXT:    mov r11, r0
998 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
999 ; CHECK-8M-NEXT:    blxns r0
1000 ; CHECK-8M-NEXT:    vmov r12, s0
1001 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
1002 ; CHECK-8M-NEXT:    vmov s0, r12
1003 ; CHECK-8M-NEXT:    add sp, #136
1004 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1005 ; CHECK-8M-NEXT:    pop {r7, pc}
1006 ; CHECK-8M-NEXT:    .p2align 2
1007 ; CHECK-8M-NEXT:  @ %bb.1:
1008 ; CHECK-8M-NEXT:  .LCPI13_0:
1009 ; CHECK-8M-NEXT:    .long 0x00004900 @ float 2.61874657E-41
1011 ; CHECK-NO-MVE-LABEL: h3:
1012 ; CHECK-NO-MVE:       @ %bb.0: @ %entry
1013 ; CHECK-NO-MVE-NEXT:    push {r7, lr}
1014 ; CHECK-NO-MVE-NEXT:    vldr s0, .LCPI13_0
1015 ; CHECK-NO-MVE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1016 ; CHECK-NO-MVE-NEXT:    bic r0, r0, #1
1017 ; CHECK-NO-MVE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1018 ; CHECK-NO-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1019 ; CHECK-NO-MVE-NEXT:    vstr fpcxts, [sp, #-8]!
1020 ; CHECK-NO-MVE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1021 ; CHECK-NO-MVE-NEXT:    blxns r0
1022 ; CHECK-NO-MVE-NEXT:    vldr fpcxts, [sp], #8
1023 ; CHECK-NO-MVE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1024 ; CHECK-NO-MVE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1025 ; CHECK-NO-MVE-NEXT:    pop {r7, pc}
1026 ; CHECK-NO-MVE-NEXT:    .p2align 2
1027 ; CHECK-NO-MVE-NEXT:  @ %bb.1:
1028 ; CHECK-NO-MVE-NEXT:  .LCPI13_0:
1029 ; CHECK-NO-MVE-NEXT:    .long 0x00004900 @ float 2.61874657E-41
1031 ; CHECK-MVE-LABEL: h3:
1032 ; CHECK-MVE:       @ %bb.0: @ %entry
1033 ; CHECK-MVE-NEXT:    push {r7, lr}
1034 ; CHECK-MVE-NEXT:    vmov.f16 s0, #1.000000e+01
1035 ; CHECK-MVE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1036 ; CHECK-MVE-NEXT:    bic r0, r0, #1
1037 ; CHECK-MVE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1038 ; CHECK-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1039 ; CHECK-MVE-NEXT:    vstr fpcxts, [sp, #-8]!
1040 ; CHECK-MVE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1041 ; CHECK-MVE-NEXT:    blxns r0
1042 ; CHECK-MVE-NEXT:    vldr fpcxts, [sp], #8
1043 ; CHECK-MVE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1044 ; CHECK-MVE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1045 ; CHECK-MVE-NEXT:    pop {r7, pc}
1046 entry:
1047   %call = tail call half %hptr(half 10.0) "cmse_nonsecure_call" nounwind
1048   ret half %call
1051 define half @h4(ptr nocapture %hptr) nounwind {
1052 ; CHECK-8M-LABEL: h4:
1053 ; CHECK-8M:       @ %bb.0: @ %entry
1054 ; CHECK-8M-NEXT:    push {r7, lr}
1055 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1056 ; CHECK-8M-NEXT:    bic r0, r0, #1
1057 ; CHECK-8M-NEXT:    sub sp, #136
1058 ; CHECK-8M-NEXT:    vmov.f32 s0, s0
1059 ; CHECK-8M-NEXT:    mov r1, r0
1060 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
1061 ; CHECK-8M-NEXT:    mov r2, r0
1062 ; CHECK-8M-NEXT:    mov r3, r0
1063 ; CHECK-8M-NEXT:    mov r4, r0
1064 ; CHECK-8M-NEXT:    mov r5, r0
1065 ; CHECK-8M-NEXT:    mov r6, r0
1066 ; CHECK-8M-NEXT:    mov r7, r0
1067 ; CHECK-8M-NEXT:    mov r8, r0
1068 ; CHECK-8M-NEXT:    mov r9, r0
1069 ; CHECK-8M-NEXT:    mov r10, r0
1070 ; CHECK-8M-NEXT:    mov r11, r0
1071 ; CHECK-8M-NEXT:    mov r12, r0
1072 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
1073 ; CHECK-8M-NEXT:    blxns r0
1074 ; CHECK-8M-NEXT:    vmov r12, s0
1075 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
1076 ; CHECK-8M-NEXT:    vmov s0, r12
1077 ; CHECK-8M-NEXT:    add sp, #136
1078 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1079 ; CHECK-8M-NEXT:    pop {r7, pc}
1081 ; CHECK-81M-LABEL: h4:
1082 ; CHECK-81M:       @ %bb.0: @ %entry
1083 ; CHECK-81M-NEXT:    push {r7, lr}
1084 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1085 ; CHECK-81M-NEXT:    bic r0, r0, #1
1086 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1087 ; CHECK-81M-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1088 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
1089 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1090 ; CHECK-81M-NEXT:    blxns r0
1091 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
1092 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1093 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1094 ; CHECK-81M-NEXT:    pop {r7, pc}
1095 entry:
1096   %call = call half %hptr() "cmse_nonsecure_call" nounwind
1097   ret half %call
1100 define half @h1_minsize(ptr nocapture %hptr) "cmse_nonsecure_entry" minsize nounwind {
1101 ; CHECK-8M-LABEL: h1_minsize:
1102 ; CHECK-8M:       @ %bb.0: @ %entry
1103 ; CHECK-8M-NEXT:    push {r7, lr}
1104 ; CHECK-8M-NEXT:    vldr s0, .LCPI15_0
1105 ; CHECK-8M-NEXT:    blx r0
1106 ; CHECK-8M-NEXT:    vmov r0, s0
1107 ; CHECK-8M-NEXT:    uxth r0, r0
1108 ; CHECK-8M-NEXT:    vmov s0, r0
1109 ; CHECK-8M-NEXT:    pop.w {r7, lr}
1110 ; CHECK-8M-NEXT:    vmrs r12, fpscr
1111 ; CHECK-8M-NEXT:    vmov s1, lr
1112 ; CHECK-8M-NEXT:    vmov d1, lr, lr
1113 ; CHECK-8M-NEXT:    mov r0, lr
1114 ; CHECK-8M-NEXT:    vmov d2, lr, lr
1115 ; CHECK-8M-NEXT:    mov r1, lr
1116 ; CHECK-8M-NEXT:    vmov d3, lr, lr
1117 ; CHECK-8M-NEXT:    mov r2, lr
1118 ; CHECK-8M-NEXT:    vmov d4, lr, lr
1119 ; CHECK-8M-NEXT:    mov r3, lr
1120 ; CHECK-8M-NEXT:    vmov d5, lr, lr
1121 ; CHECK-8M-NEXT:    vmov d6, lr, lr
1122 ; CHECK-8M-NEXT:    vmov d7, lr, lr
1123 ; CHECK-8M-NEXT:    bic r12, r12, #159
1124 ; CHECK-8M-NEXT:    bic r12, r12, #4026531840
1125 ; CHECK-8M-NEXT:    vmsr fpscr, r12
1126 ; CHECK-8M-NEXT:    mov r12, lr
1127 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, lr
1128 ; CHECK-8M-NEXT:    bxns lr
1129 ; CHECK-8M-NEXT:    .p2align 2
1130 ; CHECK-8M-NEXT:  @ %bb.1:
1131 ; CHECK-8M-NEXT:  .LCPI15_0:
1132 ; CHECK-8M-NEXT:    .long 0x00004900 @ float 2.61874657E-41
1134 ; CHECK-NO-MVE-LABEL: h1_minsize:
1135 ; CHECK-NO-MVE:       @ %bb.0: @ %entry
1136 ; CHECK-NO-MVE-NEXT:    vstr fpcxtns, [sp, #-4]!
1137 ; CHECK-NO-MVE-NEXT:    push {r6, r7, lr}
1138 ; CHECK-NO-MVE-NEXT:    vldr s0, .LCPI15_0
1139 ; CHECK-NO-MVE-NEXT:    blx r0
1140 ; CHECK-NO-MVE-NEXT:    vmov r0, s0
1141 ; CHECK-NO-MVE-NEXT:    uxth r0, r0
1142 ; CHECK-NO-MVE-NEXT:    vmov s0, r0
1143 ; CHECK-NO-MVE-NEXT:    pop.w {r3, r7, lr}
1144 ; CHECK-NO-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
1145 ; CHECK-NO-MVE-NEXT:    vldr fpcxtns, [sp], #4
1146 ; CHECK-NO-MVE-NEXT:    clrm {r0, r1, r2, r3, r12, apsr}
1147 ; CHECK-NO-MVE-NEXT:    bxns lr
1148 ; CHECK-NO-MVE-NEXT:    .p2align 2
1149 ; CHECK-NO-MVE-NEXT:  @ %bb.1:
1150 ; CHECK-NO-MVE-NEXT:  .LCPI15_0:
1151 ; CHECK-NO-MVE-NEXT:    .long 0x00004900 @ float 2.61874657E-41
1153 ; CHECK-MVE-LABEL: h1_minsize:
1154 ; CHECK-MVE:       @ %bb.0: @ %entry
1155 ; CHECK-MVE-NEXT:    vstr fpcxtns, [sp, #-4]!
1156 ; CHECK-MVE-NEXT:    push {r6, r7, lr}
1157 ; CHECK-MVE-NEXT:    vmov.f16 s0, #1.000000e+01
1158 ; CHECK-MVE-NEXT:    blx r0
1159 ; CHECK-MVE-NEXT:    vmov.f16 r0, s0
1160 ; CHECK-MVE-NEXT:    vmov s0, r0
1161 ; CHECK-MVE-NEXT:    pop.w {r3, r7, lr}
1162 ; CHECK-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
1163 ; CHECK-MVE-NEXT:    vldr fpcxtns, [sp], #4
1164 ; CHECK-MVE-NEXT:    clrm {r0, r1, r2, r3, r12, apsr}
1165 ; CHECK-MVE-NEXT:    bxns lr
1166 entry:
1167   %call = call half %hptr(half 10.0) nounwind
1168   ret half %call
1171 define half @h1_arg(ptr nocapture %hptr, half %harg) nounwind {
1172 ; CHECK-8M-LABEL: h1_arg:
1173 ; CHECK-8M:       @ %bb.0: @ %entry
1174 ; CHECK-8M-NEXT:    push {r7, lr}
1175 ; CHECK-8M-NEXT:    vmov r1, s0
1176 ; CHECK-8M-NEXT:    uxth r1, r1
1177 ; CHECK-8M-NEXT:    vmov s0, r1
1178 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1179 ; CHECK-8M-NEXT:    bic r0, r0, #1
1180 ; CHECK-8M-NEXT:    sub sp, #136
1181 ; CHECK-8M-NEXT:    vmov r12, s0
1182 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
1183 ; CHECK-8M-NEXT:    vmov s0, r12
1184 ; CHECK-8M-NEXT:    ldr r1, [sp, #64]
1185 ; CHECK-8M-NEXT:    bic r1, r1, #159
1186 ; CHECK-8M-NEXT:    bic r1, r1, #4026531840
1187 ; CHECK-8M-NEXT:    vmsr fpscr, r1
1188 ; CHECK-8M-NEXT:    mov r1, r0
1189 ; CHECK-8M-NEXT:    mov r2, r0
1190 ; CHECK-8M-NEXT:    mov r3, r0
1191 ; CHECK-8M-NEXT:    mov r4, r0
1192 ; CHECK-8M-NEXT:    mov r5, r0
1193 ; CHECK-8M-NEXT:    mov r6, r0
1194 ; CHECK-8M-NEXT:    mov r7, r0
1195 ; CHECK-8M-NEXT:    mov r8, r0
1196 ; CHECK-8M-NEXT:    mov r9, r0
1197 ; CHECK-8M-NEXT:    mov r10, r0
1198 ; CHECK-8M-NEXT:    mov r11, r0
1199 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
1200 ; CHECK-8M-NEXT:    blxns r0
1201 ; CHECK-8M-NEXT:    vmov r12, s0
1202 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
1203 ; CHECK-8M-NEXT:    vmov s0, r12
1204 ; CHECK-8M-NEXT:    add sp, #136
1205 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1206 ; CHECK-8M-NEXT:    pop {r7, pc}
1208 ; CHECK-NO-MVE-LABEL: h1_arg:
1209 ; CHECK-NO-MVE:       @ %bb.0: @ %entry
1210 ; CHECK-NO-MVE-NEXT:    push {r7, lr}
1211 ; CHECK-NO-MVE-NEXT:    vmov r1, s0
1212 ; CHECK-NO-MVE-NEXT:    uxth r1, r1
1213 ; CHECK-NO-MVE-NEXT:    vmov s0, r1
1214 ; CHECK-NO-MVE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1215 ; CHECK-NO-MVE-NEXT:    bic r0, r0, #1
1216 ; CHECK-NO-MVE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1217 ; CHECK-NO-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1218 ; CHECK-NO-MVE-NEXT:    vstr fpcxts, [sp, #-8]!
1219 ; CHECK-NO-MVE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1220 ; CHECK-NO-MVE-NEXT:    blxns r0
1221 ; CHECK-NO-MVE-NEXT:    vldr fpcxts, [sp], #8
1222 ; CHECK-NO-MVE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1223 ; CHECK-NO-MVE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1224 ; CHECK-NO-MVE-NEXT:    pop {r7, pc}
1226 ; CHECK-MVE-LABEL: h1_arg:
1227 ; CHECK-MVE:       @ %bb.0: @ %entry
1228 ; CHECK-MVE-NEXT:    push {r7, lr}
1229 ; CHECK-MVE-NEXT:    vmov.f16 r1, s0
1230 ; CHECK-MVE-NEXT:    vmov s0, r1
1231 ; CHECK-MVE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1232 ; CHECK-MVE-NEXT:    bic r0, r0, #1
1233 ; CHECK-MVE-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1234 ; CHECK-MVE-NEXT:    vscclrm {s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1235 ; CHECK-MVE-NEXT:    vstr fpcxts, [sp, #-8]!
1236 ; CHECK-MVE-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1237 ; CHECK-MVE-NEXT:    blxns r0
1238 ; CHECK-MVE-NEXT:    vldr fpcxts, [sp], #8
1239 ; CHECK-MVE-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1240 ; CHECK-MVE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1241 ; CHECK-MVE-NEXT:    pop {r7, pc}
1242 entry:
1243   %call = call half %hptr(half %harg) "cmse_nonsecure_call" nounwind
1244   ret half %call
1247 define float @float_return_undef_arg(ptr nocapture %fptr) #6 {
1248 ; CHECK-8M-LABEL: float_return_undef_arg:
1249 ; CHECK-8M:       @ %bb.0: @ %entry
1250 ; CHECK-8M-NEXT:    push {r7, lr}
1251 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1252 ; CHECK-8M-NEXT:    bic r0, r0, #1
1253 ; CHECK-8M-NEXT:    sub sp, #136
1254 ; CHECK-8M-NEXT:    vmov.f32 s0, s0
1255 ; CHECK-8M-NEXT:    mov r1, r0
1256 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
1257 ; CHECK-8M-NEXT:    mov r2, r0
1258 ; CHECK-8M-NEXT:    mov r3, r0
1259 ; CHECK-8M-NEXT:    mov r4, r0
1260 ; CHECK-8M-NEXT:    mov r5, r0
1261 ; CHECK-8M-NEXT:    mov r6, r0
1262 ; CHECK-8M-NEXT:    mov r7, r0
1263 ; CHECK-8M-NEXT:    mov r8, r0
1264 ; CHECK-8M-NEXT:    mov r9, r0
1265 ; CHECK-8M-NEXT:    mov r10, r0
1266 ; CHECK-8M-NEXT:    mov r11, r0
1267 ; CHECK-8M-NEXT:    mov r12, r0
1268 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
1269 ; CHECK-8M-NEXT:    blxns r0
1270 ; CHECK-8M-NEXT:    vmov r12, s0
1271 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
1272 ; CHECK-8M-NEXT:    vmov s0, r12
1273 ; CHECK-8M-NEXT:    add sp, #136
1274 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1275 ; CHECK-8M-NEXT:    pop {r7, pc}
1277 ; CHECK-81M-LABEL: float_return_undef_arg:
1278 ; CHECK-81M:       @ %bb.0: @ %entry
1279 ; CHECK-81M-NEXT:    push {r7, lr}
1280 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1281 ; CHECK-81M-NEXT:    bic r0, r0, #1
1282 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1283 ; CHECK-81M-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1284 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
1285 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1286 ; CHECK-81M-NEXT:    blxns r0
1287 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
1288 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1289 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1290 ; CHECK-81M-NEXT:    pop {r7, pc}
1291 entry:
1292   %call = call float %fptr(i32 undef) #7
1293   ret float %call
1296 define float @float_return_poison_arg(ptr nocapture %fptr) #6 {
1297 ; CHECK-8M-LABEL: float_return_poison_arg:
1298 ; CHECK-8M:       @ %bb.0: @ %entry
1299 ; CHECK-8M-NEXT:    push {r7, lr}
1300 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1301 ; CHECK-8M-NEXT:    bic r0, r0, #1
1302 ; CHECK-8M-NEXT:    sub sp, #136
1303 ; CHECK-8M-NEXT:    vmov.f32 s0, s0
1304 ; CHECK-8M-NEXT:    mov r1, r0
1305 ; CHECK-8M-NEXT:    vlstm sp, {d0 - d15}
1306 ; CHECK-8M-NEXT:    mov r2, r0
1307 ; CHECK-8M-NEXT:    mov r3, r0
1308 ; CHECK-8M-NEXT:    mov r4, r0
1309 ; CHECK-8M-NEXT:    mov r5, r0
1310 ; CHECK-8M-NEXT:    mov r6, r0
1311 ; CHECK-8M-NEXT:    mov r7, r0
1312 ; CHECK-8M-NEXT:    mov r8, r0
1313 ; CHECK-8M-NEXT:    mov r9, r0
1314 ; CHECK-8M-NEXT:    mov r10, r0
1315 ; CHECK-8M-NEXT:    mov r11, r0
1316 ; CHECK-8M-NEXT:    mov r12, r0
1317 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
1318 ; CHECK-8M-NEXT:    blxns r0
1319 ; CHECK-8M-NEXT:    vmov r12, s0
1320 ; CHECK-8M-NEXT:    vlldm sp, {d0 - d15}
1321 ; CHECK-8M-NEXT:    vmov s0, r12
1322 ; CHECK-8M-NEXT:    add sp, #136
1323 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1324 ; CHECK-8M-NEXT:    pop {r7, pc}
1326 ; CHECK-81M-LABEL: float_return_poison_arg:
1327 ; CHECK-81M:       @ %bb.0: @ %entry
1328 ; CHECK-81M-NEXT:    push {r7, lr}
1329 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
1330 ; CHECK-81M-NEXT:    bic r0, r0, #1
1331 ; CHECK-81M-NEXT:    vpush {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1332 ; CHECK-81M-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31, vpr}
1333 ; CHECK-81M-NEXT:    vstr fpcxts, [sp, #-8]!
1334 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
1335 ; CHECK-81M-NEXT:    blxns r0
1336 ; CHECK-81M-NEXT:    vldr fpcxts, [sp], #8
1337 ; CHECK-81M-NEXT:    vpop {s16, s17, s18, s19, s20, s21, s22, s23, s24, s25, s26, s27, s28, s29, s30, s31}
1338 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
1339 ; CHECK-81M-NEXT:    pop {r7, pc}
1340 entry:
1341   %call = call float %fptr(i32 poison) #7
1342   ret float %call