This change adds a new fixup fixup_t2_so_imm for the t2_so_imm_asmoperand "T2SOImm". The fixup permits code such as:
.L1: sub r3, r3, #.L2 - .L1 .L2:
to assemble in Thumb2 as well as in ARM state. There isn't any relocation directive matching the fixup so the expression must be resolved to a constant at assembly time.
The operand predicate isT2SOImm() explicitly doesn't match expressions containing :upper16: and :lower16: as expressions with these operators must match the movt and movw instructions.
The test mov r0, foo2 in thumb2-diagnostics is moved to a new file as the fixup delays the error message till after the assembler has quit due to the other errors. As the mov instruction shares the t2_so_imm_asmoperand mov instructions with a non constant expression now match t2MOVi rather than t2MOVi16 so the error message is slightly different.
Fixes PR28647