aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorStephane Carrez <stcarrez@nerim.fr>2003-03-10 23:10:37 +0100
committerStephane Carrez <ciceron@gcc.gnu.org>2003-03-10 23:10:37 +0100
commit2d8d15b76293051e139149bf567846f1798fe2d0 (patch)
treef742d7d89ab767ab7a0bad18a7bdcd9c8ea996db /gcc
parent70f0e2883a4554c39445a4fd27e1490fcc828853 (diff)
downloadgcc-2d8d15b76293051e139149bf567846f1798fe2d0.zip
gcc-2d8d15b76293051e139149bf567846f1798fe2d0.tar.gz
gcc-2d8d15b76293051e139149bf567846f1798fe2d0.tar.bz2
m68hc11.h (HARD_REGNO_RENAME_OK): Define.
* config/m68hc11/m68hc11.h (HARD_REGNO_RENAME_OK): Define. * config/m68hc11/m68hc11-protos.h (m68hc11_hard_regno_rename_ok): Declare. * config/m68hc11/m68hc11.c (m68hc11_hard_regno_rename_ok): New function for reg rename optimization to avoid using Z and Y registers. From-SVN: r64134
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/m68hc11/m68hc11-protos.h1
-rw-r--r--gcc/config/m68hc11/m68hc11.c17
-rw-r--r--gcc/config/m68hc11/m68hc11.h6
4 files changed, 32 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9d2762f..70a26e2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,13 @@
2003-03-10 Stephane Carrez <stcarrez@nerim.fr>
+ * config/m68hc11/m68hc11.h (HARD_REGNO_RENAME_OK): Define.
+ * config/m68hc11/m68hc11-protos.h (m68hc11_hard_regno_rename_ok):
+ Declare.
+ * config/m68hc11/m68hc11.c (m68hc11_hard_regno_rename_ok): New function
+ for reg rename optimization to avoid using Z and Y registers.
+
+2003-03-10 Stephane Carrez <stcarrez@nerim.fr>
+
* config/m68hc11/m68hc11.md ("*addhi3_68hc12"): Accept any constant
when adding to X and Y since leax/leay are fast.
("*addhi3"): Accept 'I' constraint when adding to address register.
diff --git a/gcc/config/m68hc11/m68hc11-protos.h b/gcc/config/m68hc11/m68hc11-protos.h
index dda1469..01352b3 100644
--- a/gcc/config/m68hc11/m68hc11-protos.h
+++ b/gcc/config/m68hc11/m68hc11-protos.h
@@ -24,6 +24,7 @@ extern int m68hc11_override_options PARAMS((void));
extern int m68hc11_optimization_options PARAMS((int,int));
extern void m68hc11_conditional_register_usage PARAMS((void));
extern int hard_regno_mode_ok PARAMS((int, enum machine_mode));
+extern int m68hc11_hard_regno_rename_ok PARAMS((int, int));
extern int m68hc11_total_frame_size PARAMS((void));
extern int m68hc11_initial_frame_pointer_offset PARAMS((void));
diff --git a/gcc/config/m68hc11/m68hc11.c b/gcc/config/m68hc11/m68hc11.c
index 9ccac2e..ba4407b 100644
--- a/gcc/config/m68hc11/m68hc11.c
+++ b/gcc/config/m68hc11/m68hc11.c
@@ -394,6 +394,23 @@ hard_regno_mode_ok (regno, mode)
}
}
+int
+m68hc11_hard_regno_rename_ok (reg1, reg2)
+ int reg1, reg2;
+{
+ /* Don't accept renaming to Z register. We will replace it to
+ X,Y or D during machine reorg pass. */
+ if (reg2 == HARD_Z_REGNUM)
+ return 0;
+
+ /* Don't accept renaming D,X to Y register as the code will be bigger. */
+ if (TARGET_M6811 && reg2 == HARD_Y_REGNUM
+ && (D_REGNO_P (reg1) || X_REGNO_P (reg1)))
+ return 0;
+
+ return 1;
+}
+
enum reg_class
preferred_reload_class (operand, class)
rtx operand;
diff --git a/gcc/config/m68hc11/m68hc11.h b/gcc/config/m68hc11/m68hc11.h
index 3aa6a8e..95d3f60 100644
--- a/gcc/config/m68hc11/m68hc11.h
+++ b/gcc/config/m68hc11/m68hc11.h
@@ -801,6 +801,12 @@ extern enum reg_class m68hc11_tmp_regs_class;
#define SMALL_REGISTER_CLASSES 1
+/* A C expression that is nonzero if hard register number REGNO2 can be
+ considered for use as a rename register for REGNO1 */
+
+#define HARD_REGNO_RENAME_OK(REGNO1,REGNO2) \
+ m68hc11_hard_regno_rename_ok ((REGNO1), (REGNO2))
+
/* A C expression whose value is nonzero if pseudos that have been
assigned to registers of class CLASS would likely be spilled
because registers of CLASS are needed for spill registers.