This teaches GISel to select patterns which fold an extend plus optional shift into the addressing mode. In particular, adds and subs.
Factor out the arith extended register ComplexPatterns in AArch64InstrFormats.td and create GISel equivalents.
Add some equivalent functions to the ones in AArch64ISelDAGToDAG:
- selectArithExtendedRegister
- narrowExtendRegIfNeeded
- getExtendTypeForInst
getExtendTypeForInst includes the checks for loads and stores. This will be used for WRO addressing modes in loads + stores.
Teach selectCopy to properly handle subregister copies on the same bank in order to support narrowExtendRegIfNeeded. The extended register must be a GPR32, so we need to support same-bank subregister copies.
Fix a bug in getSubRegForClass which would cause registers on things like GPR32common to end up getting ssub. Just change the check to look for FPR32 rather than GPR32.
For tests:
- Add select-arith-extended-reg.mir
- Update addsub_ext.ll to include GlobalISel checks
DAG?