xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/config/os/aix/atomicity.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
136ac495dSmrg // Low-level functions for atomic operations: AIX version  -*- C++ -*-
236ac495dSmrg 
3*8feb0f0bSmrg // Copyright (C) 2000-2020 Free Software Foundation, Inc.
436ac495dSmrg //
536ac495dSmrg // This file is part of the GNU ISO C++ Library.  This library is free
636ac495dSmrg // software; you can redistribute it and/or modify it under the
736ac495dSmrg // terms of the GNU General Public License as published by the
836ac495dSmrg // Free Software Foundation; either version 3, or (at your option)
936ac495dSmrg // any later version.
1036ac495dSmrg 
1136ac495dSmrg // This library is distributed in the hope that it will be useful,
1236ac495dSmrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
1336ac495dSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1436ac495dSmrg // GNU General Public License for more details.
1536ac495dSmrg 
1636ac495dSmrg // Under Section 7 of GPL version 3, you are granted additional
1736ac495dSmrg // permissions described in the GCC Runtime Library Exception, version
1836ac495dSmrg // 3.1, as published by the Free Software Foundation.
1936ac495dSmrg 
2036ac495dSmrg // You should have received a copy of the GNU General Public License and
2136ac495dSmrg // a copy of the GCC Runtime Library Exception along with this program;
2236ac495dSmrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2336ac495dSmrg // <http://www.gnu.org/licenses/>.
2436ac495dSmrg 
2536ac495dSmrg #include <ext/atomicity.h>
2636ac495dSmrg 
2736ac495dSmrg /* We cannot use the cpu/powerpc/bits/atomicity.h inline assembly
2836ac495dSmrg    definitions for these operations since they depend on operations
2936ac495dSmrg    that are not available on the original POWER architecture.  AIX
3036ac495dSmrg    still runs on the POWER architecture, so it would be incorrect to
3136ac495dSmrg    assume the existence of these instructions.
3236ac495dSmrg 
3336ac495dSmrg    The definition of _Atomic_word must match the type pointed to by
3436ac495dSmrg    atomic_p in <sys/atomic_op.h>.  */
3536ac495dSmrg 
3636ac495dSmrg extern "C"
3736ac495dSmrg {
3836ac495dSmrg #include <sys/atomic_op.h>
3936ac495dSmrg }
4036ac495dSmrg 
_GLIBCXX_VISIBILITY(default)4136ac495dSmrg namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
4236ac495dSmrg {
4336ac495dSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
4436ac495dSmrg 
4536ac495dSmrg   _Atomic_word
4636ac495dSmrg   __attribute__ ((__unused__))
4736ac495dSmrg   __exchange_and_add (volatile _Atomic_word* __mem, int __val) throw ()
4836ac495dSmrg   { return ::fetch_and_add(const_cast<atomic_p>(__mem), __val); }
4936ac495dSmrg 
5036ac495dSmrg   void
5136ac495dSmrg   __attribute__ ((__unused__))
5236ac495dSmrg   __atomic_add (volatile _Atomic_word* __mem, int __val) throw ()
5336ac495dSmrg   { (void) ::fetch_and_add(const_cast<atomic_p>(__mem), __val); }
5436ac495dSmrg 
5536ac495dSmrg _GLIBCXX_END_NAMESPACE_VERSION
5636ac495dSmrg } // namespace
57