diff options
Diffstat (limited to 'src/arch/armv7/lib')
-rw-r--r-- | src/arch/armv7/lib/Makefile.inc | 1 | ||||
-rw-r--r-- | src/arch/armv7/lib/Makefile.uboot | 95 | ||||
-rw-r--r-- | src/arch/armv7/lib/_divsi3.S | 142 | ||||
-rw-r--r-- | src/arch/armv7/lib/_udivsi3.S | 93 | ||||
-rw-r--r-- | src/arch/armv7/lib/_uldivmod.S | 157 | ||||
-rw-r--r-- | src/arch/armv7/lib/div.c | 5 |
6 files changed, 0 insertions, 493 deletions
diff --git a/src/arch/armv7/lib/Makefile.inc b/src/arch/armv7/lib/Makefile.inc index bdf6a64ffb..d9113419f5 100644 --- a/src/arch/armv7/lib/Makefile.inc +++ b/src/arch/armv7/lib/Makefile.inc @@ -11,7 +11,6 @@ romstage-y += syslib.c ramstage-y += c_start.S -#ramstage-y += div.c ramstage-y += div0.c ramstage-y += div64.S ramstage-y += hang_spl.c diff --git a/src/arch/armv7/lib/Makefile.uboot b/src/arch/armv7/lib/Makefile.uboot deleted file mode 100644 index d33d08b14d..0000000000 --- a/src/arch/armv7/lib/Makefile.uboot +++ /dev/null @@ -1,95 +0,0 @@ -# -# (C) Copyright 2002-2006 -# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -# -# See file CREDITS for list of people who contributed to this -# project. -# -# This program 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 of -# the License, or (at your option) any later version. -# -# This program 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; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA -# - -include $(TOPDIR)/config.mk - -LIB = $(obj)lib$(ARCH).o -LIBGCC = $(obj)libgcc.o - -ifndef CONFIG_SPL_BUILD -GLSOBJS += _ashldi3.o -GLSOBJS += _ashrdi3.o -GLSOBJS += _divsi3.o -GLSOBJS += _lshrdi3.o -GLSOBJS += _modsi3.o -GLSOBJS += _udivsi3.o -GLSOBJS += _umodsi3.o -ifdef CONFIG_CHROMEOS -GLSOBJS += _uldivmod.o -endif - -GLCOBJS += div0.o - -ifeq ($(CONFIG_SYS_GENERIC_BOARD),) -COBJS-y += board.o -endif -COBJS-y += bootm.o -COBJS-y += cache.o -COBJS-y += cache-cp15.o -COBJS-$(CONFIG_SYS_L2_PL310) += cache-pl310.o -SOBJS-$(CONFIG_USE_ARCH_MEMSET) += memset.o -SOBJS-$(CONFIG_USE_ARCH_MEMCPY) += memcpy.o -else # CONFIG_SPL_BUILD -ifeq ($(CONFIG_SYS_GENERIC_BOARD),) -COBJS-y += hang_spl.o -endif -endif # CONFIG_SPL_BUILD - -COBJS-y += interrupts.o -COBJS-y += reset.o - -SRCS := $(GLSOBJS:.o=.S) $(GLCOBJS:.o=.c) \ - $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c) -OBJS := $(addprefix $(obj),$(SOBJS-y) $(COBJS-y)) -LGOBJS := $(addprefix $(obj),$(GLSOBJS)) \ - $(addprefix $(obj),$(GLCOBJS)) - -# Always build libarm.o -TARGETS := $(LIB) - -# Build private libgcc only when asked for -ifdef USE_PRIVATE_LIBGCC -TARGETS += $(LIBGCC) -endif - -# For EABI conformant tool chains, provide eabi_compat() -ifneq (,$(findstring -mabi=aapcs-linux,$(PLATFORM_CPPFLAGS))) -TARGETS += $(obj)eabi_compat.o -endif - -all: $(TARGETS) - -$(LIB): $(obj).depend $(OBJS) - $(call cmd_link_o_target, $(OBJS)) - -$(LIBGCC): $(obj).depend $(LGOBJS) - $(call cmd_link_o_target, $(LGOBJS)) - -######################################################################### - -# defines $(obj).depend target -include $(SRCTREE)/rules.mk - -sinclude $(obj).depend - -######################################################################### diff --git a/src/arch/armv7/lib/_divsi3.S b/src/arch/armv7/lib/_divsi3.S deleted file mode 100644 index cfbadb2ab9..0000000000 --- a/src/arch/armv7/lib/_divsi3.S +++ /dev/null @@ -1,142 +0,0 @@ - -.macro ARM_DIV_BODY dividend, divisor, result, curbit - -#if __LINUX_ARM_ARCH__ >= 5 - - clz \curbit, \divisor - clz \result, \dividend - sub \result, \curbit, \result - mov \curbit, #1 - mov \divisor, \divisor, lsl \result - mov \curbit, \curbit, lsl \result - mov \result, #0 - -#else - - @ Initially shift the divisor left 3 bits if possible, - @ set curbit accordingly. This allows for curbit to be located - @ at the left end of each 4 bit nibbles in the division loop - @ to save one loop in most cases. - tst \divisor, #0xe0000000 - moveq \divisor, \divisor, lsl #3 - moveq \curbit, #8 - movne \curbit, #1 - - @ Unless the divisor is very big, shift it up in multiples of - @ four bits, since this is the amount of unwinding in the main - @ division loop. Continue shifting until the divisor is - @ larger than the dividend. -1: cmp \divisor, #0x10000000 - cmplo \divisor, \dividend - movlo \divisor, \divisor, lsl #4 - movlo \curbit, \curbit, lsl #4 - blo 1b - - @ For very big divisors, we must shift it a bit at a time, or - @ we will be in danger of overflowing. -1: cmp \divisor, #0x80000000 - cmplo \divisor, \dividend - movlo \divisor, \divisor, lsl #1 - movlo \curbit, \curbit, lsl #1 - blo 1b - - mov \result, #0 - -#endif - - @ Division loop -1: cmp \dividend, \divisor - subhs \dividend, \dividend, \divisor - orrhs \result, \result, \curbit - cmp \dividend, \divisor, lsr #1 - subhs \dividend, \dividend, \divisor, lsr #1 - orrhs \result, \result, \curbit, lsr #1 - cmp \dividend, \divisor, lsr #2 - subhs \dividend, \dividend, \divisor, lsr #2 - orrhs \result, \result, \curbit, lsr #2 - cmp \dividend, \divisor, lsr #3 - subhs \dividend, \dividend, \divisor, lsr #3 - orrhs \result, \result, \curbit, lsr #3 - cmp \dividend, #0 @ Early termination? - movnes \curbit, \curbit, lsr #4 @ No, any more bits to do? - movne \divisor, \divisor, lsr #4 - bne 1b - -.endm - -.macro ARM_DIV2_ORDER divisor, order - -#if __LINUX_ARM_ARCH__ >= 5 - - clz \order, \divisor - rsb \order, \order, #31 - -#else - - cmp \divisor, #(1 << 16) - movhs \divisor, \divisor, lsr #16 - movhs \order, #16 - movlo \order, #0 - - cmp \divisor, #(1 << 8) - movhs \divisor, \divisor, lsr #8 - addhs \order, \order, #8 - - cmp \divisor, #(1 << 4) - movhs \divisor, \divisor, lsr #4 - addhs \order, \order, #4 - - cmp \divisor, #(1 << 2) - addhi \order, \order, #3 - addls \order, \order, \divisor, lsr #1 - -#endif - -.endm - - .align 5 -.globl __divsi3 -.globl __aeabi_idiv -__divsi3: -__aeabi_idiv: - cmp r1, #0 - eor ip, r0, r1 @ save the sign of the result. - beq Ldiv0 - rsbmi r1, r1, #0 @ loops below use unsigned. - subs r2, r1, #1 @ division by 1 or -1 ? - beq 10f - movs r3, r0 - rsbmi r3, r0, #0 @ positive dividend value - cmp r3, r1 - bls 11f - tst r1, r2 @ divisor is power of 2 ? - beq 12f - - ARM_DIV_BODY r3, r1, r0, r2 - - cmp ip, #0 - rsbmi r0, r0, #0 - mov pc, lr - -10: teq ip, r0 @ same sign ? - rsbmi r0, r0, #0 - mov pc, lr - -11: movlo r0, #0 - moveq r0, ip, asr #31 - orreq r0, r0, #1 - mov pc, lr - -12: ARM_DIV2_ORDER r1, r2 - - cmp ip, #0 - mov r0, r3, lsr r2 - rsbmi r0, r0, #0 - mov pc, lr - -Ldiv0: - - str lr, [sp, #-4]! - bl __div0 - mov r0, #0 @ About as wrong as it could be. - ldr pc, [sp], #4 diff --git a/src/arch/armv7/lib/_udivsi3.S b/src/arch/armv7/lib/_udivsi3.S deleted file mode 100644 index 1309802610..0000000000 --- a/src/arch/armv7/lib/_udivsi3.S +++ /dev/null @@ -1,93 +0,0 @@ -/* # 1 "libgcc1.S" */ -@ libgcc1 routines for ARM cpu. -@ Division routines, written by Richard Earnshaw, (rearnsha@armltd.co.uk) -dividend .req r0 -divisor .req r1 -result .req r2 -curbit .req r3 -/* ip .req r12 */ -/* sp .req r13 */ -/* lr .req r14 */ -/* pc .req r15 */ - .text - .globl __udivsi3 - .type __udivsi3 ,function - .globl __aeabi_uidiv - .type __aeabi_uidiv ,function - .align 0 - __udivsi3: - __aeabi_uidiv: - cmp divisor, #0 - beq Ldiv0 - mov curbit, #1 - mov result, #0 - cmp dividend, divisor - bcc Lgot_result -Loop1: - @ Unless the divisor is very big, shift it up in multiples of - @ four bits, since this is the amount of unwinding in the main - @ division loop. Continue shifting until the divisor is - @ larger than the dividend. - cmp divisor, #0x10000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #4 - movcc curbit, curbit, lsl #4 - bcc Loop1 -Lbignum: - @ For very big divisors, we must shift it a bit at a time, or - @ we will be in danger of overflowing. - cmp divisor, #0x80000000 - cmpcc divisor, dividend - movcc divisor, divisor, lsl #1 - movcc curbit, curbit, lsl #1 - bcc Lbignum -Loop3: - @ Test for possible subtractions, and note which bits - @ are done in the result. On the final pass, this may subtract - @ too much from the dividend, but the result will be ok, since the - @ "bit" will have been shifted out at the bottom. - cmp dividend, divisor - subcs dividend, dividend, divisor - orrcs result, result, curbit - cmp dividend, divisor, lsr #1 - subcs dividend, dividend, divisor, lsr #1 - orrcs result, result, curbit, lsr #1 - cmp dividend, divisor, lsr #2 - subcs dividend, dividend, divisor, lsr #2 - orrcs result, result, curbit, lsr #2 - cmp dividend, divisor, lsr #3 - subcs dividend, dividend, divisor, lsr #3 - orrcs result, result, curbit, lsr #3 - cmp dividend, #0 @ Early termination? - movnes curbit, curbit, lsr #4 @ No, any more bits to do? - movne divisor, divisor, lsr #4 - bne Loop3 -Lgot_result: - mov r0, result - mov pc, lr -Ldiv0: - str lr, [sp, #-4]! - bl __div0 (PLT) - mov r0, #0 @ about as wrong as it could be - ldmia sp!, {pc} - .size __udivsi3 , . - __udivsi3 - -.globl __aeabi_uidivmod -__aeabi_uidivmod: - - stmfd sp!, {r0, r1, ip, lr} - bl __aeabi_uidiv - ldmfd sp!, {r1, r2, ip, lr} - mul r3, r0, r2 - sub r1, r1, r3 - mov pc, lr - -.globl __aeabi_idivmod -__aeabi_idivmod: - - stmfd sp!, {r0, r1, ip, lr} - bl __aeabi_idiv - ldmfd sp!, {r1, r2, ip, lr} - mul r3, r0, r2 - sub r1, r1, r3 - mov pc, lr diff --git a/src/arch/armv7/lib/_uldivmod.S b/src/arch/armv7/lib/_uldivmod.S deleted file mode 100644 index 65e4fa8441..0000000000 --- a/src/arch/armv7/lib/_uldivmod.S +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL") version 2 as published by the Free - * Software Foundation. - */ - -/* - * A, Q = r0 + (r1 << 32) - * B, R = r2 + (r3 << 32) - * A / B = Q ... R - */ - - .text - .global __aeabi_uldivmod - .type __aeabi_uldivmod, function - .align 0 - -A_0 .req r0 -A_1 .req r1 -B_0 .req r2 -B_1 .req r3 -C_0 .req r4 -C_1 .req r5 -D_0 .req r6 -D_1 .req r7 - -Q_0 .req r0 -Q_1 .req r1 -R_0 .req r2 -R_1 .req r3 - -__aeabi_uldivmod: - stmfd sp!, {r4, r5, r6, r7, lr} - @ Test if B == 0 - orrs ip, B_0, B_1 @ Z set -> B == 0 - beq L_div_by_0 - @ Test if B is power of 2: (B & (B - 1)) == 0 - subs C_0, B_0, #1 - sbc C_1, B_1, #0 - tst C_0, B_0 - tsteq B_1, C_1 - beq L_pow2 - @ Test if A_1 == B_1 == 0 - orrs ip, A_1, B_1 - beq L_div_32_32 - -L_div_64_64: - mov C_0, #1 - mov C_1, #0 - @ D_0 = clz A - teq A_1, #0 - clz D_0, A_1 - clzeq ip, A_0 - addeq D_0, D_0, ip - @ D_1 = clz B - teq B_1, #0 - clz D_1, B_1 - clzeq ip, B_0 - addeq D_1, D_1, ip - @ if clz B - clz A > 0 - subs D_0, D_1, D_0 - bls L_done_shift - @ B <<= (clz B - clz A) - subs D_1, D_0, #32 - rsb ip, D_0, #32 - movmi B_1, B_1, lsl D_0 - orrmi B_1, B_1, B_0, lsr ip - movpl B_1, B_0, lsl D_1 - mov B_0, B_0, lsl D_0 - @ C = 1 << (clz B - clz A) - movmi C_1, C_1, lsl D_0 - orrmi C_1, C_1, C_0, lsr ip - movpl C_1, C_0, lsl D_1 - mov C_0, C_0, lsl D_0 -L_done_shift: - mov D_0, #0 - mov D_1, #0 - @ C: current bit; D: result -L_subtract: - @ if A >= B - cmp A_1, B_1 - cmpeq A_0, B_0 - bcc L_update - @ A -= B - subs A_0, A_0, B_0 - sbc A_1, A_1, B_1 - @ D |= C - orr D_0, D_0, C_0 - orr D_1, D_1, C_1 -L_update: - @ if A == 0: break - orrs ip, A_1, A_0 - beq L_exit - @ C >>= 1 - movs C_1, C_1, lsr #1 - movs C_0, C_0, rrx - @ if C == 0: break - orrs ip, C_1, C_0 - beq L_exit - @ B >>= 1 - movs B_1, B_1, lsr #1 - mov B_0, B_0, rrx - b L_subtract -L_exit: - @ Note: A, B & Q, R are aliases - mov R_0, A_0 - mov R_1, A_1 - mov Q_0, D_0 - mov Q_1, D_1 - ldmfd sp!, {r4, r5, r6, r7, pc} - -L_div_32_32: - @ Note: A_0 & r0 are aliases - @ Q_1 r1 - mov r1, B_0 - bl __aeabi_uidivmod - mov R_0, r1 - mov R_1, #0 - mov Q_1, #0 - ldmfd sp!, {r4, r5, r6, r7, pc} - -L_pow2: - @ Note: A, B and Q, R are aliases - @ R = A & (B - 1) - and C_0, A_0, C_0 - and C_1, A_1, C_1 - @ Q = A >> log2(B) - @ Note: B must not be 0 here! - clz D_0, B_0 - add D_1, D_0, #1 - rsbs D_0, D_0, #31 - bpl L_1 - clz D_0, B_1 - rsb D_0, D_0, #31 - mov A_0, A_1, lsr D_0 - add D_0, D_0, #32 -L_1: - movpl A_0, A_0, lsr D_0 - orrpl A_0, A_0, A_1, lsl D_1 - mov A_1, A_1, lsr D_0 - @ Mov back C to R - mov R_0, C_0 - mov R_1, C_1 - ldmfd sp!, {r4, r5, r6, r7, pc} - -L_div_by_0: - bl __div0 - @ As wrong as it could be - mov Q_0, #0 - mov Q_1, #0 - mov R_0, #0 - mov R_1, #0 - ldmfd sp!, {r4, r5, r6, r7, pc} diff --git a/src/arch/armv7/lib/div.c b/src/arch/armv7/lib/div.c deleted file mode 100644 index 03352dc7a5..0000000000 --- a/src/arch/armv7/lib/div.c +++ /dev/null @@ -1,5 +0,0 @@ -void __div0(void); // called from asm so no need for a prototype in a header -void __div0(void) -{ - // div by zero -} |