This patch is another fix for vector handling in little endian mode.
The first two operands for a pack pattern are two vector registers that
form a contiguous array of inputs.  In LE mode the order of the operands
must be reversed so that the array remains contiguous in the reverse
order.

This fixes a failure in the testsuite when run little-endian
(gcc.dg/vect/no-scevccp-outer-18.c).  Bootstrapped and tested big-endian
on powerpc64-unknown-linux-gnu with no new regressions.  Ok for trunk?

Patch by Anton Blanchard.

Thanks,
Bill


2013-07-22  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
            Anton Blanchard <an...@au1.ibm.com>

        * config/rs6000/rs6000.c (altivec_expand_vec_perm_const): Reverse
        two operands for little-endian.


Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c  (revision 201131)
+++ gcc/config/rs6000/rs6000.c  (working copy)
@@ -28526,7 +28529,12 @@ altivec_expand_vec_perm_const (rtx operands[4])
            x = target;
          else
            x = gen_reg_rtx (omode);
-         emit_insn (GEN_FCN (icode) (x, op0, op1));
+         /* For little-endian, the two input operands must be swapped
+            to ensure proper right-to-left numbering from 0 to 2N-1.  */
+         if (BYTES_BIG_ENDIAN)
+           emit_insn (GEN_FCN (icode) (x, op0, op1));
+         else
+           emit_insn (GEN_FCN (icode) (x, op1, op0));
          if (omode != V16QImode)
            emit_move_insn (target, gen_lowpart (V16QImode, x));
          return true;


Reply via email to