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~