diff options
author | Michael Meissner <meissner@linux.vnet.ibm.com> | 2016-11-11 19:12:12 +0000 |
---|---|---|
committer | Michael Meissner <meissner@gcc.gnu.org> | 2016-11-11 19:12:12 +0000 |
commit | a9c1825cdad013d6551e98ca3cadcf6d28a9ec48 (patch) | |
tree | babc5f5f2ff75ed9804025f3a97c006bf9e013e4 /gcc | |
parent | 9d8f95deca5b9a5ba63c638cf96f4678c68d2bd0 (diff) | |
download | gcc-a9c1825cdad013d6551e98ca3cadcf6d28a9ec48.zip gcc-a9c1825cdad013d6551e98ca3cadcf6d28a9ec48.tar.gz gcc-a9c1825cdad013d6551e98ca3cadcf6d28a9ec48.tar.bz2 |
re PR target/78243 (incorrect byte offset in vextractuh with -mcpu=power9)
2016-11-11 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/78243
* config/rs6000/vsx.md (vsx_extract_<mode>_p9): Correct the
element order for little endian ordering.
* config/rs6000/altivec.md (reduc_plus_scal_<mode>): Use
VECTOR_ELT_ORDER_BIG and not BYTES_BIG_ENDIAN to adjust element
number.
From-SVN: r242317
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/rs6000/altivec.md | 2 | ||||
-rw-r--r-- | gcc/config/rs6000/vsx.md | 11 |
3 files changed, 18 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7dd5931..4011512 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2016-11-11 Michael Meissner <meissner@linux.vnet.ibm.com> + + PR target/78243 + * config/rs6000/vsx.md (vsx_extract_<mode>_p9): Correct the + element order for little endian ordering. + + * config/rs6000/altivec.md (reduc_plus_scal_<mode>): Use + VECTOR_ELT_ORDER_BIG and not BYTES_BIG_ENDIAN to adjust element + number. + 2016-11-11 Uros Bizjak <ubizjak@gmail.com> PR target/78310 diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 5cac839..802aa74 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -2785,7 +2785,7 @@ rtx vtmp1 = gen_reg_rtx (V4SImode); rtx vtmp2 = gen_reg_rtx (<MODE>mode); rtx dest = gen_lowpart (V4SImode, vtmp2); - int elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (<MODE>mode) - 1 : 0; + int elt = VECTOR_ELT_ORDER_BIG ? GET_MODE_NUNITS (<MODE>mode) - 1 : 0; emit_insn (gen_altivec_vspltisw (vzero, const0_rtx)); emit_insn (gen_altivec_vsum4s<VI_char>s (vtmp1, operands[1], vzero)); diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index ebb0f6d..c5a57cb 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -2542,10 +2542,13 @@ "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_VEXTRACTUB && TARGET_VSX_SMALL_INTEGER" { - /* Note, the element number has already been adjusted for endianness, so we - don't have to adjust it here. */ - int unit_size = GET_MODE_UNIT_SIZE (<MODE>mode); - HOST_WIDE_INT offset = unit_size * INTVAL (operands[2]); + HOST_WIDE_INT elt = INTVAL (operands[2]); + HOST_WIDE_INT elt_adj = (!VECTOR_ELT_ORDER_BIG + ? GET_MODE_NUNITS (<MODE>mode) - 1 - elt + : elt); + + HOST_WIDE_INT unit_size = GET_MODE_UNIT_SIZE (<MODE>mode); + HOST_WIDE_INT offset = unit_size * elt_adj; operands[2] = GEN_INT (offset); if (unit_size == 4) |