make v850 use constraints.md
authorNathan Froyd <froydnj@codesourcery.com>
Mon, 14 Feb 2011 17:26:59 +0000 (17:26 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Mon, 14 Feb 2011 17:26:59 +0000 (17:26 +0000)
make v850 use constraints.md
        * config/v850/constraints.md: New file.
        * config/v850/v850.md: Include it.
        * config/v850/predicates.md (reg_or_0_operand): Use
        satisfies_constraint_G.
        (special_symbolref_operand): Use satisfies_constraint_K.
        * config/v850/v850.h (CONSTANT_ADDRESS_P): Use constraint_satisfied_p.
        (GO_IF_LEGITIMATE_ADDRESS): Likewise.
        (REG_CLASS_FROM_LETTER, INT_7_BITS, INT_8_BITS): Delete.
        (CONST_OK_FOR_P, CONST_OK_FOR_LETTER_P): Delete.
        (EXTRA_CONSTRAINT): Delete.
        (CONST_OK_FOR_I, CONST_OK_FOR_J): Use insn_const_int_ok_for_constraint.
        (CONST_OK_FOR_K, CONST_OK_FOR_L, CONST_OK_FOR_M): Likewise.
        (CONST_OK_FOR_N, CONST_OK_FOR_O): Likewise.

From-SVN: r170140

gcc/ChangeLog
gcc/config/v850/constraints.md [new file with mode: 0644]
gcc/config/v850/predicates.md
gcc/config/v850/v850.h
gcc/config/v850/v850.md

index 1562adb51fb83a3921c65d8a54ab9435f54502ff..76d333971d69798151afdcd7260c8984b2c080de 100644 (file)
@@ -1,3 +1,19 @@
+2011-02-14  Nathan Froyd  <froydnj@codesourcery.com>
+
+        * config/v850/constraints.md: New file.
+        * config/v850/v850.md: Include it.
+        * config/v850/predicates.md (reg_or_0_operand): Use
+        satisfies_constraint_G.
+        (special_symbolref_operand): Use satisfies_constraint_K.
+        * config/v850/v850.h (CONSTANT_ADDRESS_P): Use constraint_satisfied_p.
+        (GO_IF_LEGITIMATE_ADDRESS): Likewise.
+        (REG_CLASS_FROM_LETTER, INT_7_BITS, INT_8_BITS): Delete.
+        (CONST_OK_FOR_P, CONST_OK_FOR_LETTER_P): Delete.
+        (EXTRA_CONSTRAINT): Delete.
+        (CONST_OK_FOR_I, CONST_OK_FOR_J): Use insn_const_int_ok_for_constraint.
+        (CONST_OK_FOR_K, CONST_OK_FOR_L, CONST_OK_FOR_M): Likewise.
+        (CONST_OK_FOR_N, CONST_OK_FOR_O): Likewise.
+
 2011-02-14  Anatoly Sokolov  <aesok@post.ru>
 
        PR target/47696
diff --git a/gcc/config/v850/constraints.md b/gcc/config/v850/constraints.md
new file mode 100644 (file)
index 0000000..eecdab3
--- /dev/null
@@ -0,0 +1,108 @@
+;; Constraint definitions for V850.
+;; Copyright (C) 2011 Free Software Foundation, Inc.
+;;
+;; This file is part of GCC.
+;;
+;; GCC is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 3, or (at your option)
+;; any later version.
+;;
+;; GCC is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with GCC; see the file COPYING3.  If not see
+;; <http://www.gnu.org/licenses/>.
+
+(define_register_constraint "e" "EVEN_REGS"
+  "@internal")
+
+;; Integer constraints.
+(define_constraint "I"
+  "Integer constant 0."
+  (and (match_code "const_int")
+       (match_test "ival == 0")))
+
+(define_constraint "J"
+  "A signed 5-bit immediate."
+  (and (match_code "const_int")
+       (match_test "ival >= -16 && ival <= 15")))
+
+(define_constraint "K"
+  "A signed 16-bit immediate."
+  (and (match_code "const_int")
+       (match_test "ival >= -32768 && ival <= 32767")))
+
+(define_constraint "L"
+  "A valid constant for a movhi instruction."
+  (and (match_code "const_int")
+       (ior (match_test "(ival | 0x7fff0000) == 0x7fff0000")
+           (match_test "(ival | 0x7fff0000) + 0x10000 == 0"))))
+
+(define_constraint "M"
+  "An unsigned 16-bit immediate."
+  (and (match_code "const_int")
+       (match_test "ival >= 0 && ival <= 65535")))
+
+(define_constraint "N"
+  "An unsigned 5-bit immediate in shift instructions."
+  (and (match_code "const_int")
+       (match_test "ival >= 0 && ival <= 31")))
+
+(define_constraint "O"
+  "A signed 9-bit immediate for word multiply instructions."
+  (and (match_code "const_int")
+       (match_test "ival >= -255 && ival <= 255")))
+
+(define_constraint "P"
+  "@internal"
+  (and (match_code "const_int")
+       (match_test "0")))
+
+;; Floating-point constraints.
+(define_constraint "G"
+  "A zero of some form."
+  (and (match_code "const_double")
+       (ior (match_test "GET_MODE_CLASS (mode) == MODE_FLOAT")
+           (match_test "GET_MODE_CLASS (mode) == MODE_INT"))
+       (match_test "op == CONST0_RTX (mode)")))
+
+(define_constraint "H"
+  "@internal"
+  (and (match_code "const_double")
+       (match_test "0")))
+
+;;; Extra constraints.
+(define_constraint "Q"
+  "A memory address that does not contain a symbol address."
+  (and (match_code "mem")
+       (match_test "ep_memory_operand (op, mode, FALSE)")))
+
+(define_constraint "R"
+  "@internal"
+  (match_test "special_symbolref_operand (op, VOIDmode)"))
+
+(define_constraint "S"
+  "@internal"
+  (and (match_code "symbol_ref")
+       (match_test "!SYMBOL_REF_ZDA_P (op)")))
+
+(define_constraint "T"
+  "@internal"
+  (match_test "ep_memory_operand (op, mode, TRUE)"))
+
+(define_constraint "U"
+  "@internal"
+  (ior (and (match_code "symbol_ref")
+           (match_test "SYMBOL_REF_ZDA_P (op)"))
+       (and (match_code "const")
+           (match_test "GET_CODE (XEXP (op, 0)) == PLUS")
+           (match_test "GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF")
+           (match_test "SYMBOL_REF_ZDA_P (XEXP (XEXP (op, 0), 0))"))))
+
+(define_constraint "W"
+  "@internal"
+  (match_test "disp23_operand (op, VOIDmode)"))
index a47453fd1d81bc9d6df9957a5f78dc2cebe89160..129f00d595f33f98327944c0d303047cb4607e84 100644 (file)
@@ -26,7 +26,7 @@
     return INTVAL (op) == 0;
 
   else if (GET_CODE (op) == CONST_DOUBLE)
-    return CONST_DOUBLE_OK_FOR_G (op);
+    return satisfies_constraint_G (op);
 
   else
     return register_operand (op, mode);
 {
   if (GET_CODE (op) == CONST
       && GET_CODE (XEXP (op, 0)) == PLUS
-      && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT
-      && CONST_OK_FOR_K (INTVAL (XEXP (XEXP (op, 0), 1))))
+      && satisfies_constraint_K (XEXP (XEXP (op, 0), 1)))
     op = XEXP (XEXP (op, 0), 0);
 
   if (GET_CODE (op) == SYMBOL_REF)
index afea2784810b3e637512840dce0b0edf95721858..892a34c6305bb41b87af2a78be42be4f782f4d99 100644 (file)
@@ -357,11 +357,6 @@ enum reg_class
 #define INDEX_REG_CLASS NO_REGS
 #define BASE_REG_CLASS  GENERAL_REGS
 
-/* Get reg_class from a letter such as appears in the machine description.  */
-
-#define REG_CLASS_FROM_LETTER(C) \
-       (C == 'e' ? EVEN_REGS : (NO_REGS))
-
 /* Macros to check register numbers against specific register classes.  */
 
 /* These assume that REGNO is a hard or pseudo reg number.
@@ -384,62 +379,22 @@ enum reg_class
 #define CLASS_MAX_NREGS(CLASS, MODE)   \
   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
 
-/* The letters I, J, K, L, M, N, O, P in a register constraint string
-   can be used to stand for particular ranges of immediate operands.
-   This macro defines what the ranges are.
-   C is the letter, and VALUE is a constant value.
-   Return 1 if VALUE is in the range specified by C.  */
-
-#define INT_7_BITS(VALUE) ((unsigned) (VALUE) + 0x40 < 0x80)
-#define INT_8_BITS(VALUE) ((unsigned) (VALUE) + 0x80 < 0x100)
-/* zero */
-#define CONST_OK_FOR_I(VALUE) ((VALUE) == 0)
-/* 5-bit signed immediate */
-#define CONST_OK_FOR_J(VALUE) ((unsigned) (VALUE) + 0x10 < 0x20)
-/* 16-bit signed immediate */
-#define CONST_OK_FOR_K(VALUE) ((unsigned) (VALUE) + 0x8000 < 0x10000)
-/* valid constant for movhi instruction.  */
-#define CONST_OK_FOR_L(VALUE) \
-  (((unsigned) ((int) (VALUE) >> 16) + 0x8000 < 0x10000) \
-   && CONST_OK_FOR_I ((VALUE & 0xffff)))
-/* 16-bit unsigned immediate */
-#define CONST_OK_FOR_M(VALUE) ((unsigned)(VALUE) < 0x10000)
-/* 5-bit unsigned immediate in shift instructions */
-#define CONST_OK_FOR_N(VALUE) ((unsigned) (VALUE) <= 31)
-/* 9-bit signed immediate for word multiply instruction.  */
-#define CONST_OK_FOR_O(VALUE) ((unsigned) (VALUE) + 0x100 < 0x200)
-
-#define CONST_OK_FOR_P(VALUE) 0
-
-#define CONST_OK_FOR_LETTER_P(VALUE, C)  \
-  ((C) == 'I' ? CONST_OK_FOR_I (VALUE) : \
-   (C) == 'J' ? CONST_OK_FOR_J (VALUE) : \
-   (C) == 'K' ? CONST_OK_FOR_K (VALUE) : \
-   (C) == 'L' ? CONST_OK_FOR_L (VALUE) : \
-   (C) == 'M' ? CONST_OK_FOR_M (VALUE) : \
-   (C) == 'N' ? CONST_OK_FOR_N (VALUE) : \
-   (C) == 'O' ? CONST_OK_FOR_O (VALUE) : \
-   (C) == 'P' ? CONST_OK_FOR_P (VALUE) : \
-   0)
-
-/* Similar, but for floating constants, and defining letters G and H.
-   Here VALUE is the CONST_DOUBLE rtx itself. 
-     
-  `G' is a zero of some form.  */
+/* Convenience wrappers around insn_const_int_ok_for_constraint.  */
 
-#define CONST_DOUBLE_OK_FOR_G(VALUE)                                   \
-  ((GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_FLOAT                    \
-    && (VALUE) == CONST0_RTX (GET_MODE (VALUE)))                       \
-   || (GET_MODE_CLASS (GET_MODE (VALUE)) == MODE_INT                   \
-       && CONST_DOUBLE_LOW (VALUE) == 0                                        \
-       && CONST_DOUBLE_HIGH (VALUE) == 0))
-
-#define CONST_DOUBLE_OK_FOR_H(VALUE) 0
-
-#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C)                         \
-  ((C) == 'G'   ? CONST_DOUBLE_OK_FOR_G (VALUE)                                \
-   : (C) == 'H' ? CONST_DOUBLE_OK_FOR_H (VALUE)                                \
-   : 0)
+#define CONST_OK_FOR_I(VALUE) \
+  insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_I)
+#define CONST_OK_FOR_J(VALUE) \
+  insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_J)
+#define CONST_OK_FOR_K(VALUE) \
+  insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_K)
+#define CONST_OK_FOR_L(VALUE) \
+  insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_L)
+#define CONST_OK_FOR_M(VALUE) \
+  insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_M)
+#define CONST_OK_FOR_N(VALUE) \
+  insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_N)
+#define CONST_OK_FOR_O(VALUE) \
+  insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_O)
 
 \f
 /* Stack layout; function entry, exit and calling.  */
