From 483ac460ea17878391b661804fc286b83a4598b6 Mon Sep 17 00:00:00 2001 From: rearnsha Date: Thu, 22 Mar 2012 15:14:46 +0000 Subject: [PATCH] * arm/lib1funcs.asm (ctzsi2): New function. * arm/t-elf (LIB1ASMFUNCS): Add _ctzsi2. * arm/t-linux (LIB1ASMFUNCS): Likewise. * arm/t-strongarm-elf (LIB1ASMFUNCS): Likewise. * arm/t-symbian (LIB1ASMFUNCS): Likewise. * arm/t-vxworks (LIB1ASMFUNCS): Likewise. * arm/t-wince-pe (LIB1ASMFUNCS): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@185698 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgcc/ChangeLog | 10 ++++++ libgcc/config/arm/lib1funcs.S | 64 +++++++++++++++++++++++++++++++++++++++ libgcc/config/arm/t-elf | 2 +- libgcc/config/arm/t-linux | 2 +- libgcc/config/arm/t-strongarm-elf | 2 +- libgcc/config/arm/t-symbian | 2 +- libgcc/config/arm/t-vxworks | 2 +- libgcc/config/arm/t-wince-pe | 2 +- 8 files changed, 80 insertions(+), 6 deletions(-) diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index c4a34f60f88..617db6e2758 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,13 @@ +2012-03-22 Richard Earnshaw + + * arm/lib1funcs.asm (ctzsi2): New function. + * arm/t-elf (LIB1ASMFUNCS): Add _ctzsi2. + * arm/t-linux (LIB1ASMFUNCS): Likewise. + * arm/t-strongarm-elf (LIB1ASMFUNCS): Likewise. + * arm/t-symbian (LIB1ASMFUNCS): Likewise. + * arm/t-vxworks (LIB1ASMFUNCS): Likewise. + * arm/t-wince-pe (LIB1ASMFUNCS): Likewise. + 2012-03-21 Andreas Tobler * config.host: Add bits to support powerpc64-*-freebsd*. diff --git a/libgcc/config/arm/lib1funcs.S b/libgcc/config/arm/lib1funcs.S index 094d79afad6..45c3251bd70 100644 --- a/libgcc/config/arm/lib1funcs.S +++ b/libgcc/config/arm/lib1funcs.S @@ -1594,6 +1594,70 @@ ARM_FUNC_START clzdi2 #endif #endif /* L_clzdi2 */ +#ifdef L_ctzsi2 +#if defined(__ARM_ARCH_6M__) +FUNC_START ctzsi2 + neg r1, r0 + and r0, r0, r1 + mov r1, #28 + mov r3, #1 + lsl r3, r3, #16 + cmp r0, r3 /* 0x10000 */ + bcc 2f + lsr r0, r0, #16 + sub r1, r1, #16 +2: lsr r3, r3, #8 + cmp r0, r3 /* #0x100 */ + bcc 2f + lsr r0, r0, #8 + sub r1, r1, #8 +2: lsr r3, r3, #4 + cmp r0, r3 /* #0x10 */ + bcc 2f + lsr r0, r0, #4 + sub r1, r1, #4 +2: adr r2, 1f + ldrb r0, [r2, r0] + sub r0, r0, r1 + bx lr +.align 2 +1: +.byte 27, 28, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31 + FUNC_END ctzsi2 +#else +ARM_FUNC_START ctzsi2 + rsb r1, r0, #0 + and r0, r0, r1 +# if defined(HAVE_ARM_CLZ) + clz r0, r0 + rsb r0, r0, #31 + RET +# else + mov r1, #28 + cmp r0, #0x10000 + do_it cs, t + movcs r0, r0, lsr #16 + subcs r1, r1, #16 + cmp r0, #0x100 + do_it cs, t + movcs r0, r0, lsr #8 + subcs r1, r1, #8 + cmp r0, #0x10 + do_it cs, t + movcs r0, r0, lsr #4 + subcs r1, r1, #4 + adr r2, 1f + ldrb r0, [r2, r0] + sub r0, r0, r1 + RET +.align 2 +1: +.byte 27, 28, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31 +# endif /* !HAVE_ARM_CLZ */ + FUNC_END ctzsi2 +#endif +#endif /* L_clzsi2 */ + /* ------------------------------------------------------------------------ */ /* These next two sections are here despite the fact that they contain Thumb assembler because their presence allows interworked code to be linked even diff --git a/libgcc/config/arm/t-elf b/libgcc/config/arm/t-elf index d9e8064e4de..9e7a3170f17 100644 --- a/libgcc/config/arm/t-elf +++ b/libgcc/config/arm/t-elf @@ -10,7 +10,7 @@ LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \ _arm_truncdfsf2 _arm_negsf2 _arm_addsubsf3 _arm_muldivsf3 \ _arm_cmpsf2 _arm_unordsf2 _arm_fixsfsi _arm_fixunssfsi \ _arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf \ - _clzsi2 _clzdi2 + _clzsi2 _clzdi2 _ctzsi2 # Currently there is a bug somewhere in GCC's alias analysis # or scheduling code that is breaking _fpmul_parts in fp-bit.c. diff --git a/libgcc/config/arm/t-linux b/libgcc/config/arm/t-linux index 4c1efebbd87..3d520decafb 100644 --- a/libgcc/config/arm/t-linux +++ b/libgcc/config/arm/t-linux @@ -1,6 +1,6 @@ LIB1ASMSRC = arm/lib1funcs.S LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx _clzsi2 _clzdi2 \ - _arm_addsubdf3 _arm_addsubsf3 + _ctzsi2 _arm_addsubdf3 _arm_addsubsf3 # Just for these, we omit the frame pointer since it makes such a big # difference. diff --git a/libgcc/config/arm/t-strongarm-elf b/libgcc/config/arm/t-strongarm-elf index 45d1b993218..42c6312e240 100644 --- a/libgcc/config/arm/t-strongarm-elf +++ b/libgcc/config/arm/t-strongarm-elf @@ -1,4 +1,4 @@ -LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _clzsi2 _clzdi2 +LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _clzsi2 _clzdi2 _ctzsi2 # Currently there is a bug somewhere in GCC's alias analysis # or scheduling code that is breaking _fpmul_parts in fp-bit.c. diff --git a/libgcc/config/arm/t-symbian b/libgcc/config/arm/t-symbian index 06d98faa6ae..d573157f281 100644 --- a/libgcc/config/arm/t-symbian +++ b/libgcc/config/arm/t-symbian @@ -1,4 +1,4 @@ -LIB1ASMFUNCS += _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 +LIB1ASMFUNCS += _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 _ctzsi2 # These functions have __aeabi equivalents and will never be called by GCC. # By putting them in LIB1ASMFUNCS, we avoid the standard libgcc2.c code being diff --git a/libgcc/config/arm/t-vxworks b/libgcc/config/arm/t-vxworks index 70ccdc1556a..9db1f1602bc 100644 --- a/libgcc/config/arm/t-vxworks +++ b/libgcc/config/arm/t-vxworks @@ -1 +1 @@ -LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 +LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 _ctzsi2 diff --git a/libgcc/config/arm/t-wince-pe b/libgcc/config/arm/t-wince-pe index 33ea969ccf4..f6d1700692b 100644 --- a/libgcc/config/arm/t-wince-pe +++ b/libgcc/config/arm/t-wince-pe @@ -1 +1 @@ -LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 +LIB1ASMFUNCS += _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2 _ctzsi2 -- 2.11.4.GIT