Commit cd8dc1f9 by Wolfgang Gellerich Committed by Andreas Krebbel

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
parent 4d793811
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> 2006-10-17 Andrew Pinsiki <pinskia@gmail.com>
Richard Sandiford <richard@codesourcery.com> Richard Sandiford <richard@codesourcery.com>
......
...@@ -19,6 +19,18 @@ along with GCC; see the file COPYING. If not, write to the Free ...@@ -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 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */ 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. */ /* Declare functions in s390.c. */
extern void optimization_options (int, int); extern void optimization_options (int, int);
......
...@@ -1842,14 +1842,16 @@ s390_legitimate_address_without_index_p (rtx op) ...@@ -1842,14 +1842,16 @@ s390_legitimate_address_without_index_p (rtx op)
return true; 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 int
s390_extra_constraint_str (rtx op, int c, const char * str) s390_mem_constraint (const char *str, rtx op)
{ {
struct s390_address addr; struct s390_address addr;
char c = str[0];
gcc_assert (c == str[0]);
/* Check for offsettable variants of memory constraints. */ /* Check for offsettable variants of memory constraints. */
if (c == 'A') if (c == 'A')
...@@ -1859,8 +1861,7 @@ s390_extra_constraint_str (rtx op, int c, const char * str) ...@@ -1859,8 +1861,7 @@ s390_extra_constraint_str (rtx op, int c, const char * str)
return 0; return 0;
if ((reload_completed || reload_in_progress) if ((reload_completed || reload_in_progress)
? !offsettable_memref_p (op) ? !offsettable_memref_p (op) : !offsettable_nonstrict_memref_p (op))
: !offsettable_nonstrict_memref_p (op))
return 0; return 0;
c = str[1]; c = str[1];
...@@ -1968,132 +1969,120 @@ s390_extra_constraint_str (rtx op, int c, const char * str) ...@@ -1968,132 +1969,120 @@ s390_extra_constraint_str (rtx op, int c, const char * str)
return 1; 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 int
s390_const_double_ok_for_constraint_p (rtx value, s390_O_constraint_str (const char c, HOST_WIDE_INT value)
int c,
const char * str)
{ {
gcc_assert (c == str[0]); if (!TARGET_EXTIMM)
return 0;
switch (str[0]) switch (c)
{ {
case 'G': case 's':
/* The floating point zero constant. */ return trunc_int_for_mode (value, SImode) == value;
return (GET_MODE_CLASS (GET_MODE (value)) == MODE_FLOAT
&& value == CONST0_RTX (GET_MODE (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: 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 int
s390_const_ok_for_constraint_p (HOST_WIDE_INT value, s390_N_constraint_str (const char *str, HOST_WIDE_INT value)
int c,
const char * str)
{ {
enum machine_mode mode, part_mode; enum machine_mode mode, part_mode;
int def; int def;
int part, part_goal; 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': if (str[0] == 'x')
return value >= -32768 && value < 32768; part_goal = -1;
else
case 'L': part_goal = str[0] - '0';
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;
switch (str[1])
{
case 'Q':
part_mode = QImode;
break; break;
case 'H':
case 'O': part_mode = HImode;
if (!TARGET_EXTIMM) break;
return 0; case 'S':
part_mode = SImode;
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 ();
}
break; break;
default:
return 0;
}
case 'P': switch (str[2])
return legitimate_reload_constant_p (GEN_INT (value)); {
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: default:
return 0; 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; 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 /* Compute a (partial) cost for rtx X. Return true if the complete
cost has been computed, and false if subexpressions should be cost has been computed, and false if subexpressions should be
scanned. In either case, *TOTAL contains the cost result. scanned. In either case, *TOTAL contains the cost result.
......
...@@ -481,34 +481,6 @@ extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER]; ...@@ -481,34 +481,6 @@ extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER];
: MODE) : 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. */ /* Stack layout and calling conventions. */
/* Our stack grows from higher to lower addresses. However, local variables /* Our stack grows from higher to lower addresses. However, local variables
......
...@@ -22,51 +22,9 @@ ...@@ -22,51 +22,9 @@
;; 02110-1301, USA. ;; 02110-1301, USA.
;; ;;
;; Special constraints for s/390 machine description: ;; See constraints.md for a description of constraints specific to s390.
;;
;; 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.
;; ;;
;; Special formats used for outputting 390 instructions. ;; Special formats used for outputting 390 instructions.
;; ;;
;; %C: print opcode suffix for branch condition. ;; %C: print opcode suffix for branch condition.
...@@ -243,6 +201,9 @@ ...@@ -243,6 +201,9 @@
;; Predicates ;; Predicates
(include "predicates.md") (include "predicates.md")
;; Constraint definitions
(include "constraints.md")
;; Other includes ;; Other includes
(include "tpf.md") (include "tpf.md")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment