aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Edelsohn <dje.gcc@gmail.com>2015-06-15 22:17:47 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2015-06-15 18:17:47 -0400
commit7faaf44a7f673db903e6b85b2d8d30e189622973 (patch)
treecdab896ac09385982e7d4583b66c52bd621ecd88 /gcc
parent6a0f8c015e787ad40bca94c72d34911368762db9 (diff)
downloadgcc-7faaf44a7f673db903e6b85b2d8d30e189622973.zip
gcc-7faaf44a7f673db903e6b85b2d8d30e189622973.tar.gz
gcc-7faaf44a7f673db903e6b85b2d8d30e189622973.tar.bz2
altivec.md: Delete UNSPEC_VMLADDUHM.
* altivec.md: Delete UNSPEC_VMLADDUHM. (mulv4si3_p8): New pattern. (mulv4si3): Use it for POWER8. (mulv8hi3): Use vmladduhm with zero addend. (altivec_vmladduhm): Descriptive RTL. From-SVN: r224494
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rs6000/altivec.md115
2 files changed, 62 insertions, 61 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 812cb7a..019e211 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2015-06-15 David Edelsohn <dje.gcc@gmail.com>
+
+ * altivec.md: Delete UNSPEC_VMLADDUHM.
+ (mulv4si3_p8): New pattern.
+ (mulv4si3): Use it for POWER8.
+ (mulv8hi3): Use vmladduhm with zero addend.
+ (altivec_vmladduhm): Descriptive RTL.
+
2015-06-15 Jim Wilson <jim.wilson@linaro.org>
* config/aarch64/aarch64.md (mov<mode>_aarch64): Change alternative 2
diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
index b27ee35..5cc0b03 100644
--- a/gcc/config/rs6000/altivec.md
+++ b/gcc/config/rs6000/altivec.md
@@ -27,7 +27,6 @@
UNSPEC_VMSUMSHS
UNSPEC_VMHADDSHS
UNSPEC_VMHRADDSHS
- UNSPEC_VMLADDUHM
UNSPEC_VADDCUW
UNSPEC_VADDU
UNSPEC_VADDS
@@ -634,84 +633,79 @@
;; [(set (match_operand:V4SI 0 "register_operand" "=v")
;; (mult:V4SI (match_operand:V4SI 1 "register_operand" "v")
;; (match_operand:V4SI 2 "register_operand" "v")))]
+(define_insn "mulv4si3_p8"
+ [(set (match_operand:V4SI 0 "register_operand" "=v")
+ (mult:V4SI (match_operand:V4SI 1 "register_operand" "v")
+ (match_operand:V4SI 2 "register_operand" "v")))]
+ "TARGET_P8_VECTOR"
+ "vmuluwm %0,%1,%2"
+ [(set_attr "type" "veccomplex")])
+
(define_expand "mulv4si3"
[(use (match_operand:V4SI 0 "register_operand" ""))
(use (match_operand:V4SI 1 "register_operand" ""))
(use (match_operand:V4SI 2 "register_operand" ""))]
"TARGET_ALTIVEC"
- "
- {
- rtx zero;
- rtx swap;
- rtx small_swap;
- rtx sixteen;
- rtx one;
- rtx two;
- rtx low_product;
- rtx high_product;
+{
+ rtx zero;
+ rtx swap;
+ rtx small_swap;
+ rtx sixteen;
+ rtx one;
+ rtx two;
+ rtx low_product;
+ rtx high_product;
- zero = gen_reg_rtx (V4SImode);
- emit_insn (gen_altivec_vspltisw (zero, const0_rtx));
+ if (TARGET_P8_VECTOR)
+ {
+ emit_insn (gen_mulv4si3_p8 (operands[0], operands[1], operands[2]));
+ DONE;
+ }
+
+ zero = gen_reg_rtx (V4SImode);
+ emit_insn (gen_altivec_vspltisw (zero, const0_rtx));
- sixteen = gen_reg_rtx (V4SImode);
- emit_insn (gen_altivec_vspltisw (sixteen, gen_rtx_CONST_INT (V4SImode, -16)));
+ sixteen = gen_reg_rtx (V4SImode);
+ emit_insn (gen_altivec_vspltisw (sixteen, gen_rtx_CONST_INT (V4SImode, -16)));
- swap = gen_reg_rtx (V4SImode);
- emit_insn (gen_vrotlv4si3 (swap, operands[2], sixteen));
+ swap = gen_reg_rtx (V4SImode);
+ emit_insn (gen_vrotlv4si3 (swap, operands[2], sixteen));
- one = gen_reg_rtx (V8HImode);
- convert_move (one, operands[1], 0);
+ one = gen_reg_rtx (V8HImode);
+ convert_move (one, operands[1], 0);
- two = gen_reg_rtx (V8HImode);
- convert_move (two, operands[2], 0);
+ two = gen_reg_rtx (V8HImode);
+ convert_move (two, operands[2], 0);
- small_swap = gen_reg_rtx (V8HImode);
- convert_move (small_swap, swap, 0);
+ small_swap = gen_reg_rtx (V8HImode);
+ convert_move (small_swap, swap, 0);
- low_product = gen_reg_rtx (V4SImode);
- emit_insn (gen_altivec_vmulouh (low_product, one, two));
+ low_product = gen_reg_rtx (V4SImode);
+ emit_insn (gen_altivec_vmulouh (low_product, one, two));
- high_product = gen_reg_rtx (V4SImode);
- emit_insn (gen_altivec_vmsumuhm (high_product, one, small_swap, zero));
+ high_product = gen_reg_rtx (V4SImode);
+ emit_insn (gen_altivec_vmsumuhm (high_product, one, small_swap, zero));
- emit_insn (gen_vashlv4si3 (high_product, high_product, sixteen));
+ emit_insn (gen_vashlv4si3 (high_product, high_product, sixteen));
- emit_insn (gen_addv4si3 (operands[0], high_product, low_product));
+ emit_insn (gen_addv4si3 (operands[0], high_product, low_product));
- DONE;
- }")
+ DONE;
+})
(define_expand "mulv8hi3"
[(use (match_operand:V8HI 0 "register_operand" ""))
(use (match_operand:V8HI 1 "register_operand" ""))
(use (match_operand:V8HI 2 "register_operand" ""))]
"TARGET_ALTIVEC"
- "
-{
- rtx odd = gen_reg_rtx (V4SImode);
- rtx even = gen_reg_rtx (V4SImode);
- rtx high = gen_reg_rtx (V4SImode);
- rtx low = gen_reg_rtx (V4SImode);
-
- if (BYTES_BIG_ENDIAN)
- {
- emit_insn (gen_altivec_vmulesh (even, operands[1], operands[2]));
- emit_insn (gen_altivec_vmulosh (odd, operands[1], operands[2]));
- emit_insn (gen_altivec_vmrghw_direct (high, even, odd));
- emit_insn (gen_altivec_vmrglw_direct (low, even, odd));
- emit_insn (gen_altivec_vpkuwum_direct (operands[0], high, low));
- }
- else
- {
- emit_insn (gen_altivec_vmulosh (even, operands[1], operands[2]));
- emit_insn (gen_altivec_vmulesh (odd, operands[1], operands[2]));
- emit_insn (gen_altivec_vmrghw_direct (high, odd, even));
- emit_insn (gen_altivec_vmrglw_direct (low, odd, even));
- emit_insn (gen_altivec_vpkuwum_direct (operands[0], low, high));
- }
-
- DONE;
-}")
+{
+ rtx zero = gen_reg_rtx (V8HImode);
+
+ emit_insn (gen_altivec_vspltish (zero, const0_rtx));
+ emit_insn (gen_altivec_vmladduhm(operands[0], operands[1], operands[2], zero));
+
+ DONE;
+})
;; Fused multiply subtract
(define_insn "*altivec_vnmsubfp"
@@ -851,10 +845,9 @@
(define_insn "altivec_vmladduhm"
[(set (match_operand:V8HI 0 "register_operand" "=v")
- (unspec:V8HI [(match_operand:V8HI 1 "register_operand" "v")
- (match_operand:V8HI 2 "register_operand" "v")
- (match_operand:V8HI 3 "register_operand" "v")]
- UNSPEC_VMLADDUHM))]
+ (plus:V8HI (mult:V8HI (match_operand:V8HI 1 "register_operand" "v")
+ (match_operand:V8HI 2 "register_operand" "v"))
+ (match_operand:V8HI 3 "register_operand" "v")))]
"TARGET_ALTIVEC"
"vmladduhm %0,%1,%2,%3"
[(set_attr "type" "veccomplex")])