This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Paolo Bonzini schrieb:On 09/23/2011 10:56 AM, Paolo Bonzini wrote:Also, I am curious about one thing: while this is of course a very pragmatic solution, you could also convert AVR to get rid of CC0, do this at expansion time, and get split-wide-types to work as intended.
My changes are just micro-optimizations to print things in a smarter way.
compare-elim.c makes it relatively easy to remove CC0 nowadays.
For example, a two-byte add can be written as
(set (reg:QI L1) (plus:QI (reg:QI L2) (reg:QI L3))) (set (reg:QI H1) (plus:QI (plus:QI (req:QI H2) (reg:QI H3)) (ltu:QI (reg:QI L1) (reg:QI L3))))
After reload the second instruction can be split to
(set (reg:CC_C CC) (compare:QI (reg:QI L1) (reg:QI L3))) (set (reg:QI H1) (plus:QI (plus:QI (req:QI H2) (reg:QI H3)) (lt:QI (reg:CC_C CC) (const_int 0))))
What happens if L1=L3? AVR just has two-operand instructions so there are many insns with "0" constraint.
How goes the LTU -> LT transition?
Ans reloading from memory might change Carry. How is that handled? Read somewhere about that problem in some PR-chat and that this blocked the cc0 -> CCmode transition (don't know if that's actually a restriction).
(i.e. cp+adc). compare-elim will then be able to turn this into add+adc:
[parallel (set (reg:QI L1) (plus:QI (reg:QI L2) (reg:QI L3))) (set (reg:CC_C CC) (compare:QI (plus:QI (reg:QI L2) (reg:QI L3)) (reg:QI L3))))] (set (reg:QI H1) (plus:QI (plus:QI (req:QI H2) (reg:QI H3)) (lt:QI (reg:CC_C CC) (const_int 0))))
What about the other flags like Z (zero) and N (negative)? They are not as important as Carry but are still usable to avoid comparisons. Describing all that explicitly in RTL will be quite tedious...
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |