llvm-project/libclc/opencl/lib/generic/atomic/atomic_fetch_add.cl

105 lines
4.4 KiB
Common Lisp

//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#include "clc/atomic/clc_atomic_fetch_add.h"
#include "clc/opencl/utils.h"
#define __CLC_FUNCTION atomic_fetch_add
#define __CLC_IMPL_FUNCTION __clc_atomic_fetch_add
#define __CLC_BODY "atomic_def.inc"
#include "clc/integer/gentype.inc"
#define __CLC_BODY "atomic_def.inc"
#include "clc/math/gentype.inc"
// If the device address space is 64-bits, the data types atomic_intptr_t,
// atomic_uintptr_t, atomic_size_t and atomic_ptrdiff_t are supported if the
// cl_khr_int64_base_atomics and cl_khr_int64_extended_atomics extensions are
// supported and have been enabled.
#if __SIZEOF_POINTER__ < 8 || (defined(cl_khr_int64_base_atomics) && \
defined(cl_khr_int64_extended_atomics))
#if defined(__opencl_c_atomic_scope_device) && \
defined(__opencl_c_atomic_order_seq_cst)
_CLC_DEF _CLC_OVERLOAD uintptr_t
atomic_fetch_add(volatile __local atomic_uintptr_t *p, ptrdiff_t v) {
return __scoped_atomic_fetch_add((volatile __local uintptr_t *)p, v,
__ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE);
}
_CLC_DEF _CLC_OVERLOAD uintptr_t
atomic_fetch_add(volatile __global atomic_uintptr_t *p, ptrdiff_t v) {
return __scoped_atomic_fetch_add((volatile __global uintptr_t *)p, v,
__ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE);
}
#if _CLC_GENERIC_AS_SUPPORTED
_CLC_DEF _CLC_OVERLOAD uintptr_t atomic_fetch_add(volatile atomic_uintptr_t *p,
ptrdiff_t v) {
return __scoped_atomic_fetch_add((volatile uintptr_t *)p, v, __ATOMIC_SEQ_CST,
__MEMORY_SCOPE_DEVICE);
}
#endif // _CLC_GENERIC_AS_SUPPORTED
#endif // defined(__opencl_c_atomic_scope_device) &&
// defined(__opencl_c_atomic_order_seq_cst)
#ifdef __opencl_c_atomic_scope_device
_CLC_DEF _CLC_OVERLOAD uintptr_t atomic_fetch_add(
volatile __local atomic_uintptr_t *p, ptrdiff_t v, memory_order order) {
return __scoped_atomic_fetch_add((volatile __local uintptr_t *)p, v, order,
__MEMORY_SCOPE_DEVICE);
}
_CLC_DEF _CLC_OVERLOAD uintptr_t atomic_fetch_add(
volatile __global atomic_uintptr_t *p, ptrdiff_t v, memory_order order) {
return __scoped_atomic_fetch_add((volatile __global uintptr_t *)p, v, order,
__MEMORY_SCOPE_DEVICE);
}
#if _CLC_GENERIC_AS_SUPPORTED
_CLC_DEF _CLC_OVERLOAD uintptr_t atomic_fetch_add(volatile atomic_uintptr_t *p,
ptrdiff_t v,
memory_order order) {
return __scoped_atomic_fetch_add((volatile uintptr_t *)p, v, order,
__MEMORY_SCOPE_DEVICE);
}
#endif // _CLC_GENERIC_AS_SUPPORTED
#endif // __opencl_c_atomic_scope_device
_CLC_DEF _CLC_OVERLOAD uintptr_t
atomic_fetch_add(volatile __local atomic_uintptr_t *p, ptrdiff_t v,
memory_order order, memory_scope scope) {
return __scoped_atomic_fetch_add((volatile __local uintptr_t *)p, v, order,
__opencl_get_clang_memory_scope(scope));
}
_CLC_DEF _CLC_OVERLOAD uintptr_t
atomic_fetch_add(volatile __global atomic_uintptr_t *p, ptrdiff_t v,
memory_order order, memory_scope scope) {
return __scoped_atomic_fetch_add((volatile __global uintptr_t *)p, v, order,
__opencl_get_clang_memory_scope(scope));
}
#if _CLC_GENERIC_AS_SUPPORTED
_CLC_DEF _CLC_OVERLOAD uintptr_t atomic_fetch_add(volatile atomic_uintptr_t *p,
ptrdiff_t v,
memory_order order,
memory_scope scope) {
return __scoped_atomic_fetch_add((volatile uintptr_t *)p, v, order,
__opencl_get_clang_memory_scope(scope));
}
#endif // _CLC_GENERIC_AS_SUPPORTED
#endif // __SIZEOF_POINTER__ < 8 || (defined(cl_khr_int64_base_atomics) &&
// defined(cl_khr_int64_extended_atomics))