From 627b6fe2df0c59eb723dae340fa8d746aa7ce703 Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Fri, 20 Aug 2004 19:07:10 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/config/rs6000/rs6000.c | 33 +++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) 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: