Prior to ARMv4, ARM had no native support for loading halfwords and signed bytes. To load a signed byte you had to LDRB
then sign extend the value (LSL
it up then ASR
it back down). This is painful so char
is unsigned
by default.
In ARMv4 instructions were added to handle halfwords and signed values. These new instructions had to be squeezed into the available instruction space. Limits on the space available meant that they could not be made as flexible as the original instructions, which are able to do various address computations when loading the value.
So you may find that LDRSB
, for example, is unable to combine a fetch from memory with an address computation whereas LDRB
could. This can cost cycles. Sometimes we can rework short
-heavy code to operate on pairs of ints
to avoid this.
There’s more info on my site here: http://www.davespace.co.uk/arm/efficient-c-for-arm/memaccess.html