Hi, Now that I have Power8 hardware to test on, I've discovered that I introduced a problem with http://gcc.gnu.org/ml/gcc-patches/2014-01/msg01547.html that causes a bootstrap failure when specifying -mcpu=power8. I moved some logic from rs6000_expand_vec_perm_const_1 into vsx_xxpermdi2_<mode>_1. I failed to notice there is another path into vsx_xxpermdi2_<mode>_1 that is exercised during the bootstrap.
To avoid the problem, this patch adjusts the code generated along this other path so that the later transformation will be correct. Bootstrapped and tested on powerpc64{,le}-unknown-linux-gnu configured both with -mcpu=power7 and with -mcpu=power8 with no regressions. The Power8 LE bootstrap now completes cleanly. Is this ok for trunk? Thanks, Bill 2014-02-16 Bill Schmidt <wschm...@linux.vnet.ibm.com> * config/rs6000/vsx.md (vsx_xxpermdi_<mode>): Handle little endian targets. Index: gcc/config/rs6000/vsx.md =================================================================== --- gcc/config/rs6000/vsx.md (revision 207809) +++ gcc/config/rs6000/vsx.md (working copy) @@ -1621,7 +1621,18 @@ op1 = gen_lowpart (V2DImode, op1); } } - emit_insn (gen (target, op0, op1, perm0, perm1)); + /* In little endian mode, vsx_xxpermdi2_<mode>_1 will perform a + transformation we don't want; it is necessary for + rs6000_expand_vec_perm_const_1 but not for this use. So we + prepare for that by reversing the transformation here. */ + if (BYTES_BIG_ENDIAN) + emit_insn (gen (target, op0, op1, perm0, perm1)); + else + { + rtx p0 = GEN_INT (3 - INTVAL (perm1)); + rtx p1 = GEN_INT (3 - INTVAL (perm0)); + emit_insn (gen (target, op1, op0, p0, p1)); + } DONE; })