Hi,
This patch is posted/approved before at
https://gcc.gnu.org/ml/gcc-patches/2014-07/msg00311.html
It's one prerequisite patch for memset inlining patch on ARM.
Unfortunately, it was reverted along with it because the whole patch set
revealed a latent bug causing glibc build failure and I didn't have enough
time to fixed back that time.  Now with the potential bug resolved by
https://gcc.gnu.org/ml/gcc-patches/2014-09/msg00298.html , I will apply this
patch in 24h again if no objection.

Retested along with memset-inlining patch set.

Thanks,
bin

2014-09-04  Bin Cheng  <bin.ch...@arm.com>

        * config/arm/arm.c (output_move_neon): Handle REG explicitly.
Index: gcc/config/arm/arm.c
===================================================================
--- gcc/config/arm/arm.c        (revision 214780)
+++ gcc/config/arm/arm.c        (working copy)
@@ -18555,6 +18599,20 @@ output_move_neon (rtx *operands)
       /* FIXME: Not currently enabled in neon_vector_mem_operand.  */
       gcc_unreachable ();
 
+    case REG:
+      /* We have to use vldm / vstm for too-large modes.  */
+      if (nregs > 1)
+       {
+         if (nregs > 4)
+           templ = "v%smia%%?\t%%m0, %%h1";
+         else
+           templ = "v%s1.64\t%%h1, %%A0";
+
+         ops[0] = mem;
+         ops[1] = reg;
+         break;
+       }
+      /* Fall through.  */
     case LABEL_REF:
     case PLUS:
       {
@@ -18588,14 +18646,7 @@ output_move_neon (rtx *operands)
       }
 
     default:
-      /* We have to use vldm / vstm for too-large modes.  */
-      if (nregs > 4)
-       templ = "v%smia%%?\t%%m0, %%h1";
-      else
-       templ = "v%s1.64\t%%h1, %%A0";
-
-      ops[0] = mem;
-      ops[1] = reg;
+      gcc_unreachable ();
     }
 
   sprintf (buff, templ, load ? "ld" : "st");

Reply via email to