diff options
Diffstat (limited to 'src/arch/arm/libgcc/bpabi_asm.S')
-rw-r--r-- | src/arch/arm/libgcc/bpabi_asm.S | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/arch/arm/libgcc/bpabi_asm.S b/src/arch/arm/libgcc/bpabi_asm.S new file mode 100644 index 0000000000..27b4a1cfe8 --- /dev/null +++ b/src/arch/arm/libgcc/bpabi_asm.S @@ -0,0 +1,130 @@ +/* Miscellaneous BPABI functions. + + Copyright (C) 2003, 2004, 2007, 2008 Free Software Foundation, Inc. + Contributed by CodeSourcery, LLC. + + This file is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + In addition to the permissions in the GNU General Public License, the + Free Software Foundation gives you unlimited permission to link the + compiled version of this file into combinations with other programs, + and to distribute those combinations without any restriction coming + from the use of this file. (The General Public License restrictions + do apply in other respects; for example, they cover modification of + the file, and distribution when not linked into a combine + executable.) + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + + +#include <arch/asm.h> + +#ifdef __ARMEB__ +#define xxh r0 +#define xxl r1 +#define yyh r2 +#define yyl r3 +#else +#define xxh r1 +#define xxl r0 +#define yyh r3 +#define yyl r2 +#endif + +#if defined __thumb2__ + +.macro do_it cond + it \cond +.endm +#define do_push push +#define do_pop pop + +#else + +.macro do_it cond +.endm +#define do_push stmfd sp!, +#define do_pop ldmfd sp!, + +#endif + +ENTRY(__aeabi_lcmp) + + cmp xxh, yyh + do_it lt + movlt r0, #-1 + do_it gt + movgt r0, #1 + do_it ne + movne pc, lr + subs r0, xxl, yyl + do_it lo + movlo r0, #-1 + do_it hi + movhi r0, #1 + mov pc, lr + +ENDPROC(__aeabi_lcmp) + +ENTRY(__aeabi_ulcmp) + + cmp xxh, yyh + do_it lo + movlo r0, #-1 + do_it hi + movhi r0, #1 + do_it ne + movne pc, lr + cmp xxl, yyl + do_it lo + movlo r0, #-1 + do_it hi + movhi r0, #1 + do_it eq + moveq r0, #0 + mov pc, lr + +ENDPROC(__aeabi_ulcmp) + +ENTRY(__aeabi_ldivmod) + sub sp, sp, #8 +#if defined(__thumb2__) + mov ip, sp + push {ip, lr} +#else + do_push {sp, lr} +#endif + bl __gnu_ldivmod_helper + ldr lr, [sp, #4] + add sp, sp, #8 + do_pop {r2, r3} + mov pc, lr + +ENDPROC(__aeabi_ldivmod) + +ENTRY(__aeabi_uldivmod) + sub sp, sp, #8 +#if defined(__thumb2__) + mov ip, sp + push {ip, lr} +#else + do_push {sp, lr} +#endif + bl __gnu_uldivmod_helper + ldr lr, [sp, #4] + add sp, sp, #8 + do_pop {r2, r3} + mov pc, lr + +ENDPROC(__aeabi_uldivmod) |