diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/expr.c | 16 | ||||
-rw-r--r-- | gcc/expr.h | 4 | ||||
-rw-r--r-- | gcc/genopinit.c | 1 | ||||
-rw-r--r-- | gcc/optabs.c | 1 | ||||
-rw-r--r-- | gcc/rtlanal.c | 3 |
6 files changed, 34 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b73cd6657d1..8e1ab0674bb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +Fri Jul 20 21:59:42 CEST 2001 Jan Hubicka <jh@suse.cz> + + * rtlanal.c (set_noop_p): Return true for noop jumps. + + * expr.c (emit_single_push_insn): Add call to push expander. + * expr.h (optab_index): Add OTI_push + (push_optab): New constant. + * genopinit.c (optabs): Add push_optab. + * optabs.c (init_optab): Init push optab. + * md.texi (push??1): Document + 2001-07-20 Stephane Carrez <Stephane.Carrez@worldnet.fr> * config/m68hc11/m68hc11.md ("movdi", "movdi_internal"): Use an diff --git a/gcc/expr.c b/gcc/expr.c index 041ee908044..bd60d3f59b9 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -3155,7 +3155,21 @@ emit_single_push_insn (mode, x, type) rtx dest_addr; unsigned rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode)); rtx dest; + enum insn_code icode; + insn_operand_predicate_fn pred; + stack_pointer_delta += PUSH_ROUNDING (GET_MODE_SIZE (mode)); + /* If there is push pattern, use it. Otherwise try old way of throwing + MEM representing push operation to move expander. */ + icode = push_optab->handlers[(int) mode].insn_code; + if (icode != CODE_FOR_nothing) + { + if (((pred = insn_data[(int) icode].operand[0].predicate) + && !((*pred) (x, mode)))) + x = force_reg (mode, x); + emit_insn (GEN_FCN (icode) (x)); + return; + } if (GET_MODE_SIZE (mode) == rounded_size) dest_addr = gen_rtx_fmt_e (STACK_PUSH_CODE, Pmode, stack_pointer_rtx); else @@ -3172,8 +3186,6 @@ emit_single_push_insn (mode, x, type) dest = gen_rtx_MEM (mode, dest_addr); - stack_pointer_delta += PUSH_ROUNDING (GET_MODE_SIZE (mode)); - if (type != 0) { set_mem_attributes (dest, type, 1); diff --git a/gcc/expr.h b/gcc/expr.h index ed79d99d05b..07b1a811017 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -378,6 +378,9 @@ enum optab_index OTI_cmov, OTI_cstore, + /* Push instruction. */ + OTI_push, + OTI_MAX }; @@ -437,6 +440,7 @@ extern optab optab_table[OTI_MAX]; #define cbranch_optab (optab_table[OTI_cbranch]) #define cmov_optab (optab_table[OTI_cmov]) #define cstore_optab (optab_table[OTI_cstore]) +#define push_optab (optab_table[OTI_push]) /* Tables of patterns for extending one integer mode to another. */ extern enum insn_code extendtab[MAX_MACHINE_MODE][MAX_MACHINE_MODE][2]; diff --git a/gcc/genopinit.c b/gcc/genopinit.c index e8b12112865..8e00718e2f1 100644 --- a/gcc/genopinit.c +++ b/gcc/genopinit.c @@ -128,6 +128,7 @@ const char * const optabs[] = "cbranch_optab->handlers[$A].insn_code = CODE_FOR_$(cbranch$a4$)", "cmov_optab->handlers[$A].insn_code = CODE_FOR_$(cmov$a6$)", "cstore_optab->handlers[$A].insn_code = CODE_FOR_$(cstore$a4$)", + "push_optab->handlers[$A].insn_code = CODE_FOR_$(push$a1$)", "reload_in_optab[$A] = CODE_FOR_$(reload_in$a$)", "reload_out_optab[$A] = CODE_FOR_$(reload_out$a$)", "movstr_optab[$A] = CODE_FOR_$(movstr$a$)", diff --git a/gcc/optabs.c b/gcc/optabs.c index f135ad18765..84cf56dead9 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -4682,6 +4682,7 @@ init_optabs () cbranch_optab = init_optab (UNKNOWN); cmov_optab = init_optab (UNKNOWN); cstore_optab = init_optab (UNKNOWN); + push_optab = init_optab (UNKNOWN); for (i = 0; i < NUM_MACHINE_MODES; i++) { diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 90562efab6a..2f9696cc1fc 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -998,6 +998,9 @@ set_noop_p (set) if (GET_CODE (dst) == MEM && GET_CODE (src) == MEM) return rtx_equal_p (dst, src); + if (dst == pc_rtx && src == pc_rtx) + return 1; + if (GET_CODE (dst) == SIGN_EXTRACT || GET_CODE (dst) == ZERO_EXTRACT) return rtx_equal_p (XEXP (dst, 0), src) |