]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/30970 (Register zeroing by xor N,N should be moved out of loop)
authorUros Bizjak <ubizjak@gmail.com>
Tue, 27 Feb 2007 21:27:27 +0000 (22:27 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Tue, 27 Feb 2007 21:27:27 +0000 (22:27 +0100)
        PR target/30970
        * config/i386/sse.md (*mov<mode>_internal, *movv4sf_internal,
        *movv2df_internal): Enable pattern only for valid operand
        combinations.
        * config/i386/i386.c (ix86_modes_tieable_p): For SSE registers,
        tie only 128bit modes. For MMX registers, tie only 64bit modes.

testsuite/ChangeLog:

PR target/30970
* gcc.target/i386/gfortran.dg/pr30970.c: New test.

From-SVN: r122387

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr30970.c [new file with mode: 0644]

index 31a40de2e784e1fa11d60d33231058f62548c1a0..dc5a8d14d623eb77ed39f348a1c6bd571f20783b 100644 (file)
@@ -1,3 +1,12 @@
+2007-02-27  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/30970
+       * config/i386/sse.md (*mov<mode>_internal, *movv4sf_internal,
+       *movv2df_internal): Enable pattern only for valid operand
+       combinations.
+       * config/i386/i386.c (ix86_modes_tieable_p): For SSE registers,
+       tie only 128bit modes. For MMX registers, tie only 64bit modes.
+
 2007-02-27  Mike Stump  <mrs@apple.com>
 
        * config/darwin-crt3.c: Avoid compilation when compiling for a
index 5a4e1d5e4c6c68449e46d75f63058a6511b9177e..c0208301afd4f16515006ea7deb9b8e3365bed4a 100644 (file)
@@ -18783,15 +18783,17 @@ ix86_modes_tieable_p (enum machine_mode mode1, enum machine_mode mode2)
 
   /* If MODE2 is only appropriate for an SSE register, then tie with
      any other mode acceptable to SSE registers.  */
-  if (GET_MODE_SIZE (mode2) >= 8
+  if (GET_MODE_SIZE (mode2) == 16
       && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode2))
-    return ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1);
+    return (GET_MODE_SIZE (mode1) == 16
+           && ix86_hard_regno_mode_ok (FIRST_SSE_REG, mode1));
 
-  /* If MODE2 is appropriate for an MMX (or SSE) register, then tie
+  /* If MODE2 is appropriate for an MMX register, then tie
      with any other mode acceptable to MMX registers.  */
   if (GET_MODE_SIZE (mode2) == 8
       && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode2))
-    return ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1);
+    return (GET_MODE_SIZE (mode2) == 8
+           && ix86_hard_regno_mode_ok (FIRST_MMX_REG, mode1));
 
   return false;
 }
index 512a8f9bfdf11065e2e30ec879a8ab86e2b23aa7..cc123cc3510349f01bb35f0b994b17f41c9e1284 100644 (file)
@@ -60,7 +60,9 @@
 (define_insn "*mov<mode>_internal"
   [(set (match_operand:SSEMODEI 0 "nonimmediate_operand" "=x,x ,m")
        (match_operand:SSEMODEI 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
-  "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+  "TARGET_SSE
+   && (register_operand (operands[0], <MODE>mode)
+       || register_operand (operands[1], <MODE>mode))"
 {
   switch (which_alternative)
     {
 (define_insn "*movv4sf_internal"
   [(set (match_operand:V4SF 0 "nonimmediate_operand" "=x,x,m")
        (match_operand:V4SF 1 "nonimmediate_or_sse_const_operand" "C,xm,x"))]
-  "TARGET_SSE"
+  "TARGET_SSE
+   && (register_operand (operands[0], V4SFmode)
+       || register_operand (operands[1], V4SFmode))"
 {
   switch (which_alternative)
     {
 (define_insn "*movv2df_internal"
   [(set (match_operand:V2DF 0 "nonimmediate_operand" "=x,x,m")
        (match_operand:V2DF 1 "nonimmediate_or_sse_const_operand" "C,xm,x"))]
-  "TARGET_SSE && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+  "TARGET_SSE
+   && (register_operand (operands[0], V2DFmode)
+       || register_operand (operands[1], V2DFmode))"
 {
   switch (which_alternative)
     {
index cf07c57ad94810536e0dcd19554b5ee87ccc83a4..1b31b2feef8a87be19545d02ccd285152f856854 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-27  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/30970
+       * gcc.target/i386/gfortran.dg/pr30970.c: New test. 
+
 2007-02-27  Mark Mitchell  <mark@codesourcery.com>
 
        * lib/target-supports.exp (check_effective_target_init_priority):
diff --git a/gcc/testsuite/gcc.target/i386/pr30970.c b/gcc/testsuite/gcc.target/i386/pr30970.c
new file mode 100644 (file)
index 0000000..5ee7cb3
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } }
+/* { dg-options "-msse2 -O2 -ftree-vectorize" } */
+
+#define N 256
+int b[N];
+
+void test()
+{  
+  int i;
+
+  for (i = 0; i < N; i++)
+    b[i] = 0;
+}
+
+/* { dg-final { scan-assembler-times "pxor" 1 } } */