On 2/4/26 20:41, Paolo Bonzini wrote:
This is primarily for x86.
(1) movz is 2 operand, so that may avoid clobbering an input,
(2) movz is 3-4 byte whereas and r/i32 is 6-7 byte.
Because of these, there's a comment somewhere that says we'll prefer
extract over and
(perhaps in tcg_gen_andi_* or fold_and). IIRC this also happens to
simplify ppc and
s390x
insn selection (and vs rotate and mask). AFAIK, no other hosts are
penalized.
I think it would be better to pick a canonical form for AND with 2^n-1 and handle
conversion to extract (like PPC rotates or movz) in the backend.
Picking AND as the canonical form also avoids makes the macros for extract validity
simpler too; adding an extra constraint for immediate 2^n-1 is easier and it generalizes
to other PPC rotate and mask cases.
Picking AND means we have to use "r,0,ri" for x86, losing register allocation
flexibility.
r~