diff options
author | raeburn <raeburn@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-04-07 13:24:41 +0000 |
---|---|---|
committer | raeburn <raeburn@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-04-07 13:24:41 +0000 |
commit | 4c6850154f71dfe2196adf04daa6193d52b7197f (patch) | |
tree | bf79d75abdc3cd25b8178e72cb02346c7d041e99 /gcc/regclass.c | |
parent | 1f38cbd3d8fb3beaec2ded87d4d040d5b554ca4e (diff) | |
download | gcc-4c6850154f71dfe2196adf04daa6193d52b7197f.tar.gz |
Sync up MEMORY_MOVE_COST changes with FSF.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19032 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/regclass.c')
-rw-r--r-- | gcc/regclass.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c index e964e99a82c..e4dff7921c8 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -183,6 +183,14 @@ static char *in_inc_dec; #endif /* FORBIDDEN_INC_DEC_CLASSES */ +#ifdef HAVE_SECONDARY_RELOADS + +/* Sample MEM values for use by memory_move_secondary_cost. */ + +static rtx top_of_stack[MAX_MACHINE_MODE]; + +#endif /* HAVE_SECONDARY_RELOADS */ + /* Function called only once to initialize the above data on reg usage. Once this is done, various switches may override. */ @@ -422,11 +430,23 @@ init_regs () init_reg_sets_1 (); init_reg_modes (); + +#ifdef HAVE_SECONDARY_RELOADS + { + /* Make some fake stack-frame MEM references for use in + memory_move_secondary_cost. */ + int i; + for (i = 0; i < MAX_MACHINE_MODE; i++) + top_of_stack[i] = gen_rtx (MEM, i, stack_pointer_rtx); + } +#endif } #ifdef HAVE_SECONDARY_RELOADS + /* Compute extra cost of moving registers to/from memory due to reloads. Only needed if secondary reloads are required for memory moves. */ + int memory_move_secondary_cost (mode, class, in) enum machine_mode mode; @@ -435,23 +455,26 @@ memory_move_secondary_cost (mode, class, in) { enum reg_class altclass; int partial_cost = 0; - rtx mem; - /* We need a memory reference to feed to SECONDARY... macros. */ - mem = gen_rtx (MEM, mode, stack_pointer_rtx); + rtx mem = top_of_stack[(int) mode]; if (in) + { #ifdef SECONDARY_INPUT_RELOAD_CLASS - altclass = SECONDARY_INPUT_RELOAD_CLASS (class, mode, mem); + altclass = SECONDARY_INPUT_RELOAD_CLASS (class, mode, mem); #else - altclass = NO_REGS; + altclass = NO_REGS; #endif + } else + { #ifdef SECONDARY_OUTPUT_RELOAD_CLASS - altclass = SECONDARY_OUTPUT_RELOAD_CLASS (class, mode, mem); + altclass = SECONDARY_OUTPUT_RELOAD_CLASS (class, mode, mem); #else - altclass = NO_REGS; + altclass = NO_REGS; #endif + } + if (altclass == NO_REGS) return 0; |