From a60561983f0df814863a68d87cef51ab66974864 Mon Sep 17 00:00:00 2001 From: Bill Schmidt Date: Tue, 23 Jul 2013 22:30:58 +0000 Subject: [PATCH] rs6000.c (altivec_expand_vec_perm_const): Correct selection of field for vector splat in little endian mode. 2013-07-23 Bill Schmidt Anton Blanchard * config/rs6000/rs6000.c (altivec_expand_vec_perm_const): Correct selection of field for vector splat in little endian mode. Co-Authored-By: Anton Blanchard From-SVN: r201193 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/rs6000.c | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fe3e041a004..0eed895e65a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-07-23 Bill Schmidt + Anton Blanchard + + * config/rs6000/rs6000.c (altivec_expand_vec_perm_const): Correct + selection of field for vector splat in little endian mode. + 2013-07-23 Michael Meissner * config/rs6000/vector.md (xor3): Move 128-bit boolean diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 8c3cf97faa3..7729188a393 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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; } -- 2.30.2