summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-09 05:34:10 +0000
committerhjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-09 05:34:10 +0000
commit678451e45df34d26de6b7aaf7209cc7ef28fb4bb (patch)
treea03d22c398b076fd0e62a1a69c9e07cc59f07611
parentca56294027990f3885aa152e55c2e6a26004b01f (diff)
downloadppe42-gcc-678451e45df34d26de6b7aaf7209cc7ef28fb4bb.tar.gz
ppe42-gcc-678451e45df34d26de6b7aaf7209cc7ef28fb4bb.zip
Support "andhi/andsi/anddi" as a zero-extending move.
gcc/ 2010-10-08 H.J. Lu <hongjiu.lu@intel.com> PR target/45913 * config/i386/i386.c (ix86_binary_operator_ok): Support "andhi/andsi/anddi" as a zero-extending move. gcc/testsuite/ 2010-10-08 H.J. Lu <hongjiu.lu@intel.com> PR target/45913 * gcc.target/i386/pr45913.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165215 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr45913.c23
4 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a560cc701b3..538551d85b8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-10-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/45913
+ * config/i386/i386.c (ix86_binary_operator_ok): Support
+ "andhi/andsi/anddi" as a zero-extending move.
+
2010-10-08 Nathan Froyd <froydnj@codesourcery.com>
* builtins.c (fold_call_stmt): Don't copy gimple call arguments
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 33510a77c59..999c7160a57 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -14987,7 +14987,16 @@ ix86_binary_operator_ok (enum rtx_code code, enum machine_mode mode,
/* Source 1 cannot be a non-matching memory. */
if (MEM_P (src1) && !rtx_equal_p (dst, src1))
- return false;
+ {
+ /* Support "andhi/andsi/anddi" as a zero-extending move. */
+ return (code == AND
+ && (mode == HImode
+ || mode == SImode
+ || (TARGET_64BIT && mode == DImode))
+ && CONST_INT_P (src2)
+ && (INTVAL (src2) == 0xff
+ || INTVAL (src2) == 0xffff));
+ }
return true;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a5764707b1c..9c2d0df5abd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-08 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/45913
+ * gcc.target/i386/pr45913.c: New.
+
2010-10-08 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/45943
diff --git a/gcc/testsuite/gcc.target/i386/pr45913.c b/gcc/testsuite/gcc.target/i386/pr45913.c
new file mode 100644
index 00000000000..46b9c66f8cd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr45913.c
@@ -0,0 +1,23 @@
+/* PR target/45913 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fselective-scheduling2 -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops" } */
+
+extern void bar (int, int);
+
+int ss[128];
+
+void
+foo (int i, int j, int k, int *p1, int *p2)
+{
+ int s[128];
+ __builtin_memcpy (s, ss, sizeof s);
+
+ while (i--)
+ {
+ int a = s[i];
+ while (j--)
+ bar (k, p2[a]);
+ j = s[i] & 0xFF;
+ bar (p1[a], k);
+ }
+}
OpenPOWER on IntegriCloud