]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
lib1funcs.asm (ctzsi2): New function.
authorRichard Earnshaw <rearnsha@arm.com>
Thu, 22 Mar 2012 15:14:46 +0000 (15:14 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Thu, 22 Mar 2012 15:14:46 +0000 (15:14 +0000)
* 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.

From-SVN: r185698

libgcc/ChangeLog
libgcc/config/arm/lib1funcs.S
libgcc/config/arm/t-elf
libgcc/config/arm/t-linux
libgcc/config/arm/t-strongarm-elf
libgcc/config/arm/t-symbian
libgcc/config/arm/t-vxworks
libgcc/config/arm/t-wince-pe

index c4a34f60f88ef9fb4dacffb811fe0bd308358dee..617db6e27584ef2e05ee439095623f999a033da3 100644 (file)
@@ -1,3 +1,13 @@
+2012-03-22  Richard Earnshaw  <rearnsha@arm.com>
+
+       * 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  <andreast@fgznet.ch>
 
        * config.host: Add bits to support powerpc64-*-freebsd*.
index 094d79afad6ee0de0bae085aa4226fc81aea436c..45c3251bd7032ff43d377472f100214477d6afbe 100644 (file)
@@ -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
index d9e8064e4deaaf3a436f0710d121c3263f78863c..9e7a3170f177865645b2fa291d08390f123a3518 100644 (file)
@@ -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.
index 4c1efebbd879c68c01edd16b5a8f435753c7f886..3d520decafbc45d41a70f1db607a93bc6c32e3b7 100644 (file)
@@ -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.
index 45d1b9932189426d72b9c28bcd8a5d5ea8ea3451..42c6312e240414cba83accc3f58df3922cf3c9bd 100644 (file)
@@ -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.
index 06d98faa6ae61626f3acc184b2a5e80c65389581..d573157f281de972397d20c4e8509c2af776255c 100644 (file)
@@ -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
index 70ccdc1556aad248ddc56ee5ab9f492fec44409a..9db1f1602bcfb71315ae3caf5562e8751789910e 100644 (file)
@@ -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
index 33ea969ccf4b55a225f65b822861a71102a5d013..f6d1700692badf93bbaf0ff916de61d97309d94d 100644 (file)
@@ -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