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>
Richard Sandiford <richard@codesourcery.com>
......
......@@ -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);
......
......@@ -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.
......
......@@ -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
......
......@@ -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")
......
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