diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2013-11-18 14:50:47 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2013-11-18 14:50:47 +0000 |
commit | b04268a57f6e67376cf804e6e5866cf8cbfef968 (patch) | |
tree | 131a6aaf79560e8a3a9a65edd5dc63fa0d893de7 /gcc | |
parent | a2ca7c8cb966f02300a3775ba5575412aa6b1f94 (diff) | |
download | gcc-b04268a57f6e67376cf804e6e5866cf8cbfef968.zip gcc-b04268a57f6e67376cf804e6e5866cf8cbfef968.tar.gz gcc-b04268a57f6e67376cf804e6e5866cf8cbfef968.tar.bz2 |
tree.h (tree_fits_shwi_p, [...]): Declare.
gcc/
* tree.h (tree_fits_shwi_p, tree_fits_uhwi_p): Declare.
* tree.c (tree_fits_shwi_p, tree_fits_uhwi_p): Define.
From-SVN: r204954
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/tree.c | 26 | ||||
-rw-r--r-- | gcc/tree.h | 10 |
3 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ed1b63..6ae3a6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-11-18 Richard Sandiford <rdsandiford@googlemail.com> + + * tree.h (tree_fits_shwi_p, tree_fits_uhwi_p): Declare. + * tree.c (tree_fits_shwi_p, tree_fits_uhwi_p): Define. + 2013-11-18 Kirill Yukhin <kirill.yukhin@intel.com> * gcc/config/ia64/ia64.c (ia64_split_tmode_move): Mark @@ -6990,6 +6990,32 @@ host_integerp (const_tree t, int pos) || (pos && TREE_INT_CST_HIGH (t) == 0))); } +/* Return true if T is an INTEGER_CST whose numerical value (extended + according to TYPE_UNSIGNED) fits in a signed HOST_WIDE_INT. */ + +bool +tree_fits_shwi_p (const_tree t) +{ + return (t != NULL_TREE + && TREE_CODE (t) == INTEGER_CST + && ((TREE_INT_CST_HIGH (t) == 0 + && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) >= 0) + || (TREE_INT_CST_HIGH (t) == -1 + && (HOST_WIDE_INT) TREE_INT_CST_LOW (t) < 0 + && !TYPE_UNSIGNED (TREE_TYPE (t))))); +} + +/* Return true if T is an INTEGER_CST whose numerical value (extended + according to TYPE_UNSIGNED) fits in an unsigned HOST_WIDE_INT. */ + +bool +tree_fits_uhwi_p (const_tree t) +{ + return (t != NULL_TREE + && TREE_CODE (t) == INTEGER_CST + && TREE_INT_CST_HIGH (t) == 0); +} + /* Return the HOST_WIDE_INT least significant bits of T if it is an INTEGER_CST and there is no overflow. POS is nonzero if the result must be non-negative. We must be able to satisfy the above conditions. */ @@ -3662,6 +3662,16 @@ extern int host_integerp (const_tree, int) ATTRIBUTE_PURE /* host_integerp is pure only when checking is disabled. */ #endif ; +extern bool tree_fits_shwi_p (const_tree) +#ifndef ENABLE_TREE_CHECKING + ATTRIBUTE_PURE /* tree_fits_shwi_p is pure only when checking is disabled. */ +#endif + ; +extern bool tree_fits_uhwi_p (const_tree) +#ifndef ENABLE_TREE_CHECKING + ATTRIBUTE_PURE /* tree_fits_uhwi_p is pure only when checking is disabled. */ +#endif + ; extern HOST_WIDE_INT tree_low_cst (const_tree, int); #if !defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 4003) extern inline __attribute__ ((__gnu_inline__)) HOST_WIDE_INT |