===================================================================
@@ -1984,20 +1984,39 @@ tree_floor_log2 (const_tree expr)
: floor_log2 (low));
}
+static int
+real_somep (const_tree expr, REAL_VALUE_TYPE dcst)
+{
+ STRIP_NOPS (expr);
+
+ switch (TREE_CODE (expr))
+ {
+ case REAL_CST:
+ return REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dcst)
+ && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr))));
+ case COMPLEX_CST:
+ return real_somep (TREE_REALPART (expr), dcst)
+ && real_somep (TREE_IMAGPART (expr), dconst0);
+ case VECTOR_CST:
+ {
+ unsigned i;
+ for (i = 0; i < VECTOR_CST_NELTS (expr); ++i)
+ if (!real_somep (VECTOR_CST_ELT (expr, i), dcst))
+ return false;
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
/* Return 1 if EXPR is the real constant zero. Trailing zeroes matter for
decimal float constants, so don't return 1 for them. */
int
real_zerop (const_tree expr)
{
- STRIP_NOPS (expr);
-
- return ((TREE_CODE (expr) == REAL_CST
- && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0)
- && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
- || (TREE_CODE (expr) == COMPLEX_CST
- && real_zerop (TREE_REALPART (expr))
- && real_zerop (TREE_IMAGPART (expr))));
+ return real_somep (expr, dconst0);
}
/* Return 1 if EXPR is the real constant one in real or complex form.
@@ -2007,14 +2026,7 @@ real_zerop (const_tree expr)
int
real_onep (const_tree expr)
{
- STRIP_NOPS (expr);
-
- return ((TREE_CODE (expr) == REAL_CST
- && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1)
- && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
- || (TREE_CODE (expr) == COMPLEX_CST
- && real_onep (TREE_REALPART (expr))
- && real_zerop (TREE_IMAGPART (expr))));
+ return real_somep (expr, dconst1);
}
/* Return 1 if EXPR is the real constant two. Trailing zeroes matter
@@ -2023,14 +2035,7 @@ real_onep (const_tree expr)
int
real_twop (const_tree expr)
{
- STRIP_NOPS (expr);
-
- return ((TREE_CODE (expr) == REAL_CST
- && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2)
- && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
- || (TREE_CODE (expr) == COMPLEX_CST
- && real_twop (TREE_REALPART (expr))
- && real_zerop (TREE_IMAGPART (expr))));
+ return real_somep (expr, dconst2);
}
/* Return 1 if EXPR is the real constant minus one. Trailing zeroes
@@ -2039,14 +2044,7 @@ real_twop (const_tree expr)
int
real_minus_onep (const_tree expr)
{
- STRIP_NOPS (expr);
-
- return ((TREE_CODE (expr) == REAL_CST
- && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconstm1)
- && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))))
- || (TREE_CODE (expr) == COMPLEX_CST
- && real_minus_onep (TREE_REALPART (expr))
- && real_zerop (TREE_IMAGPART (expr))));
+ return real_somep (expr, dconstm1);
}
/* Nonzero if EXP is a constant or a cast of a constant. */