aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2012-09-08 22:35:54 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2012-09-08 22:35:54 +0000
commit259febfe6cabe29e30901960d11871740a5df680 (patch)
tree53adb9d69c595e985a681f75809210f17a547320
parent4e5315e5cff61713c41cca6e0bb0f20d2d94b53b (diff)
downloadgcc-259febfe6cabe29e30901960d11871740a5df680.zip
gcc-259febfe6cabe29e30901960d11871740a5df680.tar.gz
gcc-259febfe6cabe29e30901960d11871740a5df680.tar.bz2
pa.c (hppa_rtx_costs): Update costs for large integer modes.
* config/pa/pa.c (hppa_rtx_costs): Update costs for large integer modes. From-SVN: r191102
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/pa/pa.c40
2 files changed, 36 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cee1ea4..5626de2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2012-09-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ * config/pa/pa.c (hppa_rtx_costs): Update costs for large integer modes.
+
2012-09-08 Andi Kleen <ak@linux.intel.com>
* gcc/lto/lto.c (do_whole_program_analysis):
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index bb54c6e..cba8e78 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -1422,6 +1422,8 @@ static bool
hppa_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
int *total, bool speed ATTRIBUTE_UNUSED)
{
+ int factor;
+
switch (code)
{
case CONST_INT:
@@ -1453,11 +1455,20 @@ hppa_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
case MULT:
if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
- *total = COSTS_N_INSNS (3);
- else if (TARGET_PA_11 && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT)
- *total = COSTS_N_INSNS (8);
+ {
+ *total = COSTS_N_INSNS (3);
+ return true;
+ }
+
+ /* A mode size N times larger than SImode needs O(N*N) more insns. */
+ factor = GET_MODE_SIZE (GET_MODE (x)) / 4;
+ if (factor == 0)
+ factor = 1;
+
+ if (TARGET_PA_11 && !TARGET_DISABLE_FPREGS && !TARGET_SOFT_FLOAT)
+ *total = factor * factor * COSTS_N_INSNS (8);
else
- *total = COSTS_N_INSNS (20);
+ *total = factor * factor * COSTS_N_INSNS (20);
return true;
case DIV:
@@ -1471,15 +1482,28 @@ hppa_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED,
case UDIV:
case MOD:
case UMOD:
- *total = COSTS_N_INSNS (60);
+ /* A mode size N times larger than SImode needs O(N*N) more insns. */
+ factor = GET_MODE_SIZE (GET_MODE (x)) / 4;
+ if (factor == 0)
+ factor = 1;
+
+ *total = factor * factor * COSTS_N_INSNS (60);
return true;
case PLUS: /* this includes shNadd insns */
case MINUS:
if (GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
- *total = COSTS_N_INSNS (3);
- else
- *total = COSTS_N_INSNS (1);
+ {
+ *total = COSTS_N_INSNS (3);
+ return true;
+ }
+
+ /* A size N times larger than UNITS_PER_WORD needs N times as
+ many insns, taking N times as long. */
+ factor = GET_MODE_SIZE (GET_MODE (x)) / UNITS_PER_WORD;
+ if (factor == 0)
+ factor = 1;
+ *total = factor * COSTS_N_INSNS (1);
return true;
case ASHIFT: