summaryrefslogtreecommitdiff
path: root/gcc/reload.c
diff options
context:
space:
mode:
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1992-04-11 18:17:54 +0000
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>1992-04-11 18:17:54 +0000
commit8a7a0a5afc62deea26747945912660c121a6f603 (patch)
treea2b21f9fbc38a011d29e6f6777b5910a02017faa /gcc/reload.c
parentce5b71b55c456974dd1f37e426c8f8fd86a8a448 (diff)
downloadgcc-8a7a0a5afc62deea26747945912660c121a6f603.tar.gz
*** empty log message ***
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@726 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reload.c')
-rw-r--r--gcc/reload.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/reload.c b/gcc/reload.c
index f7f1fc33518..05c1a2737dc 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -4179,6 +4179,46 @@ copy_replacements (x, y)
}
}
+/* If LOC was scheduled to be replaced by something, return the replacement.
+ Otherwise, return *LOC. */
+
+rtx
+find_replacement (loc)
+ rtx *loc;
+{
+ struct replacement *r;
+
+ for (r = &replacements[0]; r < &replacements[n_replacements]; r++)
+ {
+ rtx reloadreg = reload_reg_rtx[r->what];
+
+ if (reloadreg && r->where == loc)
+ {
+ if (r->mode != VOIDmode && GET_MODE (reloadreg) != r->mode)
+ reloadreg = gen_rtx (REG, r->mode, REGNO (reloadreg));
+
+ return reloadreg;
+ }
+ else if (reloadreg && r->subreg_loc == loc)
+ {
+ /* RELOADREG must be either a REG or a SUBREG.
+
+ ??? Is it actually still ever a SUBREG? If so, why? */
+
+ if (GET_CODE (reloadreg) == REG)
+ return gen_rtx (REG, GET_MODE (*loc),
+ REGNO (reloadreg) + SUBREG_WORD (*loc));
+ else if (GET_MODE (reloadreg) == GET_MODE (*loc))
+ return reloadreg;
+ else
+ return gen_rtx (SUBREG, GET_MODE (*loc), SUBREG_REG (reloadreg),
+ SUBREG_WORD (reloadreg) + SUBREG_WORD (*loc));
+ }
+ }
+
+ return *loc;
+}
+
/* Return nonzero if register in range [REGNO, ENDREGNO)
appears either explicitly or implicitly in X
other than being stored into.