real_zerop for vectors

Paolo Carlini paolo.carlini@oracle.com
Sun Oct 28 17:06:00 GMT 2012


Hi,

On 10/28/2012 05:51 PM, Marc Glisse wrote:
> On Sun, 28 Oct 2012, Marc Glisse wrote:
>
> [there are 4 real_*p that only differ by 1 character]
>
>> It is true that we could have a single function in tree.c:
>> bool real_intcstp (const_tree, int);
>
> The helper function could even take a REAL_VALUE_TYPE as second 
> argument, so the non-inline part doesn't have more work than currently.
I was writing something like the below.

Paolo.

/////////////////
-------------- next part --------------
Index: tree.c
===================================================================
--- tree.c	(revision 192887)
+++ tree.c	(working copy)
@@ -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.  */


More information about the Gcc-patches mailing list