aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>2014-03-03 08:09:14 +0000
committerRamana Radhakrishnan <ramana@gcc.gnu.org>2014-03-03 08:09:14 +0000
commit3416dd87b9f43d990ed3f02a413bbe656ef5298a (patch)
tree7e57f183883dfec47488ffefff4ab6ae69c13332
parentb3bdf019b761cc75d967e1330f3e90cd4c94e116 (diff)
downloadgcc-3416dd87b9f43d990ed3f02a413bbe656ef5298a.zip
gcc-3416dd87b9f43d990ed3f02a413bbe656ef5298a.tar.gz
gcc-3416dd87b9f43d990ed3f02a413bbe656ef5298a.tar.bz2
[ARM] Legitimize addresses for movmisalign<mode> for Neon.
2014-03-03 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> * config/arm/neon.md (*movmisalign<mode>): Legitimize addresses not handled by recognizers. From-SVN: r208269
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/neon.md11
2 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 93effc9..551e134 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md
index 2f06e42..aad420c 100644
--- a/gcc/config/arm/neon.md
+++ b/gcc/config/arm/neon.md
@@ -245,12 +245,23 @@
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"