From: Nathan Froyd Date: Mon, 14 Feb 2011 17:26:59 +0000 (+0000) Subject: make v850 use constraints.md X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c6150df67f5d7cb05a5784509d9158e0ecc471d8;p=gcc.git make v850 use constraints.md 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1562adb51fb..76d333971d6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2011-02-14 Nathan Froyd + + * 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 PR target/47696 diff --git a/gcc/config/v850/constraints.md b/gcc/config/v850/constraints.md new file mode 100644 index 00000000000..eecdab3d4ef --- /dev/null +++ b/gcc/config/v850/constraints.md @@ -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 +;; . + +(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)")) diff --git a/gcc/config/v850/predicates.md b/gcc/config/v850/predicates.md index a47453fd1d8..129f00d595f 100644 --- a/gcc/config/v850/predicates.md +++ b/gcc/config/v850/predicates.md @@ -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); @@ -129,8 +129,7 @@ { 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) diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index afea2784810..892a34c6305 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -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) /* 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) /* 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)))) \ diff --git a/gcc/config/v850/v850.md b/gcc/config/v850/v850.md index 26bc5838e6d..88e42c65e90 100644 --- a/gcc/config/v850/v850.md +++ b/gcc/config/v850/v850.md @@ -100,6 +100,7 @@ "nothing") (include "predicates.md") +(include "constraints.md") ;; ---------------------------------------------------------------------- ;; MOVE INSTRUCTIONS