aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2010-10-23 09:42:24 -0700
committerRichard Henderson <rth@gcc.gnu.org>2010-10-23 09:42:24 -0700
commit487a9a3ef8a77211c02d9f130f2db1f20962a58d (patch)
tree865be7655f55d604099febaa3502c37da71b1475
parent0e1b8b109fb5a19dc3576a14416383299566ff00 (diff)
downloadgcc-487a9a3ef8a77211c02d9f130f2db1f20962a58d.zip
gcc-487a9a3ef8a77211c02d9f130f2db1f20962a58d.tar.gz
gcc-487a9a3ef8a77211c02d9f130f2db1f20962a58d.tar.bz2
re PR target/46144 (gfortran.dg/vect/fast-math-vect-8.f90)
PR target/46144 * config/i386/sse.md (*avx_absneg<AVXMODEF2P>2): New. (*sse_absneg<SSEMODEF2P>2): Rename from *absneg<VEC_FLOAT_MODE>2. Honor matching operands when splitting to XOR. From-SVN: r165885
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/sse.md45
2 files changed, 42 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a2dee2e..bae8197 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-10-23 Richard Henderson <rth@redhat.com>
+
+ PR target/46144
+ * config/i386/sse.md (*avx_absneg<AVXMODEF2P>2): New.
+ (*sse_absneg<SSEMODEF2P>2): Rename from *absneg<VEC_FLOAT_MODE>2.
+ Honor matching operands when splitting to XOR.
+
2010-10-23 Ian Lance Taylor <iant@google.com>
* tree-vrp.c (extract_range_from_binary_expr): If
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index d80be88..ffddf18 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -585,21 +585,46 @@
""
"ix86_expand_fp_absneg_operator (<CODE>, <MODE>mode, operands); DONE;")
-(define_insn_and_split "*absneg<mode>2"
- [(set (match_operand:VEC_FLOAT_MODE 0 "register_operand" "=x,x")
- (match_operator:VEC_FLOAT_MODE 3 "absneg_operator"
- [(match_operand:VEC_FLOAT_MODE 1 "nonimmediate_operand" "0,xm")]))
- (use (match_operand:VEC_FLOAT_MODE 2 "nonimmediate_operand" "xm,0"))]
- "SSE_VEC_FLOAT_MODE_P (<MODE>mode) || AVX256_VEC_FLOAT_MODE_P (<MODE>mode)"
+(define_insn_and_split "*avx_absneg<mode>2"
+ [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x,x")
+ (match_operator:AVXMODEF2P 3 "absneg_operator"
+ [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "x,m")]))
+ (use (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm,x"))]
+ "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
"#"
"&& reload_completed"
[(const_int 0)]
{
- rtx set;
- set = gen_rtx_fmt_ee (GET_CODE (operands[3]) == NEG ? XOR : AND,
+ rtx t;
+
+ if (MEM_P (operands[1]))
+ t = gen_rtx_fmt_ee (GET_CODE (operands[3]) == NEG ? XOR : AND,
+ <MODE>mode, operands[2], operands[1]);
+ else
+ t = gen_rtx_fmt_ee (GET_CODE (operands[3]) == NEG ? XOR : AND,
<MODE>mode, operands[1], operands[2]);
- set = gen_rtx_SET (VOIDmode, operands[0], set);
- emit_insn (set);
+ t = gen_rtx_SET (VOIDmode, operands[0], t);
+ emit_insn (t);
+ DONE;
+})
+
+(define_insn_and_split "*sse_absneg<mode>2"
+ [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
+ (match_operator:SSEMODEF2P 3 "absneg_operator"
+ [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "0,xm")]))
+ (use (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm,0"))]
+ "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
+ "#"
+ "&& reload_completed"
+ [(const_int 0)]
+{
+ rtx t;
+
+ t = operands[rtx_equal_p (operands[0], operands[1]) ? 2 : 1];
+ t = gen_rtx_fmt_ee (GET_CODE (operands[3]) == NEG ? XOR : AND,
+ <MODE>mode, operands[0], t);
+ t = gen_rtx_SET (VOIDmode, operands[0], t);
+ emit_insn (t);
DONE;
})