make frv use constraints.md

make frv use constraints.md
	* config/frv/constraints.md: New file.
	* config/frv/predicates.md: Include it.
	* config/frv/frv.c (reg_class_from_letter): Delete.
	(frv_option_override): Don't initialize it.
	* config/frv/frv.h (REG_CLASS_FROM_LETTER): Delete.
	(CONST_OK_FOR_I, CONST_OK_FOR_J, CONST_OK_FOR_K): Delete.
	(CONST_OK_FOR_L, CONST_OK_FOR_M, CONST_OK_FOR_N): Delete.
	(CONST_OK_FOR_O, CONST_OK_FOR_P, CONST_OK_FOR_LETTER_P): Delete.
	(CONST_DOUBLE_OK_FOR_G, CONST_DOUBLE_OK_FOR_H): Delete.
	(CONST_DOUBLE_OK_FOR_LETTER_P): Delete.
	(EXTRA_CONSTRAINT_FOR_Q, EXTRA_CONSTRAINT_FOR_R): Delete.
	(EXTRA_CONSTRAINT_FOR_S, EXTRA_CONSTRAINT_FOR_T): Delete.
	(EXTRA_CONSTRAINT_FOR_U, EXTRA_CONSTRAINT): Delete.
	(EXTRA_MEMORY_CONSTRAINT, CONSTRAINT_LEN): Delete.
	(REG_CLASS_FROM_CONSTRAINT): Delete.

From-SVN: r170171
This commit is contained in:
Nathan Froyd 2011-02-15 12:44:31 +00:00 committed by Nathan Froyd
parent c95f9494fe
commit 49ac143dfb
5 changed files with 193 additions and 182 deletions

View File

@ -1,3 +1,21 @@
2011-02-15 Nathan Froyd <froydnj@codesourcery.com>
* config/frv/constraints.md: New file.
* config/frv/predicates.md: Include it.
* config/frv/frv.c (reg_class_from_letter): Delete.
(frv_option_override): Don't initialize it.
* config/frv/frv.h (REG_CLASS_FROM_LETTER): Delete.
(CONST_OK_FOR_I, CONST_OK_FOR_J, CONST_OK_FOR_K): Delete.
(CONST_OK_FOR_L, CONST_OK_FOR_M, CONST_OK_FOR_N): Delete.
(CONST_OK_FOR_O, CONST_OK_FOR_P, CONST_OK_FOR_LETTER_P): Delete.
(CONST_DOUBLE_OK_FOR_G, CONST_DOUBLE_OK_FOR_H): Delete.
(CONST_DOUBLE_OK_FOR_LETTER_P): Delete.
(EXTRA_CONSTRAINT_FOR_Q, EXTRA_CONSTRAINT_FOR_R): Delete.
(EXTRA_CONSTRAINT_FOR_S, EXTRA_CONSTRAINT_FOR_T): Delete.
(EXTRA_CONSTRAINT_FOR_U, EXTRA_CONSTRAINT): Delete.
(EXTRA_MEMORY_CONSTRAINT, CONSTRAINT_LEN): Delete.
(REG_CLASS_FROM_CONSTRAINT): Delete.
2011-02-15 Jakub Jelinek <jakub@redhat.com>
PR middle-end/47581

View File

@ -0,0 +1,174 @@
;; Constraint definitions for FRV.
;; Copyright (C) 2001 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/>.
;; Register constraints.
(define_register_constraint "a" "ACC_REGS"
"@internal")
(define_register_constraint "b" "EVEN_ACC_REGS"
"@internal")
(define_register_constraint "c" "CC_REGS"
"@internal")
(define_register_constraint "d" "GPR_REGS"
"@internal")
(define_register_constraint "e" "EVEN_REGS"
"@internal")
(define_register_constraint "f" "FPR_REGS"
"@internal")
(define_register_constraint "h" "FEVEN_REGS"
"@internal")
(define_register_constraint "l" "LR_REG"
"@internal")
(define_register_constraint "q" "QUAD_REGS"
"@internal")
(define_register_constraint "t" "ICC_REGS"
"@internal")
(define_register_constraint "u" "FCC_REGS"
"@internal")
(define_register_constraint "v" "ICR_REGS"
"@internal")
(define_register_constraint "w" "FCR_REGS"
"@internal")
(define_register_constraint "x" "QUAD_FPR_REGS"
"@internal")
(define_register_constraint "y" "LCR_REG"
"@internal")
(define_register_constraint "z" "SPR_REGS"
"@internal")
(define_register_constraint "A" "QUAD_ACC_REGS"
"@internal")
(define_register_constraint "B" "ACCG_REGS"
"@internal")
(define_register_constraint "C" "CR_REGS"
"@internal")
(define_register_constraint "D89" "GR89_REGS"
"@internal")
(define_register_constraint "D09" "GR9_REGS"
"@internal")
(define_register_constraint "D08" "GR8_REGS"
"@internal")
(define_register_constraint "D14" "FDPIC_FPTR_REGS"
"@internal")
(define_register_constraint "D15" "FDPIC_REGS"
"@internal")
(define_register_constraint "W" "FDPIC_CALL_REGS"
"@internal")
(define_register_constraint "Z" "FDPIC_REGS"
"@internal")
;; Integer constraints.
(define_constraint "I"
"A signed 6-bit immediate."
(and (match_code "const_int")
(match_test "IN_RANGE (ival, -32, 31)")))
(define_constraint "J"
"A signed 10-bit immediate."
(and (match_code "const_int")
(match_test "IN_RANGE (ival, -512, 511)")))
(define_constraint "K"
"@internal"
;; Unused.
(and (match_code "const_int")
(match_test "0")))
(define_constraint "L"
"A signed 16-bit immediate."
(and (match_code "const_int")
(match_test "IN_RANGE (ival, -32768, 32767)")))
(define_constraint "M"
"An unsigned 16-bit immediate."
(and (match_code "const_int")
(match_test "IN_RANGE (ival, 0, 65535)")))
(define_constraint "N"
"A signed 12-bit immediate that is negative."
(and (match_code "const_int")
(match_test "IN_RANGE (ival, -2048, -1)")))
(define_constraint "O"
"Zero."
(and (match_code "const_int")
(match_test "ival == 0")))
(define_constraint "P"
"A signed 12-bit immediate that is positive."
(and (match_code "const_int")
(match_test "IN_RANGE (ival, 1, 2047)")))
;; Floating-point constraints.
(define_constraint "G"
"Floating-point zero."
(and (match_code "const_double")
(ior (and (match_test "mode == VOIDmode")
(match_test "hval == 0 && lval == 0"))
(and (match_test "mode == SFmode || mode == DFmode")
(match_test "op == CONST0_RTX (mode)")))))
(define_constraint "H"
"@internal"
;; Unused.
(and (match_code "const_double")
(match_test "0")))
(define_constraint "Q"
"12-bit relocations."
(match_test "got12_operand (op, mode)"))
(define_memory_constraint "R"
"Double word memory ops that take one instruction."
(match_test "dbl_memory_one_insn_operand (op, mode)"))
(define_constraint "S"
"SYMBOL_REF."
(match_test "CONSTANT_P (op) && call_operand (op, VOIDmode)"))
(define_memory_constraint "T"
"Double word memory ops that take two instructions."
(match_test "dbl_memory_two_insn_operand (op, mode)"))
(define_memory_constraint "U"
"Memory operand for conditional execution."
(match_test "condexec_memory_operand (op, mode)"))

View File

