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");