epiphany.md (mov<mode>, [...]): Check for misaligned memory operands.
authorJoern Rennecke <joern.rennecke@embecosm.com>
Wed, 28 Nov 2012 13:21:59 +0000 (13:21 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Wed, 28 Nov 2012 13:21:59 +0000 (13:21 +0000)
        * 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

gcc/ChangeLog
gcc/config/epiphany/epiphany.md
gcc/config/epiphany/predicates.md

index 538eb02..1d4a0c9 100644 (file)
@@ -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
index 22863e8..f650870 100644 (file)
       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)
    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))]
index 6e96af9..4cbff58 100644 (file)
 (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)")))