s390.c (struct processor_costs): New data type.

2004-11-30  Mark Dettinger  <dettinge@de.ibm.com>

	* config/s390/s390.c (struct processor_costs): New data type.
	(s390_cost, z900_cost, z990_cost): New global variables.
	(override_options): Initialize s390_cost.
	(s390_rtx_costs): Reimplement.

From-SVN: r91527
This commit is contained in:
Mark Dettinger 2004-11-30 15:14:05 +00:00 committed by Ulrich Weigand
parent 472c29c364
commit 017e0eb94d
2 changed files with 132 additions and 30 deletions

View File

@ -1,3 +1,10 @@
2004-11-30 Mark Dettinger <dettinge@de.ibm.com>
* config/s390/s390.c (struct processor_costs): New data type.
(s390_cost, z900_cost, z990_cost): New global variables.
(override_options): Initialize s390_cost.
(s390_rtx_costs): Reimplement.
2004-11-29 Daniel Berlin <dberlin@dberlin.org> 2004-11-29 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/18673 Fix PR tree-optimization/18673

View File

@ -86,6 +86,61 @@ static enum machine_mode s390_cc_modes_compatible (enum machine_mode,
enum machine_mode); enum machine_mode);
/* Define the specific costs for a given cpu. */
struct processor_costs
{
const int m; /* cost of an M instruction. */
const int mghi; /* cost of an MGHI instruction. */
const int mh; /* cost of an MH instruction. */
const int mhi; /* cost of an MHI instruction. */
const int mr; /* cost of an MR instruction. */
const int ms; /* cost of an MS instruction. */
const int msg; /* cost of an MSG instruction. */
const int msgf; /* cost of an MSGF instruction. */
const int msgfr; /* cost of an MSGFR instruction. */
const int msgr; /* cost of an MSGR instruction. */
const int msr; /* cost of an MSR instruction. */
const int mult_df; /* cost of multiplication in DFmode. */
};
const struct processor_costs *s390_cost;
static const
struct processor_costs z900_cost =
{
COSTS_N_INSNS (5), /* M */
COSTS_N_INSNS (10), /* MGHI */
COSTS_N_INSNS (5), /* MH */
COSTS_N_INSNS (4), /* MHI */
COSTS_N_INSNS (5), /* MR */
COSTS_N_INSNS (4), /* MS */
COSTS_N_INSNS (15), /* MSG */
COSTS_N_INSNS (7), /* MSGF */
COSTS_N_INSNS (7), /* MSGFR */
COSTS_N_INSNS (10), /* MSGR */
COSTS_N_INSNS (4), /* MSR */
COSTS_N_INSNS (7), /* multiplication in DFmode */
};
static const
struct processor_costs z990_cost =
{
COSTS_N_INSNS (4), /* M */
COSTS_N_INSNS (2), /* MGHI */
COSTS_N_INSNS (2), /* MH */
COSTS_N_INSNS (2), /* MHI */
COSTS_N_INSNS (4), /* MR */
COSTS_N_INSNS (5), /* MS */
COSTS_N_INSNS (6), /* MSG */
COSTS_N_INSNS (4), /* MSGF */
COSTS_N_INSNS (4), /* MSGFR */
COSTS_N_INSNS (4), /* MSGR */
COSTS_N_INSNS (4), /* MSR */
COSTS_N_INSNS (1), /* multiplication in DFmode */
};
#undef TARGET_ASM_ALIGNED_HI_OP #undef TARGET_ASM_ALIGNED_HI_OP
#define TARGET_ASM_ALIGNED_HI_OP "\t.word\t" #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
#undef TARGET_ASM_ALIGNED_DI_OP #undef TARGET_ASM_ALIGNED_DI_OP
@ -1318,6 +1373,14 @@ override_options (void)
if (TARGET_64BIT && !TARGET_ZARCH) if (TARGET_64BIT && !TARGET_ZARCH)
error ("64-bit ABI not supported in ESA/390 mode."); error ("64-bit ABI not supported in ESA/390 mode.");
/* Set processor cost function. */
if (s390_tune == PROCESSOR_2084_Z990)
s390_cost = &z990_cost;
else
s390_cost = &z900_cost;
if (s390_warn_framesize_string) if (s390_warn_framesize_string)
{ {
if (sscanf (s390_warn_framesize_string, HOST_WIDE_INT_PRINT_DEC, if (sscanf (s390_warn_framesize_string, HOST_WIDE_INT_PRINT_DEC,
@ -1782,7 +1845,9 @@ s390_const_ok_for_constraint_p (HOST_WIDE_INT 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.
CODE contains GET_CODE (x), OUTER_CODE contains the code
of the superexpression of x. */
static bool static bool
s390_rtx_costs (rtx x, int code, int outer_code, int *total) s390_rtx_costs (rtx x, int code, int outer_code, int *total)
@ -1790,28 +1855,7 @@ s390_rtx_costs (rtx x, int code, int outer_code, int *total)
switch (code) switch (code)
{ {
case CONST: case CONST:
if (GET_CODE (XEXP (x, 0)) == MINUS
&& GET_CODE (XEXP (XEXP (x, 0), 1)) != CONST_INT)
*total = 1000;
else
*total = 0;
return true;
case CONST_INT: case CONST_INT:
/* Force_const_mem does not work out of reload, because the
saveable_obstack is set to reload_obstack, which does not
live long enough. Because of this we cannot use force_const_mem
in addsi3. This leads to problems with gen_add2_insn with a
constant greater than a short. Because of that we give an
addition of greater constants a cost of 3 (reload1.c 10096). */
/* ??? saveable_obstack no longer exists. */
if (outer_code == PLUS
&& (INTVAL (x) > 32767 || INTVAL (x) < -32768))
*total = COSTS_N_INSNS (3);
else
*total = 0;
return true;
case LABEL_REF: case LABEL_REF:
case SYMBOL_REF: case SYMBOL_REF:
case CONST_DOUBLE: case CONST_DOUBLE:
@ -1821,6 +1865,8 @@ s390_rtx_costs (rtx x, int code, int outer_code, int *total)
case ASHIFT: case ASHIFT:
case ASHIFTRT: case ASHIFTRT:
case LSHIFTRT: case LSHIFTRT:
case ROTATE:
case ROTATERT:
case PLUS: case PLUS:
case AND: case AND:
case IOR: case IOR:
@ -1829,21 +1875,70 @@ s390_rtx_costs (rtx x, int code, int outer_code, int *total)
case NEG: case NEG:
case NOT: case NOT:
*total = COSTS_N_INSNS (1); *total = COSTS_N_INSNS (1);
return true; return false;
case MULT: case MULT:
if (GET_MODE (XEXP (x, 0)) == DImode) switch (GET_MODE (x))
*total = COSTS_N_INSNS (40); {
else case SImode:
*total = COSTS_N_INSNS (7); {
return true; rtx left = XEXP (x, 0);
rtx right = XEXP (x, 1);
if (GET_CODE (right) == CONST_INT
&& CONST_OK_FOR_CONSTRAINT_P (INTVAL (right), 'K', "K"))
*total = s390_cost->mhi;
else if (GET_CODE (left) == SIGN_EXTEND)
*total = s390_cost->mh;
else
*total = s390_cost->ms; /* msr, ms, msy */
break;
}
case DImode:
{
rtx left = XEXP (x, 0);
rtx right = XEXP (x, 1);
if (TARGET_64BIT)
{
if (GET_CODE (right) == CONST_INT
&& CONST_OK_FOR_CONSTRAINT_P (INTVAL (right), 'K', "K"))
*total = s390_cost->mghi;
else if (GET_CODE (left) == SIGN_EXTEND)
*total = s390_cost->msgf;
else
*total = s390_cost->msg; /* msgr, msg */
}
else /* TARGET_31BIT */
{
if (GET_CODE (left) == SIGN_EXTEND
&& GET_CODE (right) == SIGN_EXTEND)
/* mulsidi case: mr, m */
*total = s390_cost->m;
else
/* Complex calculation is required. */
*total = COSTS_N_INSNS (40);
}
break;
}
case SFmode:
case DFmode:
*total = s390_cost->mult_df;
break;
default:
return false;
}
return false;
case DIV: case DIV:
case UDIV: case UDIV:
case MOD: case MOD:
case UMOD: case UMOD:
*total = COSTS_N_INSNS (33); *total = COSTS_N_INSNS (33);
return true; return false;
case SIGN_EXTEND:
if (outer_code == MULT)
*total = 0;
return false;
default: default:
return false; return false;