@ -252,9 +252,6 @@ static /* GTY(()) */ frv_ifcvt_t frv_ifcvt;
/* Map register number to smallest register class. */
enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER];
/* Map class letter into register class. */
enum reg_class reg_class_from_letter[256];
/* Cached value of frv_stack_info. */
static frv_stack_t *frv_stack_cache = (frv_stack_t *)0;
@ -809,48 +806,6 @@ frv_option_override (void)
if (!global_options_set.x_g_switch_value && !TARGET_LIBPIC)
g_switch_value = SDATA_DEFAULT_SIZE;
/* A C expression which defines the machine-dependent operand
constraint letters for register classes. If CHAR is such a
letter, the value should be the register class corresponding to
it. Otherwise, the value should be `NO_REGS'. The register
letter `r', corresponding to class `GENERAL_REGS', will not be
passed to this macro; you do not need to handle it.
The following letters are unavailable, due to being used as
constraints:
'0'..'9'
'<', '>'
'E', 'F', 'G', 'H'
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'
'Q', 'R', 'S', 'T', 'U'
'V', 'X'
'g', 'i', 'm', 'n', 'o', 'p', 'r', 's' */
for (i = 0; i < 256; i++)
reg_class_from_letter[i] = NO_REGS;
reg_class_from_letter['a'] = ACC_REGS;
reg_class_from_letter['b'] = EVEN_ACC_REGS;
reg_class_from_letter['c'] = CC_REGS;
reg_class_from_letter['d'] = GPR_REGS;
reg_class_from_letter['e'] = EVEN_REGS;
reg_class_from_letter['f'] = FPR_REGS;
reg_class_from_letter['h'] = FEVEN_REGS;
reg_class_from_letter['l'] = LR_REG;
reg_class_from_letter['q'] = QUAD_REGS;
reg_class_from_letter['t'] = ICC_REGS;
reg_class_from_letter['u'] = FCC_REGS;
reg_class_from_letter['v'] = ICR_REGS;
reg_class_from_letter['w'] = FCR_REGS;
reg_class_from_letter['x'] = QUAD_FPR_REGS;
reg_class_from_letter['y'] = LCR_REG;
reg_class_from_letter['z'] = SPR_REGS;
reg_class_from_letter['A'] = QUAD_ACC_REGS;
reg_class_from_letter['B'] = ACCG_REGS;
reg_class_from_letter['C'] = CR_REGS;
reg_class_from_letter['W'] = FDPIC_CALL_REGS; /* gp14+15 */
reg_class_from_letter['Z'] = FDPIC_REGS; /* gp15 */
/* There is no single unaligned SI op for PIC code. Sometimes we
need to use ".4byte" and sometimes we need to use ".picptr".
See frv_assemble_integer for details. */

View File

