Hi, On Wed, 23 Nov 2016, Segher Boessenkool wrote:
> > Even with non-constant shifts it remains an extract and make_extraction > > does support variable start positions (which is the shift amount), as does > > the zero_extract pattern (depending on target of course). > > Sure, but the extraction length is non-constant as well then! And not > just not-constant, with a conditional inside it, even. Right, that would be the consequence. I don't see much care for this problem anywhere, which probably hints that there aren't many targets accepting variant positions for zero_extract :) > > > if (GET_CODE (inner) == LSHIFTRT > > > + && CONST_INT_P (XEXP (inner, 1)) > > > && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (inner)) > > > && subreg_lowpart_p (x)) > > > { > > > new_rtx = make_compound_operation (XEXP (inner, 0), next_code); > > > + int width = GET_MODE_PRECISION (GET_MODE (inner)) > > > + - INTVAL (XEXP (inner, 1)); > > > > GET_MODE (new_rtx), because that's the object you're giving to > > make_extraction, not inner (and not XEXP(inner, 0)). > > This is about the *original* rtx, the lshiftrt: how many non-zero bits > does that leave. The bits zeroed out by the lshiftrt have to be zeroed > out by the zero_extract as well, to keep the same semantics in the > resulting rtl. Of course. I saw it more as a requirements on the inputs of make_extraction. In the end this is moot, as all three modes (of inner, of (inner,0) and of new_rtx) are the same :) Ciao, Michael.