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

_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to