longlong.h (__arm__): Define count_leading_zeros.
authorPaul Brook <paul@codesourcery.com>
Thu, 12 Jun 2008 17:29:47 +0000 (17:29 +0000)
committerPaul Brook <pbrook@gcc.gnu.org>
Thu, 12 Jun 2008 17:29:47 +0000 (17:29 +0000)
2008-06-12  Paul Brook  <paul@codesourcery.com>

gcc/
* longlong.h (__arm__): Define count_leading_zeros.
* config/arm/lib1funcs.asm (xxh, xxl, yyh, yyl): Define.
(clzsi2, clzdi2): New functions.
* config/arm/bpabi-v6m.S (xxh, xxl, yyh, yyl): Remove.
* config/arm/bpabi.S (xxh, xxl, yyh, yyl): Remove.
* config/arm/t-strongarm-elf (LIB1ASMFUNCS): Ditto.
* config/arm/t-vxworks (LIB1ASMFUNCS): Ditto.
* config/arm/t-pe (LIB1ASMFUNCS): Ditto.
* config/arm/t-arm-elf (LIB1ASMFUNCS): Ditto.
* config/arm/t-arm-coff (LIB1ASMFUNCS): Ditto.
* config/arm/t-linux (LIB1ASMFUNCS): Ditto.
* config/arm/t-symbian (LIB1ASMFUNCS): Ditto.
* config/arm/t-wince-pe (LIB1ASMFUNCS): Ditto.

From-SVN: r136718

13 files changed:
gcc/ChangeLog
gcc/config/arm/bpabi-v6m.S
gcc/config/arm/bpabi.S
gcc/config/arm/lib1funcs.asm
gcc/config/arm/t-arm-coff
gcc/config/arm/t-arm-elf
gcc/config/arm/t-linux
gcc/config/arm/t-pe
gcc/config/arm/t-strongarm-elf
gcc/config/arm/t-symbian
gcc/config/arm/t-vxworks
gcc/config/arm/t-wince-pe
gcc/longlong.h

index 936c2ffda504b0e06c9089c16c07d7badceb6998..cf53434d5791f35e0eae5ad8c95e741d06a945f4 100644 (file)
@@ -1,3 +1,19 @@
+2008-06-12  Paul Brook  <paul@codesourcery.com>
+
+       * longlong.h (__arm__): Define count_leading_zeros.
+       * config/arm/lib1funcs.asm (xxh, xxl, yyh, yyl): Define.
+       (clzsi2, clzdi2): New functions.
+       * config/arm/bpabi-v6m.S (xxh, xxl, yyh, yyl): Remove.
+       * config/arm/bpabi.S (xxh, xxl, yyh, yyl): Remove.
+       * config/arm/t-strongarm-elf (LIB1ASMFUNCS): Ditto.
+       * config/arm/t-vxworks (LIB1ASMFUNCS): Ditto.
+       * config/arm/t-pe (LIB1ASMFUNCS): Ditto.
+       * config/arm/t-arm-elf (LIB1ASMFUNCS): Ditto.
+       * config/arm/t-arm-coff (LIB1ASMFUNCS): Ditto.
+       * config/arm/t-linux (LIB1ASMFUNCS): Ditto.
+       * config/arm/t-symbian (LIB1ASMFUNCS): Ditto.
+       * config/arm/t-wince-pe (LIB1ASMFUNCS): Ditto.
+
 2008-06-12  Kazu Hirata  <kazu@codesourcery.com>
 
        * config/m68k/m68k.c (m68k_tune_flags): New.
index fa3b9c4147882609a14e5ecc6555e86936552cd4..3a20227499bd1210a10f009b306685fdece25a5a 100644 (file)
    the Free Software Foundation, 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 
-#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 
-       
 #ifdef L_aeabi_lcmp
 
 FUNC_START aeabi_lcmp
index 1f08346598054f36bb18e233ce6ad7345616606c..82ca140a6bc6e039b0630a7318e467382a43506a 100644 (file)
    the Free Software Foundation, 51 Franklin Street, Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 
-#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 
-       
 #ifdef L_aeabi_lcmp
 
 ARM_FUNC_START aeabi_lcmp
index 2fc66be80d5e36d1d5d02da0f65038672470de3e..fe315bcb69b48d76876bc1728c693ad6d5d0be88 100644 (file)
@@ -406,6 +406,18 @@ SYM (__\name):
 .endm
 #endif
 
+#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 
+
 #ifdef __thumb__
 /* Register aliases.  */
 
@@ -1212,6 +1224,120 @@ LSYM(Lover12):
 
 #endif /* __symbian__ */
 
