bpabi.S revision 1.1 1 /* Miscellaneous BPABI functions.
2
3 Copyright (C) 2003-2013 Free Software Foundation, Inc.
4 Contributed by CodeSourcery, LLC.
5
6 This file is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
9 later version.
10
11 This file is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
19
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 <http://www.gnu.org/licenses/>. */
24
25 #ifdef __ARM_EABI__
26 /* Some attributes that are common to all routines in this file. */
27 /* Tag_ABI_align_needed: This code does not require 8-byte
28 alignment from the caller. */
29 /* .eabi_attribute 24, 0 -- default setting. */
30 /* Tag_ABI_align_preserved: This code preserves 8-byte
31 alignment in any callee. */
32 .eabi_attribute 25, 1
33 #endif /* __ARM_EABI__ */
34
35 #ifdef L_aeabi_lcmp
36
37 ARM_FUNC_START aeabi_lcmp
38 cmp xxh, yyh
39 do_it lt
40 movlt r0, #-1
41 do_it gt
42 movgt r0, #1
43 do_it ne
44 RETc(ne)
45 subs r0, xxl, yyl
46 do_it lo
47 movlo r0, #-1
48 do_it hi
49 movhi r0, #1
50 RET
51 FUNC_END aeabi_lcmp
52
53 #endif /* L_aeabi_lcmp */
54
55 #ifdef L_aeabi_ulcmp
56
57 ARM_FUNC_START aeabi_ulcmp
58 cmp xxh, yyh
59 do_it lo
60 movlo r0, #-1
61 do_it hi
62 movhi r0, #1
63 do_it ne
64 RETc(ne)
65 cmp xxl, yyl
66 do_it lo
67 movlo r0, #-1
68 do_it hi
69 movhi r0, #1
70 do_it eq
71 moveq r0, #0
72 RET
73 FUNC_END aeabi_ulcmp
74
75 #endif /* L_aeabi_ulcmp */
76
77 .macro test_div_by_zero signed
78 /* Tail-call to divide-by-zero handlers which may be overridden by the user,
79 so unwinding works properly. */
80 #if defined(__thumb2__)
81 cbnz yyh, 1f
82 cbnz yyl, 1f
83 cmp xxh, #0
84 do_it eq
85 cmpeq xxl, #0
86 .ifc \signed, unsigned
87 beq 2f
88 mov xxh, #0xffffffff
89 mov xxl, xxh
90 2:
91 .else
92 do_it lt, t
93 movlt xxl, #0
94 movlt xxh, #0x80000000
95 do_it gt, t
96 movgt xxh, #0x7fffffff
97 movgt xxl, #0xffffffff
98 .endif
99 b SYM (__aeabi_ldiv0) __PLT__
100 1:
101 #else
102 /* Note: Thumb-1 code calls via an ARM shim on processors which
103 support ARM mode. */
104 cmp yyh, #0
105 cmpeq yyl, #0
106 bne 2f
107 cmp xxh, #0
108 cmpeq xxl, #0
109 .ifc \signed, unsigned
110 movne xxh, #0xffffffff
111 movne xxl, #0xffffffff
112 .else
113 movlt xxh, #0x80000000
114 movlt xxl, #0
115 movgt xxh, #0x7fffffff
116 movgt xxl, #0xffffffff
117 .endif
118 b SYM (__aeabi_ldiv0) __PLT__
119 2:
120 #endif
121 .endm
122
123 #ifdef L_aeabi_ldivmod
124
125 ARM_FUNC_START aeabi_ldivmod
126 test_div_by_zero signed
127
128 sub sp, sp, #8
129 #if defined(__thumb2__)
130 mov ip, sp
131 push {ip, lr}
132 #else
133 do_push {sp, lr}
134 #endif
135 bl SYM(__gnu_ldivmod_helper) __PLT__
136 ldr lr, [sp, #4]
137 add sp, sp, #8
138 do_pop {r2, r3}
139 RET
140
141 #endif /* L_aeabi_ldivmod */
142
143 #ifdef L_aeabi_uldivmod
144
145 ARM_FUNC_START aeabi_uldivmod
146 test_div_by_zero unsigned
147
148 sub sp, sp, #8
149 #if defined(__thumb2__)
150 mov ip, sp
151 push {ip, lr}
152 #else
153 do_push {sp, lr}
154 #endif
155 bl SYM(__gnu_uldivmod_helper) __PLT__
156 ldr lr, [sp, #4]
157 add sp, sp, #8
158 do_pop {r2, r3}
159 RET
160
161 #endif /* L_aeabi_divmod */
162
163