diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr47800.c | 15 |
4 files changed, 33 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 30c524a..c5bd191 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-02-19 Jakub Jelinek <jakub@redhat.com> + + PR target/47800 + * config/i386/i386.md (peephole2 for shift and plus): Use + operands[1] original mode in the first insn. + 2011-02-18 Mike Stump <mikestump@comcast.net> * config/t-darwin (TM_H): Add dependency on darwin-sections.def. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 1f14f5c..a17ab7a 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -1,6 +1,6 @@ ;; GCC machine description for IA-32 and x86-64. ;; Copyright (C) 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +;; 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 ;; Free Software Foundation, Inc. ;; Mostly by William Schelter. ;; x86_64 support added by Jan Hubicka @@ -17461,7 +17461,7 @@ (plus (match_dup 0) (match_operand 4 "x86_64_general_operand" ""))) (clobber (reg:CC FLAGS_REG))])] - "INTVAL (operands[2]) >= 0 && INTVAL (operands[2]) <= 3 + "IN_RANGE (INTVAL (operands[2]), 1, 3) /* Validate MODE for lea. */ && ((!TARGET_PARTIAL_REG_STALL && (GET_MODE (operands[0]) == QImode @@ -17475,7 +17475,8 @@ [(set (match_dup 5) (match_dup 4)) (set (match_dup 0) (match_dup 1))] { - enum machine_mode mode = GET_MODE (operands[1]) == DImode ? DImode : SImode; + enum machine_mode op1mode = GET_MODE (operands[1]); + enum machine_mode mode = op1mode == DImode ? DImode : SImode; int scale = 1 << INTVAL (operands[2]); rtx index = gen_lowpart (Pmode, operands[1]); rtx base = gen_lowpart (Pmode, operands[5]); @@ -17485,10 +17486,9 @@ gen_rtx_MULT (Pmode, index, GEN_INT (scale))); operands[5] = base; if (mode != Pmode) - { - operands[1] = gen_rtx_SUBREG (mode, operands[1], 0); - operands[5] = gen_rtx_SUBREG (mode, operands[5], 0); - } + operands[1] = gen_rtx_SUBREG (mode, operands[1], 0); + if (op1mode != Pmode) + operands[5] = gen_rtx_SUBREG (op1mode, operands[5], 0); operands[0] = dest; }) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8dc3c71..be5a006 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-02-19 Jakub Jelinek <jakub@redhat.com> + + PR target/47800 + * gcc.target/i386/pr47800.c: New test. + 2011-02-18 Iain Sandoe <iains@gcc.gnu.org> * objc/execute/exceptions/foward-1.x: New. diff --git a/gcc/testsuite/gcc.target/i386/pr47800.c b/gcc/testsuite/gcc.target/i386/pr47800.c new file mode 100644 index 0000000..45c817b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr47800.c @@ -0,0 +1,15 @@ +/* PR target/47800 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -march=nocona" } */ + +int +foo (unsigned char *x, unsigned char *y) +{ + unsigned char a; + for (a = 0; x < y; x++) + if (a & 0x80) + a = (unsigned char) (a << 1) + 1 + *x; + else + a = (unsigned char) (a << 1) + *x; + return a; +} |