+#if ((__ARM_ARCH__ > 5) && !defined(__ARM_ARCH_6M__)) \
+    || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \
+    || defined(__ARM_ARCH_5TEJ__)
+#define HAVE_ARM_CLZ 1
+#endif
+
+#ifdef L_clzsi2
+#if defined(__ARM_ARCH_6M__)
+FUNC_START clzsi2
+       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]
+       add     r0, r0, r1
+       bx lr
+.align 2
+1:
+.byte 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
+       FUNC_END clzsi2
+#else
+ARM_FUNC_START clzsi2
+# if defined(HAVE_ARM_CLZ)
+       clz     r0, r0
+       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]
+       add     r0, r0, r1
+       bx lr
+.align 2
+1:
+.byte 4, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0
+# endif /* !HAVE_ARM_CLZ */
+       FUNC_END clzsi2
+#endif
+#endif /* L_clzsi2 */
+
+#ifdef L_clzdi2
+#if !defined(HAVE_ARM_CLZ)
+
+# if defined(__ARM_ARCH_6M__)
+FUNC_START clzdi2
+       push    {r4, lr}
+# else
+ARM_FUNC_START clzdi2
+       do_push {r4, lr}
+# endif
+       cmp     xxh, #0
+       bne     1f
+# ifdef __ARMEB__
+       mov     r0, xxl
+       bl      __clzsi2
+       add     r0, r0, #32
+       b 2f
+1:
+       bl      __clzsi2
+# else
+       bl      __clzsi2
+       add     r0, r0, #32
+       b 2f
+1:
+       mov     r0, xxh
+       bl      __clzsi2
+# endif
+2:
+# if defined(__ARM_ARCH_6M__)
+       pop     {r4, pc}
+# else
+       RETLDM  r4
+# endif
+       FUNC_END clzdi2
+
+#else /* HAVE_ARM_CLZ */
+
+ARM_FUNC_START clzdi2
+       cmp     xxh, #0
+       do_it   eq, et
+       clzeq   r0, xxl
+       clzne   r0, xxh
+       addeq   r0, r0, #32
+       RET
+       FUNC_END clzdi2
+
+#endif
+#endif /* L_clzdi2 */
+
 /* ------------------------------------------------------------------------ */
 /* 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 763add31dacf01241e9efd9ee256d38446844490..4fa1929bb4b1fea054bd6cfa3a300eb105e94235 100644 (file)
@@ -1,5 +1,5 @@
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX clzsi2 _clzdi2
 
 # We want fine grained libraries, so use the new code to build the
 # floating point emulation libraries.
index 31ba396b433ebeae33ead3873a177d3802e6125d..33462939994ed0303084efcc7a6d8c9445447bb1 100644 (file)
@@ -10,7 +10,8 @@ LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func \
        _arm_fixdfsi _arm_fixunsdfsi \
        _arm_truncdfsf2 _arm_negsf2 _arm_addsubsf3 _arm_muldivsf3 \
        _arm_cmpsf2 _arm_unordsf2 _arm_fixsfsi _arm_fixunssfsi \
-       _arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf
+       _arm_floatdidf _arm_floatdisf _arm_floatundidf _arm_floatundisf \
+       _clzsi2 _clzdi2
 
 MULTILIB_OPTIONS     = marm/mthumb
 MULTILIB_DIRNAMES    = arm thumb
index 75da2dd29cdacd1a9aef40169ae2dc3cf782e6cd..0e5c0b2501b57834768f50020cdbae3847c038dd 100644 (file)
@@ -3,7 +3,7 @@
 TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC
 
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx clzsi2 _clzdi2
 
 # MULTILIB_OPTIONS = mhard-float/msoft-float
 # MULTILIB_DIRNAMES = hard-float soft-float
index 741e2b85ab737b2930437f0145c465acf3357cee..83c096ced70d256a9a60e2a588da216e835c0982 100644 (file)
@@ -1,5 +1,5 @@
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2
 
 # We want fine grained libraries, so use the new code to build the
 # floating point emulation libraries.
@@ -29,4 +29,4 @@ MULTILIB_DIRNAMES = fpu thumb
 
 LIBGCC = stmp-multilib
 INSTALL_LIBGCC = install-multilib
-TARGET_LIBGCC2_CFLAGS = 
\ No newline at end of file
+TARGET_LIBGCC2_CFLAGS = 
index c8193548a7633429e698aa925064e474df7e6d9e..bc076e88a047aa9704ac609288e886bf65c54828 100644 (file)
@@ -1,5 +1,5 @@
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _clzsi2 _clzdi2
 
 # We want fine grained libraries, so use the new code to build the
 # floating point emulation libraries.
index db8913818286ae8eddcd1db53e7c892a5926431f..cadbd2236b3e2297aee275d25e568dcb9eb9baa5 100644 (file)
@@ -1,4 +1,4 @@
-LIB1ASMFUNCS = _bb_init_func _call_via_rX _interwork_call_via_rX
+LIB1ASMFUNCS = _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2
 
 # 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 978aa5ef2f5978dd3d96d86e76ed45f6a9b5def8..565b33d6ce9342f39aeb7ab28c6b392dd3e00083 100644 (file)
@@ -1,5 +1,5 @@
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2
 
 # We want fine grained libraries, so use the new code to build the
 # floating point emulation libraries.
index fca9853e75c14d247eb305df9da4b88b1ff8a355..84b8170ecdfaf314fd2dcc7290e152161773df1a 100644 (file)
@@ -1,5 +1,5 @@
 LIB1ASMSRC = arm/lib1funcs.asm
-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX
+LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _call_via_rX _interwork_call_via_rX _clzsi2 _clzdi2
 
 # We want fine grained libraries, so use the new code to build the
 # floating point emulation libraries.
index 38b4c6fb2219b1ea50ab8182e20cdc60844d98fc..45a95c40eb55bfd14cd5d45a37a38c67061c0e45 100644 (file)
@@ -226,6 +226,12 @@ UDItype __umulsidi3 (USItype, USItype);
 #define UDIV_TIME 100
 #endif /* __arm__ */
 
+#if defined(__arm__)
+/* Let gcc decide how best to implement count_leading_zeros.  */
+#define count_leading_zeros(COUNT,X)   ((COUNT) = __builtin_clz (X))
+#define COUNT_LEADING_ZEROS_0 32
+#endif
+
 #if defined (__CRIS__) && __CRIS_arch_version >= 3
 #define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X))
 #if __CRIS_arch_version >= 8