summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-11-16 17:37:52 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-11-16 17:37:52 -0500
commit9ad265b05ed2c5b516f15dc4ca9f5b17944a1951 (patch)
tree401e461f2ce411e3879f94f7aaa695ead6c40a29
parent9c4faac1d5513acab9c9fd9ee957fc68944f3035 (diff)
downloadgcc-9ad265b05ed2c5b516f15dc4ca9f5b17944a1951.tar.gz
(integer_{zero,one,all_ones,pow2}p): Handle COMPLEX_CST.
(real_{zero,one,two}p): Likewise. From-SVN: r8473
-rw-r--r--gcc/tree.c63
1 files changed, 45 insertions, 18 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 69008a18e32..24a815ac76e 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1415,7 +1415,8 @@ make_tree_vec (len)
return t;
}
-/* Return 1 if EXPR is the integer constant zero. */
+/* Return 1 if EXPR is the integer constant zero or a complex constant
+ of zero. */
int
integer_zerop (expr)
@@ -1423,12 +1424,16 @@ integer_zerop (expr)
{
STRIP_NOPS (expr);
- return (TREE_CODE (expr) == INTEGER_CST
- && TREE_INT_CST_LOW (expr) == 0
- && TREE_INT_CST_HIGH (expr) == 0);
+ return ((TREE_CODE (expr) == INTEGER_CST
+ && TREE_INT_CST_LOW (expr) == 0
+ && TREE_INT_CST_HIGH (expr) == 0)
+ || (TREE_CODE (expr) == COMPLEX_CST
+ && integer_zerop (TREE_REALPART (expr))
+ && integer_zerop (TREE_IMAGPART (expr))));
}
-/* Return 1 if EXPR is the integer constant one. */
+/* Return 1 if EXPR is the integer constant one or the corresponding
+ complex constant. */
int
integer_onep (expr)
@@ -1436,13 +1441,16 @@ integer_onep (expr)
{
STRIP_NOPS (expr);
- return (TREE_CODE (expr) == INTEGER_CST
- && TREE_INT_CST_LOW (expr) == 1
- && TREE_INT_CST_HIGH (expr) == 0);
+ return ((TREE_CODE (expr) == INTEGER_CST
+ && TREE_INT_CST_LOW (expr) == 1
+ && TREE_INT_CST_HIGH (expr) == 0)
+ || (TREE_CODE (expr) == COMPLEX_CST
+ && integer_onep (TREE_REALPART (expr))
+ && integer_zerop (TREE_IMAGPART (expr))));
}
-/* Return 1 if EXPR is an integer containing all 1's
- in as much precision as it contains. */
+/* Return 1 if EXPR is an integer containing all 1's in as much precision as
+ it contains. Likewise for the corresponding complex constant. */
int
integer_all_onesp (expr)
@@ -1453,7 +1461,12 @@ integer_all_onesp (expr)
STRIP_NOPS (expr);
- if (TREE_CODE (expr) != INTEGER_CST)
+ if (TREE_CODE (expr) == COMPLEX_CST
+ && integer_all_onesp (TREE_REALPART (expr))
+ && integer_zerop (TREE_IMAGPART (expr)))
+ return 1;
+
+ else if (TREE_CODE (expr) != INTEGER_CST)
return 0;
uns = TREE_UNSIGNED (TREE_TYPE (expr));
@@ -1495,6 +1508,11 @@ integer_pow2p (expr)
STRIP_NOPS (expr);
+ if (TREE_CODE (expr) == COMPLEX_CST
+ && integer_pow2p (TREE_REALPART (expr))
+ && integer_zerop (TREE_IMAGPART (expr)))
+ return 1;
+
if (TREE_CODE (expr) != INTEGER_CST)
return 0;
@@ -1516,11 +1534,14 @@ real_zerop (expr)
{
STRIP_NOPS (expr);
- return (TREE_CODE (expr) == REAL_CST
- && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0));
+ return ((TREE_CODE (expr) == REAL_CST
+ && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0))
+ || (TREE_CODE (expr) == COMPLEX_CST
+ && real_zerop (TREE_REALPART (expr))
+ && real_zerop (TREE_IMAGPART (expr))));
}
-/* Return 1 if EXPR is the real constant one. */
+/* Return 1 if EXPR is the real constant one in real or complex form. */
int
real_onep (expr)
@@ -1528,8 +1549,11 @@ real_onep (expr)
{
STRIP_NOPS (expr);
- return (TREE_CODE (expr) == REAL_CST
- && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1));
+ return ((TREE_CODE (expr) == REAL_CST
+ && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1))
+ || (TREE_CODE (expr) == COMPLEX_CST
+ && real_onep (TREE_REALPART (expr))
+ && real_zerop (TREE_IMAGPART (expr))));
}
/* Return 1 if EXPR is the real constant two. */
@@ -1540,8 +1564,11 @@ real_twop (expr)
{
STRIP_NOPS (expr);
- return (TREE_CODE (expr) == REAL_CST
- && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2));
+ return ((TREE_CODE (expr) == REAL_CST
+ && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2))
+ || (TREE_CODE (expr) == COMPLEX_CST
+ && real_twop (TREE_REALPART (expr))
+ && real_zerop (TREE_IMAGPART (expr))));
}
/* Nonzero if EXP is a constant or a cast of a constant. */