aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@gnu.org>2004-11-27 23:00:57 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2004-11-27 18:00:57 -0500
commit22e54023ca7fbcbe877b51687a9a6698640ee011 (patch)
tree1f07b6f19a05e0aae2020b433c8a7b2c43c1097f
parent7482ad259b15635788b1069dcfc6c8dca402f922 (diff)
downloadgcc-22e54023ca7fbcbe877b51687a9a6698640ee011.zip
gcc-22e54023ca7fbcbe877b51687a9a6698640ee011.tar.gz
gcc-22e54023ca7fbcbe877b51687a9a6698640ee011.tar.bz2
re PR target/16800 (PowerPC - Unnecessary rldicl)
PR target/16800 * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve accuracy of EQ, GTU, and LTU costs. Add costs for GT, LT, and UNORDERED. Distinguish between SImode and DImode CONST_INT. From-SVN: r91399
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/rs6000/rs6000.c75
2 files changed, 59 insertions, 23 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6def113..cc56027 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-11-28 David Edelsohn <edelsohn@gnu.org>
+
+ PR target/16800
+ * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve accuracy of
+ EQ, GTU, and LTU costs. Add costs for GT, LT, and UNORDERED.
+ Distinguish between SImode and DImode CONST_INT.
+
2004-11-28 Andreas Fischer <a_fisch@gmx.de>
Alan Modra <amodra@bigpond.net.au>
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index ca919b3..ab80a47 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -18050,16 +18050,15 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
|| outer_code == MINUS)
&& (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
|| CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
- || ((outer_code == IOR || outer_code == XOR)
- && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
- || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')))
- || ((outer_code == DIV || outer_code == UDIV
- || outer_code == MOD || outer_code == UMOD)
- && exact_log2 (INTVAL (x)) >= 0)
|| (outer_code == AND
&& (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
- || CONST_OK_FOR_LETTER_P (INTVAL (x), 'L')
+ || (CONST_OK_FOR_LETTER_P (INTVAL (x),
+ mode == SImode ? 'L' : 'J'))
|| mask_operand (x, VOIDmode)))
+ || ((outer_code == IOR || outer_code == XOR)
+ && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
+ || (CONST_OK_FOR_LETTER_P (INTVAL (x),
+ mode == SImode ? 'L' : 'J'))))
|| outer_code == ASHIFT
|| outer_code == ASHIFTRT
|| outer_code == LSHIFTRT
@@ -18068,9 +18067,21 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
|| outer_code == ZERO_EXTRACT
|| (outer_code == MULT
&& CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
+ || ((outer_code == DIV || outer_code == UDIV
+ || outer_code == MOD || outer_code == UMOD)
+ && exact_log2 (INTVAL (x)) >= 0)
|| (outer_code == COMPARE
&& (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
- || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K'))))
+ || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')))
+ || (outer_code == EQ
+ && (CONST_OK_FOR_LETTER_P (INTVAL (x), 'I')
+ || CONST_OK_FOR_LETTER_P (INTVAL (x), 'K')
+ || (CONST_OK_FOR_LETTER_P (INTVAL (x),
+ mode == SImode ? 'L' : 'J'))))
+ || (outer_code == GTU
+ && CONST_OK_FOR_LETTER_P (INTVAL (x), 'I'))
+ || (outer_code == LTU
+ && CONST_OK_FOR_LETTER_P (INTVAL (x), 'P')))
{
*total = 0;
return true;
@@ -18348,26 +18359,44 @@ rs6000_rtx_costs (rtx x, int code, int outer_code, int *total)
case EQ:
case GTU:
case LTU:
- if (mode == Pmode)
+ /* Carry bit requires mode == Pmode.
+ NEG or PLUS already counted so only add one. */
+ if (mode == Pmode
+ && (outer_code == NEG || outer_code == PLUS))
{
- switch (outer_code)
+ *total = COSTS_N_INSNS (1);
+ return true;
+ }
+ if (outer_code == SET)
+ {
+ if (XEXP (x, 1) == const0_rtx)
{
- case PLUS:
- case NEG:
- /* PLUS or NEG already counted so only add one more. */
- *total = COSTS_N_INSNS (1);
- break;
- case SET:
- *total = COSTS_N_INSNS (3);
- break;
- case COMPARE:
- *total = 0;
+ *total = COSTS_N_INSNS (2);
return true;
- default:
- break;
}
- return false;
+ else if (mode == Pmode)
+ {
+ *total = COSTS_N_INSNS (3);
+ return false;
+ }
+ }
+ /* FALLTHRU */
+
+ case GT:
+ case LT:
+ case UNORDERED:
+ if (outer_code == SET && (XEXP (x, 1) == const0_rtx))
+ {
+ *total = COSTS_N_INSNS (2);
+ return true;
}
+ /* CC COMPARE. */
+ if (outer_code == COMPARE)
+ {
+ *total = 0;
+ return true;
+ }
+ break;
default:
break;