Blame SOURCES/gcc44-pr53199.patch

f28b6a
2012-05-03  Michael Meissner  <meissner@linux.vnet.ibm.com>
f28b6a
f28b6a
	PR target/53199
f28b6a
	* config/rs6000/rs6000.md (bswapdi splitters): If
f28b6a
	-mavoid-indexed-addresses (or -mcpu=power6 which sets it by
f28b6a
	default) is used, generate an alternate sequence that does not
f28b6a
	depend on using indexed addressing.
f28b6a
f28b6a
	* gcc.target/powwerpc/pr53199.c: New file.
f28b6a
f28b6a
--- gcc/config/rs6000/rs6000.md	(revision 187118)
f28b6a
+++ gcc/config/rs6000/rs6000.md	(revision 187119)
f28b6a
@@ -2456,7 +2456,18 @@ (define_split
f28b6a
   if (GET_CODE (addr1) == PLUS)
f28b6a
     {
f28b6a
       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
f28b6a
-      addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
f28b6a
+      if (TARGET_AVOID_XFORM)
f28b6a
+	{
f28b6a
+	  emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
f28b6a
+	  addr2 = op2;
f28b6a
+	}
f28b6a
+      else
f28b6a
+	addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
f28b6a
+    }
f28b6a
+  else if (TARGET_AVOID_XFORM)
f28b6a
+    {
f28b6a
+      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
f28b6a
+      addr2 = op2;
f28b6a
     }
f28b6a
   else
f28b6a
     {
f28b6a
@@ -2506,7 +2517,18 @@ (define_split
f28b6a
   if (GET_CODE (addr1) == PLUS)
f28b6a
     {
f28b6a
       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
f28b6a
-      addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
f28b6a
+      if (TARGET_AVOID_XFORM)
f28b6a
+	{
f28b6a
+	  emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
f28b6a
+	  addr2 = op2;
f28b6a
+	}
f28b6a
+      else
f28b6a
+	addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
f28b6a
+    }
f28b6a
+  else if (TARGET_AVOID_XFORM)
f28b6a
+    {
f28b6a
+      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
f28b6a
+      addr2 = op2;
f28b6a
     }
f28b6a
   else
f28b6a
     {
f28b6a
@@ -2587,7 +2609,18 @@ (define_split
f28b6a
   if (GET_CODE (addr1) == PLUS)
f28b6a
     {
f28b6a
       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
f28b6a
-      addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
f28b6a
+      if (TARGET_AVOID_XFORM)
f28b6a
+	{
f28b6a
+	  emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
f28b6a
+	  addr2 = op2;
f28b6a
+	}
f28b6a
+      else
f28b6a
+	addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
f28b6a
+    }
f28b6a
+  else if (TARGET_AVOID_XFORM)
f28b6a
+    {
f28b6a
+      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
f28b6a
+      addr2 = op2;
f28b6a
     }
f28b6a
   else
f28b6a
     {
f28b6a
@@ -2632,7 +2665,18 @@ (define_split
f28b6a
   if (GET_CODE (addr1) == PLUS)
f28b6a
     {
f28b6a
       emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
f28b6a
-      addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
f28b6a
+      if (TARGET_AVOID_XFORM)
f28b6a
+	{
f28b6a
+	  emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
f28b6a
+	  addr2 = op2;
f28b6a
+	}
f28b6a
+      else
f28b6a
+	addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
f28b6a
+    }
f28b6a
+  else if (TARGET_AVOID_XFORM)
f28b6a
+    {
f28b6a
+      emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
f28b6a
+      addr2 = op2;
f28b6a
     }
f28b6a
   else
f28b6a
     {
f28b6a
--- gcc/testsuite/gcc.target/powerpc/pr53199.c	(revision 0)
f28b6a
+++ gcc/testsuite/gcc.target/powerpc/pr53199.c	(revision 187119)
f28b6a
@@ -0,0 +1,50 @@
f28b6a
+/* { dg-do compile { target { powerpc*-*-* } } } */
f28b6a
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
f28b6a
+/* { dg-options "-O2 -mcpu=power6 -mavoid-indexed-addresses" } */
f28b6a
+/* { dg-final { scan-assembler-times "lwbrx" 6 } } */
f28b6a
+/* { dg-final { scan-assembler-times "stwbrx" 6 } } */
f28b6a
+
f28b6a
+/* PR 51399: bswap gets an error if -mavoid-indexed-addresses was used in
f28b6a
+   creating the two lwbrx instructions.  */
f28b6a
+
f28b6a
+long long
f28b6a
+load64_reverse_1 (long long *p)
f28b6a
+{
f28b6a
+  return __builtin_bswap64 (*p);
f28b6a
+}
f28b6a
+
f28b6a
+long long
f28b6a
+load64_reverse_2 (long long *p)
f28b6a
+{
f28b6a
+  return __builtin_bswap64 (p[1]);
f28b6a
+}
f28b6a
+
f28b6a
+long long
f28b6a
+load64_reverse_3 (long long *p, int i)
f28b6a
+{
f28b6a
+  return __builtin_bswap64 (p[i]);
f28b6a
+}
f28b6a
+
f28b6a
+void
f28b6a
+store64_reverse_1 (long long *p, long long x)
f28b6a
+{
f28b6a
+  *p = __builtin_bswap64 (x);
f28b6a
+}
f28b6a
+
f28b6a
+void
f28b6a
+store64_reverse_2 (long long *p, long long x)
f28b6a
+{
f28b6a
+  p[1] = __builtin_bswap64 (x);
f28b6a
+}
f28b6a
+
f28b6a
+void
f28b6a
+store64_reverse_3 (long long *p, long long x, int i)
f28b6a
+{
f28b6a
+  p[i] = __builtin_bswap64 (x);
f28b6a
+}
f28b6a
+
f28b6a
+long long
f28b6a
+reg_reverse (long long x)
f28b6a
+{
f28b6a
+  return __builtin_bswap64 (x);
f28b6a
+}