This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

make real.h constants more consistent


This is a small patch that simply hides the implementation of real
constants for e, 1/3, sqrt(2) from outside real.[ch]. I think this
makes the code cleaner (each constant has its own function, no special
enumeration constants needed, no switch needed) and easier to read
(dconst_e is easier and shorter than *get_real_const (rv_e)).

Bootstrapped and regression tested with --enable-languages=all on
86_64-unknown-linux-gnu.

OK for trunk?


2008-07-25  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

 * real.h (dconst_e, dconst_third, dconst_sqrt2, get_real_const_e,
get_real_const_third, get_real_const_sqrt2): Declare.
   (enum real_value_const): Delete.
   (get_real_const): Delete.
 * real.c (get_real_const): Delete.
   (get_real_const_e): Define.
   (get_real_const_third): Define.
   (get_real_const_sqrt2): Define.
 * builtins.c: Update all callers.
Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c	(revision 138089)
+++ gcc/builtins.c	(working copy)
@@ -7484,8 +7484,7 @@
 	  && operand_equal_p (real, imag, OEP_PURE_SAME))
         {
 	  const REAL_VALUE_TYPE sqrt2_trunc
-	    = real_value_truncate (TYPE_MODE (type),
-				   *get_real_const (rv_sqrt2));
+	    = real_value_truncate (TYPE_MODE (type), dconst_sqrt2);
 	  STRIP_NOPS (real);
 	  return fold_build2 (MULT_EXPR, type,
 			      fold_build1 (ABS_EXPR, type, real),
@@ -7568,7 +7567,7 @@
 	  tree tree_root;
 	  /* The inner root was either sqrt or cbrt.  */
 	  REAL_VALUE_TYPE dconstroot =
-	    BUILTIN_SQRT_P (fcode) ? dconsthalf : *get_real_const (rv_third);
+	    BUILTIN_SQRT_P (fcode) ? dconsthalf : dconst_third;
 
 	  /* Adjust for the outer root.  */
 	  SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
@@ -7621,7 +7620,7 @@
 	{
 	  tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
 	  const REAL_VALUE_TYPE third_trunc =
-	    real_value_truncate (TYPE_MODE (type), *get_real_const (rv_third));
+	    real_value_truncate (TYPE_MODE (type), dconst_third);
 	  arg = fold_build2 (MULT_EXPR, type,
 			     CALL_EXPR_ARG (arg, 0),
 			     build_real (type, third_trunc));
@@ -7637,7 +7636,7 @@
 	    {
 	      tree arg0 = CALL_EXPR_ARG (arg, 0);
 	      tree tree_root;
-	      REAL_VALUE_TYPE dconstroot = *get_real_const (rv_third);
+	      REAL_VALUE_TYPE dconstroot = dconst_third;
 
 	      SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
 	      dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
@@ -7660,8 +7659,7 @@
 		  REAL_VALUE_TYPE dconstroot;
 
 		  real_arithmetic (&dconstroot, MULT_EXPR,
-				   get_real_const (rv_third),
-				   get_real_const (rv_third));
+                                   &dconst_third, &dconst_third);
 		  dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
 		  tree_root = build_real (type, dconstroot);
 		  return build_call_expr (powfn, 2, arg0, tree_root);
@@ -7680,8 +7678,7 @@
 	    {
 	      tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
 	      const REAL_VALUE_TYPE dconstroot
-		= real_value_truncate (TYPE_MODE (type),
-				       *get_real_const (rv_third));
+		= real_value_truncate (TYPE_MODE (type), dconst_third);
 	      tree narg01 = fold_build2 (MULT_EXPR, type, arg01,
 					 build_real (type, dconstroot));
 	      return build_call_expr (powfn, 2, arg00, narg01);
@@ -8229,7 +8226,7 @@
       if (flag_unsafe_math_optimizations && func == mpfr_log)
         {
 	  const REAL_VALUE_TYPE e_truncated =
-	    real_value_truncate (TYPE_MODE (type), *get_real_const (rv_e));
+	    real_value_truncate (TYPE_MODE (type), dconst_e);
 	  if (real_dconstp (arg, &e_truncated))
 	    return build_real (type, dconst1);
 	}
@@ -8263,8 +8260,7 @@
 	  CASE_FLT_FN (BUILT_IN_EXP):
 	    /* Prepare to do logN(exp(exponent) -> exponent*logN(e).  */
 	    x = build_real (type,
-			    real_value_truncate (TYPE_MODE (type),
-						 *get_real_const (rv_e)));
+			    real_value_truncate (TYPE_MODE (type), dconst_e));
 	    exponent = CALL_EXPR_ARG (arg, 0);
 	    break;
 	  CASE_FLT_FN (BUILT_IN_EXP2):
@@ -8291,7 +8287,7 @@
 	    /* Prepare to do logN(cbrt(x) -> (1/3)*logN(x).  */
 	    x = CALL_EXPR_ARG (arg, 0);
 	    exponent = build_real (type, real_value_truncate (TYPE_MODE (type),
-							      *get_real_const (rv_third)));
+							      dconst_third));
 	    break;
 	  CASE_FLT_FN (BUILT_IN_POW):
 	    /* Prepare to do logN(pow(x,exponent) -> exponent*logN(x).  */
@@ -8351,7 +8347,7 @@
       && operand_equal_p (arg0, arg1, OEP_PURE_SAME))
     {
       const REAL_VALUE_TYPE sqrt2_trunc
-	= real_value_truncate (TYPE_MODE (type), *get_real_const (rv_sqrt2));
+	= real_value_truncate (TYPE_MODE (type), dconst_sqrt2);
       return fold_build2 (MULT_EXPR, type,
 			  fold_build1 (ABS_EXPR, type, arg0),
 			  build_real (type, sqrt2_trunc));
@@ -8417,8 +8413,7 @@
       if (flag_unsafe_math_optimizations)
 	{
 	  const REAL_VALUE_TYPE dconstroot
-	    = real_value_truncate (TYPE_MODE (type),
-				   *get_real_const (rv_third));
+	    = real_value_truncate (TYPE_MODE (type), dconst_third);
 
 	  if (REAL_VALUES_EQUAL (c, dconstroot))
 	    {
@@ -8485,8 +8480,7 @@
 	  if (tree_expr_nonnegative_p (arg))
 	    {
 	      const REAL_VALUE_TYPE dconstroot
-		= real_value_truncate (TYPE_MODE (type),
-				       *get_real_const (rv_third));
+		= real_value_truncate (TYPE_MODE (type), dconst_third);
 	      tree narg1 = fold_build2 (MULT_EXPR, type, arg1,
 					build_real (type, dconstroot));
 	      return build_call_expr (fndecl, 2, arg, narg1);
Index: gcc/real.c
===================================================================
--- gcc/real.c	(revision 138089)
+++ gcc/real.c	(working copy)
@@ -2181,47 +2181,61 @@
     do_divide (r, r, &pten);
 }
 
-/* Returns the special REAL_VALUE_TYPE enumerated by E.  */
+/* Returns the special REAL_VALUE_TYPE corresponding to 'e'.  */
 
 const REAL_VALUE_TYPE *
-get_real_const (enum real_value_const e)
+get_real_const_e (void)
 {
-  static REAL_VALUE_TYPE value[rv_max];
+  static REAL_VALUE_TYPE value;
 
-  gcc_assert (e < rv_max);
+  /* Initialize mathematical constants for constant folding builtins.
+     These constants need to be given to at least 160 bits precision.  */
+  if (value.cl == rvc_zero)
+    {
+      mpfr_t m;
+      mpfr_init2 (m, SIGNIFICAND_BITS);
+      mpfr_set_ui (m, 1, GMP_RNDN);
+      mpfr_exp (m, m, GMP_RNDN);
+      real_from_mpfr (&value, m, NULL_TREE, GMP_RNDN);
+      mpfr_clear (m);
+    }
+  return &value;
+}
 
+/* Returns the special REAL_VALUE_TYPE corresponding to 1/3.  */
+
+const REAL_VALUE_TYPE *
+get_real_const_third (void)
+{
+  static REAL_VALUE_TYPE value;
+
   /* Initialize mathematical constants for constant folding builtins.
      These constants need to be given to at least 160 bits precision.  */
-  if (value[e].cl == rvc_zero)
-    switch (e)
+  if (value.cl == rvc_zero)
     {
-    case rv_e:
-      {
-	mpfr_t m;
-	mpfr_init2 (m, SIGNIFICAND_BITS);
-	mpfr_set_ui (m, 1, GMP_RNDN);
-	mpfr_exp (m, m, GMP_RNDN);
-	real_from_mpfr (&value[e], m, NULL_TREE, GMP_RNDN);
-	mpfr_clear (m);
-      }
-      break;
-    case rv_third:
-      real_arithmetic (&value[e], RDIV_EXPR, &dconst1, real_digit (3));
-      break;
-    case rv_sqrt2:
-      {
-	mpfr_t m;
-	mpfr_init2 (m, SIGNIFICAND_BITS);
-	mpfr_sqrt_ui (m, 2, GMP_RNDN);
-	real_from_mpfr (&value[e], m, NULL_TREE, GMP_RNDN);
-	mpfr_clear (m);
-      }
-      break;
-    default:
-      gcc_unreachable();
+      real_arithmetic (&value, RDIV_EXPR, &dconst1, real_digit (3));
     }
+  return &value;
+}
 
-  return &value[e];
+/* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2).  */
+
+const REAL_VALUE_TYPE *
+get_real_const_sqrt2 (void)
+{
+  static REAL_VALUE_TYPE value;
+
+  /* Initialize mathematical constants for constant folding builtins.
+     These constants need to be given to at least 160 bits precision.  */
+  if (value.cl == rvc_zero)
+    {
+      mpfr_t m;
+      mpfr_init2 (m, SIGNIFICAND_BITS);
+      mpfr_sqrt_ui (m, 2, GMP_RNDN);
+      real_from_mpfr (&value, m, NULL_TREE, GMP_RNDN);
+      mpfr_clear (m);
+    }
+  return &value;
 }
 
 /* Fills R with +Inf.  */
Index: gcc/real.h
===================================================================
--- gcc/real.h	(revision 138089)
+++ gcc/real.h	(working copy)
@@ -381,18 +381,19 @@
 extern REAL_VALUE_TYPE dconst2;
 extern REAL_VALUE_TYPE dconstm1;
 extern REAL_VALUE_TYPE dconsthalf;
+#define dconst_e  (*get_real_const_e ())
+#define dconst_third (*get_real_const_third ())
+#define dconst_sqrt2 (*get_real_const_sqrt2 ())
 
-/* Enumerate the special constant values we need. */
-enum real_value_const {
-  rv_e,
-  rv_third,
-  rv_sqrt2,
-  rv_max
-};
+/* Function to return the real value special constant 'e'.  */
+extern const REAL_VALUE_TYPE * get_real_const_e (void);
 
-/* Function to return a real value special constant.  */
-extern const REAL_VALUE_TYPE * get_real_const (enum real_value_const);
+/* Returns the special REAL_VALUE_TYPE corresponding to 1/3.  */
+extern const REAL_VALUE_TYPE * get_real_const_third (void);
 
+/* Returns the special REAL_VALUE_TYPE corresponding to sqrt(2).  */
+extern const REAL_VALUE_TYPE * get_real_const_sqrt2 (void);
+
 /* Function to return a real value (not a tree node)
    from a given integer constant.  */
 REAL_VALUE_TYPE real_value_from_int_cst (const_tree, const_tree);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]