aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2006-11-10 09:45:47 +0100
committerUros Bizjak <uros@gcc.gnu.org>2006-11-10 09:45:47 +0100
commit0e9dac9e169233b2cd6dcfac54c26b2a77db4808 (patch)
treed3f27279b2ad7508dbc4932a162b2047bbafc59a
parente61e5ddcceb34c5a5dc09febaedb44059d5bc96d (diff)
downloadgcc-0e9dac9e169233b2cd6dcfac54c26b2a77db4808.zip
gcc-0e9dac9e169233b2cd6dcfac54c26b2a77db4808.tar.gz
gcc-0e9dac9e169233b2cd6dcfac54c26b2a77db4808.tar.bz2
re PR tree-optimization/29777 (missed optimization: model missing widen_mult* idioms for SSE)
PR target/29777 * config/i386/sse.md (smulv8hi3_highpart): Change from define_insn to define_expand. (umulv8hi3_highpart): Ditto. (vec_widen_smult_hi_v8hi): New expander. (vec_widen_smult_lo_v8hi): Ditto. testsuite/ChangeLog: PR target/29777 * lib/target-supports.exp (vect_widen_mult_hi_to_si): Add i?86-*-* and x86_64-*-* targets. From-SVN: r118649
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/i386/sse.md44
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/lib/target-supports.exp4
4 files changed, 60 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9c2b589..6ca8f7a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2006-11-10 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/29777
+ * config/i386/sse.md (smulv8hi3_highpart): Change from define_insn
+ to define_expand.
+ (umulv8hi3_highpart): Ditto.
+ (vec_widen_smult_hi_v8hi): New expander.
+ (vec_widen_smult_lo_v8hi): Ditto.
+
2006-11-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.c (do_mpfr_arg3): New.
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 9985b7d..460937f 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -2620,7 +2620,7 @@
[(set_attr "type" "sseimul")
(set_attr "mode" "TI")])
-(define_insn "smulv8hi3_highpart"
+(define_expand "smulv8hi3_highpart"
[(set (match_operand:V8HI 0 "register_operand" "")
(truncate:V8HI
(lshiftrt:V8SI
@@ -2648,7 +2648,7 @@
[(set_attr "type" "sseimul")
(set_attr "mode" "TI")])
-(define_insn "umulv8hi3_highpart"
+(define_expand "umulv8hi3_highpart"
[(set (match_operand:V8HI 0 "register_operand" "")
(truncate:V8HI
(lshiftrt:V8SI
@@ -2818,6 +2818,46 @@
DONE;
})
+(define_expand "vec_widen_smult_hi_v8hi"
+ [(match_operand:V4SI 0 "register_operand" "")
+ (match_operand:V8HI 1 "register_operand" "")
+ (match_operand:V8HI 2 "register_operand" "")]
+ "TARGET_SSE2"
+{
+ rtx op1, op2, t1, t2, dest;
+
+ op1 = operands[1];
+ op2 = operands[2];
+ t1 = gen_reg_rtx (V8HImode);
+ t2 = gen_reg_rtx (V8HImode);
+ dest = gen_lowpart (V8HImode, operands[0]);
+
+ emit_insn (gen_mulv8hi3 (t1, op1, op2));
+ emit_insn (gen_smulv8hi3_highpart (t2, op1, op2));
+ emit_insn (gen_vec_interleave_highv8hi (dest, t1, t2));
+ DONE;
+})
+
+(define_expand "vec_widen_smult_lo_v8hi"
+ [(match_operand:V4SI 0 "register_operand" "")
+ (match_operand:V8HI 1 "register_operand" "")
+ (match_operand:V8HI 2 "register_operand" "")]
+ "TARGET_SSE2"
+{
+ rtx op1, op2, t1, t2, dest;
+
+ op1 = operands[1];
+ op2 = operands[2];
+ t1 = gen_reg_rtx (V8HImode);
+ t2 = gen_reg_rtx (V8HImode);
+ dest = gen_lowpart (V8HImode, operands[0]);
+
+ emit_insn (gen_mulv8hi3 (t1, op1, op2));
+ emit_insn (gen_smulv8hi3_highpart (t2, op1, op2));
+ emit_insn (gen_vec_interleave_lowv8hi (dest, t1, t2));
+ DONE;
+})
+
(define_expand "vec_widen_umult_hi_v8hi"
[(match_operand:V4SI 0 "register_operand" "")
(match_operand:V8HI 1 "register_operand" "")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 659aa50..ec8b83d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2006-11-10 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/29777
+ * lib/target-supports.exp (vect_widen_mult_hi_to_si): Add i?86-*-*
+ and x86_64-*-* targets.
+
2006-11-09 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/torture/builtin-math-2.c: Test builtin fma.
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 8e263a3..2947c08 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -1603,7 +1603,9 @@ proc check_effective_target_vect_widen_mult_hi_to_si { } {
} else {
set et_vect_widen_mult_hi_to_si_saved 0
}
- if { [istarget powerpc*-*-*] } {
+ if { [istarget powerpc*-*-*]
+ || [istarget i?86-*-*]
+ || [istarget x86_64-*-*] } {
set et_vect_widen_mult_hi_to_si_saved 1
}
}