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
These register numbers don't match the input, has something overwritten the wrong part of the instructions?