brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · a4ccab5 Raw
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