80 lines · plain
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifdef __CLC_SCALAR10 11#if defined(__opencl_c_fp64) && (defined(cl_khr_int64_base_atomics) && \12 defined(cl_khr_int64_extended_atomics))13#define __CLC_HAVE_64_ATOMIC14#endif15#if defined(__CLC_FPSIZE) && (__CLC_FPSIZE < 64 || defined(__CLC_HAVE_64_ATOMIC)16#define __CLC_HAVE_FP_ATOMIC17#endif18#if defined(__CLC_GENSIZE) && \19 ((__CLC_GENSIZE == 32) || \20 (__CLC_GENSIZE == 64 && defined(__CLC_HAVE_64_ATOMIC)))21#define __CLC_HAVE_INT_ATOMIC22#endif23#if defined(__CLC_HAVE_FP_ATOMIC) || defined(__CLC_HAVE_INT_ATOMIC)24 25#define __CLC_ATOMIC_GENTYPE __CLC_XCONCAT(atomic_, __CLC_GENTYPE)26 27#ifdef __CLC_NO_VALUE_ARG28#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \29 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \30 volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr) { \31 return __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, \32 __ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE); \33 }34#elif defined(__CLC_RETURN_VOID)35#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \36 _CLC_OVERLOAD _CLC_DEF void __CLC_FUNCTION( \37 volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value) { \38 __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Value, \39 __ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE); \40 }41#elif defined(__CLC_COMPARE_EXCHANGE)42#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \43 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \44 volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, \45 ADDRSPACE __CLC_GENTYPE *Expected, __CLC_GENTYPE Desired) { \46 __CLC_GENTYPE Comparator = *Expected; \47 __CLC_GENTYPE RetValue = __clc_atomic_compare_exchange( \48 (volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Comparator, Desired, \49 __ATOMIC_SEQ_CST, __ATOMIC_RELAXED, __MEMORY_SCOPE_DEVICE); \50 if (Comparator != RetValue) { \51 *Expected = RetValue; \52 return true; \53 } \54 return false; \55 }56#else57#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \58 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \59 volatile ADDRSPACE __CLC_ATOMIC_GENTYPE *Ptr, __CLC_GENTYPE Value) { \60 return __CLC_IMPL_FUNCTION((volatile ADDRSPACE __CLC_GENTYPE *)Ptr, Value, \61 __ATOMIC_SEQ_CST, __MEMORY_SCOPE_DEVICE); \62 }63#endif64 65__CLC_DEFINE_ATOMIC(global)66__CLC_DEFINE_ATOMIC(local)67#if _CLC_GENERIC_AS_SUPPORTED68__CLC_DEFINE_ATOMIC()69#endif70 71#undef __CLC_DEFINE_ATOMIC72 73#endif // __CLC_HAVE_FP_ATOMIC || __CLC_HAVE_INT_ATOMIC74 75#undef __CLC_HAVE_INT_ATOMIC76#undef __CLC_HAVE_FP_ATOMIC77#undef __CLC_HAVE_64_ATOMIC78 79#endif // __CLC_SCALAR80