aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1992-08-20 08:36:23 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1992-08-20 08:36:23 -0400
commite6fe56a4248d990cdeb8d1d5ddaed1e2510754fb (patch)
treeef8fc8090560351e672708311cc1393d0fbd4492 /gcc
parent1b238f1c06364a492a314e550a8a4c8efff29dad (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/expr.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 315474d..2a94dca 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -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;
}