mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-19 19:51:12 +08:00
(expand_return): In code for doing scc with jumps,
stick to default handling if we have corresponding scc pattern. From-SVN: r12641
This commit is contained in:
parent
3aba034bf0
commit
3f8b69de79
38
gcc/stmt.c
38
gcc/stmt.c
@ -2734,29 +2734,51 @@ expand_return (retval)
|
||||
{
|
||||
/* If this is return x == y; then generate
|
||||
if (x == y) return 1; else return 0;
|
||||
if we can do it with explicit return insns and
|
||||
branches are cheap. */
|
||||
if we can do it with explicit return insns and branches are cheap,
|
||||
but not if we have the corresponding scc insn. */
|
||||
int has_scc = 0;
|
||||
if (retval_rhs)
|
||||
switch (TREE_CODE (retval_rhs))
|
||||
{
|
||||
case EQ_EXPR:
|
||||
#ifdef HAVE_seq
|
||||
has_scc = HAVE_seq;
|
||||
#endif
|
||||
case NE_EXPR:
|
||||
#ifdef HAVE_sne
|
||||
has_scc = HAVE_sne;
|
||||
#endif
|
||||
case GT_EXPR:
|
||||
#ifdef HAVE_sgt
|
||||
has_scc = HAVE_sgt;
|
||||
#endif
|
||||
case GE_EXPR:
|
||||
#ifdef HAVE_sge
|
||||
has_scc = HAVE_sge;
|
||||
#endif
|
||||
case LT_EXPR:
|
||||
#ifdef HAVE_slt
|
||||
has_scc = HAVE_slt;
|
||||
#endif
|
||||
case LE_EXPR:
|
||||
#ifdef HAVE_sle
|
||||
has_scc = HAVE_sle;
|
||||
#endif
|
||||
case TRUTH_ANDIF_EXPR:
|
||||
case TRUTH_ORIF_EXPR:
|
||||
case TRUTH_AND_EXPR:
|
||||
case TRUTH_OR_EXPR:
|
||||
case TRUTH_NOT_EXPR:
|
||||
case TRUTH_XOR_EXPR:
|
||||
op0 = gen_label_rtx ();
|
||||
jumpifnot (retval_rhs, op0);
|
||||
expand_value_return (const1_rtx);
|
||||
emit_label (op0);
|
||||
expand_value_return (const0_rtx);
|
||||
return;
|
||||
if (! has_scc)
|
||||
{
|
||||
op0 = gen_label_rtx ();
|
||||
jumpifnot (retval_rhs, op0);
|
||||
expand_value_return (const1_rtx);
|
||||
emit_label (op0);
|
||||
expand_value_return (const0_rtx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_return */
|
||||
|
Loading…
x
Reference in New Issue
Block a user