libgcc-std.ver (__clztf2): New.
* 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. From-SVN: r62606
This commit is contained in:
parent
5d4b76c0a9
commit
8275b011ca
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
126
gcc/libgcc2.c
126
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;
|
||||
|
@ -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))
|
||||
|
28
gcc/optabs.c
28
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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user