[ARM] Legitimize addresses for movmisalign<mode> for Neon.
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>
Mon, 3 Mar 2014 08:09:14 +0000 (08:09 +0000)
committerRamana Radhakrishnan <ramana@gcc.gnu.org>
Mon, 3 Mar 2014 08:09:14 +0000 (08:09 +0000)
2014-03-03  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>

* config/arm/neon.md (*movmisalign<mode>): Legitimize addresses
not handled by recognizers.

From-SVN: r208269

gcc/ChangeLog
gcc/config/arm/neon.md

index 93effc9fae23846dc128b540138c8bff7fc1da6c..551e134e0642cb143029bb447867dcc6e508abb7 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-03  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
+
+       * config/arm/neon.md (*movmisalign<mode>): Legitimize addresses
+       not handled by recognizers.
+
 2014-03-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/60175
index 2f06e42ed31e1ed154f0722b68227971cd4f9ad9..aad420ce7853f7f2c3b8c5d8783b5084992cde36 100644 (file)
                     UNSPEC_MISALIGNED_ACCESS))]
   "TARGET_NEON && !BYTES_BIG_ENDIAN && unaligned_access"
 {
+  rtx adjust_mem;
   /* This pattern is not permitted to fail during expansion: if both arguments
      are non-registers (e.g. memory := constant, which can be created by the
      auto-vectorizer), force operand 1 into a register.  */
   if (!s_register_operand (operands[0], <MODE>mode)
       && !s_register_operand (operands[1], <MODE>mode))
     operands[1] = force_reg (<MODE>mode, operands[1]);
+
+  if (s_register_operand (operands[0], <MODE>mode))
+    adjust_mem = operands[1];
+  else
+    adjust_mem = operands[0];
+
+  /* Legitimize address.  */
+  if (!neon_vector_mem_operand (adjust_mem, 2, true))
+    XEXP (adjust_mem, 0) = force_reg (Pmode, XEXP (adjust_mem, 0));
+
 })
 
 (define_insn "*movmisalign<mode>_neon_store"