rs6000.md (bswapdi2): Force address into register if not in indexed or indirect form.
authorAaron Sawdey <acsawdey@linux.ibm.com>
Tue, 30 Oct 2018 17:05:37 +0000 (17:05 +0000)
committerAaron Sawdey <acsawdey@gcc.gnu.org>
Tue, 30 Oct 2018 17:05:37 +0000 (12:05 -0500)
2018-10-30  Aaron Sawdey  <acsawdey@linux.ibm.com>

* config/rs6000/rs6000.md (bswapdi2): Force address into register
if not in indexed or indirect form.
(bswapdi2_load): Change predicate to indexed_or_indirect_operand.
(bswapdi2_store): Ditto.
* config/rs6000/rs6000.c (rs6000_force_indexed_or_indirect_mem): New
helper function.
* config/rs6000/rs6000-protos.h (rs6000_force_indexed_or_indirect_mem):
Prototype for helper function.

From-SVN: r265632

gcc/ChangeLog
gcc/config/rs6000/rs6000-protos.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 851502e5ba0c8ef09a161c8bb163208b84d39f0e..01e58aa1073f8fba7fca6f96923e99bf61803747 100644 (file)
@@ -1,3 +1,14 @@
+2018-10-30  Aaron Sawdey  <acsawdey@linux.ibm.com>
+
+       * config/rs6000/rs6000.md (bswapdi2): Force address into register
+       if not in indexed or indirect form.
+       (bswapdi2_load): Change predicate to indexed_or_indirect_operand.
+       (bswapdi2_store): Ditto.
+       * config/rs6000/rs6000.c (rs6000_force_indexed_or_indirect_mem): New
+       helper function.
+       * config/rs6000/rs6000-protos.h (rs6000_force_indexed_or_indirect_mem):
+       Prototype for helper function.
+
 2018-10-30  Martin Sebor  <msebor@redhat.com>
 
        * doc/extend.texi (optimize): Clarify/expand attribute documentation.
index bb2584b7b483ef978ed637744b2b6a96d52bb7c4..30dc896e76c2ac26ebde0a61d49daaf5ce8dc300 100644 (file)
@@ -47,6 +47,7 @@ extern bool legitimate_constant_pool_address_p (const_rtx, machine_mode,
 extern bool legitimate_indirect_address_p (rtx, int);
 extern bool legitimate_indexed_address_p (rtx, int);
 extern bool avoiding_indexed_address_p (machine_mode);
+extern rtx rs6000_force_indexed_or_indirect_mem (rtx x);
 
 extern rtx rs6000_got_register (rtx);
 extern rtx find_addr_reg (rtx);
index 4f113cb025e08191768fec5baa58a649cacdc0f2..30b7266f02e062b65e25a955349889618c89a3eb 100644 (file)
@@ -8423,6 +8423,22 @@ rs6000_const_not_ok_for_debug_p (rtx x)
   return false;
 }
 
+/* Helper function for making sure we will make full
+   use of indexed addressing.  */
+
+rtx
+rs6000_force_indexed_or_indirect_mem (rtx x)
+{
+  machine_mode m = GET_MODE (x);
+  if (!indexed_or_indirect_operand (x, m))
+    {
+      rtx addr = XEXP (x, 0);
+      addr = force_reg (Pmode, addr);
+      x = replace_equiv_address_nv (x, addr);
+    }
+  return x;
+}
+
 
 /* Implement the TARGET_LEGITIMATE_COMBINED_INSN hook.  */
 
index 0e7cf353af116681f325a4eff6bb7d25a6010397..4feb18a55fa03c261b76470307485af867dabc9b 100644 (file)
   if (TARGET_POWERPC64 && TARGET_LDBRX)
     {
       if (MEM_P (src))
-       emit_insn (gen_bswapdi2_load (dest, src));
+        {
+         src = rs6000_force_indexed_or_indirect_mem (src);
+         emit_insn (gen_bswapdi2_load (dest, src));
+        }
       else if (MEM_P (dest))
-       emit_insn (gen_bswapdi2_store (dest, src));
+        {
+         dest = rs6000_force_indexed_or_indirect_mem (dest);
+         emit_insn (gen_bswapdi2_store (dest, src));
+        }
       else if (TARGET_P9_VECTOR)
        emit_insn (gen_bswapdi2_xxbrd (dest, src));
       else
 ;; Power7/cell has ldbrx/stdbrx, so use it directly
 (define_insn "bswapdi2_load"
   [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
-       (bswap:DI (match_operand:DI 1 "memory_operand" "Z")))]
+       (bswap:DI (match_operand:DI 1 "indexed_or_indirect_operand" "Z")))]
   "TARGET_POWERPC64 && TARGET_LDBRX"
   "ldbrx %0,%y1"
   [(set_attr "type" "load")])
 
 (define_insn "bswapdi2_store"
-  [(set (match_operand:DI 0 "memory_operand" "=Z")
+  [(set (match_operand:DI 0 "indexed_or_indirect_operand" "=Z")
        (bswap:DI (match_operand:DI 1 "gpc_reg_operand" "r")))]
   "TARGET_POWERPC64 && TARGET_LDBRX"
   "stdbrx %1,%y0"