@@ -623,9 +578,7 @@ struct cum_arg { int nbytes; int anonymous_args; };
 /* ??? This seems too exclusive.  May get better code by accepting more
    possibilities here, in particular, should accept ZDA_NAME SYMBOL_REFs.  */
 
-#define CONSTANT_ADDRESS_P(X)   \
-  (GET_CODE (X) == CONST_INT                           \
-   && CONST_OK_FOR_K (INTVAL (X)))
+#define CONSTANT_ADDRESS_P(X) constraint_satisfied_p (X, CONSTRAINT_K)
 
 /* Maximum number of registers that can appear in a valid memory address.  */
 
@@ -666,39 +619,6 @@ struct cum_arg { int nbytes; int anonymous_args; };
 
 #endif
 
-/* A C expression that defines the optional machine-dependent
-   constraint letters that can be used to segregate specific types of
-   operands, usually memory references, for the target machine.
-   Normally this macro will not be defined.  If it is required for a
-   particular target machine, it should return 1 if VALUE corresponds
-   to the operand type represented by the constraint letter C.  If C
-   is not defined as an extra constraint, the value returned should
-   be 0 regardless of VALUE.
-
-   For example, on the ROMP, load instructions cannot have their
-   output in r0 if the memory reference contains a symbolic address.
-   Constraint letter `Q' is defined as representing a memory address
-   that does *not* contain a symbolic address.  An alternative is
-   specified with a `Q' constraint on the input and `r' on the
-   output.  The next alternative specifies `m' on the input and a
-   register class that does not include r0 on the output.  */
-
-#define EXTRA_CONSTRAINT(OP, C)                                                \
- ((C) == 'Q'   ? ep_memory_operand (OP, GET_MODE (OP), FALSE)          \
-  : (C) == 'R' ? special_symbolref_operand (OP, VOIDmode)              \
-  : (C) == 'S' ? (GET_CODE (OP) == SYMBOL_REF                          \
-                 && !SYMBOL_REF_ZDA_P (OP))                            \
-  : (C) == 'T' ? ep_memory_operand (OP, GET_MODE (OP), TRUE)           \
-  : (C) == 'U' ? ((GET_CODE (OP) == SYMBOL_REF                         \
-                  && SYMBOL_REF_ZDA_P (OP))                            \
-                 || (GET_CODE (OP) == CONST                            \
-                     && GET_CODE (XEXP (OP, 0)) == PLUS                \
-                     && GET_CODE (XEXP (XEXP (OP, 0), 0)) == SYMBOL_REF\
-                     && SYMBOL_REF_ZDA_P (XEXP (XEXP (OP, 0), 0))))    \
-  : (C) == 'W' ? (GET_CODE (OP) == CONST_INT                            \
-                 && ((unsigned)(INTVAL (OP)) >= 0x8000)               \
-                 && ((unsigned)(INTVAL (OP)) < 0x400000))              \
-  : 0)
 \f
 /* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
    that is a valid memory address for an instruction.
@@ -738,7 +658,7 @@ do {                                                                        \
      goto ADDR;                                                                \
   if (GET_CODE (X) == PLUS                                             \
       && RTX_OK_FOR_BASE_P (XEXP (X, 0))                               \
-      && (GET_CODE (XEXP (X,1)) == CONST_INT && CONST_OK_FOR_K (INTVAL(XEXP (X,1)) + GET_MODE_NUNITS(MODE) * UNITS_PER_WORD)) \
+      && constraint_satisfied_p (XEXP (X,1), CONSTRAINT_K)             \
       && ((MODE == QImode || INTVAL (XEXP (X, 1)) % 2 == 0)            \
           && CONST_OK_FOR_K (INTVAL (XEXP (X, 1))                      \
                               + (GET_MODE_NUNITS (MODE) * UNITS_PER_WORD)))) \
index 26bc5838e6d210d8987ed155f1070f632afcc0bb..88e42c65e904849f482af18c203b00497b1c5ab9 100644 (file)
                         "nothing")
 
 (include "predicates.md")
+(include "constraints.md")
 \f
 ;; ----------------------------------------------------------------------
 ;; MOVE INSTRUCTIONS