diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1992-04-11 18:17:54 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 1992-04-11 18:17:54 +0000 |
commit | 8a7a0a5afc62deea26747945912660c121a6f603 (patch) | |
tree | a2b21f9fbc38a011d29e6f6777b5910a02017faa /gcc/reload.c | |
parent | ce5b71b55c456974dd1f37e426c8f8fd86a8a448 (diff) | |
download | gcc-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.c | 40 |
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. |