summaryrefslogtreecommitdiffstats
path: root/gcc/regclass.c
diff options
context:
space:
mode:
authorraeburn <raeburn@138bc75d-0d04-0410-961f-82ee72b054a4>1998-04-07 13:24:41 +0000
committerraeburn <raeburn@138bc75d-0d04-0410-961f-82ee72b054a4>1998-04-07 13:24:41 +0000
commit4c6850154f71dfe2196adf04daa6193d52b7197f (patch)
treebf79d75abdc3cd25b8178e72cb02346c7d041e99 /gcc/regclass.c
parent1f38cbd3d8fb3beaec2ded87d4d040d5b554ca4e (diff)
downloadppe42-gcc-4c6850154f71dfe2196adf04daa6193d52b7197f.tar.gz
ppe42-gcc-4c6850154f71dfe2196adf04daa6193d52b7197f.zip
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.c37
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;
OpenPOWER on IntegriCloud