From d41e3320812c9a849b32c60aa7c7b4f4de62995f Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 4 Aug 2010 09:15:51 +0000 Subject: 2010-08-04 Richard Guenther * Makefile.in (double-int.o): Add $(TOPLEV_H) dependency. * double-int.h (double_int_ctz): Declare. * double-int.c (double_int_ctz): New function. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@162859 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/Makefile.in | 3 ++- gcc/double-int.c | 21 +++++++++++++++++++++ gcc/double-int.h | 2 ++ 4 files changed, 31 insertions(+), 1 deletion(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7b338e42ac5..e89469f7fb4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-08-04 Richard Guenther + + * Makefile.in (double-int.o): Add $(TOPLEV_H) dependency. + * double-int.h (double_int_ctz): Declare. + * double-int.c (double_int_ctz): New function. + 2010-08-04 Hariharan Sandanagobalane * config/picochip/picochip.c (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): diff --git a/gcc/Makefile.in b/gcc/Makefile.in index a6b3460e948..030b9c06dcc 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -2279,7 +2279,8 @@ stringpool.o: stringpool.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ convert.o: convert.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \ $(FLAGS_H) convert.h $(TOPLEV_H) $(DIAGNOSTIC_CORE_H) langhooks.h -double-int.o: double-int.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) +double-int.o: double-int.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ + $(TOPLEV_H) $(TREE_H) # lto-compress.o needs $(ZLIBINC) added to the include flags. lto-compress.o: lto-compress.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ diff --git a/gcc/double-int.c b/gcc/double-int.c index 924e91b6c90..29e720b2919 100644 --- a/gcc/double-int.c +++ b/gcc/double-int.c @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "tm.h" #include "tree.h" +#include "toplev.h" /* We know that A1 + B1 = SUM1, using 2's complement arithmetic and ignoring overflow. Suppose A, B and SUM have the same respective signs as A1, B1, @@ -850,6 +851,26 @@ double_int_setbit (double_int a, unsigned bitpos) return a; } +/* Count trailing zeros in A. */ +int +double_int_ctz (double_int a) +{ + unsigned HOST_WIDE_INT w = a.low ? a.low : (unsigned HOST_WIDE_INT) a.high; + unsigned bits = a.low ? 0 : HOST_BITS_PER_WIDE_INT; + if (!w) + return HOST_BITS_PER_DOUBLE_INT; +#if (GCC_VERSION >= 3004) + bits += CTZ_HWI (w); +#else + while (!(w & 1)) + { + w >>= 1; + bits += 1; + } +#endif + return bits; +} + /* Shift A left by COUNT places keeping only PREC bits of result. Shift right if COUNT is negative. ARITH true specifies arithmetic shifting; otherwise use logical shift. */ diff --git a/gcc/double-int.h b/gcc/double-int.h index b14693d4fbd..c2f74e95e28 100644 --- a/gcc/double-int.h +++ b/gcc/double-int.h @@ -148,7 +148,9 @@ double_int double_int_umod (double_int, double_int, unsigned); double_int double_int_divmod (double_int, double_int, bool, unsigned, double_int *); double_int double_int_sdivmod (double_int, double_int, unsigned, double_int *); double_int double_int_udivmod (double_int, double_int, unsigned, double_int *); + double_int double_int_setbit (double_int, unsigned); +int double_int_ctz (double_int); /* Logical operations. */ -- cgit v1.2.1