http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46127
Summary: Use 16bit add instead of 32bit in thumb2 Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: car...@google.com CC: car...@google.com Host: i686-linux Target: arm-eabi Build: i686-linux Compile the following code with options -march=armv7-a -mthumb -Os unsigned long compressBound (unsigned long sourceLen) { return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + (sourceLen >> 25) + 13; } GCC 4.6 generates: compressBound: add r3, r0, #13 // A add r3, r3, r0, lsr #12 add r3, r3, r0, lsr #14 add r0, r3, r0, lsr #25 bx lr We can change the instruction order and register a little compressBound: add r3, r0, r0, lsr #12 add r3, r3, r0, lsr #14 add r0, r3, r0, lsr #25 add r0, r0, #13 // B bx lr Now instruction A becomes instruction B. Instruction A is 32 bit, instruction B is 16 bit, so it becomes shorter. Don't know how to handle it in compiler.