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

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

Reply via email to