[AArch64] Refactor aarch64_mov_operand predicate.
authorChris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
Thu, 23 May 2013 14:09:39 +0000 (14:09 +0000)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Thu, 23 May 2013 14:09:39 +0000 (14:09 +0000)
Co-Authored-By: Marcus Shawcroft <marcus.shawcroft@arm.com>
From-SVN: r199259

gcc/ChangeLog
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/predicates.md

index 02335f0a45ec411512bc6bcf764219503ea4e38a..3ba9d4eae3e568187b5f2c4551a202aa95a5321e 100644 (file)
@@ -1,3 +1,11 @@
+2013-05-23  Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
+           Marcus Shawcroft  <marcus.shawcroft@arm.com>
+
+       * config/aarch64/aarch64-protos.h (aarch64_mov_operand_p): Define.
+       * config/aarch64/aarch64.c (aarch64_mov_operand_p): Define.
+       * config/aarch64/predicates.md (aarch64_const_address): Remove.
+       (aarch64_mov_operand): Use aarch64_mov_operand_p.
+
 2013-05-23  Vidya Praveen <vidyapraveen@arm.com>
 
        * config/aarch64/aarch64-simd.md (clzv4si2): Support for CLZ
index 001842e43b4cdb166f0b13fc0f74cec1f6f0e2f8..91fcde80cf65805bb7f3eb06f31c58bc43314f6b 100644 (file)
@@ -146,6 +146,8 @@ bool aarch64_is_long_call_p (rtx);
 bool aarch64_label_mentioned_p (rtx);
 bool aarch64_legitimate_pic_operand_p (rtx);
 bool aarch64_move_imm (HOST_WIDE_INT, enum machine_mode);
+bool aarch64_mov_operand_p (rtx, enum aarch64_symbol_context,
+                           enum machine_mode);
 bool aarch64_pad_arg_upward (enum machine_mode, const_tree);
 bool aarch64_pad_reg_upward (enum machine_mode, const_tree, bool);
 bool aarch64_regno_ok_for_base_p (int, bool);
index a0aff58668bcb9c7766907ce89fe7e828eb90cf5..12a705587824cc15bd81dca26dbd35ecafcfc515 100644 (file)
@@ -6455,6 +6455,25 @@ aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
   return true;
 }
 
+bool
+aarch64_mov_operand_p (rtx x,
+                      enum aarch64_symbol_context context ATTRIBUTE_UNUSED,
+                      enum machine_mode mode)
+{
+
+  if (GET_CODE (x) == HIGH
+      && aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
+    return true;
+
+  if (CONST_INT_P (x) && aarch64_move_imm (INTVAL (x), mode))
+    return true;
+
+  if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x))
+    return true;
+
+  return false;
+}
+
 /* Return a const_int vector of VAL.  */
 rtx
 aarch64_simd_gen_const_vector_dup (enum machine_mode mode, int val)
index 8514e8f8fbdda73ecec5d79a336b54a2bd7be4f3..16c4385e84568009ecd726f3db50c236d5658eef 100644 (file)
        (match_test "aarch64_legitimate_address_p (mode, XEXP (op, 0), PARALLEL,
                                               0)")))
 
-(define_predicate "aarch64_const_address"
-  (and (match_code "symbol_ref")
-       (match_test "mode == DImode && CONSTANT_ADDRESS_P (op)")))
-
 (define_predicate "aarch64_valid_symref"
   (match_code "const, symbol_ref, label_ref")
 {
   (and (match_code "reg,subreg,mem,const_int,symbol_ref,high")
        (ior (match_operand 0 "register_operand")
            (ior (match_operand 0 "memory_operand")
-                (ior (match_test "GET_CODE (op) == HIGH
-                                  && aarch64_valid_symref (XEXP (op, 0),
-                                                           GET_MODE (XEXP (op, 0)))")
-                     (ior (match_test "CONST_INT_P (op)
-                                       && aarch64_move_imm (INTVAL (op), mode)")
-                          (match_test "aarch64_const_address (op, mode)")))))))
+                (match_test "aarch64_mov_operand_p (op, SYMBOL_CONTEXT_ADR, mode)")))))
 
 (define_predicate "aarch64_movti_operand"
   (and (match_code "reg,subreg,mem,const_int")