------- Comment #4 from rask at gcc dot gnu dot org 2007-11-09 23:51 ------- This has improved (-O2 -fomit-frame-pointer):
test: movl 4(%esp), %eax # 32 *movsi_1/1 [length = 4] movl 8(%esp), %edx # 44 *movsi_1/1 [length = 4] orl %eax, %edx # 6 *iorsi_1/1 [length = 2] addl $1, %eax # 35 *addsi_1/1 [length = 3] cmpl $1, %edx # 38 *cmpsi_1_insn/1 [length = 3] sbbl %edx, %edx # 39 x86_movsicc_0_m1 [length = 2] notl %edx # 40 *one_cmplsi2_1 [length = 2] andl %edx, %eax # 41 *andsi_1/1 [length = 2] ret # 47 return_internal [length = 1] .ident "GCC: (GNU) 4.3.0 20071102 (experimental)" With -Os -fomit-frame-pointer we get: test: movl 4(%esp), %edx # 32 *movsi_1/1 [length = 4] xorl %eax, %eax # 48 *movsi_xor [length = 2] movl 8(%esp), %ecx # 43 *movsi_1/1 [length = 4] orl %edx, %ecx # 7 *iorsi_3 [length = 2] je .L3 # 8 *jcc_1 [length = 2] leal 1(%edx), %eax # 44 *lea_1 [length = 3] .L3: ret # 47 return_internal [length = 1] With -O2/-Os -fomit-frame-pointer -march=pentiumpro: test: movl 4(%esp), %edx # 32 *movsi_1/1 [length = 4] xorl %eax, %eax # 46 *movsi_xor [length = 2] leal 1(%edx), %ecx # 41 *lea_1 [length = 3] orl 8(%esp), %edx # 36 *iorsi_3 [length = 4] cmovne %ecx, %eax # 38 *movsicc_noc/1 [length = 3] ret # 44 return_internal [length = 1] I would probably code it like so: movl 4(%esp), %eax ; 4 movl 8(%esp), %edx ; 4 orl %eax, %edx ; 2 addl $-1, %edx ; 3 adcl $0, %eax ; 3 ret ; 1 -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11873