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

Reply via email to