How to target a processor with very primitive addressing modes?
Georg-Johann Lay
avr@gjlay.de
Mon Jun 10 15:48:12 GMT 2024
Am 08.06.24 um 11:32 schrieb Mikael Pettersson via Gcc:
> On Thu, Jun 6, 2024 at 8:59 PM Dimitar Dimitrov <dimitar@dinux.eu> wrote:
>> Have you tried defining TARGET_LEGITIMIZE_ADDRESS for your target? From
>> a quick search I see that the iq2000 and rx backends are rewriting some
>> PLUS expression addresses with insn sequence to calculate the address.
>
> I have partial success.
>
> The key was to define both TARGET_LEGITIMATE_ADDRESS_P and an
> addptr<Pmode>3 insn.
>
> I had tried TARGET_LEGITIMATE_ADDRESS_P before, together with various
> combinations of TARGET_LEGITIMIZE_ADDRESS and
> LEGITIMIZE_RELOAD_ADDRESS, but they all threw gcc into reload loops.
>
> My add<Pmode>3 insn clobbers the CC register. The docs say to define
> addptr<Pmode>3 in this case, and that eliminated the reload loops.
>
> The issue now is that the machine cannot perform an add without
> clobbering the CC register, so I'll have to hide that somehow. When
> emitting the asm code, can one check if the CC register is LIVE-OUT
> from the insn? If it isn't I shouldn't have to generate code to
> preserve it.
>
> /Mikael
There is a different approach like liken by AVR (and maybe some
more targets):
Don't introduce CC until after reload, i.e. keep cbranch insns
and only split them to compare + branch after reload in the
first post reload split pass.
It's some effort because the number of insns is effectively
doubled: One pre-reload version of the insn without CC,
and a postreload version with CC. On AVR, most insns don't
set CCmode is a usable way, so that works, though not as
well like the killed cc0 representation.
Then I am not sure whether TARGET_LEGITIMIZE_ADDRESS works in
all situations, in particular when it comes to accessing frame
locations. It might be required to fake-supply reg+offset
addressing, and then split that post-reload.
An example is the Reduced Tiny cores (-mavrtiny) of the AVR
port that only support POST_INC or byte addressing. Splitting
locations after reload improved code quality a lot.
But it also revealed an unfixed bug in DSE:
DSE does not track frame pointer changes and eliminates
living stores. So be prepared.
Johann
More information about the Gcc
mailing list