aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog16
-rw-r--r--gcc/libgcc-std.ver8
-rw-r--r--gcc/libgcc2.c126
-rw-r--r--gcc/libgcc2.h22
-rw-r--r--gcc/optabs.c28
5 files changed, 111 insertions, 89 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0085476..7188c9f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,19 @@
+2003-02-09 Richard Henderson <rth@redhat.com>
+
+ * libgcc-std.ver (__clztf2): New.
+ (__ctztf2, __popcounttf2, __paritytf2): New.
+ * libgcc2.c (__clzSI2, __clzDI2, __ctzSI2, __ctzDI2, __popcountSI2,
+ __popcountDI2, __paritySI2, __parityDI2): Use UWmode and UDWmode;
+ adjust code to match the different type sizes.
+ * libgcc2.h (__clzSI2, __ctzSI2, __popcountSI2, __paritySI2,
+ __clzDI2, __ctzDI2, __popcountDI2, __parityDI2): New macros.
+
+ * optabs.c (init_integral_libfuncs): Don't hard-code SImode and
+ TImode; select word_mode and twice that.
+ (init_floating_libfuncs): Don't hard-code SFmode and TFmode;
+ select the modes from float, double, and long double.
+ (init_optabs): Remove duplicate initializations.
+
2003-02-09 Wolfgang Bangerth <bangerth@ticam.utexas.edu>
* doc/install.texi: Squeeze and streamline section on
diff --git a/gcc/libgcc-std.ver b/gcc/libgcc-std.ver
index 360e528..21847be 100644
--- a/gcc/libgcc-std.ver
+++ b/gcc/libgcc-std.ver
@@ -186,10 +186,14 @@ GCC_3.4 {
# bit scanning and counting built-ins
__clzsi2
__clzdi2
+ __clzti2
__ctzsi2
__ctzdi2
+ __ctzti2
__popcountsi2
__popcountdi2
- __paritysi2
- __paritydi2
+ __popcountti2
+ __paritysi2
+ __paritydi2
+ __parityti2
}
diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c
index 3736b2c..069aedb 100644
--- a/gcc/libgcc2.c
+++ b/gcc/libgcc2.c
@@ -539,15 +539,13 @@ const UQItype __clz_tab[] =
#ifdef L_clzsi2
#undef int
-extern int __clzsi2 (USItype x);
+extern int __clzSI2 (UWtype x);
int
-__clzsi2 (USItype x)
+__clzSI2 (UWtype x)
{
- UWtype w = x;
Wtype ret;
- count_leading_zeros (ret, w);
- ret -= (sizeof(w) - sizeof(x)) * BITS_PER_UNIT;
+ count_leading_zeros (ret, x);
return ret;
}
@@ -555,25 +553,19 @@ __clzsi2 (USItype x)
#ifdef L_clzdi2
#undef int
-extern int __clzdi2 (UDItype x);
+extern int __clzDI2 (UDWtype x);
int
-__clzdi2 (UDItype x)
+__clzDI2 (UDWtype x)
{
+ DWunion uu;
UWtype word;
Wtype ret, add;
- if (sizeof(x) > sizeof(word))
- {
- DWunion uu;
-
- uu.ll = x;
- if (uu.s.high)
- word = uu.s.high, add = 0;
- else
- word = uu.s.low, add = W_TYPE_SIZE;
- }
+ uu.ll = x;
+ if (uu.s.high)
+ word = uu.s.high, add = 0;
else
- word = x, add = (Wtype)(sizeof(x) - sizeof(word)) * BITS_PER_UNIT;
+ word = uu.s.low, add = W_TYPE_SIZE;
count_leading_zeros (ret, word);
return ret + add;
@@ -582,9 +574,9 @@ __clzdi2 (UDItype x)
#ifdef L_ctzsi2
#undef int
-extern int __ctzsi2 (USItype x);
+extern int __ctzSI2 (UWtype x);
int
-__ctzsi2 (USItype x)
+__ctzSI2 (UWtype x)
{
Wtype ret;
@@ -596,25 +588,19 @@ __ctzsi2 (USItype x)
#ifdef L_ctzdi2
#undef int
-extern int __ctzdi2 (UDItype x);
+extern int __ctzDI2 (UDWtype x);
int
-__ctzdi2 (UDItype x)
+__ctzDI2 (UDWtype x)
{
+ DWunion uu;
UWtype word;
Wtype ret, add;
- if (sizeof(x) > sizeof(word))
- {
- DWunion uu;
-
- uu.ll = x;
- if (uu.s.low)
- word = uu.s.low, add = 0;
- else
- word = uu.s.high, add = W_TYPE_SIZE;
- }
+ uu.ll = x;
+ if (uu.s.low)
+ word = uu.s.low, add = 0;
else
- word = x, add = 0;
+ word = uu.s.high, add = W_TYPE_SIZE;
count_trailing_zeros (ret, word);
return ret + add;
@@ -642,57 +628,77 @@ const UQItype __popcount_tab[] =
#ifdef L_popcountsi2
#undef int
-extern int __popcountsi2 (USItype x);
+extern int __popcountSI2 (UWtype x);
int
-__popcountsi2 (USItype x)
+__popcountSI2 (UWtype x)
{
- return __popcount_tab[(x >> 0) & 0xff]
- + __popcount_tab[(x >> 8) & 0xff]
- + __popcount_tab[(x >> 16) & 0xff]
- + __popcount_tab[(x >> 24) & 0xff];
+ UWtype i, ret = 0;
+
+ for (i = 0; i < W_TYPE_SIZE; i += 8)
+ ret += __popcount_tab[(x >> i) & 0xff];
+
+ return ret;
}
#endif
#ifdef L_popcountdi2
#undef int
-extern int __popcountdi2 (UDItype x);
+extern int __popcountDI2 (UDWtype x);
int
-__popcountdi2 (UDItype x)
+__popcountDI2 (UDWtype x)
{
- return __popcount_tab[(x >> 0) & 0xff]
- + __popcount_tab[(x >> 8) & 0xff]
- + __popcount_tab[(x >> 16) & 0xff]
- + __popcount_tab[(x >> 24) & 0xff]
- + __popcount_tab[(x >> 32) & 0xff]
- + __popcount_tab[(x >> 40) & 0xff]
- + __popcount_tab[(x >> 48) & 0xff]
- + __popcount_tab[(x >> 56) & 0xff];
+ UWtype i, ret = 0;
+
+ for (i = 0; i < 2*W_TYPE_SIZE; i += 8)
+ ret += __popcount_tab[(x >> i) & 0xff];
+
+ return ret;
}
#endif
#ifdef L_paritysi2
#undef int
-extern int __paritysi2 (USItype x);
+extern int __paritySI2 (UWtype x);
int
-__paritysi2 (USItype x)
+__paritySI2 (UWtype x)
{
- UWtype nx = x;
- nx ^= nx >> 16;
- nx ^= nx >> 8;
- nx ^= nx >> 4;
- nx &= 0xf;
- return (0x6996 >> nx) & 1;
+#if W_TYPE_SIZE > 64
+# error "fill out the table"
+#endif
+#if W_TYPE_SIZE > 32
+ x ^= x >> 32;
+#endif
+#if W_TYPE_SIZE > 16
+ x ^= x >> 16;
+#endif
+ x ^= x >> 8;
+ x ^= x >> 4;
+ x &= 0xf;
+ return (0x6996 >> x) & 1;
}
#endif
#ifdef L_paritydi2
#undef int
-extern int __paritydi2 (UDItype x);
+extern int __parityDI2 (UDWtype x);
int
-__paritydi2 (UDItype x)
+__parityDI2 (UDWtype x)
{
- UWtype nx = x ^ (x >> 32);
+ DWunion uu;
+ UWtype nx;
+
+ uu.ll = x;
+ nx = uu.s.low ^ uu.s.high;
+
+#if W_TYPE_SIZE > 64
+# error "fill out the table"
+#endif
+#if W_TYPE_SIZE > 32
+ nx ^= nx >> 32;
+#endif
+#if W_TYPE_SIZE > 16
nx ^= nx >> 16;
+#endif
nx ^= nx >> 8;
nx ^= nx >> 4;
nx &= 0xf;
diff --git a/gcc/libgcc2.h b/gcc/libgcc2.h
index 876e1d5..09c1b08 100644
--- a/gcc/libgcc2.h
+++ b/gcc/libgcc2.h
@@ -203,7 +203,15 @@ typedef int word_type __attribute__ ((mode (__word__)));
#define __fixunssfSI __NW(fixunssf,)
#define __ffsSI2 __NW(ffs,2)
+#define __clzSI2 __NW(clz,2)
+#define __ctzSI2 __NW(ctz,2)
+#define __popcountSI2 __NW(popcount,2)
+#define __paritySI2 __NW(parity,2)
#define __ffsDI2 __NDW(ffs,2)
+#define __clzDI2 __NDW(clz,2)
+#define __ctzDI2 __NDW(ctz,2)
+#define __popcountDI2 __NDW(popcount,2)
+#define __parityDI2 __NDW(parity,2)
extern DWtype __muldi3 (DWtype, DWtype);
extern DWtype __divdi3 (DWtype, DWtype);
@@ -226,20 +234,6 @@ extern DWtype __lshrdi3 (DWtype, word_type);
extern DWtype __ashldi3 (DWtype, word_type);
extern DWtype __ashrdi3 (DWtype, word_type);
-/* ??? Ought to get these named properly for DSPs. */
-#if BITS_PER_UNIT != 8 || MIN_UNITS_PER_WORD < 4
-# undef L_clzsi2
-# undef L_ctzsi2
-# undef L_popcountsi2
-# undef L_paritysi2
-# if LONG_LONG_TYPE_SIZE <= 32
-# undef L_clzdi2
-# undef L_ctzdi2
-# undef L_popcountdi2
-# undef L_paritydi2
-# endif
-#endif
-
/* __udiv_w_sdiv is static inline when building other libgcc2 portions. */
#if (!defined(L_udivdi3) && !defined(L_divdi3) && \
!defined(L_umoddi3) && !defined(L_moddi3))
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 226b199..fbd7bdf 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5396,7 +5396,9 @@ init_integral_libfuncs (optable, opname, suffix)
const char *opname;
int suffix;
{
- init_libfuncs (optable, SImode, TImode, opname, suffix);
+ init_libfuncs (optable, word_mode,
+ mode_for_size (2*BITS_PER_WORD, MODE_INT, 0),
+ opname, suffix);
}
/* Initialize the libfunc fields of an entire group of entries in some
@@ -5410,7 +5412,18 @@ init_floating_libfuncs (optable, opname, suffix)
const char *opname;
int suffix;
{
- init_libfuncs (optable, SFmode, TFmode, opname, suffix);
+ enum machine_mode fmode, dmode, lmode;
+
+ fmode = float_type_node ? TYPE_MODE (float_type_node) : VOIDmode;
+ dmode = double_type_node ? TYPE_MODE (double_type_node) : VOIDmode;
+ lmode = long_double_type_node ? TYPE_MODE (long_double_type_node) : VOIDmode;
+
+ if (fmode != VOIDmode)
+ init_libfuncs (optable, fmode, fmode, opname, suffix);
+ if (dmode != fmode && dmode != VOIDmode)
+ init_libfuncs (optable, dmode, dmode, opname, suffix);
+ if (lmode != dmode && lmode != VOIDmode)
+ init_libfuncs (optable, lmode, lmode, opname, suffix);
}
rtx
@@ -5659,17 +5672,6 @@ init_optabs ()
/* The ffs function operates on `int'. */
ffs_optab->handlers[(int) mode_for_size (INT_TYPE_SIZE, MODE_INT, 0)].libfunc
= init_one_libfunc ("ffs");
- ffs_optab->handlers[(int) DImode].libfunc = init_one_libfunc ("__ffsdi2");
- clz_optab->handlers[(int) SImode].libfunc = init_one_libfunc ("__clzsi2");
- clz_optab->handlers[(int) DImode].libfunc = init_one_libfunc ("__clzdi2");
- ctz_optab->handlers[(int) SImode].libfunc = init_one_libfunc ("__ctzsi2");
- ctz_optab->handlers[(int) DImode].libfunc = init_one_libfunc ("__ctzdi2");
- popcount_optab->handlers[(int) SImode].libfunc
- = init_one_libfunc ("__popcountsi2");
- popcount_optab->handlers[(int) DImode].libfunc
- = init_one_libfunc ("__popcountdi2");
- parity_optab->handlers[(int) SImode].libfunc = init_one_libfunc ("__paritysi2");
- parity_optab->handlers[(int) DImode].libfunc = init_one_libfunc ("__paritydi2");
extendsfdf2_libfunc = init_one_libfunc ("__extendsfdf2");
extendsfxf2_libfunc = init_one_libfunc ("__extendsfxf2");