@ -1003,25 +1003,6 @@ extern enum reg_class regno_reg_class[];
(as well as added to a displacement). */
#define INDEX_REG_CLASS GPR_REGS
/* A C expression which defines the machine-dependent operand constraint
letters for register classes. If CHAR is such a letter, the value should be
the register class corresponding to it. Otherwise, the value should be
`NO_REGS'. The register letter `r', corresponding to class `GENERAL_REGS',
will not be passed to this macro; you do not need to handle it.
The following letters are unavailable, due to being used as
constraints:
'0'..'9'
'<', '>'
'E', 'F', 'G', 'H'
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P'
'Q', 'R', 'S', 'T', 'U'
'V', 'X'
'g', 'i', 'm', 'n', 'o', 'p', 'r', 's' */
extern enum reg_class reg_class_from_letter[];
#define REG_CLASS_FROM_LETTER(CHAR) reg_class_from_letter [(unsigned char)(CHAR)]
/* A C expression which is nonzero if register number NUM is suitable for use
as a base register in operand addresses. It may be either a suitable hard
register or a pseudo register that has been allocated such a hard register. */
@ -1067,124 +1048,6 @@ extern enum reg_class reg_class_from_letter[];
#define ZERO_P(x) (x == CONST0_RTX (GET_MODE (x)))
/* 6-bit signed immediate. */
#define CONST_OK_FOR_I(VALUE) IN_RANGE (VALUE, -32, 31)
/* 10-bit signed immediate. */
#define CONST_OK_FOR_J(VALUE) IN_RANGE (VALUE, -512, 511)
/* Unused */
#define CONST_OK_FOR_K(VALUE) 0
/* 16-bit signed immediate. */
#define CONST_OK_FOR_L(VALUE) IN_RANGE (VALUE, -32768, 32767)
/* 16-bit unsigned immediate. */
#define CONST_OK_FOR_M(VALUE) IN_RANGE (VALUE, 0, 65535)
/* 12-bit signed immediate that is negative. */
#define CONST_OK_FOR_N(VALUE) IN_RANGE (VALUE, -2048, -1)
/* Zero */
#define CONST_OK_FOR_O(VALUE) ((VALUE) == 0)
/* 12-bit signed immediate that is negative. */
#define CONST_OK_FOR_P(VALUE) IN_RANGE (VALUE, 1, 2047)
/* A C expression that defines the machine-dependent operand constraint letters
(`I', `J', `K', .. 'P') that specify particular ranges of integer values.
If C is one of those letters, the expression should check that VALUE, an
integer, is in the appropriate range and return 1 if so, 0 otherwise. If C
is not one of those letters, the value should be 0 regardless of VALUE. */
#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)
/* A C expression that defines the machine-dependent operand constraint letters
(`G', `H') that specify particular ranges of `const_double' values.
If C is one of those letters, the expression should check that VALUE, an RTX
of code `const_double', is in the appropriate range and return 1 if so, 0
otherwise. If C is not one of those letters, the value should be 0
regardless of VALUE.
`const_double' is used for all floating-point constants and for `DImode'
fixed-point constants. A given letter can accept either or both kinds of
values. It can use `GET_MODE' to distinguish between these kinds. */
#define CONST_DOUBLE_OK_FOR_G(VALUE) \
((GET_MODE (VALUE) == VOIDmode \
&& CONST_DOUBLE_LOW (VALUE) == 0 \
&& CONST_DOUBLE_HIGH (VALUE) == 0) \
|| ((GET_MODE (VALUE) == SFmode \
|| GET_MODE (VALUE) == DFmode) \
&& (VALUE) == CONST0_RTX (GET_MODE (VALUE))))
#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)
/* A C expression that defines the optional machine-dependent constraint
letters (`Q', `R', `S', `T', `U') 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. */
/* 12-bit relocations. */
#define EXTRA_CONSTRAINT_FOR_Q(VALUE) \
(got12_operand (VALUE, GET_MODE (VALUE)))
/* Double word memory ops that take one instruction. */
#define EXTRA_CONSTRAINT_FOR_R(VALUE) \
(dbl_memory_one_insn_operand (VALUE, GET_MODE (VALUE)))
/* SYMBOL_REF */
#define EXTRA_CONSTRAINT_FOR_S(VALUE) \
(CONSTANT_P (VALUE) && call_operand (VALUE, VOIDmode))
/* Double word memory ops that take two instructions. */
#define EXTRA_CONSTRAINT_FOR_T(VALUE) \
(dbl_memory_two_insn_operand (VALUE, GET_MODE (VALUE)))
/* Memory operand for conditional execution. */
#define EXTRA_CONSTRAINT_FOR_U(VALUE) \
(condexec_memory_operand (VALUE, GET_MODE (VALUE)))
#define EXTRA_CONSTRAINT(VALUE, C) \
( (C) == 'Q' ? EXTRA_CONSTRAINT_FOR_Q (VALUE) \
: (C) == 'R' ? EXTRA_CONSTRAINT_FOR_R (VALUE) \
: (C) == 'S' ? EXTRA_CONSTRAINT_FOR_S (VALUE) \
: (C) == 'T' ? EXTRA_CONSTRAINT_FOR_T (VALUE) \
: (C) == 'U' ? EXTRA_CONSTRAINT_FOR_U (VALUE) \
: 0)
#define EXTRA_MEMORY_CONSTRAINT(C,STR) \
((C) == 'U' || (C) == 'R' || (C) == 'T')
#define CONSTRAINT_LEN(C, STR) \
((C) == 'D' ? 3 : DEFAULT_CONSTRAINT_LEN ((C), (STR)))
#define REG_CLASS_FROM_CONSTRAINT(C, STR) \
(((C) == 'D' && (STR)[1] == '8' && (STR)[2] == '9') ? GR89_REGS : \
((C) == 'D' && (STR)[1] == '0' && (STR)[2] == '9') ? GR9_REGS : \
((C) == 'D' && (STR)[1] == '0' && (STR)[2] == '8') ? GR8_REGS : \
((C) == 'D' && (STR)[1] == '1' && (STR)[2] == '4') ? FDPIC_FPTR_REGS : \
((C) == 'D' && (STR)[1] == '1' && (STR)[2] == '5') ? FDPIC_REGS : \
REG_CLASS_FROM_LETTER ((C)))
/* Basic Stack Layout. */

View File

@ -1519,6 +1519,7 @@
;;
(include "predicates.md")
(include "constraints.md")
;; ::::::::::::::::::::
;; ::