From 73792b92639b0ded29e5efebb0cd31abb55abd81 Mon Sep 17 00:00:00 2001 From: Bill Schmidt Date: Tue, 23 Jul 2013 22:36:04 +0000 Subject: [PATCH] rs6000.c (altivec_expand_vec_perm_const): Reverse two operands for little-endian. 2013-07-23 Bill Schmidt Anton Blanchard * config/rs6000/rs6000.c (altivec_expand_vec_perm_const): Reverse two operands for little-endian. Co-Authored-By: Anton Blanchard From-SVN: r201195 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/rs6000.c | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20b6b53..9b8d018 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): Reverse + two operands for little-endian. + 2013-07-23 Steve Ellcey * config/mips/mips.c (mips_case_values_threshold): New. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 7729188..a3c9c98 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -28520,7 +28520,10 @@ 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; - if (swapped) + /* 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 (swapped ^ !BYTES_BIG_ENDIAN) x = op0, op0 = op1, op1 = x; if (imode != V16QImode) { -- 2.7.4