aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/alpha
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-07-01 23:11:30 -0700
committerRichard Henderson <rth@gcc.gnu.org>2004-07-01 23:11:30 -0700
commit8260c194b7ee859e189226d198f84defc373f8d2 (patch)
tree4ef589ebb05634b4a13fe5da61c5a0a216a5231f /gcc/config/alpha
parent6429e3bef352c9dc940977d3079f025f3268a8b9 (diff)
downloadgcc-8260c194b7ee859e189226d198f84defc373f8d2.zip
gcc-8260c194b7ee859e189226d198f84defc373f8d2.tar.gz
gcc-8260c194b7ee859e189226d198f84defc373f8d2.tar.bz2
alpha.c (struct alpha_rtx_cost_data): Add int_div.
* config/alpha/alpha.c (struct alpha_rtx_cost_data): Add int_div. (alpha_rtx_cost_data): Update to match. (alpha_rtx_cost_size): New. (alpha_rtx_costs): Honor optimize_size. From-SVN: r84014
Diffstat (limited to 'gcc/config/alpha')
-rw-r--r--gcc/config/alpha/alpha.c59
1 files changed, 44 insertions, 15 deletions
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c
index 91aaae7..66c8df1 100644
--- a/gcc/config/alpha/alpha.c
+++ b/gcc/config/alpha/alpha.c
@@ -137,6 +137,7 @@ struct alpha_rtx_cost_data
unsigned char int_mult_di;
unsigned char int_shift;
unsigned char int_cmov;
+ unsigned short int_div;
};
static struct alpha_rtx_cost_data const alpha_rtx_cost_data[PROCESSOR_MAX] =
@@ -150,6 +151,7 @@ static struct alpha_rtx_cost_data const alpha_rtx_cost_data[PROCESSOR_MAX] =
COSTS_N_INSNS (23), /* int_mult_di */
COSTS_N_INSNS (2), /* int_shift */
COSTS_N_INSNS (2), /* int_cmov */
+ COSTS_N_INSNS (70), /* int_div */
},
{ /* EV5 */
COSTS_N_INSNS (4), /* fp_add */
@@ -160,6 +162,7 @@ static struct alpha_rtx_cost_data const alpha_rtx_cost_data[PROCESSOR_MAX] =
COSTS_N_INSNS (12), /* int_mult_di */
COSTS_N_INSNS (1) + 1, /* int_shift */
COSTS_N_INSNS (1), /* int_cmov */
+ COSTS_N_INSNS (45), /* int_div */
},
{ /* EV6 */
COSTS_N_INSNS (4), /* fp_add */
@@ -170,9 +173,28 @@ static struct alpha_rtx_cost_data const alpha_rtx_cost_data[PROCESSOR_MAX] =
COSTS_N_INSNS (7), /* int_mult_di */
COSTS_N_INSNS (1), /* int_shift */
COSTS_N_INSNS (2), /* int_cmov */
+ COSTS_N_INSNS (25), /* int_div */
},
};
+/* Similar but tuned for code size instead of execution latency. The
+ extra +N is fractional cost tuning based on latency. It's used to
+ encourage use of cheaper insns like shift, but only if there's just
+ one of them. */
+
+static struct alpha_rtx_cost_data const alpha_rtx_cost_size =
+{
+ COSTS_N_INSNS (1), /* fp_add */
+ COSTS_N_INSNS (1), /* fp_mult */
+ COSTS_N_INSNS (1), /* fp_div_sf */
+ COSTS_N_INSNS (1) + 1, /* fp_div_df */
+ COSTS_N_INSNS (1) + 1, /* int_mult_si */
+ COSTS_N_INSNS (1) + 2, /* int_mult_di */
+ COSTS_N_INSNS (1), /* int_shift */
+ COSTS_N_INSNS (1), /* int_cmov */
+ COSTS_N_INSNS (6), /* int_div */
+};
+
/* Get the number of args of a function in one of two ways. */
#if TARGET_ABI_OPEN_VMS || TARGET_ABI_UNICOSMK
#define NUM_ARGS current_function_args_info.num_args
@@ -2103,15 +2125,21 @@ alpha_rtx_costs (rtx x, int code, int outer_code, int *total)
{
enum machine_mode mode = GET_MODE (x);
bool float_mode_p = FLOAT_MODE_P (mode);
+ const struct alpha_rtx_cost_data *cost_data;
+
+ if (optimize_size)
+ cost_data = &alpha_rtx_cost_size;
+ else
+ cost_data = &alpha_rtx_cost_data[alpha_cpu];
switch (code)
{
+ case CONST_INT:
/* If this is an 8-bit constant, return zero since it can be used
nearly anywhere with no cost. If it is a valid operand for an
ADD or AND, likewise return 0 if we know it will be used in that
context. Otherwise, return 2 since it might be used there later.
All other constants take at least two insns. */
- case CONST_INT:
if (INTVAL (x) >= 0 && INTVAL (x) < 256)
{
*total = 0;
@@ -2140,16 +2168,17 @@ alpha_rtx_costs (rtx x, int code, int outer_code, int *total)
*total = COSTS_N_INSNS (1 + (outer_code != MEM));
else if (tls_symbolic_operand_type (x))
/* Estimate of cost for call_pal rduniq. */
+ /* ??? How many insns do we emit here? More than one... */
*total = COSTS_N_INSNS (15);
else
/* Otherwise we do a load from the GOT. */
- *total = COSTS_N_INSNS (alpha_memory_latency);
+ *total = COSTS_N_INSNS (optimize_size ? 1 : alpha_memory_latency);
return true;
case PLUS:
case MINUS:
if (float_mode_p)
- *total = alpha_rtx_cost_data[alpha_cpu].fp_add;
+ *total = cost_data->fp_add;
else if (GET_CODE (XEXP (x, 0)) == MULT
&& const48_operand (XEXP (XEXP (x, 0), 1), VOIDmode))
{
@@ -2161,11 +2190,11 @@ alpha_rtx_costs (rtx x, int code, int outer_code, int *total)
case MULT:
if (float_mode_p)
- *total = alpha_rtx_cost_data[alpha_cpu].fp_mult;
+ *total = cost_data->fp_mult;
else if (mode == DImode)
- *total = alpha_rtx_cost_data[alpha_cpu].int_mult_di;
+ *total = cost_data->int_mult_di;
else
- *total = alpha_rtx_cost_data[alpha_cpu].int_mult_si;
+ *total = cost_data->int_mult_si;
return false;
case ASHIFT:
@@ -2179,14 +2208,14 @@ alpha_rtx_costs (rtx x, int code, int outer_code, int *total)
case ASHIFTRT:
case LSHIFTRT:
- *total = alpha_rtx_cost_data[alpha_cpu].int_shift;
+ *total = cost_data->int_shift;
return false;
case IF_THEN_ELSE:
if (float_mode_p)
- *total = alpha_rtx_cost_data[alpha_cpu].fp_add;
+ *total = cost_data->fp_add;
else
- *total = alpha_rtx_cost_data[alpha_cpu].int_cmov;
+ *total = cost_data->int_cmov;
return false;
case DIV:
@@ -2194,15 +2223,15 @@ alpha_rtx_costs (rtx x, int code, int outer_code, int *total)
case MOD:
case UMOD:
if (!float_mode_p)
- *total = COSTS_N_INSNS (70); /* ??? */
+ *total = cost_data->int_div;
else if (mode == SFmode)
- *total = alpha_rtx_cost_data[alpha_cpu].fp_div_sf;
+ *total = cost_data->fp_div_sf;
else
- *total = alpha_rtx_cost_data[alpha_cpu].fp_div_df;
+ *total = cost_data->fp_div_df;
return false;
case MEM:
- *total = COSTS_N_INSNS (alpha_memory_latency);
+ *total = COSTS_N_INSNS (optimize_size ? 1 : alpha_memory_latency);
return true;
case NEG:
@@ -2216,7 +2245,7 @@ alpha_rtx_costs (rtx x, int code, int outer_code, int *total)
case ABS:
if (! float_mode_p)
{
- *total = COSTS_N_INSNS (1) + alpha_rtx_cost_data[alpha_cpu].int_cmov;
+ *total = COSTS_N_INSNS (1) + cost_data->int_cmov;
return false;
}
/* FALLTHRU */
@@ -2227,7 +2256,7 @@ alpha_rtx_costs (rtx x, int code, int outer_code, int *total)
case UNSIGNED_FIX:
case FLOAT_EXTEND:
case FLOAT_TRUNCATE:
- *total = alpha_rtx_cost_data[alpha_cpu].fp_add;
+ *total = cost_data->fp_add;
return false;
default: