From: Dale Johannesen Date: Fri, 20 Aug 2004 19:07:10 +0000 (+0000) Subject: rs6000.c (rs6000_rtx_costs): Improve DIV/MOD. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=627b6fe2df0c59eb723dae340fa8d746aa7ce703;p=gcc.git rs6000.c (rs6000_rtx_costs): Improve DIV/MOD. 2004-08-20 Dale Johannesen * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve DIV/MOD. From-SVN: r86334 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cd2748451c7..5a4c7c50c6b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2004-08-20 Dale Johannesen + + * config/rs6000/rs6000.c (rs6000_rtx_costs): Improve DIV/MOD. + 2004-08-20 Daniel Jacobowitz * regrename.c (kill_value_one_regno): Renamed from kill_value_regno. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index f9792ecdadc..3d788442a27 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -17064,6 +17064,9 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, || ((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') @@ -17232,20 +17235,30 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, : rs6000_cost->sdiv; return false; } - if (GET_CODE (XEXP (x, 1)) == CONST_INT - && exact_log2 (INTVAL (XEXP (x, 1))) >= 0) - { - *total = COSTS_N_INSNS (2); - return false; - } /* FALLTHRU */ case UDIV: case UMOD: - if (GET_MODE (XEXP (x, 1)) == DImode) - *total = rs6000_cost->divdi; - else - *total = rs6000_cost->divsi; + if (GET_CODE (XEXP (x, 1)) == CONST_INT + && exact_log2 (INTVAL (XEXP (x, 1))) >= 0) + { + if (code == DIV || code == MOD) + /* Shift, addze */ + *total = COSTS_N_INSNS (2); + else + /* Shift */ + *total = COSTS_N_INSNS (1); + } + else + { + if (GET_MODE (XEXP (x, 1)) == DImode) + *total = rs6000_cost->divdi; + else + *total = rs6000_cost->divsi; + } + /* Add in shift and subtract for MOD. */ + if (code == MOD || code == UMOD) + *total += COSTS_N_INSNS (2); return false; case FFS: