bpabi.S (aeabi_ldivmod): Add DWARF information for computing the location of the...
[gcc.git] / libgcc / config / arm / bpabi.S
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 cfi_start __aeabi_ldivmod, LSYM(Lend_aeabi_ldivmod)
127 test_div_by_zero signed
128
129 sub sp, sp, #8
130 #if defined(__thumb2__)
131 mov ip, sp
132 push {ip, lr}
133 #else
134 do_push {sp, lr}
135 #endif
136 98: cfi_push 98b - __aeabi_ldivmod, 0xe, -0xc, 0x10
137 bl SYM(__gnu_ldivmod_helper) __PLT__
138 ldr lr, [sp, #4]
139 add sp, sp, #8
140 do_pop {r2, r3}
141 RET
142 cfi_end LSYM(Lend_aeabi_ldivmod)
143
144 #endif /* L_aeabi_ldivmod */
145
146 #ifdef L_aeabi_uldivmod
147
148 ARM_FUNC_START aeabi_uldivmod
149 cfi_start __aeabi_uldivmod, LSYM(Lend_aeabi_uldivmod)
150 test_div_by_zero unsigned
151
152 sub sp, sp, #8
153 #if defined(__thumb2__)
154 mov ip, sp
155 push {ip, lr}
156 #else
157 do_push {sp, lr}
158 #endif
159 98: cfi_push 98b - __aeabi_uldivmod, 0xe, -0xc, 0x10
160 bl SYM(__gnu_uldivmod_helper) __PLT__
161 ldr lr, [sp, #4]
162 add sp, sp, #8
163 do_pop {r2, r3}
164 RET
165 cfi_end LSYM(Lend_aeabi_uldivmod)
166
167 #endif /* L_aeabi_divmod */
168