On Mon, 2013-07-22 at 19:49 -0400, David Edelsohn wrote:
> On Mon, Jul 22, 2013 at 7:05 PM, Bill Schmidt
> <[email protected]> wrote:
> > 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 <[email protected]>
> > Anton Blanchard <[email protected]>
> >
> > * config/rs6000/rs6000.c (altivec_expand_vec_perm_const): Reverse
> > two operands for little-endian.
>
> Wouldn't it be better to handle this where the code is performing a
> swap a few lines above?
OK, currently testing the following. OK if it passes?
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 201149)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -28518,6 +28518,11 @@ altivec_expand_vec_perm_const (rtx operands[4])
enum machine_mode omode = insn_data[icode].operand[0].mode;
enum machine_mode imode = insn_data[icode].operand[1].mode;
+ /* For little-endian, the two input operands must be swapped
+ (or swapped back) to ensure proper right-to-left numbering
+ from 0 to 2N-1. */
+ if (!BYTES_BIG_ENDIAN)
+ swapped = !swapped;
if (swapped)
x = op0, op0 = op1, op1 = x;
if (imode != V16QImode)
Thanks,
Bill
>
> Thanks, David
>