121
|
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
2 ; RUN: llc -asm-verbose=false -mattr=-vfp2 -mtriple=arm-eabi < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-SOFT
|
|
3 ; RUN: llc -asm-verbose=false -mattr=-vfp2 -mtriple=arm-eabi -meabi=gnu < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-SOFT
|
|
4 ; RUN: llc -asm-verbose=false -mattr=+vfp3 -mtriple=arm-eabi < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-SOFTFP
|
|
5 ; RUN: llc -asm-verbose=false -mattr=+vfp3 -meabi=gnu -mtriple=arm-eabi < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-SOFTFP
|
|
6 ; RUN: llc -asm-verbose=false -mattr=+vfp3 -float-abi=hard -mtriple=arm-eabi < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-HARDFP-SP -check-prefix=CHECK-HARDFP-DP
|
|
7 ; RUN: llc -asm-verbose=false -mattr=+vfp3 -float-abi=hard -meabi=gnu -mtriple=arm-eabi < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-HARDFP-SP -check-prefix=CHECK-HARDFP-DP
|
|
8 ; RUN: llc -asm-verbose=false -mattr=+vfp3,+fp-only-sp -float-abi=hard -mtriple=arm-eabi < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-HARDFP-SP -check-prefix=CHECK-HARDFP-SPONLY
|
|
9 ; RUN: llc -asm-verbose=false -mattr=+vfp3,+fp-only-sp -float-abi=hard -mtriple=arm-eabi -meabi=gnu < %s | FileCheck %s -check-prefix=CHECK-ALL -check-prefix=CHECK-HARDFP-SP -check-prefix=CHECK-HARDFP-SPONLY
|
|
10
|
|
11 ; The Runtime ABI for the ARM Architecture IHI0043 section 4.1.2 The
|
|
12 ; floating-point helper functions to always use the base AAPCS (soft-float)
|
|
13 ; calling convention.
|
|
14
|
|
15 ; In this test we cover the following configurations:
|
|
16 ; CHECK-SOFT -mfloat-abi=soft
|
|
17 ; * expect no use of floating point instructions
|
|
18 ; * expect to use __aeabi_ helper function in each function
|
|
19 ; CHECK-SOFTFP -mfloat-abi=softfp
|
|
20 ; * all functions use base AAPCS
|
|
21 ; * floating point instructions permitted, so __aeabi_ helpers only
|
|
22 ; expected when there is no available instruction.
|
|
23 ; CHECK-HARD-FP-SP -mfloat-abi=hardfp (single precision instructions)
|
|
24 ; * all non Runtime ABI helper functions use AAPCS VFP
|
|
25 ; * floating point instructions permitted, so __aeabi_ helpers only
|
|
26 ; expected when there is no available instruction.
|
|
27 ; CHECK-HARD-FP-DP -mfloat-abi=hardfp (double precision instructions)
|
|
28 ; CHECK-HARD_FP_SPONLY -mfloat-abi=hardfp (double precision but single
|
|
29 ; precision only FPU)
|
|
30 ; * as CHECK-HARD-FP-SP, but we split up the double precision helper
|
|
31 ; functions so we can test a single precision only FPU, which has to use
|
|
32 ; helper function for all double precision operations.
|
|
33
|
|
34 ; In all cases we must use base AAPCS when calling a helper function from
|
|
35 ; section 4.1.2.
|
|
36
|
|
37 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
|
38 target triple = "arm-eabi"
|
|
39
|
|
40 define float @fadd(float %a, float %b) #0 {
|
|
41 ; CHECK-SOFT-LABEL: fadd:
|
|
42 ; CHECK-SOFT: .save {r11, lr}
|
|
43 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
44 ; CHECK-SOFT-NEXT: bl __aeabi_fadd
|
|
45 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
46 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
47 ;
|
|
48 ; CHECK-SOFTFP-LABEL: fadd:
|
|
49 ; CHECK-SOFTFP: vmov s0, r1
|
|
50 ; CHECK-SOFTFP-NEXT: vmov s2, r0
|
|
51 ; CHECK-SOFTFP-NEXT: vadd.f32 s0, s2, s0
|
|
52 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
53 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
54 ;
|
|
55 ; CHECK-HARDFP-SP-LABEL: fadd:
|
|
56 ; CHECK-HARDFP-SP: vadd.f32 s0, s0, s1
|
|
57 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
58 entry:
|
|
59 %add = fadd float %a, %b
|
|
60 ret float %add
|
|
61 }
|
|
62
|
|
63 define float @fdiv(float %a, float %b) #0 {
|
|
64 ; CHECK-SOFT-LABEL: fdiv:
|
|
65 ; CHECK-SOFT: .save {r11, lr}
|
|
66 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
67 ; CHECK-SOFT-NEXT: bl __aeabi_fdiv
|
|
68 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
69 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
70 ;
|
|
71 ; CHECK-SOFTFP-LABEL: fdiv:
|
|
72 ; CHECK-SOFTFP: vmov s0, r1
|
|
73 ; CHECK-SOFTFP-NEXT: vmov s2, r0
|
|
74 ; CHECK-SOFTFP-NEXT: vdiv.f32 s0, s2, s0
|
|
75 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
76 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
77 ;
|
|
78 ; CHECK-HARDFP-SP-LABEL: fdiv:
|
|
79 ; CHECK-HARDFP-SP: vdiv.f32 s0, s0, s1
|
|
80 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
81 entry:
|
|
82 %div = fdiv float %a, %b
|
|
83 ret float %div
|
|
84 }
|
|
85
|
|
86 define float @fmul(float %a, float %b) #0 {
|
|
87 ; CHECK-SOFT-LABEL: fmul:
|
|
88 ; CHECK-SOFT: .save {r11, lr}
|
|
89 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
90 ; CHECK-SOFT-NEXT: bl __aeabi_fmul
|
|
91 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
92 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
93 ;
|
|
94 ; CHECK-SOFTFP-LABEL: fmul:
|
|
95 ; CHECK-SOFTFP: vmov s0, r1
|
|
96 ; CHECK-SOFTFP-NEXT: vmov s2, r0
|
|
97 ; CHECK-SOFTFP-NEXT: vmul.f32 s0, s2, s0
|
|
98 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
99 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
100 ;
|
|
101 ; CHECK-HARDFP-SP-LABEL: fmul:
|
|
102 ; CHECK-HARDFP-SP: vmul.f32 s0, s0, s1
|
|
103 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
104 entry:
|
|
105 %mul = fmul float %a, %b
|
|
106 ret float %mul
|
|
107 }
|
|
108
|
|
109 define float @fsub(float %a, float %b) #0 {
|
|
110 ; CHECK-SOFT-LABEL: fsub:
|
|
111 ; CHECK-SOFT: .save {r11, lr}
|
|
112 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
113 ; CHECK-SOFT-NEXT: bl __aeabi_fsub
|
|
114 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
115 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
116 ;
|
|
117 ; CHECK-SOFTFP-LABEL: fsub:
|
|
118 ; CHECK-SOFTFP: vmov s0, r1
|
|
119 ; CHECK-SOFTFP-NEXT: vmov s2, r0
|
|
120 ; CHECK-SOFTFP-NEXT: vsub.f32 s0, s2, s0
|
|
121 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
122 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
123 ;
|
|
124 ; CHECK-HARDFP-SP-LABEL: fsub:
|
|
125 ; CHECK-HARDFP-SP: vsub.f32 s0, s0, s1
|
|
126 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
127 entry:
|
|
128 %sub = fsub float %a, %b
|
|
129 ret float %sub
|
|
130 }
|
|
131
|
|
132 define i32 @fcmpeq(float %a, float %b) #0 {
|
|
133 ; CHECK-SOFT-LABEL: fcmpeq:
|
|
134 ; CHECK-SOFT: .save {r11, lr}
|
|
135 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
136 ; CHECK-SOFT-NEXT: bl __aeabi_fcmpeq
|
|
137 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
138 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
139 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
140 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
141 ;
|
|
142 ; CHECK-SOFTFP-LABEL: fcmpeq:
|
|
143 ; CHECK-SOFTFP: vmov s2, r0
|
|
144 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
145 ; CHECK-SOFTFP-NEXT: vmov s0, r1
|
|
146 ; CHECK-SOFTFP-NEXT: vcmp.f32 s2, s0
|
|
147 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
148 ; CHECK-SOFTFP-NEXT: moveq r0, #1
|
|
149 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
150 ;
|
|
151 ; CHECK-HARDFP-SP-LABEL: fcmpeq:
|
|
152 ; CHECK-HARDFP-SP: vcmp.f32 s0, s1
|
|
153 ; CHECK-HARDFP-SP-NEXT: mov r0, #0
|
|
154 ; CHECK-HARDFP-SP-NEXT: vmrs APSR_nzcv, fpscr
|
|
155 ; CHECK-HARDFP-SP-NEXT: moveq r0, #1
|
|
156 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
157 entry:
|
|
158 %cmp = fcmp oeq float %a, %b
|
|
159 %conv = zext i1 %cmp to i32
|
|
160 ret i32 %conv
|
|
161 }
|
|
162
|
|
163 define i32 @fcmplt(float %a, float %b) #0 {
|
|
164 ; CHECK-SOFT-LABEL: fcmplt:
|
|
165 ; CHECK-SOFT: .save {r11, lr}
|
|
166 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
167 ; CHECK-SOFT-NEXT: bl __aeabi_fcmplt
|
|
168 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
169 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
170 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
171 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
172 ;
|
|
173 ; CHECK-SOFTFP-LABEL: fcmplt:
|
|
174 ; CHECK-SOFTFP: vmov s2, r0
|
|
175 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
176 ; CHECK-SOFTFP-NEXT: vmov s0, r1
|
|
177 ; CHECK-SOFTFP-NEXT: vcmpe.f32 s2, s0
|
|
178 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
179 ; CHECK-SOFTFP-NEXT: movmi r0, #1
|
|
180 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
181 ;
|
|
182 ; CHECK-HARDFP-SP-LABEL: fcmplt:
|
|
183 ; CHECK-HARDFP-SP: vcmpe.f32 s0, s1
|
|
184 ; CHECK-HARDFP-SP-NEXT: mov r0, #0
|
|
185 ; CHECK-HARDFP-SP-NEXT: vmrs APSR_nzcv, fpscr
|
|
186 ; CHECK-HARDFP-SP-NEXT: movmi r0, #1
|
|
187 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
188 entry:
|
|
189 %cmp = fcmp olt float %a, %b
|
|
190 %conv = zext i1 %cmp to i32
|
|
191 ret i32 %conv
|
|
192 }
|
|
193
|
|
194 define i32 @fcmple(float %a, float %b) #0 {
|
|
195 ; CHECK-SOFT-LABEL: fcmple:
|
|
196 ; CHECK-SOFT: .save {r11, lr}
|
|
197 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
198 ; CHECK-SOFT-NEXT: bl __aeabi_fcmple
|
|
199 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
200 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
201 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
202 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
203 ;
|
|
204 ; CHECK-SOFTFP-LABEL: fcmple:
|
|
205 ; CHECK-SOFTFP: vmov s2, r0
|
|
206 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
207 ; CHECK-SOFTFP-NEXT: vmov s0, r1
|
|
208 ; CHECK-SOFTFP-NEXT: vcmpe.f32 s2, s0
|
|
209 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
210 ; CHECK-SOFTFP-NEXT: movls r0, #1
|
|
211 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
212 ;
|
|
213 ; CHECK-HARDFP-SP-LABEL: fcmple:
|
|
214 ; CHECK-HARDFP-SP: vcmpe.f32 s0, s1
|
|
215 ; CHECK-HARDFP-SP-NEXT: mov r0, #0
|
|
216 ; CHECK-HARDFP-SP-NEXT: vmrs APSR_nzcv, fpscr
|
|
217 ; CHECK-HARDFP-SP-NEXT: movls r0, #1
|
|
218 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
219 entry:
|
|
220 %cmp = fcmp ole float %a, %b
|
|
221 %conv = zext i1 %cmp to i32
|
|
222 ret i32 %conv
|
|
223 }
|
|
224
|
|
225 define i32 @fcmpge(float %a, float %b) #0 {
|
|
226 ; CHECK-SOFT-LABEL: fcmpge:
|
|
227 ; CHECK-SOFT: .save {r11, lr}
|
|
228 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
229 ; CHECK-SOFT-NEXT: bl __aeabi_fcmpge
|
|
230 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
231 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
232 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
233 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
234 ;
|
|
235 ; CHECK-SOFTFP-LABEL: fcmpge:
|
|
236 ; CHECK-SOFTFP: vmov s2, r0
|
|
237 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
238 ; CHECK-SOFTFP-NEXT: vmov s0, r1
|
|
239 ; CHECK-SOFTFP-NEXT: vcmpe.f32 s2, s0
|
|
240 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
241 ; CHECK-SOFTFP-NEXT: movge r0, #1
|
|
242 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
243 ;
|
|
244 ; CHECK-HARDFP-SP-LABEL: fcmpge:
|
|
245 ; CHECK-HARDFP-SP: vcmpe.f32 s0, s1
|
|
246 ; CHECK-HARDFP-SP-NEXT: mov r0, #0
|
|
247 ; CHECK-HARDFP-SP-NEXT: vmrs APSR_nzcv, fpscr
|
|
248 ; CHECK-HARDFP-SP-NEXT: movge r0, #1
|
|
249 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
250 entry:
|
|
251 %cmp = fcmp oge float %a, %b
|
|
252 %conv = zext i1 %cmp to i32
|
|
253 ret i32 %conv
|
|
254 }
|
|
255
|
|
256 define i32 @fcmpgt(float %a, float %b) #0 {
|
|
257 ; CHECK-SOFT-LABEL: fcmpgt:
|
|
258 ; CHECK-SOFT: .save {r11, lr}
|
|
259 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
260 ; CHECK-SOFT-NEXT: bl __aeabi_fcmpgt
|
|
261 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
262 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
263 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
264 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
265 ;
|
|
266 ; CHECK-SOFTFP-LABEL: fcmpgt:
|
|
267 ; CHECK-SOFTFP: vmov s2, r0
|
|
268 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
269 ; CHECK-SOFTFP-NEXT: vmov s0, r1
|
|
270 ; CHECK-SOFTFP-NEXT: vcmpe.f32 s2, s0
|
|
271 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
272 ; CHECK-SOFTFP-NEXT: movgt r0, #1
|
|
273 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
274 ;
|
|
275 ; CHECK-HARDFP-SP-LABEL: fcmpgt:
|
|
276 ; CHECK-HARDFP-SP: vcmpe.f32 s0, s1
|
|
277 ; CHECK-HARDFP-SP-NEXT: mov r0, #0
|
|
278 ; CHECK-HARDFP-SP-NEXT: vmrs APSR_nzcv, fpscr
|
|
279 ; CHECK-HARDFP-SP-NEXT: movgt r0, #1
|
|
280 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
281 entry:
|
|
282 %cmp = fcmp ogt float %a, %b
|
|
283 %conv = zext i1 %cmp to i32
|
|
284 ret i32 %conv
|
|
285 }
|
|
286
|
|
287 define i32 @fcmpun(float %a, float %b) #0 {
|
|
288 ; CHECK-SOFT-LABEL: fcmpun:
|
|
289 ; CHECK-SOFT: .save {r11, lr}
|
|
290 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
291 ; CHECK-SOFT-NEXT: bl __aeabi_fcmpun
|
|
292 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
293 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
294 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
295 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
296 ;
|
|
297 ; CHECK-SOFTFP-LABEL: fcmpun:
|
|
298 ; CHECK-SOFTFP: vmov s2, r0
|
|
299 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
300 ; CHECK-SOFTFP-NEXT: vmov s0, r1
|
|
301 ; CHECK-SOFTFP-NEXT: vcmpe.f32 s2, s0
|
|
302 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
303 ; CHECK-SOFTFP-NEXT: movvs r0, #1
|
|
304 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
305 ;
|
|
306 ; CHECK-HARDFP-SP-LABEL: fcmpun:
|
|
307 ; CHECK-HARDFP-SP: vcmpe.f32 s0, s1
|
|
308 ; CHECK-HARDFP-SP-NEXT: mov r0, #0
|
|
309 ; CHECK-HARDFP-SP-NEXT: vmrs APSR_nzcv, fpscr
|
|
310 ; CHECK-HARDFP-SP-NEXT: movvs r0, #1
|
|
311 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
312 entry:
|
|
313 %cmp = fcmp uno float %a, %b
|
|
314 %0 = zext i1 %cmp to i32
|
|
315 ret i32 %0
|
|
316 }
|
|
317
|
|
318 define double @dadd(double %a, double %b) #0 {
|
|
319 ; CHECK-SOFT-LABEL: dadd:
|
|
320 ; CHECK-SOFT: .save {r11, lr}
|
|
321 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
322 ; CHECK-SOFT-NEXT: bl __aeabi_dadd
|
|
323 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
324 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
325 ;
|
|
326 ; CHECK-SOFTFP-LABEL: dadd:
|
|
327 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
328 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
329 ; CHECK-SOFTFP-NEXT: vadd.f64 d16, d17, d16
|
|
330 ; CHECK-SOFTFP-NEXT: vmov r0, r1, d16
|
|
331 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
332 ;
|
|
333 ; CHECK-HARDFP-DP-LABEL: dadd:
|
|
334 ; CHECK-HARDFP-DP: vadd.f64 d0, d0, d1
|
|
335 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
336 ;
|
|
337 ; CHECK-HARDFP-SPONLY-LABEL: dadd:
|
|
338 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
339 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
340 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
341 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
342 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dadd
|
|
343 ; CHECK-HARDFP-SPONLY-NEXT: vmov d0, r0, r1
|
|
344 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
345 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
346 entry:
|
|
347 %add = fadd double %a, %b
|
|
348 ret double %add
|
|
349 }
|
|
350
|
|
351 define double @ddiv(double %a, double %b) #0 {
|
|
352 ; CHECK-SOFT-LABEL: ddiv:
|
|
353 ; CHECK-SOFT: .save {r11, lr}
|
|
354 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
355 ; CHECK-SOFT-NEXT: bl __aeabi_ddiv
|
|
356 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
357 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
358 ;
|
|
359 ; CHECK-SOFTFP-LABEL: ddiv:
|
|
360 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
361 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
362 ; CHECK-SOFTFP-NEXT: vdiv.f64 d16, d17, d16
|
|
363 ; CHECK-SOFTFP-NEXT: vmov r0, r1, d16
|
|
364 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
365 ;
|
|
366 ; CHECK-HARDFP-DP-LABEL: ddiv:
|
|
367 ; CHECK-HARDFP-DP: vdiv.f64 d0, d0, d1
|
|
368 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
369 ;
|
|
370 ; CHECK-HARDFP-SPONLY-LABEL: ddiv:
|
|
371 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
372 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
373 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
374 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
375 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_ddiv
|
|
376 ; CHECK-HARDFP-SPONLY-NEXT: vmov d0, r0, r1
|
|
377 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
378 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
379 entry:
|
|
380 %div = fdiv double %a, %b
|
|
381 ret double %div
|
|
382 }
|
|
383
|
|
384 define double @dmul(double %a, double %b) #0 {
|
|
385 ; CHECK-SOFT-LABEL: dmul:
|
|
386 ; CHECK-SOFT: .save {r11, lr}
|
|
387 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
388 ; CHECK-SOFT-NEXT: bl __aeabi_dmul
|
|
389 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
390 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
391 ;
|
|
392 ; CHECK-SOFTFP-LABEL: dmul:
|
|
393 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
394 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
395 ; CHECK-SOFTFP-NEXT: vmul.f64 d16, d17, d16
|
|
396 ; CHECK-SOFTFP-NEXT: vmov r0, r1, d16
|
|
397 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
398 ;
|
|
399 ; CHECK-HARDFP-DP-LABEL: dmul:
|
|
400 ; CHECK-HARDFP-DP: vmul.f64 d0, d0, d1
|
|
401 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
402 ;
|
|
403 ; CHECK-HARDFP-SPONLY-LABEL: dmul:
|
|
404 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
405 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
406 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
407 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
408 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dmul
|
|
409 ; CHECK-HARDFP-SPONLY-NEXT: vmov d0, r0, r1
|
|
410 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
411 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
412 entry:
|
|
413 %mul = fmul double %a, %b
|
|
414 ret double %mul
|
|
415 }
|
|
416
|
|
417 define double @dsub(double %a, double %b) #0 {
|
|
418 ; CHECK-SOFT-LABEL: dsub:
|
|
419 ; CHECK-SOFT: .save {r11, lr}
|
|
420 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
421 ; CHECK-SOFT-NEXT: bl __aeabi_dsub
|
|
422 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
423 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
424 ;
|
|
425 ; CHECK-SOFTFP-LABEL: dsub:
|
|
426 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
427 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
428 ; CHECK-SOFTFP-NEXT: vsub.f64 d16, d17, d16
|
|
429 ; CHECK-SOFTFP-NEXT: vmov r0, r1, d16
|
|
430 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
431 ;
|
|
432 ; CHECK-HARDFP-DP-LABEL: dsub:
|
|
433 ; CHECK-HARDFP-DP: vsub.f64 d0, d0, d1
|
|
434 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
435 ;
|
|
436 ; CHECK-HARDFP-SPONLY-LABEL: dsub:
|
|
437 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
438 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
439 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
440 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
441 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dsub
|
|
442 ; CHECK-HARDFP-SPONLY-NEXT: vmov d0, r0, r1
|
|
443 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
444 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
445 entry:
|
|
446 %sub = fsub double %a, %b
|
|
447 ret double %sub
|
|
448 }
|
|
449
|
|
450 define i32 @dcmpeq(double %a, double %b) #0 {
|
|
451 ; CHECK-SOFT-LABEL: dcmpeq:
|
|
452 ; CHECK-SOFT: .save {r11, lr}
|
|
453 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
454 ; CHECK-SOFT-NEXT: bl __aeabi_dcmpeq
|
|
455 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
456 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
457 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
458 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
459 ;
|
|
460 ; CHECK-SOFTFP-LABEL: dcmpeq:
|
|
461 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
462 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
463 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
464 ; CHECK-SOFTFP-NEXT: vcmp.f64 d17, d16
|
|
465 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
466 ; CHECK-SOFTFP-NEXT: moveq r0, #1
|
|
467 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
468 ;
|
|
469 ; CHECK-HARDFP-DP-LABEL: dcmpeq:
|
|
470 ; CHECK-HARDFP-DP: vcmp.f64 d0, d1
|
|
471 ; CHECK-HARDFP-DP-NEXT: mov r0, #0
|
|
472 ; CHECK-HARDFP-DP-NEXT: vmrs APSR_nzcv, fpscr
|
|
473 ; CHECK-HARDFP-DP-NEXT: moveq r0, #1
|
|
474 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
475 ;
|
|
476 ; CHECK-HARDFP-SPONLY-LABEL: dcmpeq:
|
|
477 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
478 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
479 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
480 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
481 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dcmpeq
|
|
482 ; CHECK-HARDFP-SPONLY-NEXT: cmp r0, #0
|
|
483 ; CHECK-HARDFP-SPONLY-NEXT: movne r0, #1
|
|
484 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
485 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
486 entry:
|
|
487 %cmp = fcmp oeq double %a, %b
|
|
488 %conv = zext i1 %cmp to i32
|
|
489 ret i32 %conv
|
|
490 }
|
|
491
|
|
492 define i32 @dcmplt(double %a, double %b) #0 {
|
|
493 ; CHECK-SOFT-LABEL: dcmplt:
|
|
494 ; CHECK-SOFT: .save {r11, lr}
|
|
495 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
496 ; CHECK-SOFT-NEXT: bl __aeabi_dcmplt
|
|
497 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
498 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
499 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
500 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
501 ;
|
|
502 ; CHECK-SOFTFP-LABEL: dcmplt:
|
|
503 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
504 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
505 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
506 ; CHECK-SOFTFP-NEXT: vcmpe.f64 d17, d16
|
|
507 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
508 ; CHECK-SOFTFP-NEXT: movmi r0, #1
|
|
509 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
510 ;
|
|
511 ; CHECK-HARDFP-DP-LABEL: dcmplt:
|
|
512 ; CHECK-HARDFP-DP: vcmpe.f64 d0, d1
|
|
513 ; CHECK-HARDFP-DP-NEXT: mov r0, #0
|
|
514 ; CHECK-HARDFP-DP-NEXT: vmrs APSR_nzcv, fpscr
|
|
515 ; CHECK-HARDFP-DP-NEXT: movmi r0, #1
|
|
516 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
517 ;
|
|
518 ; CHECK-HARDFP-SPONLY-LABEL: dcmplt:
|
|
519 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
520 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
521 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
522 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
523 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dcmplt
|
|
524 ; CHECK-HARDFP-SPONLY-NEXT: cmp r0, #0
|
|
525 ; CHECK-HARDFP-SPONLY-NEXT: movne r0, #1
|
|
526 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
527 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
528 entry:
|
|
529 %cmp = fcmp olt double %a, %b
|
|
530 %conv = zext i1 %cmp to i32
|
|
531 ret i32 %conv
|
|
532 }
|
|
533
|
|
534 define i32 @dcmple(double %a, double %b) #0 {
|
|
535 ; CHECK-SOFT-LABEL: dcmple:
|
|
536 ; CHECK-SOFT: .save {r11, lr}
|
|
537 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
538 ; CHECK-SOFT-NEXT: bl __aeabi_dcmple
|
|
539 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
540 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
541 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
542 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
543 ;
|
|
544 ; CHECK-SOFTFP-LABEL: dcmple:
|
|
545 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
546 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
547 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
548 ; CHECK-SOFTFP-NEXT: vcmpe.f64 d17, d16
|
|
549 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
550 ; CHECK-SOFTFP-NEXT: movls r0, #1
|
|
551 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
552 ;
|
|
553 ; CHECK-HARDFP-DP-LABEL: dcmple:
|
|
554 ; CHECK-HARDFP-DP: vcmpe.f64 d0, d1
|
|
555 ; CHECK-HARDFP-DP-NEXT: mov r0, #0
|
|
556 ; CHECK-HARDFP-DP-NEXT: vmrs APSR_nzcv, fpscr
|
|
557 ; CHECK-HARDFP-DP-NEXT: movls r0, #1
|
|
558 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
559 ;
|
|
560 ; CHECK-HARDFP-SPONLY-LABEL: dcmple:
|
|
561 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
562 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
563 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
564 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
565 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dcmple
|
|
566 ; CHECK-HARDFP-SPONLY-NEXT: cmp r0, #0
|
|
567 ; CHECK-HARDFP-SPONLY-NEXT: movne r0, #1
|
|
568 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
569 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
570 entry:
|
|
571 %cmp = fcmp ole double %a, %b
|
|
572 %conv = zext i1 %cmp to i32
|
|
573 ret i32 %conv
|
|
574 }
|
|
575
|
|
576 define i32 @dcmpge(double %a, double %b) #0 {
|
|
577 ; CHECK-SOFT-LABEL: dcmpge:
|
|
578 ; CHECK-SOFT: .save {r11, lr}
|
|
579 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
580 ; CHECK-SOFT-NEXT: bl __aeabi_dcmpge
|
|
581 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
582 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
583 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
584 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
585 ;
|
|
586 ; CHECK-SOFTFP-LABEL: dcmpge:
|
|
587 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
588 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
589 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
590 ; CHECK-SOFTFP-NEXT: vcmpe.f64 d17, d16
|
|
591 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
592 ; CHECK-SOFTFP-NEXT: movge r0, #1
|
|
593 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
594 ;
|
|
595 ; CHECK-HARDFP-DP-LABEL: dcmpge:
|
|
596 ; CHECK-HARDFP-DP: vcmpe.f64 d0, d1
|
|
597 ; CHECK-HARDFP-DP-NEXT: mov r0, #0
|
|
598 ; CHECK-HARDFP-DP-NEXT: vmrs APSR_nzcv, fpscr
|
|
599 ; CHECK-HARDFP-DP-NEXT: movge r0, #1
|
|
600 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
601 ;
|
|
602 ; CHECK-HARDFP-SPONLY-LABEL: dcmpge:
|
|
603 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
604 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
605 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
606 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
607 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dcmpge
|
|
608 ; CHECK-HARDFP-SPONLY-NEXT: cmp r0, #0
|
|
609 ; CHECK-HARDFP-SPONLY-NEXT: movne r0, #1
|
|
610 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
611 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
612 entry:
|
|
613 %cmp = fcmp oge double %a, %b
|
|
614 %conv = zext i1 %cmp to i32
|
|
615 ret i32 %conv
|
|
616 }
|
|
617
|
|
618 define i32 @dcmpgt(double %a, double %b) #0 {
|
|
619 ; CHECK-SOFT-LABEL: dcmpgt:
|
|
620 ; CHECK-SOFT: .save {r11, lr}
|
|
621 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
622 ; CHECK-SOFT-NEXT: bl __aeabi_dcmpgt
|
|
623 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
624 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
625 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
626 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
627 ;
|
|
628 ; CHECK-SOFTFP-LABEL: dcmpgt:
|
|
629 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
630 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
631 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
632 ; CHECK-SOFTFP-NEXT: vcmpe.f64 d17, d16
|
|
633 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
634 ; CHECK-SOFTFP-NEXT: movgt r0, #1
|
|
635 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
636 ;
|
|
637 ; CHECK-HARDFP-DP-LABEL: dcmpgt:
|
|
638 ; CHECK-HARDFP-DP: vcmpe.f64 d0, d1
|
|
639 ; CHECK-HARDFP-DP-NEXT: mov r0, #0
|
|
640 ; CHECK-HARDFP-DP-NEXT: vmrs APSR_nzcv, fpscr
|
|
641 ; CHECK-HARDFP-DP-NEXT: movgt r0, #1
|
|
642 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
643 ;
|
|
644 ; CHECK-HARDFP-SPONLY-LABEL: dcmpgt:
|
|
645 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
646 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
647 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
648 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
649 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dcmpgt
|
|
650 ; CHECK-HARDFP-SPONLY-NEXT: cmp r0, #0
|
|
651 ; CHECK-HARDFP-SPONLY-NEXT: movne r0, #1
|
|
652 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
653 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
654 entry:
|
|
655 %cmp = fcmp ogt double %a, %b
|
|
656 %conv = zext i1 %cmp to i32
|
|
657 ret i32 %conv
|
|
658 }
|
|
659
|
|
660 define i32 @dcmpun(double %a, double %b) #0 {
|
|
661 ; CHECK-SOFT-LABEL: dcmpun:
|
|
662 ; CHECK-SOFT: .save {r11, lr}
|
|
663 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
664 ; CHECK-SOFT-NEXT: bl __aeabi_dcmpun
|
|
665 ; CHECK-SOFT-NEXT: cmp r0, #0
|
|
666 ; CHECK-SOFT-NEXT: movne r0, #1
|
|
667 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
668 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
669 ;
|
|
670 ; CHECK-SOFTFP-LABEL: dcmpun:
|
|
671 ; CHECK-SOFTFP: vmov d16, r2, r3
|
|
672 ; CHECK-SOFTFP-NEXT: vmov d17, r0, r1
|
|
673 ; CHECK-SOFTFP-NEXT: mov r0, #0
|
|
674 ; CHECK-SOFTFP-NEXT: vcmpe.f64 d17, d16
|
|
675 ; CHECK-SOFTFP-NEXT: vmrs APSR_nzcv, fpscr
|
|
676 ; CHECK-SOFTFP-NEXT: movvs r0, #1
|
|
677 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
678 ;
|
|
679 ; CHECK-HARDFP-DP-LABEL: dcmpun:
|
|
680 ; CHECK-HARDFP-DP: vcmpe.f64 d0, d1
|
|
681 ; CHECK-HARDFP-DP-NEXT: mov r0, #0
|
|
682 ; CHECK-HARDFP-DP-NEXT: vmrs APSR_nzcv, fpscr
|
|
683 ; CHECK-HARDFP-DP-NEXT: movvs r0, #1
|
|
684 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
685 ;
|
|
686 ; CHECK-HARDFP-SPONLY-LABEL: dcmpun:
|
|
687 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
688 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
689 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
690 ; CHECK-HARDFP-SPONLY-NEXT: vmov r2, r3, d1
|
|
691 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_dcmpun
|
|
692 ; CHECK-HARDFP-SPONLY-NEXT: cmp r0, #0
|
|
693 ; CHECK-HARDFP-SPONLY-NEXT: movne r0, #1
|
|
694 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
695 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
696 entry:
|
|
697 %cmp = fcmp uno double %a, %b
|
|
698 %0 = zext i1 %cmp to i32
|
|
699 ret i32 %0
|
|
700 }
|
|
701
|
|
702 define i32 @d2iz(double %a) #0 {
|
|
703 ; CHECK-SOFT-LABEL: d2iz:
|
|
704 ; CHECK-SOFT: .save {r11, lr}
|
|
705 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
706 ; CHECK-SOFT-NEXT: bl __aeabi_d2iz
|
|
707 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
708 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
709 ;
|
|
710 ; CHECK-SOFTFP-LABEL: d2iz:
|
|
711 ; CHECK-SOFTFP: vmov d16, r0, r1
|
|
712 ; CHECK-SOFTFP-NEXT: vcvt.s32.f64 s0, d16
|
|
713 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
714 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
715 ;
|
|
716 ; CHECK-HARDFP-DP-LABEL: d2iz:
|
|
717 ; CHECK-HARDFP-DP: vcvt.s32.f64 s0, d0
|
|
718 ; CHECK-HARDFP-DP-NEXT: vmov r0, s0
|
|
719 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
720 ;
|
|
721 ; CHECK-HARDFP-SPONLY-LABEL: d2iz:
|
|
722 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
723 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
724 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
725 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_d2iz
|
|
726 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
727 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
728 entry:
|
|
729 %conv = fptosi double %a to i32
|
|
730 ret i32 %conv
|
|
731 }
|
|
732
|
|
733 define i32 @d2uiz(double %a) #0 {
|
|
734 ; CHECK-SOFT-LABEL: d2uiz:
|
|
735 ; CHECK-SOFT: .save {r11, lr}
|
|
736 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
737 ; CHECK-SOFT-NEXT: bl __aeabi_d2uiz
|
|
738 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
739 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
740 ;
|
|
741 ; CHECK-SOFTFP-LABEL: d2uiz:
|
|
742 ; CHECK-SOFTFP: vmov d16, r0, r1
|
|
743 ; CHECK-SOFTFP-NEXT: vcvt.u32.f64 s0, d16
|
|
744 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
745 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
746 ;
|
|
747 ; CHECK-HARDFP-DP-LABEL: d2uiz:
|
|
748 ; CHECK-HARDFP-DP: vcvt.u32.f64 s0, d0
|
|
749 ; CHECK-HARDFP-DP-NEXT: vmov r0, s0
|
|
750 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
751 ;
|
|
752 ; CHECK-HARDFP-SPONLY-LABEL: d2uiz:
|
|
753 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
754 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
755 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
756 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_d2uiz
|
|
757 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
758 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
759 entry:
|
|
760 %conv = fptoui double %a to i32
|
|
761 ret i32 %conv
|
|
762 }
|
|
763
|
|
764 define i64 @d2lz(double %a) #0 {
|
|
765 ; CHECK-SOFT-LABEL: d2lz:
|
|
766 ; CHECK-SOFT: .save {r11, lr}
|
|
767 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
768 ; CHECK-SOFT-NEXT: bl __aeabi_d2lz
|
|
769 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
770 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
771 ;
|
|
772 ; CHECK-SOFTFP-LABEL: d2lz:
|
|
773 ; CHECK-SOFTFP: .save {r11, lr}
|
|
774 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
775 ; CHECK-SOFTFP-NEXT: bl __aeabi_d2lz
|
|
776 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
777 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
778 ;
|
|
779 ; CHECK-HARDFP-SP-LABEL: d2lz:
|
|
780 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
781 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
782 ; CHECK-HARDFP-SP-NEXT: vmov r0, r1, d0
|
|
783 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_d2lz
|
|
784 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
785 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
786 entry:
|
|
787 %conv = fptosi double %a to i64
|
|
788 ret i64 %conv
|
|
789 }
|
|
790
|
|
791 define i64 @d2ulz(double %a) #0 {
|
|
792 ; CHECK-SOFT-LABEL: d2ulz:
|
|
793 ; CHECK-SOFT: .save {r11, lr}
|
|
794 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
795 ; CHECK-SOFT-NEXT: bl __aeabi_d2ulz
|
|
796 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
797 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
798 ;
|
|
799 ; CHECK-SOFTFP-LABEL: d2ulz:
|
|
800 ; CHECK-SOFTFP: .save {r11, lr}
|
|
801 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
802 ; CHECK-SOFTFP-NEXT: bl __aeabi_d2ulz
|
|
803 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
804 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
805 ;
|
|
806 ; CHECK-HARDFP-SP-LABEL: d2ulz:
|
|
807 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
808 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
809 ; CHECK-HARDFP-SP-NEXT: vmov r0, r1, d0
|
|
810 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_d2ulz
|
|
811 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
812 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
813 entry:
|
|
814 %conv = fptoui double %a to i64
|
|
815 ret i64 %conv
|
|
816 }
|
|
817
|
|
818 define i32 @f2iz(float %a) #0 {
|
|
819 ; CHECK-SOFT-LABEL: f2iz:
|
|
820 ; CHECK-SOFT: .save {r11, lr}
|
|
821 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
822 ; CHECK-SOFT-NEXT: bl __aeabi_f2iz
|
|
823 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
824 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
825 ;
|
|
826 ; CHECK-SOFTFP-LABEL: f2iz:
|
|
827 ; CHECK-SOFTFP: vmov s0, r0
|
|
828 ; CHECK-SOFTFP-NEXT: vcvt.s32.f32 s0, s0
|
|
829 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
830 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
831 ;
|
|
832 ; CHECK-HARDFP-SP-LABEL: f2iz:
|
|
833 ; CHECK-HARDFP-SP: vcvt.s32.f32 s0, s0
|
|
834 ; CHECK-HARDFP-SP-NEXT: vmov r0, s0
|
|
835 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
836 entry:
|
|
837 %conv = fptosi float %a to i32
|
|
838 ret i32 %conv
|
|
839 }
|
|
840
|
|
841 define i32 @f2uiz(float %a) #0 {
|
|
842 ; CHECK-SOFT-LABEL: f2uiz:
|
|
843 ; CHECK-SOFT: .save {r11, lr}
|
|
844 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
845 ; CHECK-SOFT-NEXT: bl __aeabi_f2uiz
|
|
846 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
847 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
848 ;
|
|
849 ; CHECK-SOFTFP-LABEL: f2uiz:
|
|
850 ; CHECK-SOFTFP: vmov s0, r0
|
|
851 ; CHECK-SOFTFP-NEXT: vcvt.u32.f32 s0, s0
|
|
852 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
853 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
854 ;
|
|
855 ; CHECK-HARDFP-SP-LABEL: f2uiz:
|
|
856 ; CHECK-HARDFP-SP: vcvt.u32.f32 s0, s0
|
|
857 ; CHECK-HARDFP-SP-NEXT: vmov r0, s0
|
|
858 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
859 entry:
|
|
860 %conv = fptoui float %a to i32
|
|
861 ret i32 %conv
|
|
862 }
|
|
863
|
|
864 define i64 @f2lz(float %a) #0 {
|
|
865 ; CHECK-SOFT-LABEL: f2lz:
|
|
866 ; CHECK-SOFT: .save {r11, lr}
|
|
867 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
868 ; CHECK-SOFT-NEXT: bl __aeabi_f2lz
|
|
869 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
870 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
871 ;
|
|
872 ; CHECK-SOFTFP-LABEL: f2lz:
|
|
873 ; CHECK-SOFTFP: .save {r11, lr}
|
|
874 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
875 ; CHECK-SOFTFP-NEXT: bl __aeabi_f2lz
|
|
876 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
877 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
878 ;
|
|
879 ; CHECK-HARDFP-SP-LABEL: f2lz:
|
|
880 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
881 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
882 ; CHECK-HARDFP-SP-NEXT: vmov r0, s0
|
|
883 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_f2lz
|
|
884 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
885 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
886 entry:
|
|
887 %conv = fptosi float %a to i64
|
|
888 ret i64 %conv
|
|
889 }
|
|
890
|
|
891 define i64 @f2ulz(float %a) #0 {
|
|
892 ; CHECK-SOFT-LABEL: f2ulz:
|
|
893 ; CHECK-SOFT: .save {r11, lr}
|
|
894 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
895 ; CHECK-SOFT-NEXT: bl __aeabi_f2ulz
|
|
896 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
897 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
898 ;
|
|
899 ; CHECK-SOFTFP-LABEL: f2ulz:
|
|
900 ; CHECK-SOFTFP: .save {r11, lr}
|
|
901 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
902 ; CHECK-SOFTFP-NEXT: bl __aeabi_f2ulz
|
|
903 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
904 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
905 ;
|
|
906 ; CHECK-HARDFP-SP-LABEL: f2ulz:
|
|
907 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
908 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
909 ; CHECK-HARDFP-SP-NEXT: vmov r0, s0
|
|
910 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_f2ulz
|
|
911 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
912 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
913 entry:
|
|
914 %conv = fptoui float %a to i64
|
|
915 ret i64 %conv
|
|
916 }
|
|
917
|
|
918 define float @d2f(double %a) #0 {
|
|
919 ; CHECK-SOFT-LABEL: d2f:
|
|
920 ; CHECK-SOFT: .save {r11, lr}
|
|
921 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
922 ; CHECK-SOFT-NEXT: bl __aeabi_d2f
|
|
923 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
924 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
925 ;
|
|
926 ; CHECK-SOFTFP-LABEL: d2f:
|
|
927 ; CHECK-SOFTFP: vmov d16, r0, r1
|
|
928 ; CHECK-SOFTFP-NEXT: vcvt.f32.f64 s0, d16
|
|
929 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
930 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
931 ;
|
|
932 ; CHECK-HARDFP-DP-LABEL: d2f:
|
|
933 ; CHECK-HARDFP-DP: vcvt.f32.f64 s0, d0
|
|
934 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
935 ;
|
|
936 ; CHECK-HARDFP-SPONLY-LABEL: d2f:
|
|
937 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
938 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
939 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, r1, d0
|
|
940 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_d2f
|
|
941 ; CHECK-HARDFP-SPONLY-NEXT: vmov s0, r0
|
|
942 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
943 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
944 entry:
|
|
945 %conv = fptrunc double %a to float
|
|
946 ret float %conv
|
|
947 }
|
|
948
|
|
949 define double @f2d(float %a) #0 {
|
|
950 ; CHECK-SOFT-LABEL: f2d:
|
|
951 ; CHECK-SOFT: .save {r11, lr}
|
|
952 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
953 ; CHECK-SOFT-NEXT: bl __aeabi_f2d
|
|
954 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
955 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
956 ;
|
|
957 ; CHECK-SOFTFP-LABEL: f2d:
|
|
958 ; CHECK-SOFTFP: vmov s0, r0
|
|
959 ; CHECK-SOFTFP-NEXT: vcvt.f64.f32 d16, s0
|
|
960 ; CHECK-SOFTFP-NEXT: vmov r0, r1, d16
|
|
961 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
962 ;
|
|
963 ; CHECK-HARDFP-DP-LABEL: f2d:
|
|
964 ; CHECK-HARDFP-DP: vcvt.f64.f32 d0, s0
|
|
965 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
966 ;
|
|
967 ; CHECK-HARDFP-SPONLY-LABEL: f2d:
|
|
968 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
969 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
970 ; CHECK-HARDFP-SPONLY-NEXT: vmov r0, s0
|
|
971 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_f2d
|
|
972 ; CHECK-HARDFP-SPONLY-NEXT: vmov d0, r0, r1
|
|
973 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
974 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
975 entry:
|
|
976 %conv = fpext float %a to double
|
|
977 ret double %conv
|
|
978 }
|
|
979
|
|
980 define double @i2d(i32 %a) #0 {
|
|
981 ; CHECK-SOFT-LABEL: i2d:
|
|
982 ; CHECK-SOFT: .save {r11, lr}
|
|
983 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
984 ; CHECK-SOFT-NEXT: bl __aeabi_i2d
|
|
985 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
986 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
987 ;
|
|
988 ; CHECK-SOFTFP-LABEL: i2d:
|
|
989 ; CHECK-SOFTFP: vmov s0, r0
|
|
990 ; CHECK-SOFTFP-NEXT: vcvt.f64.s32 d16, s0
|
|
991 ; CHECK-SOFTFP-NEXT: vmov r0, r1, d16
|
|
992 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
993 ;
|
|
994 ; CHECK-HARDFP-DP-LABEL: i2d:
|
|
995 ; CHECK-HARDFP-DP: vmov s0, r0
|
|
996 ; CHECK-HARDFP-DP-NEXT: vcvt.f64.s32 d0, s0
|
|
997 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
998 ;
|
|
999 ; CHECK-HARDFP-SPONLY-LABEL: i2d:
|
|
1000 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
1001 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
1002 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_i2d
|
|
1003 ; CHECK-HARDFP-SPONLY-NEXT: vmov d0, r0, r1
|
|
1004 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
1005 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
1006 entry:
|
|
1007 %conv = sitofp i32 %a to double
|
|
1008 ret double %conv
|
|
1009 }
|
|
1010
|
|
1011 define double @ui2d(i32 %a) #0 {
|
|
1012 ; CHECK-SOFT-LABEL: ui2d:
|
|
1013 ; CHECK-SOFT: .save {r11, lr}
|
|
1014 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
1015 ; CHECK-SOFT-NEXT: bl __aeabi_ui2d
|
|
1016 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
1017 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
1018 ;
|
|
1019 ; CHECK-SOFTFP-LABEL: ui2d:
|
|
1020 ; CHECK-SOFTFP: vmov s0, r0
|
|
1021 ; CHECK-SOFTFP-NEXT: vcvt.f64.u32 d16, s0
|
|
1022 ; CHECK-SOFTFP-NEXT: vmov r0, r1, d16
|
|
1023 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
1024 ;
|
|
1025 ; CHECK-HARDFP-DP-LABEL: ui2d:
|
|
1026 ; CHECK-HARDFP-DP: vmov s0, r0
|
|
1027 ; CHECK-HARDFP-DP-NEXT: vcvt.f64.u32 d0, s0
|
|
1028 ; CHECK-HARDFP-DP-NEXT: mov pc, lr
|
|
1029 ;
|
|
1030 ; CHECK-HARDFP-SPONLY-LABEL: ui2d:
|
|
1031 ; CHECK-HARDFP-SPONLY: .save {r11, lr}
|
|
1032 ; CHECK-HARDFP-SPONLY-NEXT: push {r11, lr}
|
|
1033 ; CHECK-HARDFP-SPONLY-NEXT: bl __aeabi_ui2d
|
|
1034 ; CHECK-HARDFP-SPONLY-NEXT: vmov d0, r0, r1
|
|
1035 ; CHECK-HARDFP-SPONLY-NEXT: pop {r11, lr}
|
|
1036 ; CHECK-HARDFP-SPONLY-NEXT: mov pc, lr
|
|
1037 entry:
|
|
1038 %conv = uitofp i32 %a to double
|
|
1039 ret double %conv
|
|
1040 }
|
|
1041
|
|
1042 define double @l2d(i64 %a) #0 {
|
|
1043 ; CHECK-SOFT-LABEL: l2d:
|
|
1044 ; CHECK-SOFT: .save {r11, lr}
|
|
1045 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
1046 ; CHECK-SOFT-NEXT: bl __aeabi_l2d
|
|
1047 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
1048 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
1049 ;
|
|
1050 ; CHECK-SOFTFP-LABEL: l2d:
|
|
1051 ; CHECK-SOFTFP: .save {r11, lr}
|
|
1052 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
1053 ; CHECK-SOFTFP-NEXT: bl __aeabi_l2d
|
|
1054 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
1055 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
1056 ;
|
|
1057 ; CHECK-HARDFP-SP-LABEL: l2d:
|
|
1058 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
1059 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
1060 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_l2d
|
|
1061 ; CHECK-HARDFP-SP-NEXT: vmov d0, r0, r1
|
|
1062 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
1063 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
1064 entry:
|
|
1065 %conv = sitofp i64 %a to double
|
|
1066 ret double %conv
|
|
1067 }
|
|
1068
|
|
1069 define double @ul2d(i64 %a) #0 {
|
|
1070 ; CHECK-SOFT-LABEL: ul2d:
|
|
1071 ; CHECK-SOFT: .save {r11, lr}
|
|
1072 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
1073 ; CHECK-SOFT-NEXT: bl __aeabi_ul2d
|
|
1074 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
1075 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
1076 ;
|
|
1077 ; CHECK-SOFTFP-LABEL: ul2d:
|
|
1078 ; CHECK-SOFTFP: .save {r11, lr}
|
|
1079 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
1080 ; CHECK-SOFTFP-NEXT: bl __aeabi_ul2d
|
|
1081 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
1082 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
1083 ;
|
|
1084 ; CHECK-HARDFP-SP-LABEL: ul2d:
|
|
1085 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
1086 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
1087 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_ul2d
|
|
1088 ; CHECK-HARDFP-SP-NEXT: vmov d0, r0, r1
|
|
1089 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
1090 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
1091 entry:
|
|
1092 %conv = uitofp i64 %a to double
|
|
1093 ret double %conv
|
|
1094 }
|
|
1095
|
|
1096 define float @i2f(i32 %a) #0 {
|
|
1097 ; CHECK-SOFT-LABEL: i2f:
|
|
1098 ; CHECK-SOFT: .save {r11, lr}
|
|
1099 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
1100 ; CHECK-SOFT-NEXT: bl __aeabi_i2f
|
|
1101 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
1102 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
1103 ;
|
|
1104 ; CHECK-SOFTFP-LABEL: i2f:
|
|
1105 ; CHECK-SOFTFP: vmov s0, r0
|
|
1106 ; CHECK-SOFTFP-NEXT: vcvt.f32.s32 s0, s0
|
|
1107 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
1108 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
1109 ;
|
|
1110 ; CHECK-HARDFP-SP-LABEL: i2f:
|
|
1111 ; CHECK-HARDFP-SP: vmov s0, r0
|
|
1112 ; CHECK-HARDFP-SP-NEXT: vcvt.f32.s32 s0, s0
|
|
1113 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
1114 entry:
|
|
1115 %conv = sitofp i32 %a to float
|
|
1116 ret float %conv
|
|
1117 }
|
|
1118
|
|
1119 define float @ui2f(i32 %a) #0 {
|
|
1120 ; CHECK-SOFT-LABEL: ui2f:
|
|
1121 ; CHECK-SOFT: .save {r11, lr}
|
|
1122 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
1123 ; CHECK-SOFT-NEXT: bl __aeabi_ui2f
|
|
1124 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
1125 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
1126 ;
|
|
1127 ; CHECK-SOFTFP-LABEL: ui2f:
|
|
1128 ; CHECK-SOFTFP: vmov s0, r0
|
|
1129 ; CHECK-SOFTFP-NEXT: vcvt.f32.u32 s0, s0
|
|
1130 ; CHECK-SOFTFP-NEXT: vmov r0, s0
|
|
1131 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
1132 ;
|
|
1133 ; CHECK-HARDFP-SP-LABEL: ui2f:
|
|
1134 ; CHECK-HARDFP-SP: vmov s0, r0
|
|
1135 ; CHECK-HARDFP-SP-NEXT: vcvt.f32.u32 s0, s0
|
|
1136 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
1137 entry:
|
|
1138 %conv = uitofp i32 %a to float
|
|
1139 ret float %conv
|
|
1140 }
|
|
1141
|
|
1142 define float @l2f(i64 %a) #0 {
|
|
1143 ; CHECK-SOFT-LABEL: l2f:
|
|
1144 ; CHECK-SOFT: .save {r11, lr}
|
|
1145 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
1146 ; CHECK-SOFT-NEXT: bl __aeabi_l2f
|
|
1147 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
1148 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
1149 ;
|
|
1150 ; CHECK-SOFTFP-LABEL: l2f:
|
|
1151 ; CHECK-SOFTFP: .save {r11, lr}
|
|
1152 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
1153 ; CHECK-SOFTFP-NEXT: bl __aeabi_l2f
|
|
1154 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
1155 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
1156 ;
|
|
1157 ; CHECK-HARDFP-SP-LABEL: l2f:
|
|
1158 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
1159 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
1160 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_l2f
|
|
1161 ; CHECK-HARDFP-SP-NEXT: vmov s0, r0
|
|
1162 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
1163 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
1164 entry:
|
|
1165 %conv = sitofp i64 %a to float
|
|
1166 ret float %conv
|
|
1167 }
|
|
1168
|
|
1169 define float @ul2f(i64 %a) #0 {
|
|
1170 ; CHECK-SOFT-LABEL: ul2f:
|
|
1171 ; CHECK-SOFT: .save {r11, lr}
|
|
1172 ; CHECK-SOFT-NEXT: push {r11, lr}
|
|
1173 ; CHECK-SOFT-NEXT: bl __aeabi_ul2f
|
|
1174 ; CHECK-SOFT-NEXT: pop {r11, lr}
|
|
1175 ; CHECK-SOFT-NEXT: mov pc, lr
|
|
1176 ;
|
|
1177 ; CHECK-SOFTFP-LABEL: ul2f:
|
|
1178 ; CHECK-SOFTFP: .save {r11, lr}
|
|
1179 ; CHECK-SOFTFP-NEXT: push {r11, lr}
|
|
1180 ; CHECK-SOFTFP-NEXT: bl __aeabi_ul2f
|
|
1181 ; CHECK-SOFTFP-NEXT: pop {r11, lr}
|
|
1182 ; CHECK-SOFTFP-NEXT: mov pc, lr
|
|
1183 ;
|
|
1184 ; CHECK-HARDFP-SP-LABEL: ul2f:
|
|
1185 ; CHECK-HARDFP-SP: .save {r11, lr}
|
|
1186 ; CHECK-HARDFP-SP-NEXT: push {r11, lr}
|
|
1187 ; CHECK-HARDFP-SP-NEXT: bl __aeabi_ul2f
|
|
1188 ; CHECK-HARDFP-SP-NEXT: vmov s0, r0
|
|
1189 ; CHECK-HARDFP-SP-NEXT: pop {r11, lr}
|
|
1190 ; CHECK-HARDFP-SP-NEXT: mov pc, lr
|
|
1191 entry:
|
|
1192 %conv = uitofp i64 %a to float
|
|
1193 ret float %conv
|
|
1194 }
|
|
1195 attributes #0 = { nounwind }
|