Thumb2 code size improvements
Andrew Stubbs
ams at codesourcery.com
Thu Sep 9 18:23:57 BST 2010
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.
Andrew
More information about the linaro-toolchain
mailing list