bpabi.S revision 1.1.1.1.4.2
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
37ARM_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
57ARM_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
902:
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__
1001:
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__
1192:
120#endif
121.endm
122
123#ifdef L_aeabi_ldivmod
124
125ARM_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
145ARM_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