rs6000: insn_cost
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 11 Oct 2017 00:11:23 +0000 (02:11 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 11 Oct 2017 00:11:23 +0000 (02:11 +0200)
commitca158af378fe7727ec100bd03b3a07a540f25d9b
tree3f837ba72fb8a8c01712d6d66ce33a3dec74cb39
parent7cd6ea64f8b4abb51debc41cba2558fbda814a7f
rs6000: insn_cost

This adds an implementation of the insn_cost hook to rs6000.

This implementations is very minimal (so far).  It is mostly based on
how many machine instructions are generated by an RTL insn, and it also
looks at the instruction type.  Floating point insns are costed as if
all machine instructions it generates are floating point; the other
insns are treated as if all but one are integer insns (and one is the
specified type).  Load instructions are treated as costing twice as
much, and load locked and sync insns as three times as much (just like
the original costs), and integer div and mul are handled as well.

Each define_insn (etc.) can set a "cost" attribute to override this
general cost.  With optimization for size, the cost is set equal to the
value of the "length" attribute.

With this, the majority of cost differences between old and new are
where the old was wrong.  Also, benchmarks show a slight win (if
anything).  Some refinements are obviously needed.

* config/rs6000/rs6000.c (TARGET_INSN_COST): New.
(rs6000_insn_cost): New function.
* config/rs6000/rs6000.md (cost): New attribute.

From-SVN: r253624
gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md