Commit f0517163 by Roger Sayle Committed by Roger Sayle

rs6000.c (struct processor_costs): Add new fields for simple floating point operations "fp"...


	* config/rs6000/rs6000.c (struct processor_costs): Add new fields
	for simple floating point operations "fp", double precision
	multiplication "dmul", and single and double precision division
	"sdiv" and "ddiv".  Update all CPU variant tables as appropriate.
	(ppc630_cost): New table split from ppc620_cost, to distinguish
	differences in floating point latencies.
	(rs6000_override_options): Use ppc630_cost for PROCESSOR_PPC630.
	(rs6000_rtx_costs): Add support for single and double precision
	floating point addition, subtraction, multiplication, division,
	fused-multiply-add, fused-multiply-sub, negation, absolute value
	and negative absolute value.  Tweak MEM case to use prefered idiom.

From-SVN: r84226
parent 63b88252
2004-07-07 Roger Sayle <roger@eyesopen.com>
* config/rs6000/rs6000.c (struct processor_costs): Add new fields
for simple floating point operations "fp", double precision
multiplication "dmul", and single and double precision division
"sdiv" and "ddiv". Update all CPU variant tables as appropriate.
(ppc630_cost): New table split from ppc620_cost, to distinguish
differences in floating point latencies.
(rs6000_override_options): Use ppc630_cost for PROCESSOR_PPC630.
(rs6000_rtx_costs): Add support for single and double precision
floating point addition, subtraction, multiplication, division,
fused-multiply-add, fused-multiply-sub, negation, absolute value
and negative absolute value. Tweak MEM case to use prefered idiom.
2004-07-07 Richard Henderson <rth@redhat.com> 2004-07-07 Richard Henderson <rth@redhat.com>
* tree-flow-inline.h (may_propagate_copy): Move... * tree-flow-inline.h (may_propagate_copy): Move...
......
...@@ -292,6 +292,10 @@ struct processor_costs { ...@@ -292,6 +292,10 @@ struct processor_costs {
const int muldi; /* cost of DImode multiplication. */ const int muldi; /* cost of DImode multiplication. */
const int divsi; /* cost of SImode division. */ const int divsi; /* cost of SImode division. */
const int divdi; /* cost of DImode division. */ const int divdi; /* cost of DImode division. */
const int fp; /* cost of simple SFmode and DFmode insns. */
const int dmul; /* cost of DFmode multiplication (and fmadd). */
const int sdiv; /* cost of SFmode division (fdivs). */
const int ddiv; /* cost of DFmode division (fdiv). */
}; };
const struct processor_costs *rs6000_cost; const struct processor_costs *rs6000_cost;
...@@ -307,6 +311,10 @@ struct processor_costs size32_cost = { ...@@ -307,6 +311,10 @@ struct processor_costs size32_cost = {
1, /* muldi */ 1, /* muldi */
1, /* divsi */ 1, /* divsi */
1, /* divdi */ 1, /* divdi */
1, /* fp */
1, /* dmul */
1, /* sdiv */
1, /* ddiv */
}; };
/* Instruction size costs on 64bit processors. */ /* Instruction size costs on 64bit processors. */
...@@ -318,6 +326,10 @@ struct processor_costs size64_cost = { ...@@ -318,6 +326,10 @@ struct processor_costs size64_cost = {
1, /* muldi */ 1, /* muldi */
1, /* divsi */ 1, /* divsi */
1, /* divdi */ 1, /* divdi */
1, /* fp */
1, /* dmul */
1, /* sdiv */
1, /* ddiv */
}; };
/* Instruction costs on RIOS1 processors. */ /* Instruction costs on RIOS1 processors. */
...@@ -329,6 +341,10 @@ struct processor_costs rios1_cost = { ...@@ -329,6 +341,10 @@ struct processor_costs rios1_cost = {
5, /* muldi */ 5, /* muldi */
19, /* divsi */ 19, /* divsi */
19, /* divdi */ 19, /* divdi */
2, /* fp */
2, /* dmul */
19, /* sdiv */
19, /* ddiv */
}; };
/* Instruction costs on RIOS2 processors. */ /* Instruction costs on RIOS2 processors. */
...@@ -340,6 +356,10 @@ struct processor_costs rios2_cost = { ...@@ -340,6 +356,10 @@ struct processor_costs rios2_cost = {
2, /* muldi */ 2, /* muldi */
13, /* divsi */ 13, /* divsi */
13, /* divdi */ 13, /* divdi */
2, /* fp */
2, /* dmul */
17, /* sdiv */
17, /* ddiv */
}; };
/* Instruction costs on RS64A processors. */ /* Instruction costs on RS64A processors. */
...@@ -351,6 +371,10 @@ struct processor_costs rs64a_cost = { ...@@ -351,6 +371,10 @@ struct processor_costs rs64a_cost = {
34, /* muldi */ 34, /* muldi */
65, /* divsi */ 65, /* divsi */
67, /* divdi */ 67, /* divdi */
4, /* fp */
4, /* dmul */
31, /* sdiv */
31, /* ddiv */
}; };
/* Instruction costs on MPCCORE processors. */ /* Instruction costs on MPCCORE processors. */
...@@ -362,6 +386,10 @@ struct processor_costs mpccore_cost = { ...@@ -362,6 +386,10 @@ struct processor_costs mpccore_cost = {
2, /* muldi */ 2, /* muldi */
6, /* divsi */ 6, /* divsi */
6, /* divdi */ 6, /* divdi */
4, /* fp */
5, /* dmul */
10, /* sdiv */
17, /* ddiv */
}; };
/* Instruction costs on PPC403 processors. */ /* Instruction costs on PPC403 processors. */
...@@ -373,6 +401,10 @@ struct processor_costs ppc403_cost = { ...@@ -373,6 +401,10 @@ struct processor_costs ppc403_cost = {
4, /* muldi */ 4, /* muldi */
33, /* divsi */ 33, /* divsi */
33, /* divdi */ 33, /* divdi */
11, /* fp */
11, /* dmul */
11, /* sdiv */
11, /* ddiv */
}; };
/* Instruction costs on PPC405 processors. */ /* Instruction costs on PPC405 processors. */
...@@ -384,6 +416,10 @@ struct processor_costs ppc405_cost = { ...@@ -384,6 +416,10 @@ struct processor_costs ppc405_cost = {
5, /* muldi */ 5, /* muldi */
35, /* divsi */ 35, /* divsi */
35, /* divdi */ 35, /* divdi */
11, /* fp */
11, /* dmul */
11, /* sdiv */
11, /* ddiv */
}; };
/* Instruction costs on PPC440 processors. */ /* Instruction costs on PPC440 processors. */
...@@ -395,6 +431,10 @@ struct processor_costs ppc440_cost = { ...@@ -395,6 +431,10 @@ struct processor_costs ppc440_cost = {
3, /* muldi */ 3, /* muldi */
34, /* divsi */ 34, /* divsi */
34, /* divdi */ 34, /* divdi */
5, /* fp */
5, /* dmul */
19, /* sdiv */
33, /* ddiv */
}; };
/* Instruction costs on PPC601 processors. */ /* Instruction costs on PPC601 processors. */
...@@ -406,6 +446,10 @@ struct processor_costs ppc601_cost = { ...@@ -406,6 +446,10 @@ struct processor_costs ppc601_cost = {
5, /* muldi */ 5, /* muldi */
36, /* divsi */ 36, /* divsi */
36, /* divdi */ 36, /* divdi */
4, /* fp */
5, /* dmul */
17, /* sdiv */
31, /* ddiv */
}; };
/* Instruction costs on PPC603 processors. */ /* Instruction costs on PPC603 processors. */
...@@ -417,6 +461,10 @@ struct processor_costs ppc603_cost = { ...@@ -417,6 +461,10 @@ struct processor_costs ppc603_cost = {
5, /* muldi */ 5, /* muldi */
37, /* divsi */ 37, /* divsi */
37, /* divdi */ 37, /* divdi */
3, /* fp */
4, /* dmul */
18, /* sdiv */
33, /* ddiv */
}; };
/* Instruction costs on PPC604 processors. */ /* Instruction costs on PPC604 processors. */
...@@ -428,6 +476,10 @@ struct processor_costs ppc604_cost = { ...@@ -428,6 +476,10 @@ struct processor_costs ppc604_cost = {
4, /* muldi */ 4, /* muldi */
20, /* divsi */ 20, /* divsi */
20, /* divdi */ 20, /* divdi */
3, /* fp */
3, /* dmul */
18, /* sdiv */
32, /* ddiv */
}; };
/* Instruction costs on PPC604e processors. */ /* Instruction costs on PPC604e processors. */
...@@ -439,9 +491,13 @@ struct processor_costs ppc604e_cost = { ...@@ -439,9 +491,13 @@ struct processor_costs ppc604e_cost = {
2, /* muldi */ 2, /* muldi */
20, /* divsi */ 20, /* divsi */
20, /* divdi */ 20, /* divdi */
3, /* fp */
3, /* dmul */
18, /* sdiv */
32, /* ddiv */
}; };
/* Instruction costs on PPC620 and PPC630 processors. */ /* Instruction costs on PPC620 processors. */
static const static const
struct processor_costs ppc620_cost = { struct processor_costs ppc620_cost = {
5, /* mulsi */ 5, /* mulsi */
...@@ -450,6 +506,25 @@ struct processor_costs ppc620_cost = { ...@@ -450,6 +506,25 @@ struct processor_costs ppc620_cost = {
7, /* muldi */ 7, /* muldi */
21, /* divsi */ 21, /* divsi */
37, /* divdi */ 37, /* divdi */
3, /* fp */
3, /* dmul */
18, /* sdiv */
32, /* ddiv */
};
/* Instruction costs on PPC630 processors. */
static const
struct processor_costs ppc630_cost = {
5, /* mulsi */
4, /* mulsi_const */
3, /* mulsi_const9 */
7, /* muldi */
21, /* divsi */
37, /* divdi */
3, /* fp */
3, /* dmul */
17, /* sdiv */
21, /* ddiv */
}; };
/* Instruction costs on PPC750 and PPC7400 processors. */ /* Instruction costs on PPC750 and PPC7400 processors. */
...@@ -461,6 +536,10 @@ struct processor_costs ppc750_cost = { ...@@ -461,6 +536,10 @@ struct processor_costs ppc750_cost = {
5, /* muldi */ 5, /* muldi */
17, /* divsi */ 17, /* divsi */
17, /* divdi */ 17, /* divdi */
3, /* fp */
3, /* dmul */
17, /* sdiv */
31, /* ddiv */
}; };
/* Instruction costs on PPC7450 processors. */ /* Instruction costs on PPC7450 processors. */
...@@ -472,6 +551,10 @@ struct processor_costs ppc7450_cost = { ...@@ -472,6 +551,10 @@ struct processor_costs ppc7450_cost = {
4, /* muldi */ 4, /* muldi */
23, /* divsi */ 23, /* divsi */
23, /* divdi */ 23, /* divdi */
5, /* fp */
5, /* dmul */
21, /* sdiv */
35, /* ddiv */
}; };
/* Instruction costs on PPC8540 processors. */ /* Instruction costs on PPC8540 processors. */
...@@ -483,6 +566,10 @@ struct processor_costs ppc8540_cost = { ...@@ -483,6 +566,10 @@ struct processor_costs ppc8540_cost = {
4, /* muldi */ 4, /* muldi */
19, /* divsi */ 19, /* divsi */
19, /* divdi */ 19, /* divdi */
4, /* fp */
4, /* dmul */
29, /* sdiv */
29, /* ddiv */
}; };
/* Instruction costs on POWER4 and POWER5 processors. */ /* Instruction costs on POWER4 and POWER5 processors. */
...@@ -494,6 +581,10 @@ struct processor_costs power4_cost = { ...@@ -494,6 +581,10 @@ struct processor_costs power4_cost = {
4, /* muldi */ 4, /* muldi */
18, /* divsi */ 18, /* divsi */
34, /* divdi */ 34, /* divdi */
3, /* fp */
3, /* dmul */
17, /* sdiv */
17, /* ddiv */
}; };
...@@ -1370,10 +1461,13 @@ rs6000_override_options (const char *default_cpu) ...@@ -1370,10 +1461,13 @@ rs6000_override_options (const char *default_cpu)
break; break;
case PROCESSOR_PPC620: case PROCESSOR_PPC620:
case PROCESSOR_PPC630:
rs6000_cost = &ppc620_cost; rs6000_cost = &ppc620_cost;
break; break;
case PROCESSOR_PPC630:
rs6000_cost = &ppc630_cost;
break;
case PROCESSOR_PPC750: case PROCESSOR_PPC750:
case PROCESSOR_PPC7400: case PROCESSOR_PPC7400:
rs6000_cost = &ppc750_cost; rs6000_cost = &ppc750_cost;
...@@ -16419,6 +16513,8 @@ static bool ...@@ -16419,6 +16513,8 @@ static bool
rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
int *total) int *total)
{ {
enum machine_mode mode = GET_MODE (x);
switch (code) switch (code)
{ {
/* On the RS/6000, if it is valid in the insn, it is free. /* On the RS/6000, if it is valid in the insn, it is free.
...@@ -16433,16 +16529,30 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, ...@@ -16433,16 +16529,30 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
return true; return true;
case PLUS: case PLUS:
*total = ((GET_CODE (XEXP (x, 1)) == CONST_INT if (mode == DFmode)
&& ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1)) *total = GET_CODE (XEXP (x, 0)) == MULT
+ 0x8000) >= 0x10000) ? COSTS_N_INSNS (rs6000_cost->dmul)
&& ((INTVAL (XEXP (x, 1)) & 0xffff) != 0)) : COSTS_N_INSNS (rs6000_cost->fp);
? COSTS_N_INSNS (2) else if (mode == SFmode)
: COSTS_N_INSNS (1)); *total = COSTS_N_INSNS (rs6000_cost->fp);
else
*total = ((GET_CODE (XEXP (x, 1)) == CONST_INT
&& ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1))
+ 0x8000) >= 0x10000)
&& ((INTVAL (XEXP (x, 1)) & 0xffff) != 0))
? COSTS_N_INSNS (2)
: COSTS_N_INSNS (1));
return true; return true;
case MINUS: case MINUS:
*total = COSTS_N_INSNS (1); if (mode == DFmode)
*total = GET_CODE (XEXP (x, 0)) == MULT
? COSTS_N_INSNS (rs6000_cost->dmul)
: COSTS_N_INSNS (rs6000_cost->fp);
else if (mode == SFmode)
*total = COSTS_N_INSNS (rs6000_cost->fp);
else
*total = COSTS_N_INSNS (1);
return true; return true;
case AND: case AND:
...@@ -16464,7 +16574,11 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, ...@@ -16464,7 +16574,11 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
else else
*total = COSTS_N_INSNS (rs6000_cost->mulsi_const); *total = COSTS_N_INSNS (rs6000_cost->mulsi_const);
} }
else if (GET_MODE (XEXP (x, 1)) == DImode) else if (mode == DFmode)
*total = COSTS_N_INSNS (rs6000_cost->dmul);
else if (mode == SFmode)
*total = COSTS_N_INSNS (rs6000_cost->fp);
else if (mode == DImode)
*total = COSTS_N_INSNS (rs6000_cost->muldi); *total = COSTS_N_INSNS (rs6000_cost->muldi);
else else
*total = COSTS_N_INSNS (rs6000_cost->mulsi); *total = COSTS_N_INSNS (rs6000_cost->mulsi);
...@@ -16472,6 +16586,12 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, ...@@ -16472,6 +16586,12 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
case DIV: case DIV:
case MOD: case MOD:
if (FLOAT_MODE_P (mode))
{
*total = mode == DFmode ? COSTS_N_INSNS (rs6000_cost->ddiv)
: COSTS_N_INSNS (rs6000_cost->sdiv);
return true;
}
if (GET_CODE (XEXP (x, 1)) == CONST_INT if (GET_CODE (XEXP (x, 1)) == CONST_INT
&& exact_log2 (INTVAL (XEXP (x, 1))) >= 0) && exact_log2 (INTVAL (XEXP (x, 1))) >= 0)
{ {
...@@ -16492,9 +16612,17 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, ...@@ -16492,9 +16612,17 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
*total = COSTS_N_INSNS (4); *total = COSTS_N_INSNS (4);
return true; return true;
case NEG:
case ABS:
if (FLOAT_MODE_P (mode))
*total = COSTS_N_INSNS (rs6000_cost->fp);
else
*total = COSTS_N_INSNS (1);
return true;
case MEM: case MEM:
/* MEM should be slightly more expensive than (plus (reg) (const)). */ /* MEM should be slightly more expensive than (plus (reg) (const)). */
*total = 5; *total = COSTS_N_INSNS (1) + 1;
return true; return true;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment