Reverting merge from trunk
[official-gcc.git] / libgcc / config / arm / bpabi.S
blobb5cf207126523c7abefe7dcadfeecfc7c8a8161e
1 /* Miscellaneous BPABI functions.
3    Copyright (C) 2003-2013 Free Software Foundation, Inc.
4    Contributed by CodeSourcery, LLC.
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.
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.
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.
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/>.  */
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__ */
35 #ifdef L_aeabi_lcmp
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
53 #endif /* L_aeabi_lcmp */
54         
55 #ifdef L_aeabi_ulcmp
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
75 #endif /* L_aeabi_ulcmp */
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
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__
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__
120 #endif
121 .endm
123 #ifdef L_aeabi_ldivmod
125 ARM_FUNC_START aeabi_ldivmod
126         cfi_start       __aeabi_ldivmod, LSYM(Lend_aeabi_ldivmod)
127         test_div_by_zero signed
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 */
146 #ifdef L_aeabi_uldivmod
148 ARM_FUNC_START aeabi_uldivmod
149         cfi_start       __aeabi_uldivmod, LSYM(Lend_aeabi_uldivmod)
150         test_div_by_zero unsigned
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)
167 #endif /* L_aeabi_divmod */
168