aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-06-07 10:21:05 -0700
committerRichard Henderson <rth@gcc.gnu.org>2004-06-07 10:21:05 -0700
commit5c64c9001b34df259ef676ec1af22a652dcd3607 (patch)
tree5e74f52ca677863288bf42f1e90e033f30e5e686 /gcc
parent07d5edd25f93b247c49250803a3e37b8f17027b2 (diff)
downloadgcc-5c64c9001b34df259ef676ec1af22a652dcd3607.zip
gcc-5c64c9001b34df259ef676ec1af22a652dcd3607.tar.gz
gcc-5c64c9001b34df259ef676ec1af22a652dcd3607.tar.bz2
re PR rtl-optimization/15193 (Unary minus using pointer to V4SF vector causes -fforce-mem to exhaust all memory)
PR rtl-opt/15193 * expmed.c (extract_bit_field): Fix vector_extract return. * config/i386/i386.md (negv4sf2): New pattern. From-SVN: r82699
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386.md12
-rw-r--r--gcc/expmed.c5
3 files changed, 21 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4ba070b..a096a8a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-06-07 Richard Henderson <rth@redhat.com>
+
+ PR rtl-opt/15193
+ * expmed.c (extract_bit_field): Fix vector_extract return.
+
+ * config/i386/i386.md (negv4sf2): New pattern.
+
2004-06-07 Mark Mitchell <mark@codesourcery.com>
PR c++/15337
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 770a7af..ed2c579 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -20404,6 +20404,18 @@
[(set_attr "type" "sseadd")
(set_attr "mode" "SF")])
+;; ??? Should probably be done by generic code instead.
+(define_expand "negv4sf2"
+ [(set (match_operand:V4SF 0 "register_operand" "")
+ (xor:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "")
+ (match_dup 2)))]
+ "TARGET_SSE"
+{
+ rtx m0 = gen_lowpart (SFmode, gen_int_mode (0x80000000, SImode));
+ rtx vm0 = gen_rtx_CONST_VECTOR (V4SFmode, gen_rtvec (4, m0, m0, m0, m0));
+ operands[2] = force_reg (V4SFmode, vm0);
+})
+
(define_insn "mulv4sf3"
[(set (match_operand:V4SF 0 "register_operand" "=x")
(mult:V4SF (match_operand:V4SF 1 "register_operand" "0")
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 3751bc5..9679b71 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -1125,6 +1125,7 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
|| ! (*insn_data[icode].operand[1].predicate) (src, mode1)
|| ! (*insn_data[icode].operand[2].predicate) (rtxpos, mode2))
abort ();
+
pat = GEN_FCN (icode) (dest, src, rtxpos);
seq = get_insns ();
end_sequence ();
@@ -1132,9 +1133,7 @@ extract_bit_field (rtx str_rtx, unsigned HOST_WIDE_INT bitsize,
{
emit_insn (seq);
emit_insn (pat);
- return extract_bit_field (dest, bitsize,
- bitnum - pos * GET_MODE_BITSIZE (innermode),
- unsignedp, target, mode, tmode, total_size);
+ return dest;
}
}