Implements ADDS/SUBS 24-bit immediate optimization using the

MIPeepholeOpt pass. This follows the pattern:

Optimize ([adds|subs] r, imm) -> ([ADDS|SUBS] ([ADD|SUB] r, #imm0, lsl #12), #imm1),

if imm == (imm0<<12)+imm1. and both imm0 and imm1 are non-zero 12-bit unsigned

integers.

Optimize ([adds|subs] r, imm) -> ([SUBS|ADDS] ([SUB|ADD] r, #imm0, lsl #12), #imm1),

if imm == -(imm0<<12)-imm1, and both imm0 and imm1 are non-zero 12-bit unsigned

integers.

The SplitAndOpcFunc type had to change the return type to an Opcode pair so that

the first add/sub is the regular instruction and the second is the flag setting

instruction. This required updating the code in the AND case.

Testing:

I ran a two stage bootstrap with this code.

Using the second stage compiler, I verified that the negation of an ADDS to SUBS

or vice versa is a valid optimization. Example `V == -0x111111`.