diff options
author | Torbjorn Granlund <tege@gnu.org> | 1996-08-14 23:46:53 +0000 |
---|---|---|
committer | Torbjorn Granlund <tege@gnu.org> | 1996-08-14 23:46:53 +0000 |
commit | 3f8b69de79b62b2295851937aafbccf3f0fefefb (patch) | |
tree | 15de8732d22332b6f4cd644eccab9d9afc2b7832 /gcc | |
parent | 3aba034bf009e4590f14aa2c00a1107dd229e391 (diff) | |
download | gcc-3f8b69de79b62b2295851937aafbccf3f0fefefb.zip gcc-3f8b69de79b62b2295851937aafbccf3f0fefefb.tar.gz gcc-3f8b69de79b62b2295851937aafbccf3f0fefefb.tar.bz2 |
(expand_return): In code for doing scc with jumps,
stick to default handling if we have corresponding scc pattern.
From-SVN: r12641
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/stmt.c | 38 |
1 files changed, 30 insertions, 8 deletions
@@ -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 */ |