This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, PowerPC] altivec_expand_vec_perm_const selects wrong field for splat in LE mode
- From: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: dje at gcc dot gnu dot org
- Date: Tue, 23 Jul 2013 12:10:46 -0500
- Subject: [PATCH, PowerPC] altivec_expand_vec_perm_const selects wrong field for splat in LE mode
This patch fixes another small little-endian problem with vectors on
PowerPC. Element numbering is reversed when selecting a field for a
vector splat operation. Fixing this removes a regression from the test
suite when run in LE mode (gcc.dg/vect/slp-perm-3.c).
Patch by Anton Blanchard. Bootstrapped and tested on
powerpc64-unknown-linux-gnu with no new regressions. Ok for trunk?
Thanks,
Bill
2013-07-23 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
Anton Blanchard <anton@au1.ibm.com>
* config/rs6000/rs6000.c (altivec_expand_vec_perm_const): Correct
selection of field for vector splat in little endian mode.
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c (revision 201149)
+++ gcc/config/rs6000/rs6000.c (working copy)
@@ -28460,9 +28460,10 @@ altivec_expand_vec_perm_const (rtx operands[4])
break;
if (i == 16)
{
+ int field = BYTES_BIG_ENDIAN ? elt / 2 : 7 - elt / 2;
x = gen_reg_rtx (V8HImode);
emit_insn (gen_altivec_vsplth (x, gen_lowpart (V8HImode, op0),
- GEN_INT (elt / 2)));
+ GEN_INT (field)));
emit_move_insn (target, gen_lowpart (V16QImode, x));
return true;
}
@@ -28478,9 +28479,10 @@ altivec_expand_vec_perm_const (rtx operands[4])
break;
if (i == 16)
{
+ int field = BYTES_BIG_ENDIAN ? elt / 4 : 3 - elt / 4;
x = gen_reg_rtx (V4SImode);
emit_insn (gen_altivec_vspltw (x, gen_lowpart (V4SImode, op0),
- GEN_INT (elt / 4)));
+ GEN_INT (field)));
emit_move_insn (target, gen_lowpart (V16QImode, x));
return true;
}