Thumb2 code size improvements
Nicolas Pitre
nicolas.pitre at linaro.org
Fri Sep 10 02:14:06 BST 2010
On Thu, 9 Sep 2010, Andrew Stubbs wrote:
> On 09/09/10 16:22, Yao Qi wrote:
> > GCC produces code like this,
> > 00000024<unPack>:
> > 24: f000 000f and.w r0, r0, #15
> > 28: 2807 cmp r0, #7
> > 2a: d901 bls.n 30<unPack+0xc>
> > 2c: 3810 subs r0, #16
> > 2e: b280 uxth r0, r0<--[1]
> > 30: b200 sxth r0, r0<--[2]
> > 32: 4770 bx lr
> >
> > Are instruction [1] and [2] redundant? Can we remove these two
> > instructions? If they are redundant, we can remove them safely.
>
> Yes, I'd say they were redundant.
>
> In one code path, the result is always positive, and strictly <16, so
> the sign extend is a NOP.
>
> In the other code path, UXTH followed by SXTH is always equivalent to
> SXTH alone, regardless of input.
>
> I wondered for a while whether the extension or rotation did anything
> cunning to the status register, or something, but it seems not.
Of course, the optimal code sequence for this function would be:
lsl r0, r0, #28
asr r0, r0, #28
bx lr
But I doubt gcc could ever become that smart.
Nicolas
More information about the linaro-toolchain
mailing list