diff options
author | David Edelsohn <edelsohn@gnu.org> | 2004-11-27 23:00:57 +0000 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2004-11-27 18:00:57 -0500 |
commit | 22e54023ca7fbcbe877b51687a9a6698640ee011 (patch) | |
tree | 1f07b6f19a05e0aae2020b433c8a7b2c43c1097f | |
parent | 7482ad259b15635788b1069dcfc6c8dca402f922 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 75 |
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; |