https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102566

--- Comment #9 from Thiago Macieira <thiago at kde dot org> ---
Looks like it doesn't work for the sign bit.

$ cat /tmp/test.cpp 
#include <atomic>
bool tbit(std::atomic<int> &i)
{
    return i.fetch_or(CONSTANT, std::memory_order_relaxed) & CONSTANT;
}
$ ~/dev/gcc/bin/gcc -DCONSTANT='(1<<30)' -S -o - -O2 /tmp/test.cpp | sed -n
'/startproc/,/endproc/p'
        .cfi_startproc
        lock btsl       $30, (%rdi)
        setc    %al
        ret
        .cfi_endproc
$ ~/dev/gcc/bin/gcc -DCONSTANT='(1<<31)' -S -o - -O2 /tmp/test.cpp | sed -n
'/startproc/,/endproc/p'
        .cfi_startproc
        movl    (%rdi), %eax
.L2:
        movl    %eax, %ecx
        movl    %eax, %edx
        orl     $-2147483648, %ecx
        lock cmpxchgl   %ecx, (%rdi)
        jne     .L2
        shrl    $31, %edx
        movl    %edx, %eax
        ret
        .cfi_endproc

Changing to std::atomic<unsigned> makes no difference.

Reply via email to