On 29/02/16 11:21, Michael Collison wrote:
On 2/29/2016 4:06 AM, Kyrill Tkachov wrote:
Hi Michael,
On 29/02/16 04:47, Michael Collison wrote:
This patches address PR 70008, where a reverse subtract with carry
instruction can be generated in thumb2 mode. It was tested with no
regressions in arm and thumb modes on the following targets:
arm-none-linux-gnueabi
arm-none-linux-gnuabihf
armeb-none-linux-gnuabihf
arm-none-eabi
Okay for trunk?
2016-02-28 Michael Collison <michael.collison@linaro.org>
PR target/70008
* config/arm/arm.md (*subsi3_carryin): Only match pattern if
TARGET_ARM due to 'rsc' instruction alternative.
* config/arm/thumb2.md (*thumb2_subsi3_carryin): New pattern.
The *subsi3_carrying pattern has the arch attribute:
(set_attr "arch" "*,a")
That means that the second alternative that generates the RSC
instruction is only enabled
for ARM mode. Do you have a testcase where this doesn't happen and
this pattern generates
the second alternative for Thumb2?
No I don't have a test case; i noticed the pattern when working on the
overflow project. I did not realize
that an attribute could affect the matching of an alternative. I will
close the bug.
Thanks,
Kyrill
This is all true, but there is a potential performance issue with this
pattern though, that could lead to sub-optimal code.
The predicate accepts reg-or-int, but in ARM state only simple
'const-ok-for-arm' immediates are permitted by the predicates, and in
thumb code, no immediates are permitted at all. This could potentially
result in sub-optimal code due to late splitting of the pattern. It
would be better if the predicate understood these limitations and
restricted immediates accordingly.
R.