diff options
author | Alan Lawrence <alan.lawrence@arm.com> | 2014-11-14 11:18:21 +0000 |
---|---|---|
committer | Alan Lawrence <alalaw01@gcc.gnu.org> | 2014-11-14 11:18:21 +0000 |
commit | ba067536a7c03b18bb8dcb5bdf3126d2997dafda (patch) | |
tree | 7fbb9f6107ef0d703aea46a134e9f95630ea4e94 /gcc | |
parent | ebaea9baf55808fed2b41462fe6038b4512d9fde (diff) | |
download | gcc-ba067536a7c03b18bb8dcb5bdf3126d2997dafda.zip gcc-ba067536a7c03b18bb8dcb5bdf3126d2997dafda.tar.gz gcc-ba067536a7c03b18bb8dcb5bdf3126d2997dafda.tar.bz2 |
[RS6000] Remove vec_shl and (hopefully) fix vec_shr
* config/rs6000/vector.md (vec_shl_<mode>): Remove.
(vec_shr_<mode>): Reverse shift if BYTES_BIG_ENDIAN.
From-SVN: r217552
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/rs6000/vector.md | 48 |
2 files changed, 9 insertions, 44 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 46a5f8b..5e4a668 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2014-11-14 Alan Lawrence <alan.lawrence@arm.com> + * config/rs6000/vector.md (vec_shl_<mode>): Remove. + (vec_shr_<mode>): Reverse shift if BYTES_BIG_ENDIAN. + +2014-11-14 Alan Lawrence <alan.lawrence@arm.com> + * optabs.c (shift_amt_for_vec_perm_mask): Remove code conditional on BYTES_BIG_ENDIAN. * tree-vect-loop.c (calc_vec_perm_mask_for_shift, diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md index 237724e..04f4538 100644 --- a/gcc/config/rs6000/vector.md +++ b/gcc/config/rs6000/vector.md @@ -960,53 +960,11 @@ "VECTOR_MEM_VSX_P (<MODE>mode) && TARGET_ALLOW_MOVMISALIGN" "") - -;; Vector shift left in bits. Currently supported ony for shift -;; amounts that can be expressed as byte shifts (divisible by 8). -;; General shift amounts can be supported using vslo + vsl. We're -;; not expecting to see these yet (the vectorizer currently -;; generates only shifts divisible by byte_size). -(define_expand "vec_shl_<mode>" - [(match_operand:VEC_L 0 "vlogical_operand" "") - (match_operand:VEC_L 1 "vlogical_operand" "") - (match_operand:QI 2 "reg_or_short_operand" "")] - "TARGET_ALTIVEC" - " -{ - rtx bitshift = operands[2]; - rtx shift; - rtx insn; - HOST_WIDE_INT bitshift_val; - HOST_WIDE_INT byteshift_val; - - if (! CONSTANT_P (bitshift)) - FAIL; - bitshift_val = INTVAL (bitshift); - if (bitshift_val & 0x7) - FAIL; - byteshift_val = bitshift_val >> 3; - if (TARGET_VSX && (byteshift_val & 0x3) == 0) - { - shift = gen_rtx_CONST_INT (QImode, byteshift_val >> 2); - insn = gen_vsx_xxsldwi_<mode> (operands[0], operands[1], operands[1], - shift); - } - else - { - shift = gen_rtx_CONST_INT (QImode, byteshift_val); - insn = gen_altivec_vsldoi_<mode> (operands[0], operands[1], operands[1], - shift); - } - - emit_insn (insn); - DONE; -}") - ;; Vector shift right in bits. Currently supported ony for shift ;; amounts that can be expressed as byte shifts (divisible by 8). ;; General shift amounts can be supported using vsro + vsr. We're ;; not expecting to see these yet (the vectorizer currently -;; generates only shifts divisible by byte_size). +;; generates only shifts by a whole number of vector elements). (define_expand "vec_shr_<mode>" [(match_operand:VEC_L 0 "vlogical_operand" "") (match_operand:VEC_L 1 "vlogical_operand" "") @@ -1025,7 +983,9 @@ bitshift_val = INTVAL (bitshift); if (bitshift_val & 0x7) FAIL; - byteshift_val = 16 - (bitshift_val >> 3); + byteshift_val = (bitshift_val >> 3); + if (!BYTES_BIG_ENDIAN) + byteshift_val = 16 - byteshift_val; if (TARGET_VSX && (byteshift_val & 0x3) == 0) { shift = gen_rtx_CONST_INT (QImode, byteshift_val >> 2); |