[Vectorizer]Make reductions-via-shifts and vec_shr_optab endianness-neutral
authorAlan Lawrence <alan.lawrence@arm.com>
Fri, 14 Nov 2014 10:48:34 +0000 (10:48 +0000)
committerAlan Lawrence <alalaw01@gcc.gnu.org>
Fri, 14 Nov 2014 10:48:34 +0000 (10:48 +0000)
        * optabs.c (shift_amt_for_vec_perm_mask): Remove code conditional on
        BYTES_BIG_ENDIAN.
        * tree-vect-loop.c (calc_vec_perm_mask_for_shift,
        vect_create_epilog_for_reduction): Likewise.
        * doc/md.texi (vec_shr_m): Clarify direction of shifting.

From-SVN: r217550

gcc/ChangeLog
gcc/doc/md.texi
gcc/optabs.c
gcc/tree-vect-loop.c

index 4a20001..0a272ba 100644 (file)
@@ -1,3 +1,11 @@
+2014-11-13  Alan Lawrence  <alan.lawrence@arm.com>
+
+       * optabs.c (shift_amt_for_vec_perm_mask): Remove code conditional on
+       BYTES_BIG_ENDIAN.
+       * tree-vect-loop.c (calc_vec_perm_mask_for_shift,
+       vect_create_epilog_for_reduction): Likewise.
+       * doc/md.texi (vec_shr_m): Clarify direction of shifting.
+
 2014-11-14  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
        PR target/63724
index 6404147..b8e5ac5 100644 (file)
@@ -4798,7 +4798,7 @@ of a wider mode.)
 
 @cindex @code{vec_shr_@var{m}} instruction pattern
 @item @samp{vec_shr_@var{m}}
-Whole vector right shift in bits.
+Whole vector right shift in bits, i.e. towards element 0.
 Operand 1 is a vector to be shifted.
 Operand 2 is an integer shift amount in bits.
 Operand 0 is where the resulting shifted vector is stored.
index f6548c3..0acedb9 100644 (file)
@@ -6618,8 +6618,6 @@ shift_amt_for_vec_perm_mask (rtx sel)
        return NULL_RTX;
     }
 
-  if (BYTES_BIG_ENDIAN)
-    first = (2 * nelt) - first;
   return GEN_INT (first * bitsize);
 }
 
index 7aa5862..5e66dcf 100644 (file)
@@ -3092,7 +3092,7 @@ calc_vec_perm_mask_for_shift (enum machine_mode mode, unsigned int offset,
   unsigned int i, nelt = GET_MODE_NUNITS (mode);
 
   for (i = 0; i < nelt; i++)
-    sel[i] = (BYTES_BIG_ENDIAN ? i - offset : i + offset) & (2*nelt - 1);
+    sel[i] = (i + offset) & (2*nelt - 1);
 }
 
 /* Checks whether the target supports whole-vector shifts for vectors of mode
@@ -3907,7 +3907,7 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple stmt,
   gimple epilog_stmt = NULL;
   enum tree_code code = gimple_assign_rhs_code (stmt);
   gimple exit_phi;
-  tree bitsize, bitpos;
+  tree bitsize;
   tree adjustment_def = NULL;
   tree vec_initial_def = NULL;
   tree reduction_op, expr, def;
@@ -4417,14 +4417,8 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple stmt,
         dump_printf_loc (MSG_NOTE, vect_location,
                         "extract scalar result\n");
 
-      if (BYTES_BIG_ENDIAN)
-        bitpos = size_binop (MULT_EXPR,
-                             bitsize_int (TYPE_VECTOR_SUBPARTS (vectype) - 1),
-                             TYPE_SIZE (scalar_type));
-      else
-        bitpos = bitsize_zero_node;
-
-      rhs = build3 (BIT_FIELD_REF, scalar_type, new_temp, bitsize, bitpos);
+      rhs = build3 (BIT_FIELD_REF, scalar_type,
+                   new_temp, bitsize, bitsize_zero_node);
       epilog_stmt = gimple_build_assign (new_scalar_dest, rhs);
       new_temp = make_ssa_name (new_scalar_dest, epilog_stmt);
       gimple_assign_set_lhs (epilog_stmt, new_temp);