aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoern Rennecke <joern.rennecke@embecosm.com>2012-11-28 13:21:59 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>2012-11-28 13:21:59 +0000
commit9bc8692a422f6fee91af1c1097545ba293b9b47b (patch)
tree925ac860d8010e7cc2630f43bd8515877a33e8c8 /gcc
parentffcc7caf89f32a76f39fd293c0e97df2b5cf5288 (diff)
downloadgcc-9bc8692a422f6fee91af1c1097545ba293b9b47b.zip
gcc-9bc8692a422f6fee91af1c1097545ba293b9b47b.tar.gz
gcc-9bc8692a422f6fee91af1c1097545ba293b9b47b.tar.bz2
epiphany.md (mov<mode>, [...]): Check for misaligned memory operands.
* config/epiphany/epiphany.md (mov<mode>, *mov<mode>_insn): Check for misaligned memory operands. * config/epiphany/predicates.md (misaligned_operand): New predicate. From-SVN: r193890
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/epiphany/epiphany.md5
-rw-r--r--gcc/config/epiphany/predicates.md5
3 files changed, 13 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 538eb02..1d4a0c9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -4,6 +4,10 @@
* config/epiphany/epiphany-protos.h (epiphany_regno_rename_ok): Declare.
* config/epiphany/epiphany.c (epiphany_regno_rename_ok): New function.
+ * config/epiphany/epiphany.md (mov<mode>, *mov<mode>_insn): Check
+ for misaligned memory operands.
+ * config/epiphany/predicates.md (misaligned_operand): New predicate.
+
2012-11-28 Richard Biener <rguenther@suse.de>
PR tree-optimization/54547
diff --git a/gcc/config/epiphany/epiphany.md b/gcc/config/epiphany/epiphany.md
index 22863e8..f650870 100644
--- a/gcc/config/epiphany/epiphany.md
+++ b/gcc/config/epiphany/epiphany.md
@@ -325,6 +325,7 @@
if (epiphany_vect_align != 4 /* == 8 */
&& !reload_in_progress
&& (GET_CODE (operands[0]) == MEM || GET_CODE (operands[1]) == MEM)
+ && !misaligned_operand (operands[1], <MODE>mode)
&& (GET_CODE (operands[0]) != SUBREG
|| (GET_MODE_SIZE (GET_MODE (SUBREG_REG (operands[0])))
!= GET_MODE_SIZE (<MODE>mode)
@@ -355,7 +356,9 @@
ldrd %0,%X1
strd %1,%X0"
"reload_completed
- && ((!MEM_P (operands[0]) && !MEM_P (operands[1]))
+ && (((!MEM_P (operands[0]) || misaligned_operand (operands[0], <MODE>mode))
+ && (!MEM_P (operands[1])
+ || misaligned_operand (operands[1], <MODE>mode)))
|| epiphany_vect_align == 4)"
[(set (match_dup 2) (match_dup 3))
(set (match_dup 4) (match_dup 5))]
diff --git a/gcc/config/epiphany/predicates.md b/gcc/config/epiphany/predicates.md
index 6e96af9..4cbff58 100644
--- a/gcc/config/epiphany/predicates.md
+++ b/gcc/config/epiphany/predicates.md
@@ -350,3 +350,8 @@
(define_predicate "nonsymbolic_immediate_operand"
(ior (match_test "immediate_operand (op, mode)")
(match_code "const_vector"))) /* Is this specific enough? */
+
+;; Return true if OP is misaligned memory operand
+(define_predicate "misaligned_operand"
+ (and (match_code "mem")
+ (match_test "MEM_ALIGN (op) < GET_MODE_ALIGNMENT (mode)")))