msp430 port
Richard Henderson
rth@redhat.com
Wed Jul 31 20:23:00 GMT 2013
On 07/31/2013 07:08 AM, DJ Delorie wrote:
>>> The first doesn't have a clobber, though...
>>
>> Hmm. Missed that. So the only reason you'd care to include the bic
>> in the regular and pattern is if it were a smaller encoding than the
>> regular r/0/i alternative.
>
> It is, but the separate pattern picks that out just fine.
That depends on how we get here. Consider an AND insn with r/0/r
operands, and the second register gets spilled, and reload proves
that it held an immediate. In that case reload will only consider
the r/0/i alternative, and the shorter bic sequence.
One can always split away the clobber post-reload. Not that your
port currently makes significant use of the flags register to
worry about it.
>> You need to implement the "return" pattern as well as "simple_return".
>> They don't actually have to be different, implementation-wise. See
>> the i386 version, where both named patterns expand to the same insn.
>
> How is this an advantage from just building the return from the epilog
> expander?
The code in function.c might transform
saves
if arg == 0 return;
something
restores
return
to
if arg == 0 return;
saves
something
restores
return
Of course... now that I think about it, that transform really only applies
to saves using a move-like insn, not a push-like insn. So ignore me here
and don't define simple_return.
OTOH, a normal "return" insn can still be helpful, usually predicated on
not having a stack frame. See i386 "return" for an example here. The
benefit will be branch-to-return will be replaced with a plain return.
>> If you only need them post-reload, follow the lead of the s390 port.
>> See the "load_multiple" and "store_multiple" expanders, and their
>> associated insns. In this case, everything folds nicely down with
>> a match_parallel.
>
> Will do.
See also m68k, if you'd like another example.
r~
More information about the Gcc-patches
mailing list