This adds support for selecting a large chunk of the load/store *roW patterns.
This is pretty much a straight port of AArch64DAGToDAGISel::SelectAddrModeWRO into GISel. The code is very similar to the XRO code. The main difference is that in the *roW patterns, we want to try and fold in an extend, and *possibly* a shift along with it. A good portion of this patch is refactoring the existing XRO code.
- Add AArch64InstructionSelector::selectAddrModeWRO
- Factor out the code from AArch64InstructionSelector::selectAddrModeShiftedExtendXReg which is used by both AArch64InstructionSelector::selectAddrModeXRO and AArch64InstructionSelector::selectAddrModeWRO into AArch64InstructionSelector::selectExtendedSHL. This is similar to the function of the same name in AArch64DAGToDAGISel.
- Add support for extends to the factored out code in selectExtendedSHL.
- Teach getExtendTypeForInst how to handle AND masks that are intended to be used in loads/stores (necessary for this addressing mode.)
- Make getExtendTypeForInst not static because moving it made an annoying diff and I wanted to have the WRO/XRO functions close to each other while I was writing the code.
Also add two tests. It seems like we just import more load patterns than store patterns, so I didn't put too much in the store test for now.
Also we're missing a couple of the load patterns right now, so I didn't include them in the test.
While we're here maybe rename this variable from Gep to PtrAdd?