https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14504
Steven Bosscher <steven at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed|2009-04-22 23:02:33 |2019-3-4 --- Comment #9 from Steven Bosscher <steven at gcc dot gnu.org> --- // -O3 -m32 -fomit-frame-pointer unsigned long cond_mask_1(bool flag, unsigned long mask, unsigned long target) { return flag ? target | mask : target & ~mask; } unsigned long cond_mask_2(bool flag, unsigned long mask, unsigned long target) { return (mask | target ^ 0xFFFFFFFFUL + flag) ^ 0xFFFFFFFFUL + flag; } GCC trunk: cond_mask_1(bool, unsigned long, unsigned long): movl 12(%esp), %eax movl 8(%esp), %edx movl %eax, %ecx orl %edx, %ecx notl %edx andl %eax, %edx cmpb $0, 4(%esp) movl %ecx, %eax cmove %edx, %eax ret cond_mask_2(bool, unsigned long, unsigned long): movzbl 4(%esp), %eax leal -1(%eax), %edx movl 12(%esp), %eax xorl %edx, %eax orl 8(%esp), %eax xorl %edx, %eax ret