diff options
author | Nick Clifton <nickc@redhat.com> | 2005-09-09 08:39:18 +0000 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 2005-09-09 08:39:18 +0000 |
commit | dcfae47c5e2507e490b278ae5db3365b31c9654e (patch) | |
tree | ac8df5d57a52e84f47e0d0efe6a0dda135e8261b | |
parent | a174b2f8ec2e48a091a8857099451912a69f5e99 (diff) | |
download | gcc-dcfae47c5e2507e490b278ae5db3365b31c9654e.zip gcc-dcfae47c5e2507e490b278ae5db3365b31c9654e.tar.gz gcc-dcfae47c5e2507e490b278ae5db3365b31c9654e.tar.bz2 |
Makefile.in (LIBGCC_DEPS): Add libgcc2.h.
* Makefile.in (LIBGCC_DEPS): Add libgcc2.h.
* libgcc2.c (__clz_tab[], __popcount_tab[]): Set the fixed dimension of
these arrays.
* libgcc2.h (__clz_tab[], __popcount_tab[]): Add exports of these arrays.
* longlong.h: Only provide a prototype for the __clz_tab[] array if this
header has not been included from libgcc2.h.
* config/stormy16/stormy16-lib2.c: Include libgcc2.h rather than defining
own types.
Provide prototypes for exported functions.
Use the __clz_tab[] and __popcount_tab[] arrays provided by libgcc2.c.
From-SVN: r104081
-rw-r--r-- | gcc/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/Makefile.in | 2 | ||||
-rw-r--r-- | gcc/config/stormy16/stormy16-lib2.c | 148 | ||||
-rw-r--r-- | gcc/libgcc2.c | 8 | ||||
-rw-r--r-- | gcc/libgcc2.h | 10 | ||||
-rw-r--r-- | gcc/longlong.h | 10 |
6 files changed, 138 insertions, 55 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82562db..185cc13 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2005-09-09 Nick Clifton <nickc@redhat.com> + + * Makefile.in (LIBGCC_DEPS): Add libgcc2.h. + * libgcc2.c (__clz_tab[], __popcount_tab[]): Set the fixed + dimension of these arrays. + * libgcc2.h (__clz_tab[], __popcount_tab[]): Add exports of + these arrays. + * longlong.h: Only provide a prototype for the __clz_tab[] array + if this header has not been included from libgcc2.h. + * config/stormy16/stormy16-lib2.c: Include libgcc2.h rather than + defining own types. + Provide prototypes for exported functions. + Use the __clz_tab[] and __popcount_tab[] arrays provided by + libgcc2.c. + 2005-09-08 Josh Conner <jconner@apple.com> PR c++/23180 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 71cab53..69e482d 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1350,7 +1350,7 @@ libgcc.mk: config.status Makefile mklibgcc $(LIB2ADD) $(LIB2ADD_ST) specs \ # All the things that might cause us to want to recompile bits of libgcc. LIBGCC_DEPS = $(GCC_PASSES) $(LANGUAGES) stmp-int-hdrs $(STMP_FIXPROTO) \ libgcc.mk $(srcdir)/libgcc2.c $(srcdir)/libgcov.c $(TCONFIG_H) \ - $(MACHMODE_H) longlong.h gbl-ctors.h config.status \ + $(MACHMODE_H) longlong.h gbl-ctors.h config.status $(srcdir)/libgcc2.h \ tsystem.h $(FPBIT) $(DPBIT) $(TPBIT) $(LIB2ADD) \ $(LIB2ADD_ST) $(LIB2ADDEH) $(LIB2ADDEHDEP) $(EXTRA_PARTS) \ $(srcdir)/config/$(LIB1ASMSRC) \ diff --git a/gcc/config/stormy16/stormy16-lib2.c b/gcc/config/stormy16/stormy16-lib2.c index 8ca9484..e8b2158 100644 --- a/gcc/config/stormy16/stormy16-lib2.c +++ b/gcc/config/stormy16/stormy16-lib2.c @@ -1,19 +1,79 @@ -typedef int HItype __attribute__ ((mode (HI))); -typedef int SItype __attribute__ ((mode (SI))); -typedef unsigned int USItype __attribute__ ((mode (SI))); +/* This file contains 16-bit versions of some of the functions found in + libgcc2.c. Really libgcc ought to be moved out of the gcc directory + and into its own top level directory, and then split up into multiple + files. On this glorious day maybe this code can be integrated into + it too. */ + +/* Copyright (C) 2005 Free Software Foundation, Inc. + + This file is part of GCC. + + GCC 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.) + + GCC 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 GCC; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ + +#include "tconfig.h" +#include "tsystem.h" +#include "coretypes.h" +#include "tm.h" + +#ifdef HAVE_GAS_HIDDEN +#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) +#else +#define ATTRIBUTE_HIDDEN +#endif + +#include "libgcc2.h" +#undef int + +/* These prototypes would normally live in libgcc2.h, but this can + only happen once the code below is integrated into libgcc2.c. */ + +extern USItype udivmodsi4 (USItype, USItype, word_type); +extern SItype __divsi3 (SItype, SItype); +extern SItype __modsi3 (SItype, SItype); +extern SItype __udivsi3 (SItype, SItype); +extern SItype __umodsi3 (SItype, SItype); +extern SItype __ashlsi3 (SItype, SItype); +extern SItype __ashrsi3 (SItype, SItype); +extern USItype __lshrsi3 (USItype, USItype); +extern int __popcounthi2 (UHWtype); +extern int __parityhi2 (UHWtype); +extern int __clzhi2 (UHWtype); +extern int __ctzhi2 (UHWtype); + -typedef int word_type __attribute__ ((mode (__word__))); USItype -udivmodsi4(USItype num, USItype den, word_type modwanted) +udivmodsi4 (USItype num, USItype den, word_type modwanted) { USItype bit = 1; USItype res = 0; - while (den < num && bit && !(den & (1L<<31))) + while (den < num && bit && !(den & (1L << 31))) { - den <<=1; - bit <<=1; + den <<= 1; + bit <<= 1; } while (bit) { @@ -22,15 +82,15 @@ udivmodsi4(USItype num, USItype den, word_type modwanted) num -= den; res |= bit; } - bit >>=1; - den >>=1; + bit >>= 1; + den >>= 1; } - if (modwanted) return num; + + if (modwanted) + return num; return res; } - - SItype __divsi3 (SItype a, SItype b) { @@ -57,8 +117,6 @@ __divsi3 (SItype a, SItype b) return res; } - - SItype __modsi3 (SItype a, SItype b) { @@ -82,17 +140,12 @@ __modsi3 (SItype a, SItype b) return res; } - - - SItype __udivsi3 (SItype a, SItype b) { return udivmodsi4 (a, b, 0); } - - SItype __umodsi3 (SItype a, SItype b) { @@ -141,22 +194,13 @@ __lshrsi3 (USItype a, USItype b) return a; } -static const unsigned char __popcount_tab[] = -{ - 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, -}; - +/* Returns the number of set bits in X. + FIXME: The return type really should be unsigned, + but this is not how the builtin is prototyped. */ int -__popcounthi2 (unsigned int x) +__popcounthi2 (UHWtype x) { - unsigned int ret; + int ret; ret = __popcount_tab [x & 0xff]; ret += __popcount_tab [(x >> 8) & 0xff]; @@ -164,8 +208,12 @@ __popcounthi2 (unsigned int x) return ret; } +/* Returns the number of set bits in X, modulo 2. + FIXME: The return type really should be unsigned, + but this is not how the builtin is prototyped. */ + int -__parityhi2 (unsigned int x) +__parityhi2 (UHWtype x) { x ^= x >> 8; x ^= x >> 4; @@ -173,19 +221,31 @@ __parityhi2 (unsigned int x) return (0x6996 >> x) & 1; } +/* Returns the number of leading zero bits in X. + FIXME: The return type really should be unsigned, + but this is not how the builtin is prototyped. */ + int -__ctzhi2 (unsigned int x) +__clzhi2 (UHWtype x) { - extern int __ctzsi2 (unsigned long); - unsigned long y = x; - - return __ctzsi2 (y << 16) - 16; + if (x > 0xff) + return 8 - __clz_tab[x >> 8]; + return 16 - __clz_tab[x]; } +/* Returns the number of trailing zero bits in X. + FIXME: The return type really should be unsigned, + but this is not how the builtin is prototyped. */ + int -__clzhi2 (unsigned int x) +__ctzhi2 (UHWtype x) { - extern int __clzsi2 (unsigned long); - - return __clzsi2 (x) - 16; + /* This is cunning. It converts X into a number with only the one bit + set, the bit was the least significant bit in X. From this we can + use the __clz_tab[] array to compute the number of trailing bits. */ + x &= - x; + + if (x > 0xff) + return __clz_tab[x >> 8] + 7; + return __clz_tab[x] - 1; } diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index 3108bff..5950cc9 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -648,7 +648,7 @@ __udiv_w_sdiv (UWtype *rp __attribute__ ((__unused__)), #endif #ifdef L_clz -const UQItype __clz_tab[] = +const UQItype __clz_tab[256] = { 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, @@ -657,7 +657,7 @@ const UQItype __clz_tab[] = 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 }; #endif @@ -731,7 +731,7 @@ extern const UQItype __popcount_tab[] ATTRIBUTE_HIDDEN; #endif #ifdef L_popcount_tab -const UQItype __popcount_tab[] = +const UQItype __popcount_tab[256] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5, 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, @@ -740,7 +740,7 @@ const UQItype __popcount_tab[] = 1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, 2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7, - 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8, + 3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8 }; #endif diff --git a/gcc/libgcc2.h b/gcc/libgcc2.h index 05901d8..56ffc61 100644 --- a/gcc/libgcc2.h +++ b/gcc/libgcc2.h @@ -373,6 +373,16 @@ typedef union DWtype ll; } DWunion; +/* Defined for L_popcount_tab. Exported here because some targets may + want to use it for their own versions of the __popcount builtins. */ +extern const UQItype __popcount_tab[256]; + +/* Defined for L_clz. Exported here because some targets may want to use + it for their own versions of the __clz builtins. It contains the bit + position of the first set bit for the numbers 0 - 255. This avoids the + need for a seperate table for the __ctz builtins. */ +extern const UQItype __clz_tab[256]; + #include "longlong.h" #undef int diff --git a/gcc/longlong.h b/gcc/longlong.h index 01a0328..3f42347 100644 --- a/gcc/longlong.h +++ b/gcc/longlong.h @@ -1,6 +1,6 @@ /* longlong.h -- definitions for mixed size 32/64 bit arithmetic. - Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2004 - Free Software Foundation, Inc. + Copyright (C) 1991, 1992, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2004, + 2005 Free Software Foundation, Inc. This definition file is free software; you can redistribute it and/or modify it under the terms of the GNU General Public @@ -29,8 +29,7 @@ DItype, UDItype -- Signed and unsigned 64 bit types. On a 32 bit machine UWtype should typically be USItype; - on a 64 bit machine, UWtype should typically be UDItype. -*/ + on a 64 bit machine, UWtype should typically be UDItype. */ #define __BITS4 (W_TYPE_SIZE / 4) #define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) @@ -42,6 +41,7 @@ #define UWtype USItype #define UHWtype USItype #define UDWtype UDItype +extern const UQItype __clz_tab[256] ATTRIBUTE_HIDDEN; #endif /* Define auxiliary asm macros. @@ -129,7 +129,6 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype); #define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzl (X)) #define COUNT_LEADING_ZEROS_0 64 #else -extern const UQItype __clz_tab[] ATTRIBUTE_HIDDEN; #define count_leading_zeros(COUNT,X) \ do { \ UDItype __xr = (X), __t, __a; \ @@ -1312,7 +1311,6 @@ UDItype __umulsidi3 (USItype, USItype); #endif #if !defined (count_leading_zeros) -extern const UQItype __clz_tab[] ATTRIBUTE_HIDDEN; #define count_leading_zeros(count, x) \ do { \ UWtype __xr = (x); \ |