• Davi Arnaut's avatar
    Bug#56760: my_atomics failures on osx10.5-x86-64bit · 4e3ec118
    Davi Arnaut authored
    The problem was due to a misuse of GCC asm constraints used to
    implement a atomic load. On x86_64, the load was implemented
    as a cmpxchg which implicitly uses the eax register as a
    source and destination operand, yet the dummy value used for
    comparison wasn't being properly loaded into eax (and other
    problems).
    
    The core problem is that cmpxchg is unnecessary as a load
    on x86_64 as there are other simpler instructions such
    as xadd. Even though, such instructions are only used to
    have a memory barrier as load and stores are atomic by
    definition. Hence, the solution is to explicitly issue the
    required CPU and compiler barriers.
    
    include/atomic/x86-gcc.h:
      Issue a synchronizing instruction before loading the value.
      Afterwards, issue a compiler barrier to prevent reordering.
    4e3ec118
x86-gcc.h 5.64 KB