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