Similar to code in getAArch64Cmp in AArch64ISelLowering.
When we get a compare against a constant, sometimes, that constant isn't valid for selecting an immediate form.
However, sometimes, you can get a valid constant by adding 1 or subtracting 1, and updating the condition code.
This implements the following transformations when valid:
- x slt c => x sle c - 1
- x sge c => x sgt c - 1
- x ult c => x ule c - 1
- x uge c => x ugt c - 1
- x sle c => x slt c + 1
- x sgt c => s sge c + 1
- x ule c => x ult c + 1
- x ugt c => s uge c + 1
Valid meaning the constant doesn't wrap around when we fudge it, and the result gives us a compare which can be selected into an immediate form.
This also moves getImmedFromMO higher up in the file so we can use it.