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

            Bug ID: 69618
           Summary: PowerPC/e6500: Atomic fence operations not properly
                    supported
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sebastian.hu...@embedded-brains.de
  Target Milestone: ---

On the PowerPC/e6500 elemental synchronization operations should be used for
acquire/release barriers. Currently a lwsync is used instead:

#include <stdatomic.h>

void release(void)
{
        atomic_thread_fence(memory_order_release);
}

void acquire(void)
{
        atomic_thread_fence(memory_order_acquire);
}

powerpc-rtems4.12-gcc -O2 -Wall -Wextra -pedantic -mcpu=e6500 -m32 -S fence.c
cat fence.s
        .file   "fence.c"
        .machine power4
        .section        ".text"
        .align 2
        .p2align 4,,15
        .globl release
        .type   release, @function
release:
        lwsync
        blr
        .size   release, .-release
        .align 2
        .p2align 4,,15
        .globl acquire
        .type   acquire, @function
acquire:
        lwsync
        blr
        .size   acquire, .-acquire
        .ident  "GCC: (GNU) 6.0.0 20160202 (experimental)

See also e6500 Core Reference Manual, 5.5.5.2.1 (Simplified memory barrier
recommendations) and EREF: A Programmer’s Reference Manual for Freescale Power
Architecture Processors (06/2014), 7.4.8.3 (Forcing Load and Store Ordering
(Memory Barriers)).

For acquire semantic a "ESYNC 12" instruction should be used (Load-Load- and
Load-Store-Barriere) and for release semantic a "ESYNC 5" instruction
(Store-Store- and Load-Store-Barrier). See also Memory Model Rationales,
section "Why ordering constraints are never limited to loads or stores"
(www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2176.html).

The e6500 core honours in contrast to the general PowerPC architecture a
Load-Store-Ordering (EREF, 7.4.8.2 (Architecture Ordering Requirements), number
4), so maybe for acquire semantic "ESYNC 8" instruction (Load-Load-Barrier) and
for release semantic a "ESYNC 1" instruction is sufficient
(Store-Store-Barrier). See EREF, 7.4.8.4 (Architectural Memory Access
Ordering), 7.4.8.6.1 (Acquire Lock and Import Shared Memory) and 7.4.8.7.1
(Export Shared Memory and Release Lock).

Reply via email to