]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm.c (neon_vector_mem_operand): Allow register POST_MODIFY for neon loads and stores.
authorCharles Baylis <charles.baylis@linaro.org>
Wed, 18 Jun 2014 13:42:44 +0000 (13:42 +0000)
committerCharles Baylis <cbaylis@gcc.gnu.org>
Wed, 18 Jun 2014 13:42:44 +0000 (13:42 +0000)
2014-06-18  Charles Baylis  <charles.baylis@linaro.org>

* config/arm/arm.c (neon_vector_mem_operand): Allow register
POST_MODIFY for neon loads and stores.
(arm_print_operand): Output post-index register for neon loads and
stores.

From-SVN: r211783

gcc/ChangeLog
gcc/config/arm/arm.c

index d3e6d53bca26215f8d272d55be5db7072565ed3b..114240b306db42f0aa638790855f77f661c1dc7f 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-18  Charles Baylis  <charles.baylis@linaro.org>
+
+       * config/arm/arm.c (neon_vector_mem_operand): Allow register
+       POST_MODIFY for neon loads and stores.
+       (arm_print_operand): Output post-index register for neon loads and
+       stores.
+
 2014-06-18  Richard Biener  <rguenther@suse.de>
 
        * tree-ssa-dce.c (perform_tree_ssa_dce): Fixup bogus commit.
index 463707ea20699b90f376b0819e760def8b61e5ad..ffe8e2105ab9b200b9553e38a9f6003f4cbbd12b 100644 (file)
@@ -12792,7 +12792,11 @@ neon_vector_mem_operand (rtx op, int type, bool strict)
       || (type == 0 && GET_CODE (ind) == PRE_DEC))
     return arm_address_register_rtx_p (XEXP (ind, 0), 0);
 
-  /* FIXME: vld1 allows register post-modify.  */
+  /* Allow post-increment by register for VLDn */
+  if (type == 2 && GET_CODE (ind) == POST_MODIFY
+      && GET_CODE (XEXP (ind, 1)) == PLUS
+      && REG_P (XEXP (XEXP (ind, 1), 1)))
+     return true;
 
   /* Match:
      (plus (reg)
@@ -21824,6 +21828,7 @@ arm_print_operand (FILE *stream, rtx x, int code)
       {
        rtx addr;
        bool postinc = FALSE;
+       rtx postinc_reg = NULL;
        unsigned align, memsize, align_bits;
 
        gcc_assert (MEM_P (x));
@@ -21833,6 +21838,11 @@ arm_print_operand (FILE *stream, rtx x, int code)
            postinc = 1;
            addr = XEXP (addr, 0);
          }
+       if (GET_CODE (addr) == POST_MODIFY)
+         {
+           postinc_reg = XEXP( XEXP (addr, 1), 1);
+           addr = XEXP (addr, 0);
+         }
        asm_fprintf (stream, "[%r", REGNO (addr));
 
        /* We know the alignment of this access, so we can emit a hint in the
@@ -21858,6 +21868,8 @@ arm_print_operand (FILE *stream, rtx x, int code)
 
        if (postinc)
          fputs("!", stream);
+       if (postinc_reg)
+         asm_fprintf (stream, ", %r", REGNO (postinc_reg));
       }
       return;