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

Reply via email to