(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
This commit is contained in:
parent
1b238f1c06
commit
e6fe56a424
31
gcc/expr.c
31
gcc/expr.c
|
@ -155,23 +155,28 @@ init_expr_once ()
|
||||||
direct_load[(int) mode] = direct_store[(int) mode] = 0;
|
direct_load[(int) mode] = direct_store[(int) mode] = 0;
|
||||||
PUT_MODE (mem, mode);
|
PUT_MODE (mem, mode);
|
||||||
|
|
||||||
/* Find a register that can be used in this mode, if any. */
|
/* See if there is some register that can be used in this mode and
|
||||||
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
|
directly loaded or stored from memory. */
|
||||||
if (HARD_REGNO_MODE_OK (regno, mode))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (regno == FIRST_PSEUDO_REGISTER)
|
for (regno = 0; regno < FIRST_PSEUDO_REGISTER
|
||||||
continue;
|
&& (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_SRC (pat) = mem;
|
||||||
SET_DEST (pat) = reg;
|
SET_DEST (pat) = reg;
|
||||||
direct_load[(int) mode] = (recog (pat, insn, &num_clobbers)) >= 0;
|
if (recog (pat, insn, &num_clobbers) >= 0)
|
||||||
|
direct_load[(int) mode] = 1;
|
||||||
|
|
||||||
SET_SRC (pat) = reg;
|
SET_SRC (pat) = reg;
|
||||||
SET_DEST (pat) = mem;
|
SET_DEST (pat) = mem;
|
||||||
direct_store[(int) mode] = (recog (pat, insn, &num_clobbers)) >= 0;
|
if (recog (pat, insn, &num_clobbers) >= 0)
|
||||||
|
direct_store[(int) mode] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
movstr_optab[(int) mode] = CODE_FOR_nothing;
|
movstr_optab[(int) mode] = CODE_FOR_nothing;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue