83 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(__SPIR32__) || defined(CLC_NVPTX)12#if (defined(__CLC_FPSIZE) && __CLC_FPSIZE <= 32) || \13 (defined(__CLC_GENSIZE) && (__CLC_GENSIZE == 32))14#define __CLC_HAS_ATOMIC15#endif16#else // defined(__SPIR32__) || defined(CLC_NVPTX)17#if defined(__CLC_FPSIZE) || (__CLC_GENSIZE >= 32)18#define __CLC_HAS_ATOMIC19#endif20#endif // defined(__SPIR32__) || defined(CLC_NVPTX)21 22#ifdef __CLC_HAS_ATOMIC23 24#ifndef __CLC_CASTTYPE25#define __CLC_CASTTYPE __CLC_GENTYPE26#endif27 28#ifndef __CLC_AS_RETTYPE29#define __CLC_AS_RETTYPE(x) x30#endif31 32#ifndef __CLC_AS_CASTTYPE33#define __CLC_AS_CASTTYPE(x) x34#endif35 36#ifdef __CLC_NO_VALUE_ARG37#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \38 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \39 volatile ADDRSPACE __CLC_GENTYPE *Ptr, int MemoryOrder, \40 int MemoryScope) { \41 return __CLC_AS_RETTYPE(__CLC_IMPL_FUNCTION( \42 (ADDRSPACE __CLC_CASTTYPE *)Ptr, MemoryOrder, MemoryScope)); \43 }44#elif defined(__CLC_INC_DEC)45#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \46 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \47 volatile ADDRSPACE __CLC_GENTYPE *Ptr, int MemoryOrder, \48 int MemoryScope) { \49 return __CLC_IMPL_FUNCTION(Ptr, (__CLC_U_GENTYPE)(-1), MemoryOrder, \50 MemoryScope); \51 }52#elif defined(__CLC_RETURN_VOID)53#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \54 _CLC_OVERLOAD _CLC_DEF void __CLC_FUNCTION( \55 volatile ADDRSPACE __CLC_GENTYPE *Ptr, __CLC_GENTYPE Value, \56 int MemoryOrder, int MemoryScope) { \57 __CLC_IMPL_FUNCTION((ADDRSPACE __CLC_CASTTYPE *)Ptr, \58 __CLC_AS_CASTTYPE(Value), MemoryOrder, MemoryScope); \59 }60#else61#define __CLC_DEFINE_ATOMIC(ADDRSPACE) \62 _CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __CLC_FUNCTION( \63 volatile ADDRSPACE __CLC_GENTYPE *Ptr, __CLC_GENTYPE Value, \64 int MemoryOrder, int MemoryScope) { \65 return __CLC_AS_RETTYPE(__CLC_IMPL_FUNCTION( \66 (ADDRSPACE __CLC_CASTTYPE *)Ptr, __CLC_AS_CASTTYPE(Value), \67 MemoryOrder, MemoryScope)); \68 }69#endif70 71__CLC_DEFINE_ATOMIC(global)72__CLC_DEFINE_ATOMIC(local)73#if _CLC_GENERIC_AS_SUPPORTED74__CLC_DEFINE_ATOMIC()75#endif76 77#undef __CLC_DEFINE_ATOMIC78 79#endif // __CLC_HAS_ATOMIC80#undef __CLC_HAS_ATOMIC81 82#endif // __CLC_SCALAR83