summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-04 09:15:51 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-04 09:15:51 +0000
commitd41e3320812c9a849b32c60aa7c7b4f4de62995f (patch)
tree048c888ac173b7ff5e353331c625f86b580387ee /gcc
parent0be9eeeeffec9dcc76041dd8d019e9782e28569c (diff)
downloadgcc-d41e3320812c9a849b32c60aa7c7b4f4de62995f.tar.gz
2010-08-04 Richard Guenther <rguenther@suse.de>
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/Makefile.in3
-rw-r--r--gcc/double-int.c21
-rw-r--r--gcc/double-int.h2
4 files changed, 31 insertions, 1 deletions
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 <rguenther@suse.de>
+
+ * 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 <hariharan@picochip.com>
* 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. */