diff options
author | Wolfgang Gellerich <gellerich@de.ibm.com> | 2006-10-17 14:12:13 +0000 |
---|---|---|
committer | Andreas Krebbel <krebbel@gcc.gnu.org> | 2006-10-17 14:12:13 +0000 |
commit | cd8dc1f9b90e8a7f8e645a29549696f399d6e9af (patch) | |
tree | a8dc4679f000ab259f2dc58c56d7aa7d5bea27ca /gcc | |
parent | 4d79381119ed02f9d80de7898935ac5686d119bd (diff) | |
download | gcc-cd8dc1f9b90e8a7f8e645a29549696f399d6e9af.zip gcc-cd8dc1f9b90e8a7f8e645a29549696f399d6e9af.tar.gz gcc-cd8dc1f9b90e8a7f8e645a29549696f399d6e9af.tar.bz2 |
contraints.md: New file.
2006-10-17 Wolfgang Gellerich <gellerich@de.ibm.com>
* config/s390/contraints.md: New file.
* config/s390/s390-protos.h (s390_mem_constraint,
s390_O_constraint_str, s390_N_constraint_str,
s390_float_const_zero_p): Function prototypes added.
* config/s390/s390.c (s390_extra_constraint_str,
s390_const_double_ok_for_constraint_p,
s390_const_ok_for_constraint_p): Functions removed.
(s390_mem_constraint, s390_O_constraint_str, s390_N_constraint_str,
s390_float_const_zero_p): New functions.
* config/s390/s390.h (REG_CLASS_FROM_LETTER, CONST_OK_FOR_CONSTRAINT_P,
CONST_DOUBLE_OK_FOR_CONSTRAINT_P, EXTRA_CONSTRAINT_STR,
EXTRA_MEMORY_CONSTRAINT, EXTRA_ADDRESS_CONSTRAINT, CONSTRAINT_LEN):
Macro definitions removed.
(s390_const_ok_for_constraint_p, s390_const_double_ok_for_constraint_p,
s390_extra_constraint_str): Functions removed.
From-SVN: r117826
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 18 | ||||
-rw-r--r-- | gcc/config/s390/constraints.md | 438 | ||||
-rw-r--r-- | gcc/config/s390/s390-protos.h | 12 | ||||
-rw-r--r-- | gcc/config/s390/s390.c | 195 | ||||
-rw-r--r-- | gcc/config/s390/s390.h | 28 | ||||
-rw-r--r-- | gcc/config/s390/s390.md | 49 |
6 files changed, 565 insertions, 175 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a2569f..d261a57 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +2006-10-17 Wolfgang Gellerich <gellerich@de.ibm.com> + + * config/s390/contraints.md: New file. + * config/s390/s390-protos.h (s390_mem_constraint, + s390_O_constraint_str, s390_N_constraint_str, + s390_float_const_zero_p): Function prototypes added. + * config/s390/s390.c (s390_extra_constraint_str, + s390_const_double_ok_for_constraint_p, + s390_const_ok_for_constraint_p): Functions removed. + (s390_mem_constraint, s390_O_constraint_str, s390_N_constraint_str, + s390_float_const_zero_p): New functions. + * config/s390/s390.h (REG_CLASS_FROM_LETTER, CONST_OK_FOR_CONSTRAINT_P, + CONST_DOUBLE_OK_FOR_CONSTRAINT_P, EXTRA_CONSTRAINT_STR, + EXTRA_MEMORY_CONSTRAINT, EXTRA_ADDRESS_CONSTRAINT, CONSTRAINT_LEN): + Macro definitions removed. + (s390_const_ok_for_constraint_p, s390_const_double_ok_for_constraint_p, + s390_extra_constraint_str): Functions removed. + 2006-10-17 Andrew Pinsiki <pinskia@gmail.com> Richard Sandiford <richard@codesourcery.com> diff --git a/gcc/config/s390/constraints.md b/gcc/config/s390/constraints.md new file mode 100644 index 0000000..cfc8aa5 --- /dev/null +++ b/gcc/config/s390/constraints.md @@ -0,0 +1,438 @@ +;; Constraints definitions belonging to the gcc backend for IBM S/390. +;; Copyright (C) 2006 Free Software Foundation, Inc. +;; Written by Wolfgang Gellerich, using code and information found in +;; files s390.md, s390.h, and s390.c. +;; +;; 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 2, 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 COPYING. If not, write to the Free +;; Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA +;; 02110-1301, USA. + + +;; +;; Special constraints for s/390 machine description: +;; +;; a -- Any address register from 1 to 15. +;; c -- Condition code register 33. +;; d -- Any register from 0 to 15. +;; f -- Floating point registers. +;; t -- Access registers 36 and 37. +;; G -- Const double zero operand +;; I -- An 8-bit constant (0..255). +;; J -- A 12-bit constant (0..4095). +;; K -- A 16-bit constant (-32768..32767). +;; L -- Value appropriate as displacement. +;; (0..4095) for short displacement +;; (-524288..524287) for long displacement +;; M -- Constant integer with a value of 0x7fffffff. +;; N -- Multiple letter constraint followed by 4 parameter letters. +;; 0..9,x: number of the part counting from most to least significant +;; H,Q: mode of the part +;; D,S,H: mode of the containing operand +;; 0,F: value of the other parts (F - all bits set) +;; +;; The constraint matches if the specified part of a constant +;; has a value different from its other parts. If the letter x +;; is specified instead of a part number, the constraint matches +;; if there is any single part with non-default value. +;; O -- Multiple letter constraint followed by 1 parameter. +;; s: Signed extended immediate value (-2G .. 2G-1). +;; p: Positive extended immediate value (0 .. 4G-1). +;; n: Negative extended immediate value (-4G .. -1). +;; These constraints do not accept any operand if the machine does +;; not provide the extended-immediate facility. +;; P -- Any integer constant that can be loaded without literal pool. +;; Q -- Memory reference without index register and with short displacement. +;; R -- Memory reference with index register and short displacement. +;; S -- Memory reference without index register but with long displacement. +;; T -- Memory reference with index register and long displacement. +;; A -- Multiple letter constraint followed by Q, R, S, or T: +;; Offsettable memory reference of type specified by second letter. +;; B -- Multiple letter constraint followed by Q, R, S, or T: +;; Memory reference of the type specified by second letter that +;; does *not* refer to a literal pool entry. +;; U -- Pointer with short displacement. +;; W -- Pointer with long displacement. +;; Y -- Shift count operand. +;; + + +;; +;; Register constraints. +;; + +(define_register_constraint "a" + "ADDR_REGS" + "Any address register from 1 to 15.") + + +(define_register_constraint "c" + "CC_REGS" + "Condition code register 33") + + +(define_register_constraint "d" + "GENERAL_REGS" + "Any register from 0 to 15") + + +(define_register_constraint "f" + "FP_REGS" + "Floating point registers") + + +(define_register_constraint "t" + "ACCESS_REGS" + "@internal + Access registers 36 and 37") + + +;; +;; General constraints for constants. +;; + +(define_constraint "G" + "@internal + Const double zero operand" + (and (match_code "const_double") + (match_test "s390_float_const_zero_p (op)"))) + + +(define_constraint "I" + "An 8-bit constant (0..255)" + (and (match_code "const_int") + (match_test "(unsigned int) ival <= 255"))) + + +(define_constraint "J" + "A 12-bit constant (0..4095)" + (and (match_code "const_int") + (match_test "(unsigned int) ival <= 4095"))) + + +(define_constraint "K" + "A 16-bit constant (-32768..32767)" + (and (match_code "const_int") + (match_test "ival >= -32768 && ival <= 32767"))) + + + +(define_constraint "L" + "Value appropriate as displacement. + (0..4095) for short displacement + (-524288..524287) for long displacement" + (and (match_code "const_int") + (match_test "TARGET_LONG_DISPLACEMENT ? + (ival >= -524288 && ival <= 524287) + : (ival >= 0 && ival <= 4095)"))) + + +(define_constraint "M" + "Constant integer with a value of 0x7fffffff" + (and (match_code "const_int") + (match_test "ival == 2147483647"))) + + +(define_constraint "P" + "@internal + Any integer constant that can be loaded without literal pool" + (and (match_code "const_int") + (match_test "legitimate_reload_constant_p (GEN_INT (ival))"))) + + +(define_address_constraint "Y" + "Shift count operand" + +;; Simply check for the basic form of a shift count. Reload will +;; take care of making sure we have a proper base register. + + (match_test "s390_decompose_shift_count (op, NULL, NULL)" )) + + +;; N -- Multiple letter constraint followed by 4 parameter letters. +;; 0..9,x: number of the part counting from most to least significant +;; H,Q: mode of the part +;; D,S,H: mode of the containing operand +;; 0,F: value of the other parts (F = all bits set) +;; +;; The constraint matches if the specified part of a constant +;; has a value different from its other parts. If the letter x +;; is specified instead of a part number, the constraint matches +;; if there is any single part with non-default value. +;; +;; The following patterns define only those constraints that are actually +;; used in s390.md. If you need an additional one, simply add it in the +;; obvious way. Function s390_N_constraint_str is ready to handle all +;; combinations. +;; + + +(define_constraint "NxQS0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"xQS0\", ival)"))) + + +(define_constraint "NxQD0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"xQD0\", ival)"))) + + +(define_constraint "N3HD0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"3HD0\", ival)"))) + + +(define_constraint "N2HD0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"2HD0\", ival)"))) + + +(define_constraint "N1SD0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"1SD0\", ival)"))) + + +(define_constraint "N1HS0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"1HS0\", ival)"))) + + +(define_constraint "N1HD0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"1HD0\", ival)"))) + + +(define_constraint "N0SD0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"0SD0\", ival)"))) + + +(define_constraint "N0HS0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"0HS0\", ival)"))) + + +(define_constraint "N0HD0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"0HD0\", ival)"))) + + +(define_constraint "NxQDF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"xQDF\", ival)"))) + + +(define_constraint "N1SDF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"1SDF\", ival)"))) + + +(define_constraint "N0SDF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"0SDF\", ival)"))) + + +(define_constraint "N3HDF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"3HDF\", ival)"))) + + +(define_constraint "N2HDF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"2HDF\", ival)"))) + + +(define_constraint "N1HDF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"1HDF\", ival)"))) + + +(define_constraint "N0HDF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"0HDF\", ival)"))) + + +(define_constraint "N0HSF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"0HSF\", ival)"))) + + +(define_constraint "N1HSF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"1HSF\", ival)"))) + + +(define_constraint "NxQSF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"xQSF\", ival)"))) + + +(define_constraint "NxQHF" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"xQHF\", ival)"))) + + +(define_constraint "NxQH0" + "@internal" + (and (match_code "const_int") + (match_test "s390_N_constraint_str (\"xQH0\", ival)"))) + + + + +;; +;; Double-letter constraints starting with O follow. +;; + + +(define_constraint "Os" + "@internal + Signed extended immediate value (-2G .. 2G-1). + This constraint will only match if the machine provides + the extended-immediate facility." + (and (match_code "const_int") + (match_test "s390_O_constraint_str ('s', ival)"))) + + +(define_constraint "Op" + "@internal + Positive extended immediate value (0 .. 4G-1). + This constraint will only match if the machine provides + the extended-immediate facility." + (and (match_code "const_int") + (match_test "s390_O_constraint_str ('p', ival)"))) + + +(define_constraint "On" + "@internal + Negative extended immediate value (-4G .. -1). + This constraint will only match if the machine provides + the extended-immediate facility." + (and (match_code "const_int") + (match_test "s390_O_constraint_str ('n', ival)"))) + + + + +;; +;; Memory constraints follow. +;; + +(define_memory_constraint "Q" + "Memory reference without index register and with short displacement" + (match_test "s390_mem_constraint (\"Q\", op)")) + + + +(define_memory_constraint "R" + "Memory reference with index register and short displacement" + (match_test "s390_mem_constraint (\"R\", op)")) + + +(define_memory_constraint "S" + "Memory reference without index register but with long displacement" + (match_test "s390_mem_constraint (\"S\", op)")) + + +(define_memory_constraint "T" + "Memory reference with index register and long displacement" + (match_test "s390_mem_constraint (\"T\", op)")) + + + +(define_memory_constraint "AQ" + "@internal + Offsettable memory reference without index register and with short displacement" + (match_test "s390_mem_constraint (\"AQ\", op)")) + + +(define_memory_constraint "AR" + "@internal + Offsettable memory reference with index register and short displacement" + (match_test "s390_mem_constraint (\"AR\", op)")) + + +(define_memory_constraint "AS" + "@internal + Offsettable memory reference without index register but with long displacement" + (match_test "s390_mem_constraint (\"AS\", op)")) + + +(define_memory_constraint "AT" + "@internal + Offsettable memory reference with index register and long displacement" + (match_test "s390_mem_constraint (\"AT\", op)")) + + + +(define_constraint "BQ" + "@internal + Memory reference without index register and with short + displacement that does *not* refer to a literal pool entry." + (match_test "s390_mem_constraint (\"BQ\", op)")) + + +(define_constraint "BR" + "@internal + Memory reference with index register and short displacement that + does *not* refer to a literal pool entry. " + (match_test "s390_mem_constraint (\"BR\", op)")) + + +(define_constraint "BS" + "@internal + Memory reference without index register but with long displacement + that does *not* refer to a literal pool entry. " + (match_test "s390_mem_constraint (\"BS\", op)")) + + +(define_constraint "BT" + "@internal + Memory reference with index register and long displacement that + does *not* refer to a literal pool entry. " + (match_test "s390_mem_constraint (\"BT\", op)")) + + + +(define_address_constraint "U" + "Pointer with short displacement" + (match_test "s390_mem_constraint (\"U\", op)")) + + + +(define_address_constraint "W" + "Pointer with long displacement" + (match_test "s390_mem_constraint (\"W\", op)")) diff --git a/gcc/config/s390/s390-protos.h b/gcc/config/s390/s390-protos.h index 4e43264..8b2db85 100644 --- a/gcc/config/s390/s390-protos.h +++ b/gcc/config/s390/s390-protos.h @@ -19,6 +19,18 @@ along with GCC; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + + +/* Prototypes of functions used for constraint evaluation in + constraints.c. */ + +extern int s390_mem_constraint (const char *str, rtx op); +extern int s390_O_constraint_str (const char c, HOST_WIDE_INT value); +extern int s390_N_constraint_str (const char *str, HOST_WIDE_INT value); +extern int s390_float_const_zero_p (rtx value); + + + /* Declare functions in s390.c. */ extern void optimization_options (int, int); diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index d205695..b6aeee1 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -1842,14 +1842,16 @@ s390_legitimate_address_without_index_p (rtx op) return true; } -/* Return 1 if OP is a valid operand for a C constraint, 0 else. */ + +/* Evaluates constraint strings described by the regular expression + ([A|B](Q|R|S|T))|U|W and returns 1 if OP is a valid operand for the + constraint given in STR, or 0 else. */ int -s390_extra_constraint_str (rtx op, int c, const char * str) +s390_mem_constraint (const char *str, rtx op) { struct s390_address addr; - - gcc_assert (c == str[0]); + char c = str[0]; /* Check for offsettable variants of memory constraints. */ if (c == 'A') @@ -1859,8 +1861,7 @@ s390_extra_constraint_str (rtx op, int c, const char * str) return 0; if ((reload_completed || reload_in_progress) - ? !offsettable_memref_p (op) - : !offsettable_nonstrict_memref_p (op)) + ? !offsettable_memref_p (op) : !offsettable_nonstrict_memref_p (op)) return 0; c = str[1]; @@ -1968,132 +1969,120 @@ s390_extra_constraint_str (rtx op, int c, const char * str) return 1; } -/* Return true if VALUE matches the constraint STR. */ + + +/* Evaluates constraint strings starting with letter O. Input + parameter C is the second letter following the "O" in the constraint + string. Returns 1 if VALUE meets the respective constraint and 0 + otherwise. */ int -s390_const_double_ok_for_constraint_p (rtx value, - int c, - const char * str) +s390_O_constraint_str (const char c, HOST_WIDE_INT value) { - gcc_assert (c == str[0]); + if (!TARGET_EXTIMM) + return 0; - switch (str[0]) + switch (c) { - case 'G': - /* The floating point zero constant. */ - return (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT - && value == CONST0_RTX (GET_MODE (value))); - + case 's': + return trunc_int_for_mode (value, SImode) == value; + + case 'p': + return value == 0 + || s390_single_part (GEN_INT (value), DImode, SImode, 0) == 1; + + case 'n': + return value == -1 + || s390_single_part (GEN_INT (value), DImode, SImode, -1) == 1; + default: - return 0; + gcc_unreachable (); } } -/* Return true if VALUE matches the constraint STR. */ + +/* Evaluates constraint strings starting with letter N. Parameter STR + contains the letters following letter "N" in the constraint string. + Returns true if VALUE matches the constraint. */ int -s390_const_ok_for_constraint_p (HOST_WIDE_INT value, - int c, - const char * str) +s390_N_constraint_str (const char *str, HOST_WIDE_INT value) { enum machine_mode mode, part_mode; int def; int part, part_goal; - gcc_assert (c == str[0]); - - switch (str[0]) - { - case 'I': - return (unsigned int)value < 256; - - case 'J': - return (unsigned int)value < 4096; - case 'K': - return value >= -32768 && value < 32768; - - case 'L': - return (TARGET_LONG_DISPLACEMENT ? - (value >= -524288 && value <= 524287) - : (value >= 0 && value <= 4095)); - case 'M': - return value == 2147483647; - - case 'N': - if (str[1] == 'x') - part_goal = -1; - else - part_goal = str[1] - '0'; - - switch (str[2]) - { - case 'Q': part_mode = QImode; break; - case 'H': part_mode = HImode; break; - case 'S': part_mode = SImode; break; - default: return 0; - } - - switch (str[3]) - { - case 'H': mode = HImode; break; - case 'S': mode = SImode; break; - case 'D': mode = DImode; break; - default: return 0; - } - - switch (str[4]) - { - case '0': def = 0; break; - case 'F': def = -1; break; - default: return 0; - } - - if (GET_MODE_SIZE (mode) <= GET_MODE_SIZE (part_mode)) - return 0; - - part = s390_single_part (GEN_INT (value), mode, part_mode, def); - if (part < 0) - return 0; - if (part_goal != -1 && part_goal != part) - return 0; + if (str[0] == 'x') + part_goal = -1; + else + part_goal = str[0] - '0'; + switch (str[1]) + { + case 'Q': + part_mode = QImode; break; - - case 'O': - if (!TARGET_EXTIMM) - return 0; - - switch (str[1]) - { - case 's': - return trunc_int_for_mode (value, SImode) == value; - - case 'p': - return value == 0 - || s390_single_part (GEN_INT (value), DImode, SImode, 0) == 1; - - case 'n': - return - (value == -1 - || s390_single_part (GEN_INT (value), DImode, SImode, -1) == 1) - && value != -((HOST_WIDE_INT)1 << 32); - - default: - gcc_unreachable (); - } + case 'H': + part_mode = HImode; + break; + case 'S': + part_mode = SImode; break; + default: + return 0; + } - case 'P': - return legitimate_reload_constant_p (GEN_INT (value)); + switch (str[2]) + { + case 'H': + mode = HImode; + break; + case 'S': + mode = SImode; + break; + case 'D': + mode = DImode; + break; + default: + return 0; + } + switch (str[3]) + { + case '0': + def = 0; + break; + case 'F': + def = -1; + break; default: return 0; } + if (GET_MODE_SIZE (mode) <= GET_MODE_SIZE (part_mode)) + return 0; + + part = s390_single_part (GEN_INT (value), mode, part_mode, def); + if (part < 0) + return 0; + if (part_goal != -1 && part_goal != part) + return 0; + return 1; } + +/* Returns true if the input parameter VALUE is a float zero. */ + +int +s390_float_const_zero_p (rtx value) +{ + return (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT + && value == CONST0_RTX (GET_MODE (value))); +} + + /* Compute a (partial) cost for rtx X. Return true if the complete cost has been computed, and false if subexpressions should be scanned. In either case, *TOTAL contains the cost result. diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h index 2f9b7d0..ba7a036 100644 --- a/gcc/config/s390/s390.h +++ b/gcc/config/s390/s390.h @@ -481,34 +481,6 @@ extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; : MODE) -/* Define various machine-dependent constraint letters. */ - -#define REG_CLASS_FROM_LETTER(C) \ - ((C) == 'a' ? ADDR_REGS : \ - (C) == 'd' ? GENERAL_REGS : \ - (C) == 'f' ? FP_REGS : \ - (C) == 'c' ? CC_REGS : \ - (C) == 't' ? ACCESS_REGS : NO_REGS) - -#define CONST_OK_FOR_CONSTRAINT_P(VALUE, C, STR) \ - s390_const_ok_for_constraint_p ((VALUE), (C), (STR)) - -#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(VALUE, C, STR) \ - s390_const_double_ok_for_constraint_p ((VALUE), (C), (STR)) - -#define EXTRA_CONSTRAINT_STR(OP, C, STR) \ - s390_extra_constraint_str ((OP), (C), (STR)) -#define EXTRA_MEMORY_CONSTRAINT(C, STR) \ - ((C) == 'Q' || (C) == 'R' || (C) == 'S' || (C) == 'T' || (C) == 'A') -#define EXTRA_ADDRESS_CONSTRAINT(C, STR) \ - ((C) == 'U' || (C) == 'W' || (C) == 'Y') - -#define CONSTRAINT_LEN(C, STR) \ - ((C) == 'N' ? 5 : \ - (C) == 'O' ? 2 : \ - (C) == 'A' ? 2 : \ - (C) == 'B' ? 2 : DEFAULT_CONSTRAINT_LEN ((C), (STR))) - /* Stack layout and calling conventions. */ /* Our stack grows from higher to lower addresses. However, local variables diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index eb734e1..2348409 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -22,51 +22,9 @@ ;; 02110-1301, USA. ;; -;; Special constraints for s/390 machine description: -;; -;; a -- Any address register from 1 to 15. -;; c -- Condition code register 33. -;; d -- Any register from 0 to 15. -;; f -- Floating point registers. -;; t -- Access registers 36 and 37. -;; G -- Const double zero operand -;; I -- An 8-bit constant (0..255). -;; J -- A 12-bit constant (0..4095). -;; K -- A 16-bit constant (-32768..32767). -;; L -- Value appropriate as displacement. -;; (0..4095) for short displacement -;; (-524288..524287) for long displacement -;; M -- Constant integer with a value of 0x7fffffff. -;; N -- Multiple letter constraint followed by 4 parameter letters. -;; 0..9,x: number of the part counting from most to least significant -;; H,Q: mode of the part -;; D,S,H: mode of the containing operand -;; 0,F: value of the other parts (F - all bits set) -;; -;; The constraint matches if the specified part of a constant -;; has a value different from its other parts. If the letter x -;; is specified instead of a part number, the constraint matches -;; if there is any single part with non-default value. -;; O -- Multiple letter constraint followed by 1 parameter. -;; s: Signed extended immediate value (-2G .. 2G-1). -;; p: Positive extended immediate value (0 .. 4G-1). -;; n: Negative extended immediate value (-4G+1 .. -1). -;; These constraints do not accept any operand if the machine does -;; not provide the extended-immediate facility. -;; P -- Any integer constant that can be loaded without literal pool. -;; Q -- Memory reference without index register and with short displacement. -;; R -- Memory reference with index register and short displacement. -;; S -- Memory reference without index register but with long displacement. -;; T -- Memory reference with index register and long displacement. -;; A -- Multiple letter constraint followed by Q, R, S, or T: -;; Offsettable memory reference of type specified by second letter. -;; B -- Multiple letter constraint followed by Q, R, S, or T: -;; Memory reference of the type specified by second letter that -;; does *not* refer to a literal pool entry. -;; U -- Pointer with short displacement. -;; W -- Pointer with long displacement. -;; Y -- Shift count operand. +;; See constraints.md for a description of constraints specific to s390. ;; + ;; Special formats used for outputting 390 instructions. ;; ;; %C: print opcode suffix for branch condition. @@ -243,6 +201,9 @@ ;; Predicates (include "predicates.md") +;; Constraint definitions +(include "constraints.md") + ;; Other includes (include "tpf.md") |