There is a bunch of similar bitfield extraction code throughout *ISelDAGToDAG.
E.g, ARMISelDAGToDAG, AArch64ISelDAGToDAG, and AMDGPUISelDAGToDAG all contain code that matches a bitfield extract from an and + right shift.
Rather than duplicating code in the same way, this adds two opcodes:
- G_UBFX (unsigned bitfield extract)
- G_SBFX (signed bitfield extract)
They work like this
%x = G_UBFX %y, lsb, width
Where lsb and width denote
- The least-significant bit of the extraction
- The width of the extraction
This will extract width bits from %y, starting at lsb. G_UBFX zero-extends the result, while G_SBFX sign-extends the result.
This should allow us to use the combiner to match the bitfield extraction patterns rather than duplicating pattern-matching code in each target.
These can be registers like a normal op. AMDGPU has registers/variable inputs for the offset and width