aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@cygnus.com>2000-04-21 21:19:55 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2000-04-21 21:19:55 +0000
commit460ad325026b4b5ea27e984c1cd5818005b47902 (patch)
tree2ed9b4f6725c49c9c59eadd7243b59fe0a77c901
parent40a20da4225b87acf57404a73d60b3ceddcfb53f (diff)
downloadgcc-460ad325026b4b5ea27e984c1cd5818005b47902.zip
gcc-460ad325026b4b5ea27e984c1cd5818005b47902.tar.gz
gcc-460ad325026b4b5ea27e984c1cd5818005b47902.tar.bz2
mn10300-protos.h (mn10300_address_cost): Declare.
* config/mn10300/mn10300-protos.h (mn10300_address_cost): Declare. * config/mn10300/mn10300.h (ADDRESS_COST): New macro. * config/mn10300/mn10300.c (mn10300_address_cost): New function. From-SVN: r33323
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/mn10300/mn10300-protos.h2
-rw-r--r--gcc/config/mn10300/mn10300.c81
-rw-r--r--gcc/config/mn10300/mn10300.h2
4 files changed, 91 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4697137..1bff945 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+Fri Apr 21 18:17:12 2000 Alexandre Oliva <aoliva@cygnus.com>
+
+ * config/mn10300/mn10300-protos.h (mn10300_address_cost): Declare.
+ * config/mn10300/mn10300.h (ADDRESS_COST): New macro.
+ * config/mn10300/mn10300.c (mn10300_address_cost): New function.
+
Fri Apr 21 18:11:56 2000 Alexandre Oliva <aoliva@cygnus.com>
* config/mn10300/mn10300.md (movdi, movdf): Do not use `movu' when
diff --git a/gcc/config/mn10300/mn10300-protos.h b/gcc/config/mn10300/mn10300-protos.h
index 2ae3ba5..66dcbe2 100644
--- a/gcc/config/mn10300/mn10300-protos.h
+++ b/gcc/config/mn10300/mn10300-protos.h
@@ -36,6 +36,8 @@ extern int symbolic_operand PARAMS ((rtx, enum machine_mode));
extern int call_address_operand PARAMS ((rtx, enum machine_mode));
extern int impossible_plus_operand PARAMS ((rtx, enum machine_mode));
extern int const_8bit_operand PARAMS ((rtx, enum machine_mode));
+
+extern int mn10300_address_cost PARAMS ((rtx, int *));
#endif /* RTX_CODE */
#ifdef TREE_CODE
diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c
index 74eb84a..3c5d359 100644
--- a/gcc/config/mn10300/mn10300.c
+++ b/gcc/config/mn10300/mn10300.c
@@ -1049,3 +1049,84 @@ legitimize_address (x, oldx, mode)
}
return x;
}
+
+int
+mn10300_address_cost (x, unsig)
+ rtx x;
+ int *unsig;
+{
+ int _s = 0;
+ if (unsig == 0)
+ unsig = &_s;
+
+ switch (GET_CODE (x))
+ {
+ case REG:
+ switch (REGNO_REG_CLASS (REGNO (x)))
+ {
+ case SP_REGS:
+ *unsig = 1;
+ return 0;
+
+ case ADDRESS_REGS:
+ return 1;
+
+ case DATA_REGS:
+ case EXTENDED_REGS:
+ return 3;
+
+ case NO_REGS:
+ return 5;
+
+ default:
+ abort ();
+ }
+
+ case PLUS:
+ case MINUS:
+ case IOR:
+ return (mn10300_address_cost (XEXP (x, 0), unsig)
+ + mn10300_address_cost (XEXP (x, 1), unsig));
+
+ case EXPR_LIST:
+ case SUBREG:
+ case MEM:
+ return ADDRESS_COST (XEXP (x, 0));
+
+ case ZERO_EXTEND:
+ *unsig = 1;
+ return mn10300_address_cost (XEXP (x, 0), unsig);
+
+ case CONST_INT:
+ if (INTVAL (x) == 0)
+ return 0;
+ if (INTVAL (x) + (*unsig ? 0 : 0x80) < 0x100)
+ return 1;
+ if (INTVAL (x) + (*unsig ? 0 : 0x8000) < 0x10000)
+ return 3;
+ if (INTVAL (x) + (*unsig ? 0 : 0x800000) < 0x1000000)
+ return 5;
+ return 7;
+
+ case CONST:
+ case SYMBOL_REF:
+ return 8;
+
+ case ADDRESSOF:
+ switch (GET_CODE (XEXP (x, 0)))
+ {
+ case MEM:
+ return ADDRESS_COST (XEXP (x, 0));
+
+ case REG:
+ return 1;
+
+ default:
+ abort ();
+ }
+
+ default:
+ abort ();
+
+ }
+}
diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h
index c1507c0..29d5e67 100644
--- a/gcc/config/mn10300/mn10300.h
+++ b/gcc/config/mn10300/mn10300.h
@@ -818,6 +818,8 @@ struct cum_arg {int nbytes; };
((CLASS1 == CLASS2 && (CLASS1 == ADDRESS_REGS || CLASS1 == DATA_REGS)) ? 2 :\
CLASS1 == CLASS2 && CLASS1 == EXTENDED_REGS ? 6 : 4)
+#define ADDRESS_COST(X) mn10300_address_cost((X), 0)
+
/* A crude cut at RTX_COSTS for the MN10300. */
/* Provide the costs of a rtl expression. This is in the body of a