//===---- hip_atomics.h - Declarations of hip atomic functions ---- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef OMPTARGET_AMDGCN_HIP_ATOMICS_H #define OMPTARGET_AMDGCN_HIP_ATOMICS_H #include "target_impl.h" namespace { template DEVICE T atomicAdd(T *address, T val) { return __atomic_fetch_add(address, val, __ATOMIC_SEQ_CST); } template DEVICE T atomicMax(T *address, T val) { return __atomic_fetch_max(address, val, __ATOMIC_SEQ_CST); } template DEVICE T atomicExch(T *address, T val) { T r; __atomic_exchange(address, &val, &r, __ATOMIC_SEQ_CST); return r; } template DEVICE T atomicCAS(T *address, T compare, T val) { (void)__atomic_compare_exchange(address, &compare, &val, false, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED); return compare; } INLINE uint32_t atomicInc(uint32_t *address, uint32_t max) { return __builtin_amdgcn_atomic_inc32(address, max, __ATOMIC_SEQ_CST, ""); } } // namespace #endif