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