From 22e54023ca7fbcbe877b51687a9a6698640ee011 Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Sat, 27 Nov 2004 23:00:57 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 ++++ gcc/config/rs6000/rs6000.c | 81 ++++++++++++++++++++++++++------------ 2 files changed, 62 insertions(+), 26 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6def113843ba..cc56027bc397 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-11-28 David Edelsohn + + 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 Alan Modra diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ca919b35a0f2..ab80a47bdf21 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) - { - 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; - return true; - default: - break; - } - return false; + *total = COSTS_N_INSNS (1); + return true; } + if (outer_code == SET) + { + if (XEXP (x, 1) == const0_rtx) + { + *total = COSTS_N_INSNS (2); + return true; + } + 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;