From ae5570023f682b92235b7046ba693622686aceae Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Wed, 27 Nov 2002 22:21:11 +0000 Subject: [PATCH] h8300.c (h8300_shift_costs): New. * config/h8300/h8300.c (h8300_shift_costs): New. * config/h8300/h8300.h (RTX_COSTS): Use h8300_shift_costs. * config/h8300/h8300-protos.h: Add a prototype for h8300_shift_costs. From-SVN: r59588 --- gcc/ChangeLog | 7 +++++++ gcc/config/h8300/h8300-protos.h | 1 + gcc/config/h8300/h8300.c | 18 ++++++++++++++++++ gcc/config/h8300/h8300.h | 26 +++++++++++++------------- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fd733e45957..34753fb29a4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-11-27 Kazu Hirata + + * config/h8300/h8300.c (h8300_shift_costs): New. + * config/h8300/h8300.h (RTX_COSTS): Use h8300_shift_costs. + * config/h8300/h8300-protos.h: Add a prototype for + h8300_shift_costs. + 2002-11-27 Jim Wilson * config/rs6000/spe.md (spu_evsplatfi, spu_evsplati): Swap operands diff --git a/gcc/config/h8300/h8300-protos.h b/gcc/config/h8300/h8300-protos.h index b88ade053bb..c9f506ae410 100644 --- a/gcc/config/h8300/h8300-protos.h +++ b/gcc/config/h8300/h8300-protos.h @@ -32,6 +32,7 @@ extern const char *emit_a_rotate PARAMS ((enum rtx_code, rtx *)); extern const char *output_simode_bld PARAMS ((int, rtx[])); extern void print_operand_address PARAMS ((FILE *, rtx)); extern int const_costs PARAMS ((rtx, enum rtx_code, enum rtx_code)); +extern int h8300_shift_costs PARAMS ((rtx)); extern void print_operand PARAMS ((FILE *, rtx, int)); extern void final_prescan_insn PARAMS ((rtx, rtx *, int)); extern int do_movsi PARAMS ((rtx[])); diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index 54dc57d3f4e..93807a09a06 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -1134,6 +1134,24 @@ const_costs (r, c, outer_code) return 4; } } + +int +h8300_shift_costs (x) + rtx x; +{ + rtx operands[4]; + + if (GET_MODE (x) != QImode + && GET_MODE (x) != HImode + && GET_MODE (x) != SImode) + return 100; + + operands[0] = NULL; + operands[1] = NULL; + operands[2] = XEXP (x, 1); + operands[3] = x; + return compute_a_shift_length (NULL, operands); +} /* Documentation for the machine specific operand escapes: diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h index 96cd0bb5ffc..63886803efb 100644 --- a/gcc/config/h8300/h8300.h +++ b/gcc/config/h8300/h8300.h @@ -1020,20 +1020,20 @@ struct cum_arg /* Provide the costs of a rtl expression. This is in the body of a switch on CODE. */ -/* ??? Shifts need to have a *much* higher cost than this. */ -#define RTX_COSTS(RTX, CODE, OUTER_CODE) \ - case MOD: \ - case DIV: \ - return 60; \ - case MULT: \ - return 20; \ - case ASHIFT: \ - case ASHIFTRT: \ - case LSHIFTRT: \ - case ROTATE: \ - case ROTATERT: \ - if (GET_MODE (RTX) == HImode) return 2; \ +#define RTX_COSTS(RTX, CODE, OUTER_CODE) \ + case MOD: \ + case DIV: \ + return 60; \ + case MULT: \ + return 20; \ + case ASHIFT: \ + case ASHIFTRT: \ + case LSHIFTRT: \ + return COSTS_N_INSNS (h8300_shift_costs (RTX)); \ + case ROTATE: \ + case ROTATERT: \ + if (GET_MODE (RTX) == HImode) return 2; \ return 8; /* Tell final.c how to eliminate redundant test instructions. */