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;