divmod pattern question
Jeff Law
law@redhat.com
Wed Jun 20 05:31:00 GMT 2018
On 06/19/2018 12:55 PM, Paul Koning wrote:
> Gentlepeople,
>
> I have a two-operand divide instruction that takes a double length dividend in a register pair, and produces the quotient in the first register and remainder in the second.
>
> How do I write a divmod pattern for that? The quotient is easy enough, I write a match_operand for that register and a matching constraint ("0") for the input dividend. But what about the remainder? The remainder appears in a register that isn't explicitly mentioned in the RTL (it's the regnum one higher than the quotient, or if you like, the second subreg of the input (dividend) register.
You can generally allocate double-sized registers with appropriate
constraints and the like. And you could use matching constraints,
perhaps with subregs, but in the end, ewwwww.
>
> I can make it a define_expand that adds a move from the remainder register into a new register which is the output operand, and count on the optimizer to optimize away that move. Is that the best answer? The current "mod" pattern does that, and I could keep that approach.
But this would generally be better I think. I'd expect the move to be
optimized away the vast majority of the time.
jeff
More information about the Gcc
mailing list