Hi,

for the function (really: ternary expressions)

int dummy(int x)
{
#ifdef VARIANT
    x < 0 ? --x : x > 0 ? ++x : 0;
#else
    x < 0 ? --x : x > 0 ? ++x : x;
#endif
}

GCC 10.2.0 generates the following code targeting AMD64:

        testl   %edi, %edi
        js      .L0
        leal    1(%rdi), %eax
        movl    $0, %edi      # SUPERFLUOUS:
        cmove   %edi, %eax    #  cmove is only executed if edi was already 0
        ret
.L0:
        leal    -1(%rdi), %eax
        ret

Targeting i386, GCC 10.2.0 generates it the other way 'round:

        movl    4(%esp), %eax
        testl   %eax, %eax
        js      L0
        leal    1(%eax), %edx
        movl    $0, %eax      # SUPERFLUOUS:
        cmovne  %edx, %eax    #  cmovne is only executed if eax was not 0
        ret
L0:
        subl    $1, %eax
        ret

regards
Stefan

Reply via email to