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

            Bug ID: 109166
           Summary: Built-in  __atomic_test_and_set does not seem to be
                    atomic on ARMv4T
           Product: gcc
           Version: 11.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jdx at o2 dot pl
  Target Milestone: ---
              Host: x86_64-w64-mingw32
            Target: arm-eabi

For the following source code:

bool tas(unsigned char *ptr)
{
    return __atomic_test_and_set(ptr, __ATOMIC_SEQ_CST);
}

gcc -march=armv4t -marm -O3 -Wall -Wextra gives:

tas:
        mov     r3, r0
        mov     r2, #1
        ldrb    r0, [r0]        @ zero_extendqisi2
        strb    r2, [r3]
        bx      lr

I am not an ARM assembler expert, but I think that LDRB/STRB pair should be
replaced with SWPB as shown here: https://godbolt.org/z/116MbYK79.

See also https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107567.

Reply via email to