This patch adds patterns to handle negation of an extended 32-bit value more efficiently. For example, (set (reg:DI r0) (neg:DI (sign_extend:DI (reg:SI r0))) The compiler currently generates mov r1, r0, asr #31 rsbs r0, r0, #0 rsc r1, r1, #0 and after the patch it generates: rsb r0, r0, #0 mov r1, r0, asr #31 (set (reg:DI r0) (neg:DI (zero_extend:DI (reg:SI r0))) The compiler currently generates mov r1, #0 rsbs r0, r0, #0 rsc r1, r1, #0 and after the patch it generates: rsbs r0, r0, #0 sbc r1, r1, r1 The following examples are not affected by the patch: (set (reg:DI r0) (sign_extend:DI (neg:SI (reg:SI r0))) rsb r0, r0, #0 mov r1, r0, asr #31 (set (reg:DI r0) (zero_extend:DI (neg:SI (reg:SI r0))) rsb r0, r0, #0 mov r1, #0 The patch also adds the appropriate test cases. gcc/ 2013-01-10 Greta Yorsh * config/arm/arm.md (negdi_extendsidi): New pattern. (negdi_zero_extendsidi): Likewise. gcc/testsuite 2013-01-10 Greta Yorsh * gcc.target/arm/negdi-1.c: New test. * gcc.target/arm/negdi-2.c: Likewise. * gcc.target/arm/negdi-3.c: Likewise. * gcc.target/arm/negdi-4.c: Likewise.