The Thumb2 instruction encoding can reduce your code size by up to 30%, so it is nice if you’re writing assembler code to use the unified syntax which will allow your code to be encoded as either ARM or Thumb2 seamlessly. Or almost seamlessly – even though the unified syntax is the same for ARM and Thumb2 encodings, there are still some things you have to bear in mind when writing code for Thumb2.
For example, the following code implements an indirect call:
mov lr, pc @ Save return address in lr ldr pc, [sp], #8 @ Load function address
This code will not work correctly on Thumb2. Switching mode from ARM to Thumb happens when an address with the bottom bit set is jumped to, this can be by a branch, an ldr
or a mov
. However the pc
does not store the Thumb mode bit, so moving from the pc
as we do in the first instruction above will not capture the information that this is a return to a Thumb function. A better sequence would be:
ldr lr, [sp], #8 @ Load function address blx lr @ Call function
The blx
instruction is only available on ARMv5 and above however, so if you need portability to historical ARM cores you may need to do a bit more work.