diff options
author | Richard Henderson <rth@redhat.com> | 2010-10-23 09:42:24 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2010-10-23 09:42:24 -0700 |
commit | 487a9a3ef8a77211c02d9f130f2db1f20962a58d (patch) | |
tree | 865be7655f55d604099febaa3502c37da71b1475 | |
parent | 0e1b8b109fb5a19dc3576a14416383299566ff00 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/sse.md | 45 |
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; }) |