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]

[wide-int] A few assorted simplifications


These changes don't have much in common except being simplifications.
Note that "len == 0" isn't possible now that we've eliminated the
0-precision case.  "val = val" should be redundant.

Tested on powerpc64-linux-gnu and by rerunning the assembly comparison.
OK to install?

Richard


Index: gcc/expmed.c
===================================================================
--- gcc/expmed.c	2013-11-09 09:39:17.841740772 +0000
+++ gcc/expmed.c	2013-11-09 09:39:27.370805176 +0000
@@ -3652,7 +3652,7 @@ expand_smod_pow2 (enum machine_mode mode
      modulus.  By including the signbit in the operation, many targets
      can avoid an explicit compare operation in the following comparison
      against zero.  */
-  wide_int mask = wi::mask (logd, false, GET_MODE_PRECISION (mode));
+  wide_int mask = wi::mask (logd, false, prec);
   mask = wi::set_bit (mask, prec - 1);
 
   temp = expand_binop (mode, and_optab, op0,
@@ -3667,7 +3667,7 @@ expand_smod_pow2 (enum machine_mode mode
   temp = expand_binop (mode, sub_optab, result, const1_rtx, result,
 		       0, OPTAB_LIB_WIDEN);
 
-  mask = wi::mask (logd, true, GET_MODE_PRECISION (mode));
+  mask = wi::mask (logd, true, prec);
   temp = expand_binop (mode, ior_optab, temp,
 		       immed_wide_int_const (mask, mode),
 		       result, 1, OPTAB_LIB_WIDEN);
Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c	2013-11-09 09:39:26.729800844 +0000
+++ gcc/fold-const.c	2013-11-09 09:39:27.373805197 +0000
@@ -7175,8 +7175,7 @@ fold_plusminus_mult_expr (location_t loc
       arg10 = build_one_cst (type);
       /* As we canonicalize A - 2 to A + -2 get rid of that sign for
 	 the purpose of this canonicalization.  */
-      if (TYPE_SIGN (TREE_TYPE (arg1)) == SIGNED
-	  && wi::neg_p (arg1)
+      if (wi::neg_p (arg1, TYPE_SIGN (TREE_TYPE (arg1)))
 	  && negate_expr_p (arg1)
 	  && code == PLUS_EXPR)
 	{
Index: gcc/real.c
===================================================================
--- gcc/real.c	2013-11-09 09:39:26.732800864 +0000
+++ gcc/real.c	2013-11-09 09:39:27.373805197 +0000
@@ -1422,7 +1422,7 @@ real_to_integer (const REAL_VALUE_TYPE *
 
       words = (precision + HOST_BITS_PER_WIDE_INT - 1) / HOST_BITS_PER_WIDE_INT;
 
-      for (int i = 0; i < 2 * MAX_BITSIZE_MODE_ANY_INT / HOST_BITS_PER_WIDE_INT; i++)
+      for (unsigned int i = 0; i < ARRAY_SIZE (val); i++)
 	val[i] = 0;
 
 #if (HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG)
@@ -2205,16 +2205,11 @@ real_from_integer (REAL_VALUE_TYPE *r, e
       r->cl = rvc_normal;
       r->sign = wi::neg_p (val_in, sgn);
 
-      if (len == 0)
-	len = 1;
-
       /* We have to ensure we can negate the largest negative number.  */
       wide_int val = wide_int::from (val_in, maxbitlen, sgn);
 
       if (r->sign)
 	val = -val;
-      else
-	val = val;
       
       /* Ensure a multiple of HOST_BITS_PER_WIDE_INT, ceiling, as elt
 	 won't work with precisions that are not a multiple of


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