Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / ARM / cmse-clear-float.ll
blobb11b8d6118f01b1ab958d5f37772dbaf8f05310a
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 | \
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 | \
5 ; RUN:   FileCheck %s --check-prefix=CHECK-8M --check-prefix=CHECK-8M-BE
7 ; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+fp-armv8d16sp,+dsp | \
8 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-81M-LE
9 ; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+fp-armv8d16sp,+dsp | \
10 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-81M-BE
11 ; RUN: llc %s -o - -mtriple=thumbv8.1m.main -mattr=+mve | \
12 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-81M-LE
13 ; RUN: llc %s -o - -mtriple=thumbebv8.1m.main -mattr=+mve | \
14 ; RUN:   FileCheck %s --check-prefix=CHECK-81M --check-prefix=CHECK-81M-BE
16 define float @f1(ptr nocapture %fptr) #0 {
17 ; CHECK-8M-LABEL: f1:
18 ; CHECK-8M:       @ %bb.0: @ %entry
19 ; CHECK-8M-NEXT:    push {r7, lr}
20 ; CHECK-8M-NEXT:    mov r1, r0
21 ; CHECK-8M-NEXT:    movs r0, #0
22 ; CHECK-8M-NEXT:    movt r0, #16672
23 ; CHECK-8M-NEXT:    blx r1
24 ; CHECK-8M-NEXT:    pop.w {r7, lr}
25 ; CHECK-8M-NEXT:    mrs r12, control
26 ; CHECK-8M-NEXT:    tst.w r12, #8
27 ; CHECK-8M-NEXT:    beq .LBB0_2
28 ; CHECK-8M-NEXT:  @ %bb.1: @ %entry
29 ; CHECK-8M-NEXT:    vmrs r12, fpscr
30 ; CHECK-8M-NEXT:    vmov d0, lr, lr
31 ; CHECK-8M-NEXT:    vmov d1, lr, lr
32 ; CHECK-8M-NEXT:    vmov d2, lr, lr
33 ; CHECK-8M-NEXT:    vmov d3, lr, lr
34 ; CHECK-8M-NEXT:    vmov d4, lr, lr
35 ; CHECK-8M-NEXT:    vmov d5, lr, lr
36 ; CHECK-8M-NEXT:    vmov d6, lr, lr
37 ; CHECK-8M-NEXT:    vmov d7, lr, lr
38 ; CHECK-8M-NEXT:    bic r12, r12, #159
39 ; CHECK-8M-NEXT:    bic r12, r12, #4026531840
40 ; CHECK-8M-NEXT:    vmsr fpscr, r12
41 ; CHECK-8M-NEXT:  .LBB0_2: @ %entry
42 ; CHECK-8M-NEXT:    mov r1, lr
43 ; CHECK-8M-NEXT:    mov r2, lr
44 ; CHECK-8M-NEXT:    mov r3, lr
45 ; CHECK-8M-NEXT:    mov r12, lr
46 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, lr
47 ; CHECK-8M-NEXT:    bxns lr
49 ; CHECK-81M-LABEL: f1:
50 ; CHECK-81M:       @ %bb.0: @ %entry
51 ; CHECK-81M-NEXT:    vstr fpcxtns, [sp, #-4]!
52 ; CHECK-81M-NEXT:    push {r7, lr}
53 ; CHECK-81M-NEXT:    sub sp, #4
54 ; CHECK-81M-NEXT:    mov r1, r0
55 ; CHECK-81M-NEXT:    movs r0, #0
56 ; CHECK-81M-NEXT:    movt r0, #16672
57 ; CHECK-81M-NEXT:    blx r1
58 ; CHECK-81M-NEXT:    add sp, #4
59 ; CHECK-81M-NEXT:    pop.w {r7, lr}
60 ; CHECK-81M-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
61 ; CHECK-81M-NEXT:    vldr fpcxtns, [sp], #4
62 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r12, apsr}
63 ; CHECK-81M-NEXT:    bxns lr
64 entry:
65   %call = call float %fptr(float 10.0) #1
66   ret float %call
69 attributes #0 = { "cmse_nonsecure_entry" nounwind }
70 attributes #1 = { nounwind }
72 define double @d1(ptr nocapture %fptr) #0 {
73 ; CHECK-8M-LE-LABEL: d1:
74 ; CHECK-8M-LE:       @ %bb.0: @ %entry
75 ; CHECK-8M-LE-NEXT:    push {r7, lr}
76 ; CHECK-8M-LE-NEXT:    vldr d0, .LCPI1_0
77 ; CHECK-8M-LE-NEXT:    mov r2, r0
78 ; CHECK-8M-LE-NEXT:    vmov r0, r1, d0
79 ; CHECK-8M-LE-NEXT:    blx r2
80 ; CHECK-8M-LE-NEXT:    pop.w {r7, lr}
81 ; CHECK-8M-LE-NEXT:    mrs r12, control
82 ; CHECK-8M-LE-NEXT:    tst.w r12, #8
83 ; CHECK-8M-LE-NEXT:    beq .LBB1_2
84 ; CHECK-8M-LE-NEXT:  @ %bb.1: @ %entry
85 ; CHECK-8M-LE-NEXT:    vmrs r12, fpscr
86 ; CHECK-8M-LE-NEXT:    vmov d0, lr, lr
87 ; CHECK-8M-LE-NEXT:    vmov d1, lr, lr
88 ; CHECK-8M-LE-NEXT:    vmov d2, lr, lr
89 ; CHECK-8M-LE-NEXT:    vmov d3, lr, lr
90 ; CHECK-8M-LE-NEXT:    vmov d4, lr, lr
91 ; CHECK-8M-LE-NEXT:    vmov d5, lr, lr
92 ; CHECK-8M-LE-NEXT:    vmov d6, lr, lr
93 ; CHECK-8M-LE-NEXT:    vmov d7, lr, lr
94 ; CHECK-8M-LE-NEXT:    bic r12, r12, #159
95 ; CHECK-8M-LE-NEXT:    bic r12, r12, #4026531840
96 ; CHECK-8M-LE-NEXT:    vmsr fpscr, r12
97 ; CHECK-8M-LE-NEXT:  .LBB1_2: @ %entry
98 ; CHECK-8M-LE-NEXT:    mov r2, lr
99 ; CHECK-8M-LE-NEXT:    mov r3, lr
100 ; CHECK-8M-LE-NEXT:    mov r12, lr
101 ; CHECK-8M-LE-NEXT:    msr apsr_nzcvqg, lr
102 ; CHECK-8M-LE-NEXT:    bxns lr
103 ; CHECK-8M-LE-NEXT:    .p2align 3
104 ; CHECK-8M-LE-NEXT:  @ %bb.3:
105 ; CHECK-8M-LE-NEXT:  .LCPI1_0:
106 ; CHECK-8M-LE-NEXT:    .long 0 @ double 10
107 ; CHECK-8M-LE-NEXT:    .long 1076101120
109 ; CHECK-8M-BE-LABEL: d1:
110 ; CHECK-8M-BE:       @ %bb.0: @ %entry
111 ; CHECK-8M-BE-NEXT:    push {r7, lr}
112 ; CHECK-8M-BE-NEXT:    vldr d0, .LCPI1_0
113 ; CHECK-8M-BE-NEXT:    mov r2, r0
114 ; CHECK-8M-BE-NEXT:    vmov r1, r0, d0
115 ; CHECK-8M-BE-NEXT:    blx r2
116 ; CHECK-8M-BE-NEXT:    pop.w {r7, lr}
117 ; CHECK-8M-BE-NEXT:    mrs r12, control
118 ; CHECK-8M-BE-NEXT:    tst.w r12, #8
119 ; CHECK-8M-BE-NEXT:    beq .LBB1_2
120 ; CHECK-8M-BE-NEXT:  @ %bb.1: @ %entry
121 ; CHECK-8M-BE-NEXT:    vmrs r12, fpscr
122 ; CHECK-8M-BE-NEXT:    vmov d0, lr, lr
123 ; CHECK-8M-BE-NEXT:    vmov d1, lr, lr
124 ; CHECK-8M-BE-NEXT:    vmov d2, lr, lr
125 ; CHECK-8M-BE-NEXT:    vmov d3, lr, lr
126 ; CHECK-8M-BE-NEXT:    vmov d4, lr, lr
127 ; CHECK-8M-BE-NEXT:    vmov d5, lr, lr
128 ; CHECK-8M-BE-NEXT:    vmov d6, lr, lr
129 ; CHECK-8M-BE-NEXT:    vmov d7, lr, lr
130 ; CHECK-8M-BE-NEXT:    bic r12, r12, #159
131 ; CHECK-8M-BE-NEXT:    bic r12, r12, #4026531840
132 ; CHECK-8M-BE-NEXT:    vmsr fpscr, r12
133 ; CHECK-8M-BE-NEXT:  .LBB1_2: @ %entry
134 ; CHECK-8M-BE-NEXT:    mov r2, lr
135 ; CHECK-8M-BE-NEXT:    mov r3, lr
136 ; CHECK-8M-BE-NEXT:    mov r12, lr
137 ; CHECK-8M-BE-NEXT:    msr apsr_nzcvqg, lr
138 ; CHECK-8M-BE-NEXT:    bxns lr
139 ; CHECK-8M-BE-NEXT:    .p2align 3
140 ; CHECK-8M-BE-NEXT:  @ %bb.3:
141 ; CHECK-8M-BE-NEXT:  .LCPI1_0:
142 ; CHECK-8M-BE-NEXT:    .long 1076101120 @ double 10
143 ; CHECK-8M-BE-NEXT:    .long 0
145 ; CHECK-81M-LE-LABEL: d1:
146 ; CHECK-81M-LE:       @ %bb.0: @ %entry
147 ; CHECK-81M-LE-NEXT:    vstr fpcxtns, [sp, #-4]!
148 ; CHECK-81M-LE-NEXT:    push {r7, lr}
149 ; CHECK-81M-LE-NEXT:    sub sp, #4
150 ; CHECK-81M-LE-NEXT:    vldr d0, .LCPI1_0
151 ; CHECK-81M-LE-NEXT:    mov r2, r0
152 ; CHECK-81M-LE-NEXT:    vmov r0, r1, d0
153 ; CHECK-81M-LE-NEXT:    blx r2
154 ; CHECK-81M-LE-NEXT:    add sp, #4
155 ; CHECK-81M-LE-NEXT:    pop.w {r7, lr}
156 ; CHECK-81M-LE-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
157 ; CHECK-81M-LE-NEXT:    vldr fpcxtns, [sp], #4
158 ; CHECK-81M-LE-NEXT:    clrm {r2, r3, r12, apsr}
159 ; CHECK-81M-LE-NEXT:    bxns lr
160 ; CHECK-81M-LE-NEXT:    .p2align 3
161 ; CHECK-81M-LE-NEXT:  @ %bb.1:
162 ; CHECK-81M-LE-NEXT:  .LCPI1_0:
163 ; CHECK-81M-LE-NEXT:    .long 0 @ double 10
164 ; CHECK-81M-LE-NEXT:    .long 1076101120
166 ; CHECK-81M-BE-LABEL: d1:
167 ; CHECK-81M-BE:       @ %bb.0: @ %entry
168 ; CHECK-81M-BE-NEXT:    vstr fpcxtns, [sp, #-4]!
169 ; CHECK-81M-BE-NEXT:    push {r7, lr}
170 ; CHECK-81M-BE-NEXT:    sub sp, #4
171 ; CHECK-81M-BE-NEXT:    vldr d0, .LCPI1_0
172 ; CHECK-81M-BE-NEXT:    mov r2, r0
173 ; CHECK-81M-BE-NEXT:    vmov r1, r0, d0
174 ; CHECK-81M-BE-NEXT:    blx r2
175 ; CHECK-81M-BE-NEXT:    add sp, #4
176 ; CHECK-81M-BE-NEXT:    pop.w {r7, lr}
177 ; CHECK-81M-BE-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
178 ; CHECK-81M-BE-NEXT:    vldr fpcxtns, [sp], #4
179 ; CHECK-81M-BE-NEXT:    clrm {r2, r3, r12, apsr}
180 ; CHECK-81M-BE-NEXT:    bxns lr
181 ; CHECK-81M-BE-NEXT:    .p2align 3
182 ; CHECK-81M-BE-NEXT:  @ %bb.1:
183 ; CHECK-81M-BE-NEXT:  .LCPI1_0:
184 ; CHECK-81M-BE-NEXT:    .long 1076101120 @ double 10
185 ; CHECK-81M-BE-NEXT:    .long 0
186 entry:
187   %call = call double %fptr(double 10.0) #1
188   ret double %call
191 define float @f2(ptr nocapture %fptr) #2 {
192 ; CHECK-8M-LABEL: f2:
193 ; CHECK-8M:       @ %bb.0: @ %entry
194 ; CHECK-8M-NEXT:    push {r7, lr}
195 ; CHECK-8M-NEXT:    mov r1, r0
196 ; CHECK-8M-NEXT:    movs r0, #0
197 ; CHECK-8M-NEXT:    movt r0, #16672
198 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
199 ; CHECK-8M-NEXT:    bic r1, r1, #1
200 ; CHECK-8M-NEXT:    sub sp, #136
201 ; CHECK-8M-NEXT:    vlstm sp
202 ; CHECK-8M-NEXT:    mov r2, r1
203 ; CHECK-8M-NEXT:    mov r3, r1
204 ; CHECK-8M-NEXT:    mov r4, r1
205 ; CHECK-8M-NEXT:    mov r5, r1
206 ; CHECK-8M-NEXT:    mov r6, r1
207 ; CHECK-8M-NEXT:    mov r7, r1
208 ; CHECK-8M-NEXT:    mov r8, r1
209 ; CHECK-8M-NEXT:    mov r9, r1
210 ; CHECK-8M-NEXT:    mov r10, r1
211 ; CHECK-8M-NEXT:    mov r11, r1
212 ; CHECK-8M-NEXT:    mov r12, r1
213 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r1
214 ; CHECK-8M-NEXT:    blxns r1
215 ; CHECK-8M-NEXT:    vlldm sp
216 ; CHECK-8M-NEXT:    add sp, #136
217 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
218 ; CHECK-8M-NEXT:    pop {r7, pc}
220 ; CHECK-81M-LABEL: f2:
221 ; CHECK-81M:       @ %bb.0: @ %entry
222 ; CHECK-81M-NEXT:    push {r7, lr}
223 ; CHECK-81M-NEXT:    mov r1, r0
224 ; CHECK-81M-NEXT:    movs r0, #0
225 ; CHECK-81M-NEXT:    movt r0, #16672
226 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
227 ; CHECK-81M-NEXT:    bic r1, r1, #1
228 ; CHECK-81M-NEXT:    sub sp, #136
229 ; CHECK-81M-NEXT:    vlstm sp
230 ; CHECK-81M-NEXT:    clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
231 ; CHECK-81M-NEXT:    blxns r1
232 ; CHECK-81M-NEXT:    vlldm sp
233 ; CHECK-81M-NEXT:    add sp, #136
234 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
235 ; CHECK-81M-NEXT:    pop {r7, pc}
236 entry:
237   %call = call float %fptr(float 10.0) #3
238   ret float %call
241 attributes #2 = { nounwind }
242 attributes #3 = { "cmse_nonsecure_call" nounwind }
244 define double @d2(ptr nocapture %fptr) #2 {
245 ; CHECK-8M-LE-LABEL: d2:
246 ; CHECK-8M-LE:       @ %bb.0: @ %entry
247 ; CHECK-8M-LE-NEXT:    push {r7, lr}
248 ; CHECK-8M-LE-NEXT:    vldr d0, .LCPI3_0
249 ; CHECK-8M-LE-NEXT:    mov r2, r0
250 ; CHECK-8M-LE-NEXT:    vmov r0, r1, d0
251 ; CHECK-8M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
252 ; CHECK-8M-LE-NEXT:    bic r2, r2, #1
253 ; CHECK-8M-LE-NEXT:    sub sp, #136
254 ; CHECK-8M-LE-NEXT:    vlstm sp
255 ; CHECK-8M-LE-NEXT:    mov r3, r2
256 ; CHECK-8M-LE-NEXT:    mov r4, r2
257 ; CHECK-8M-LE-NEXT:    mov r5, r2
258 ; CHECK-8M-LE-NEXT:    mov r6, r2
259 ; CHECK-8M-LE-NEXT:    mov r7, r2
260 ; CHECK-8M-LE-NEXT:    mov r8, r2
261 ; CHECK-8M-LE-NEXT:    mov r9, r2
262 ; CHECK-8M-LE-NEXT:    mov r10, r2
263 ; CHECK-8M-LE-NEXT:    mov r11, r2
264 ; CHECK-8M-LE-NEXT:    mov r12, r2
265 ; CHECK-8M-LE-NEXT:    msr apsr_nzcvqg, r2
266 ; CHECK-8M-LE-NEXT:    blxns r2
267 ; CHECK-8M-LE-NEXT:    vlldm sp
268 ; CHECK-8M-LE-NEXT:    add sp, #136
269 ; CHECK-8M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
270 ; CHECK-8M-LE-NEXT:    pop {r7, pc}
271 ; CHECK-8M-LE-NEXT:    .p2align 3
272 ; CHECK-8M-LE-NEXT:  @ %bb.1:
273 ; CHECK-8M-LE-NEXT:  .LCPI3_0:
274 ; CHECK-8M-LE-NEXT:    .long 0 @ double 10
275 ; CHECK-8M-LE-NEXT:    .long 1076101120
277 ; CHECK-8M-BE-LABEL: d2:
278 ; CHECK-8M-BE:       @ %bb.0: @ %entry
279 ; CHECK-8M-BE-NEXT:    push {r7, lr}
280 ; CHECK-8M-BE-NEXT:    vldr d0, .LCPI3_0
281 ; CHECK-8M-BE-NEXT:    mov r2, r0
282 ; CHECK-8M-BE-NEXT:    vmov r1, r0, d0
283 ; CHECK-8M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
284 ; CHECK-8M-BE-NEXT:    bic r2, r2, #1
285 ; CHECK-8M-BE-NEXT:    sub sp, #136
286 ; CHECK-8M-BE-NEXT:    vlstm sp
287 ; CHECK-8M-BE-NEXT:    mov r3, r2
288 ; CHECK-8M-BE-NEXT:    mov r4, r2
289 ; CHECK-8M-BE-NEXT:    mov r5, r2
290 ; CHECK-8M-BE-NEXT:    mov r6, r2
291 ; CHECK-8M-BE-NEXT:    mov r7, r2
292 ; CHECK-8M-BE-NEXT:    mov r8, r2
293 ; CHECK-8M-BE-NEXT:    mov r9, r2
294 ; CHECK-8M-BE-NEXT:    mov r10, r2
295 ; CHECK-8M-BE-NEXT:    mov r11, r2
296 ; CHECK-8M-BE-NEXT:    mov r12, r2
297 ; CHECK-8M-BE-NEXT:    msr apsr_nzcvqg, r2
298 ; CHECK-8M-BE-NEXT:    blxns r2
299 ; CHECK-8M-BE-NEXT:    vlldm sp
300 ; CHECK-8M-BE-NEXT:    add sp, #136
301 ; CHECK-8M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
302 ; CHECK-8M-BE-NEXT:    pop {r7, pc}
303 ; CHECK-8M-BE-NEXT:    .p2align 3
304 ; CHECK-8M-BE-NEXT:  @ %bb.1:
305 ; CHECK-8M-BE-NEXT:  .LCPI3_0:
306 ; CHECK-8M-BE-NEXT:    .long 1076101120 @ double 10
307 ; CHECK-8M-BE-NEXT:    .long 0
309 ; CHECK-81M-LE-LABEL: d2:
310 ; CHECK-81M-LE:       @ %bb.0: @ %entry
311 ; CHECK-81M-LE-NEXT:    push {r7, lr}
312 ; CHECK-81M-LE-NEXT:    vldr d0, .LCPI3_0
313 ; CHECK-81M-LE-NEXT:    mov r2, r0
314 ; CHECK-81M-LE-NEXT:    vmov r0, r1, d0
315 ; CHECK-81M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
316 ; CHECK-81M-LE-NEXT:    bic r2, r2, #1
317 ; CHECK-81M-LE-NEXT:    sub sp, #136
318 ; CHECK-81M-LE-NEXT:    vlstm sp
319 ; CHECK-81M-LE-NEXT:    clrm {r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
320 ; CHECK-81M-LE-NEXT:    blxns r2
321 ; CHECK-81M-LE-NEXT:    vlldm sp
322 ; CHECK-81M-LE-NEXT:    add sp, #136
323 ; CHECK-81M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
324 ; CHECK-81M-LE-NEXT:    pop {r7, pc}
325 ; CHECK-81M-LE-NEXT:    .p2align 3
326 ; CHECK-81M-LE-NEXT:  @ %bb.1:
327 ; CHECK-81M-LE-NEXT:  .LCPI3_0:
328 ; CHECK-81M-LE-NEXT:    .long 0 @ double 10
329 ; CHECK-81M-LE-NEXT:    .long 1076101120
331 ; CHECK-81M-BE-LABEL: d2:
332 ; CHECK-81M-BE:       @ %bb.0: @ %entry
333 ; CHECK-81M-BE-NEXT:    push {r7, lr}
334 ; CHECK-81M-BE-NEXT:    vldr d0, .LCPI3_0
335 ; CHECK-81M-BE-NEXT:    mov r2, r0
336 ; CHECK-81M-BE-NEXT:    vmov r1, r0, d0
337 ; CHECK-81M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
338 ; CHECK-81M-BE-NEXT:    bic r2, r2, #1
339 ; CHECK-81M-BE-NEXT:    sub sp, #136
340 ; CHECK-81M-BE-NEXT:    vlstm sp
341 ; CHECK-81M-BE-NEXT:    clrm {r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
342 ; CHECK-81M-BE-NEXT:    blxns r2
343 ; CHECK-81M-BE-NEXT:    vlldm sp
344 ; CHECK-81M-BE-NEXT:    add sp, #136
345 ; CHECK-81M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
346 ; CHECK-81M-BE-NEXT:    pop {r7, pc}
347 ; CHECK-81M-BE-NEXT:    .p2align 3
348 ; CHECK-81M-BE-NEXT:  @ %bb.1:
349 ; CHECK-81M-BE-NEXT:  .LCPI3_0:
350 ; CHECK-81M-BE-NEXT:    .long 1076101120 @ double 10
351 ; CHECK-81M-BE-NEXT:    .long 0
352 entry:
353   %call = call double %fptr(double 10.0) #3
354   ret double %call
357 define float @f3(ptr nocapture %fptr) #4 {
358 ; CHECK-8M-LABEL: f3:
359 ; CHECK-8M:       @ %bb.0: @ %entry
360 ; CHECK-8M-NEXT:    push {r7, lr}
361 ; CHECK-8M-NEXT:    mov r1, r0
362 ; CHECK-8M-NEXT:    movs r0, #0
363 ; CHECK-8M-NEXT:    movt r0, #16672
364 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
365 ; CHECK-8M-NEXT:    bic r1, r1, #1
366 ; CHECK-8M-NEXT:    sub sp, #136
367 ; CHECK-8M-NEXT:    vlstm sp
368 ; CHECK-8M-NEXT:    mov r2, r1
369 ; CHECK-8M-NEXT:    mov r3, r1
370 ; CHECK-8M-NEXT:    mov r4, r1
371 ; CHECK-8M-NEXT:    mov r5, r1
372 ; CHECK-8M-NEXT:    mov r6, r1
373 ; CHECK-8M-NEXT:    mov r7, r1
374 ; CHECK-8M-NEXT:    mov r8, r1
375 ; CHECK-8M-NEXT:    mov r9, r1
376 ; CHECK-8M-NEXT:    mov r10, r1
377 ; CHECK-8M-NEXT:    mov r11, r1
378 ; CHECK-8M-NEXT:    mov r12, r1
379 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r1
380 ; CHECK-8M-NEXT:    blxns r1
381 ; CHECK-8M-NEXT:    vlldm sp
382 ; CHECK-8M-NEXT:    add sp, #136
383 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
384 ; CHECK-8M-NEXT:    pop {r7, pc}
386 ; CHECK-81M-LABEL: f3:
387 ; CHECK-81M:       @ %bb.0: @ %entry
388 ; CHECK-81M-NEXT:    push {r7, lr}
389 ; CHECK-81M-NEXT:    mov r1, r0
390 ; CHECK-81M-NEXT:    movs r0, #0
391 ; CHECK-81M-NEXT:    movt r0, #16672
392 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
393 ; CHECK-81M-NEXT:    bic r1, r1, #1
394 ; CHECK-81M-NEXT:    sub sp, #136
395 ; CHECK-81M-NEXT:    vlstm sp
396 ; CHECK-81M-NEXT:    clrm {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
397 ; CHECK-81M-NEXT:    blxns r1
398 ; CHECK-81M-NEXT:    vlldm sp
399 ; CHECK-81M-NEXT:    add sp, #136
400 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
401 ; CHECK-81M-NEXT:    pop {r7, pc}
402 entry:
403   %call = tail call float %fptr(float 10.0) #5
404   ret float %call
407 attributes #4 = { nounwind }
408 attributes #5 = { "cmse_nonsecure_call" nounwind }
410 define double @d3(ptr nocapture %fptr) #4 {
411 ; CHECK-8M-LE-LABEL: d3:
412 ; CHECK-8M-LE:       @ %bb.0: @ %entry
413 ; CHECK-8M-LE-NEXT:    push {r7, lr}
414 ; CHECK-8M-LE-NEXT:    vldr d0, .LCPI5_0
415 ; CHECK-8M-LE-NEXT:    mov r2, r0
416 ; CHECK-8M-LE-NEXT:    vmov r0, r1, d0
417 ; CHECK-8M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
418 ; CHECK-8M-LE-NEXT:    bic r2, r2, #1
419 ; CHECK-8M-LE-NEXT:    sub sp, #136
420 ; CHECK-8M-LE-NEXT:    vlstm sp
421 ; CHECK-8M-LE-NEXT:    mov r3, r2
422 ; CHECK-8M-LE-NEXT:    mov r4, r2
423 ; CHECK-8M-LE-NEXT:    mov r5, r2
424 ; CHECK-8M-LE-NEXT:    mov r6, r2
425 ; CHECK-8M-LE-NEXT:    mov r7, r2
426 ; CHECK-8M-LE-NEXT:    mov r8, r2
427 ; CHECK-8M-LE-NEXT:    mov r9, r2
428 ; CHECK-8M-LE-NEXT:    mov r10, r2
429 ; CHECK-8M-LE-NEXT:    mov r11, r2
430 ; CHECK-8M-LE-NEXT:    mov r12, r2
431 ; CHECK-8M-LE-NEXT:    msr apsr_nzcvqg, r2
432 ; CHECK-8M-LE-NEXT:    blxns r2
433 ; CHECK-8M-LE-NEXT:    vlldm sp
434 ; CHECK-8M-LE-NEXT:    add sp, #136
435 ; CHECK-8M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
436 ; CHECK-8M-LE-NEXT:    pop {r7, pc}
437 ; CHECK-8M-LE-NEXT:    .p2align 3
438 ; CHECK-8M-LE-NEXT:  @ %bb.1:
439 ; CHECK-8M-LE-NEXT:  .LCPI5_0:
440 ; CHECK-8M-LE-NEXT:    .long 0 @ double 10
441 ; CHECK-8M-LE-NEXT:    .long 1076101120
443 ; CHECK-8M-BE-LABEL: d3:
444 ; CHECK-8M-BE:       @ %bb.0: @ %entry
445 ; CHECK-8M-BE-NEXT:    push {r7, lr}
446 ; CHECK-8M-BE-NEXT:    vldr d0, .LCPI5_0
447 ; CHECK-8M-BE-NEXT:    mov r2, r0
448 ; CHECK-8M-BE-NEXT:    vmov r1, r0, d0
449 ; CHECK-8M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
450 ; CHECK-8M-BE-NEXT:    bic r2, r2, #1
451 ; CHECK-8M-BE-NEXT:    sub sp, #136
452 ; CHECK-8M-BE-NEXT:    vlstm sp
453 ; CHECK-8M-BE-NEXT:    mov r3, r2
454 ; CHECK-8M-BE-NEXT:    mov r4, r2
455 ; CHECK-8M-BE-NEXT:    mov r5, r2
456 ; CHECK-8M-BE-NEXT:    mov r6, r2
457 ; CHECK-8M-BE-NEXT:    mov r7, r2
458 ; CHECK-8M-BE-NEXT:    mov r8, r2
459 ; CHECK-8M-BE-NEXT:    mov r9, r2
460 ; CHECK-8M-BE-NEXT:    mov r10, r2
461 ; CHECK-8M-BE-NEXT:    mov r11, r2
462 ; CHECK-8M-BE-NEXT:    mov r12, r2
463 ; CHECK-8M-BE-NEXT:    msr apsr_nzcvqg, r2
464 ; CHECK-8M-BE-NEXT:    blxns r2
465 ; CHECK-8M-BE-NEXT:    vlldm sp
466 ; CHECK-8M-BE-NEXT:    add sp, #136
467 ; CHECK-8M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
468 ; CHECK-8M-BE-NEXT:    pop {r7, pc}
469 ; CHECK-8M-BE-NEXT:    .p2align 3
470 ; CHECK-8M-BE-NEXT:  @ %bb.1:
471 ; CHECK-8M-BE-NEXT:  .LCPI5_0:
472 ; CHECK-8M-BE-NEXT:    .long 1076101120 @ double 10
473 ; CHECK-8M-BE-NEXT:    .long 0
475 ; CHECK-81M-LE-LABEL: d3:
476 ; CHECK-81M-LE:       @ %bb.0: @ %entry
477 ; CHECK-81M-LE-NEXT:    push {r7, lr}
478 ; CHECK-81M-LE-NEXT:    vldr d0, .LCPI5_0
479 ; CHECK-81M-LE-NEXT:    mov r2, r0
480 ; CHECK-81M-LE-NEXT:    vmov r0, r1, d0
481 ; CHECK-81M-LE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
482 ; CHECK-81M-LE-NEXT:    bic r2, r2, #1
483 ; CHECK-81M-LE-NEXT:    sub sp, #136
484 ; CHECK-81M-LE-NEXT:    vlstm sp
485 ; CHECK-81M-LE-NEXT:    clrm {r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
486 ; CHECK-81M-LE-NEXT:    blxns r2
487 ; CHECK-81M-LE-NEXT:    vlldm sp
488 ; CHECK-81M-LE-NEXT:    add sp, #136
489 ; CHECK-81M-LE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
490 ; CHECK-81M-LE-NEXT:    pop {r7, pc}
491 ; CHECK-81M-LE-NEXT:    .p2align 3
492 ; CHECK-81M-LE-NEXT:  @ %bb.1:
493 ; CHECK-81M-LE-NEXT:  .LCPI5_0:
494 ; CHECK-81M-LE-NEXT:    .long 0 @ double 10
495 ; CHECK-81M-LE-NEXT:    .long 1076101120
497 ; CHECK-81M-BE-LABEL: d3:
498 ; CHECK-81M-BE:       @ %bb.0: @ %entry
499 ; CHECK-81M-BE-NEXT:    push {r7, lr}
500 ; CHECK-81M-BE-NEXT:    vldr d0, .LCPI5_0
501 ; CHECK-81M-BE-NEXT:    mov r2, r0
502 ; CHECK-81M-BE-NEXT:    vmov r1, r0, d0
503 ; CHECK-81M-BE-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
504 ; CHECK-81M-BE-NEXT:    bic r2, r2, #1
505 ; CHECK-81M-BE-NEXT:    sub sp, #136
506 ; CHECK-81M-BE-NEXT:    vlstm sp
507 ; CHECK-81M-BE-NEXT:    clrm {r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
508 ; CHECK-81M-BE-NEXT:    blxns r2
509 ; CHECK-81M-BE-NEXT:    vlldm sp
510 ; CHECK-81M-BE-NEXT:    add sp, #136
511 ; CHECK-81M-BE-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
512 ; CHECK-81M-BE-NEXT:    pop {r7, pc}
513 ; CHECK-81M-BE-NEXT:    .p2align 3
514 ; CHECK-81M-BE-NEXT:  @ %bb.1:
515 ; CHECK-81M-BE-NEXT:  .LCPI5_0:
516 ; CHECK-81M-BE-NEXT:    .long 1076101120 @ double 10
517 ; CHECK-81M-BE-NEXT:    .long 0
518 entry:
519   %call = tail call double %fptr(double 10.0) #5
520   ret double %call
523 define float @f4(ptr nocapture %fptr) #6 {
524 ; CHECK-8M-LABEL: f4:
525 ; CHECK-8M:       @ %bb.0: @ %entry
526 ; CHECK-8M-NEXT:    push {r7, lr}
527 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
528 ; CHECK-8M-NEXT:    bic r0, r0, #1
529 ; CHECK-8M-NEXT:    sub sp, #136
530 ; CHECK-8M-NEXT:    vlstm sp
531 ; CHECK-8M-NEXT:    mov r1, r0
532 ; CHECK-8M-NEXT:    mov r2, r0
533 ; CHECK-8M-NEXT:    mov r3, r0
534 ; CHECK-8M-NEXT:    mov r4, r0
535 ; CHECK-8M-NEXT:    mov r5, r0
536 ; CHECK-8M-NEXT:    mov r6, r0
537 ; CHECK-8M-NEXT:    mov r7, r0
538 ; CHECK-8M-NEXT:    mov r8, r0
539 ; CHECK-8M-NEXT:    mov r9, r0
540 ; CHECK-8M-NEXT:    mov r10, r0
541 ; CHECK-8M-NEXT:    mov r11, r0
542 ; CHECK-8M-NEXT:    mov r12, r0
543 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
544 ; CHECK-8M-NEXT:    blxns r0
545 ; CHECK-8M-NEXT:    vlldm sp
546 ; CHECK-8M-NEXT:    add sp, #136
547 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
548 ; CHECK-8M-NEXT:    pop {r7, pc}
550 ; CHECK-81M-LABEL: f4:
551 ; CHECK-81M:       @ %bb.0: @ %entry
552 ; CHECK-81M-NEXT:    push {r7, lr}
553 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
554 ; CHECK-81M-NEXT:    bic r0, r0, #1
555 ; CHECK-81M-NEXT:    sub sp, #136
556 ; CHECK-81M-NEXT:    vlstm sp
557 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
558 ; CHECK-81M-NEXT:    blxns r0
559 ; CHECK-81M-NEXT:    vlldm sp
560 ; CHECK-81M-NEXT:    add sp, #136
561 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
562 ; CHECK-81M-NEXT:    pop {r7, pc}
563 entry:
564   %call = call float %fptr() #7
565   ret float %call
568 attributes #6 = { nounwind }
569 attributes #7 = { "cmse_nonsecure_call" nounwind }
571 define double @d4(ptr nocapture %fptr) #6 {
572 ; CHECK-8M-LABEL: d4:
573 ; CHECK-8M:       @ %bb.0: @ %entry
574 ; CHECK-8M-NEXT:    push {r7, lr}
575 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
576 ; CHECK-8M-NEXT:    bic r0, r0, #1
577 ; CHECK-8M-NEXT:    sub sp, #136
578 ; CHECK-8M-NEXT:    vlstm sp
579 ; CHECK-8M-NEXT:    mov r1, r0
580 ; CHECK-8M-NEXT:    mov r2, r0
581 ; CHECK-8M-NEXT:    mov r3, r0
582 ; CHECK-8M-NEXT:    mov r4, r0
583 ; CHECK-8M-NEXT:    mov r5, r0
584 ; CHECK-8M-NEXT:    mov r6, r0
585 ; CHECK-8M-NEXT:    mov r7, r0
586 ; CHECK-8M-NEXT:    mov r8, r0
587 ; CHECK-8M-NEXT:    mov r9, r0
588 ; CHECK-8M-NEXT:    mov r10, r0
589 ; CHECK-8M-NEXT:    mov r11, r0
590 ; CHECK-8M-NEXT:    mov r12, r0
591 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r0
592 ; CHECK-8M-NEXT:    blxns r0
593 ; CHECK-8M-NEXT:    vlldm sp
594 ; CHECK-8M-NEXT:    add sp, #136
595 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
596 ; CHECK-8M-NEXT:    pop {r7, pc}
598 ; CHECK-81M-LABEL: d4:
599 ; CHECK-81M:       @ %bb.0: @ %entry
600 ; CHECK-81M-NEXT:    push {r7, lr}
601 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
602 ; CHECK-81M-NEXT:    bic r0, r0, #1
603 ; CHECK-81M-NEXT:    sub sp, #136
604 ; CHECK-81M-NEXT:    vlstm sp
605 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, apsr}
606 ; CHECK-81M-NEXT:    blxns r0
607 ; CHECK-81M-NEXT:    vlldm sp
608 ; CHECK-81M-NEXT:    add sp, #136
609 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
610 ; CHECK-81M-NEXT:    pop {r7, pc}
611 entry:
612   %call = call double %fptr() #7
613   ret double %call
616 define void @fd(ptr %f, float %a, double %b) #8 {
617 ; CHECK-8M-LABEL: fd:
618 ; CHECK-8M:       @ %bb.0: @ %entry
619 ; CHECK-8M-NEXT:    push {r7, lr}
620 ; CHECK-8M-NEXT:    mov r12, r0
621 ; CHECK-8M-NEXT:    mov r0, r1
622 ; CHECK-8M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
623 ; CHECK-8M-NEXT:    bic r12, r12, #1
624 ; CHECK-8M-NEXT:    sub sp, #136
625 ; CHECK-8M-NEXT:    vlstm sp
626 ; CHECK-8M-NEXT:    mov r1, r12
627 ; CHECK-8M-NEXT:    mov r4, r12
628 ; CHECK-8M-NEXT:    mov r5, r12
629 ; CHECK-8M-NEXT:    mov r6, r12
630 ; CHECK-8M-NEXT:    mov r7, r12
631 ; CHECK-8M-NEXT:    mov r8, r12
632 ; CHECK-8M-NEXT:    mov r9, r12
633 ; CHECK-8M-NEXT:    mov r10, r12
634 ; CHECK-8M-NEXT:    mov r11, r12
635 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, r12
636 ; CHECK-8M-NEXT:    blxns r12
637 ; CHECK-8M-NEXT:    vlldm sp
638 ; CHECK-8M-NEXT:    add sp, #136
639 ; CHECK-8M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
640 ; CHECK-8M-NEXT:    pop {r7, pc}
642 ; CHECK-81M-LABEL: fd:
643 ; CHECK-81M:       @ %bb.0: @ %entry
644 ; CHECK-81M-NEXT:    push {r7, lr}
645 ; CHECK-81M-NEXT:    mov r12, r0
646 ; CHECK-81M-NEXT:    mov r0, r1
647 ; CHECK-81M-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11}
648 ; CHECK-81M-NEXT:    bic r12, r12, #1
649 ; CHECK-81M-NEXT:    sub sp, #136
650 ; CHECK-81M-NEXT:    vlstm sp
651 ; CHECK-81M-NEXT:    clrm {r1, r4, r5, r6, r7, r8, r9, r10, r11, apsr}
652 ; CHECK-81M-NEXT:    blxns r12
653 ; CHECK-81M-NEXT:    vlldm sp
654 ; CHECK-81M-NEXT:    add sp, #136
655 ; CHECK-81M-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11}
656 ; CHECK-81M-NEXT:    pop {r7, pc}
657 entry:
658   call void %f(float %a, double %b) #9
659   ret void
662 attributes #8 = { nounwind }
663 attributes #9 = { "cmse_nonsecure_call" nounwind }
665 define float @f1_minsize(ptr nocapture %fptr) #10 {
666 ; CHECK-8M-LABEL: f1_minsize:
667 ; CHECK-8M:       @ %bb.0: @ %entry
668 ; CHECK-8M-NEXT:    push {r7, lr}
669 ; CHECK-8M-NEXT:    mov r1, r0
670 ; CHECK-8M-NEXT:    ldr r0, .LCPI9_0
671 ; CHECK-8M-NEXT:    blx r1
672 ; CHECK-8M-NEXT:    pop.w {r7, lr}
673 ; CHECK-8M-NEXT:    vmrs r12, fpscr
674 ; CHECK-8M-NEXT:    vmov d0, lr, lr
675 ; CHECK-8M-NEXT:    vmov d1, lr, lr
676 ; CHECK-8M-NEXT:    mov r1, lr
677 ; CHECK-8M-NEXT:    vmov d2, lr, lr
678 ; CHECK-8M-NEXT:    mov r2, lr
679 ; CHECK-8M-NEXT:    vmov d3, lr, lr
680 ; CHECK-8M-NEXT:    mov r3, lr
681 ; CHECK-8M-NEXT:    vmov d4, lr, lr
682 ; CHECK-8M-NEXT:    vmov d5, lr, lr
683 ; CHECK-8M-NEXT:    vmov d6, lr, lr
684 ; CHECK-8M-NEXT:    vmov d7, lr, lr
685 ; CHECK-8M-NEXT:    bic r12, r12, #159
686 ; CHECK-8M-NEXT:    bic r12, r12, #4026531840
687 ; CHECK-8M-NEXT:    vmsr fpscr, r12
688 ; CHECK-8M-NEXT:    mov r12, lr
689 ; CHECK-8M-NEXT:    msr apsr_nzcvqg, lr
690 ; CHECK-8M-NEXT:    bxns lr
691 ; CHECK-8M-NEXT:    .p2align 2
692 ; CHECK-8M-NEXT:  @ %bb.1:
693 ; CHECK-8M-NEXT:  .LCPI9_0:
694 ; CHECK-8M-NEXT:    .long 1092616192 @ 0x41200000
696 ; CHECK-81M-LABEL: f1_minsize:
697 ; CHECK-81M:       @ %bb.0: @ %entry
698 ; CHECK-81M-NEXT:    vstr fpcxtns, [sp, #-4]!
699 ; CHECK-81M-NEXT:    push {r6, r7, lr}
700 ; CHECK-81M-NEXT:    mov r1, r0
701 ; CHECK-81M-NEXT:    ldr r0, .LCPI9_0
702 ; CHECK-81M-NEXT:    blx r1
703 ; CHECK-81M-NEXT:    pop.w {r3, r7, lr}
704 ; CHECK-81M-NEXT:    vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
705 ; CHECK-81M-NEXT:    vldr fpcxtns, [sp], #4
706 ; CHECK-81M-NEXT:    clrm {r1, r2, r3, r12, apsr}
707 ; CHECK-81M-NEXT:    bxns lr
708 ; CHECK-81M-NEXT:    .p2align 2
709 ; CHECK-81M-NEXT:  @ %bb.1:
710 ; CHECK-81M-NEXT:  .LCPI9_0:
711 ; CHECK-81M-NEXT:    .long 1092616192 @ 0x41200000
712 entry:
713   %call = call float %fptr(float 10.0) #11
714   ret float %call
717 attributes #10 = { "cmse_nonsecure_entry" minsize nounwind }
718 attributes #11 = { nounwind }