diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1992-08-20 08:36:23 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1992-08-20 08:36:23 -0400 |
commit | e6fe56a4248d990cdeb8d1d5ddaed1e2510754fb (patch) | |
tree | ef8fc8090560351e672708311cc1393d0fbd4492 | |
parent | 1b238f1c06364a492a314e550a8a4c8efff29dad (diff) | |
download | gcc-e6fe56a4248d990cdeb8d1d5ddaed1e2510754fb.zip gcc-e6fe56a4248d990cdeb8d1d5ddaed1e2510754fb.tar.gz gcc-e6fe56a4248d990cdeb8d1d5ddaed1e2510754fb.tar.bz2 |
(init_expr_once): Set direct_load and direct_store if SOME hard register can be loaded or stored...
(init_expr_once): Set direct_load and direct_store if SOME hard
register can be loaded or stored; not just if the first one we pick
can be.
From-SVN: r1910
-rw-r--r-- | gcc/expr.c | 31 |
1 files changed, 18 insertions, 13 deletions
@@ -155,23 +155,28 @@ init_expr_once () direct_load[(int) mode] = direct_store[(int) mode] = 0; PUT_MODE (mem, mode); - /* Find a register that can be used in this mode, if any. */ - for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) - if (HARD_REGNO_MODE_OK (regno, mode)) - break; + /* See if there is some register that can be used in this mode and + directly loaded or stored from memory. */ - if (regno == FIRST_PSEUDO_REGISTER) - continue; + for (regno = 0; regno < FIRST_PSEUDO_REGISTER + && (direct_load[(int) mode] == 0 || direct_store[(int) mode] == 0); + regno++) + { + if (! HARD_REGNO_MODE_OK (regno, mode)) + continue; - reg = gen_rtx (REG, mode, regno); + reg = gen_rtx (REG, mode, regno); - SET_SRC (pat) = mem; - SET_DEST (pat) = reg; - direct_load[(int) mode] = (recog (pat, insn, &num_clobbers)) >= 0; + SET_SRC (pat) = mem; + SET_DEST (pat) = reg; + if (recog (pat, insn, &num_clobbers) >= 0) + direct_load[(int) mode] = 1; - SET_SRC (pat) = reg; - SET_DEST (pat) = mem; - direct_store[(int) mode] = (recog (pat, insn, &num_clobbers)) >= 0; + SET_SRC (pat) = reg; + SET_DEST (pat) = mem; + if (recog (pat, insn, &num_clobbers) >= 0) + direct_store[(int) mode] = 1; + } movstr_optab[(int) mode] = CODE_FOR_nothing; } |