forked from OSchip/llvm-project
[OpenCL] Add atomic type builtins
Add atomic types and builtins operating on those atomic types to `-fdeclare-opencl-builtins`. The _explicit variants are left out of this commit, as these take enum arguments that are not yet supported by the `-fdeclare-opencl-builtins` machinery.
This commit is contained in:
parent
cfbe889af5
commit
319ea2dd9e
|
@ -265,7 +265,7 @@ def Half : Type<"half", QualType<"HalfTy">>;
|
|||
def Size : Type<"size_t", QualType<"getSizeType()">>;
|
||||
def PtrDiff : Type<"ptrdiff_t", QualType<"getPointerDiffType()">>;
|
||||
def IntPtr : Type<"intptr_t", QualType<"getIntPtrType()">>;
|
||||
def UIntPtr : Type<"uintPtr_t", QualType<"getUIntPtrType()">>;
|
||||
def UIntPtr : Type<"uintptr_t", QualType<"getUIntPtrType()">>;
|
||||
def Void : Type<"void", QualType<"VoidTy">>;
|
||||
|
||||
// OpenCL v1.0/1.2/2.0 s6.1.2: Built-in Vector Data Types.
|
||||
|
@ -290,6 +290,18 @@ def Image2dArrayMsaaDepth : Type<"image2d_array_msaa_depth_t", QualType<"OCLImag
|
|||
def Sampler : Type<"sampler_t", QualType<"OCLSamplerTy">>;
|
||||
def Event : Type<"event_t", QualType<"OCLEventTy">>;
|
||||
|
||||
// OpenCL v2.0 s6.13.11: Atomic integer and floating-point types.
|
||||
def AtomicInt : Type<"atomic_int", QualType<"getAtomicType(Context.IntTy)">>;
|
||||
def AtomicUInt : Type<"atomic_uint", QualType<"getAtomicType(Context.UnsignedIntTy)">>;
|
||||
def AtomicLong : Type<"atomic_long", QualType<"getAtomicType(Context.LongTy)">>;
|
||||
def AtomicULong : Type<"atomic_ulong", QualType<"getAtomicType(Context.UnsignedLongTy)">>;
|
||||
def AtomicFloat : Type<"atomic_float", QualType<"getAtomicType(Context.FloatTy)">>;
|
||||
def AtomicDouble : Type<"atomic_double", QualType<"getAtomicType(Context.DoubleTy)">>;
|
||||
def AtomicIntPtr : Type<"atomic_intptr_t", QualType<"getAtomicType(Context.getIntPtrType())">>;
|
||||
def AtomicUIntPtr : Type<"atomic_uintptr_t", QualType<"getAtomicType(Context.getUIntPtrType())">>;
|
||||
def AtomicSize : Type<"atomic_size_t", QualType<"getAtomicType(Context.getSizeType())">>;
|
||||
def AtomicPtrDiff : Type<"atomic_ptrdiff_t", QualType<"getAtomicType(Context.getPointerDiffType())">>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Definitions of OpenCL gentype variants
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -984,6 +996,45 @@ foreach AS = [GlobalAS, LocalAS] in {
|
|||
}
|
||||
}
|
||||
}
|
||||
// OpenCL v2.0 s6.13.11 - Atomic Functions.
|
||||
let MinVersion = CL20 in {
|
||||
foreach TypePair = [[AtomicInt, Int], [AtomicUInt, UInt],
|
||||
[AtomicLong, Long], [AtomicULong, ULong],
|
||||
[AtomicFloat, Float], [AtomicDouble, Double]] in {
|
||||
def : Builtin<"atomic_init",
|
||||
[Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
|
||||
def : Builtin<"atomic_store",
|
||||
[Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
|
||||
def : Builtin<"atomic_load",
|
||||
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>]>;
|
||||
def : Builtin<"atomic_exchange",
|
||||
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
|
||||
foreach Variant = ["weak", "strong"] in {
|
||||
def : Builtin<"atomic_compare_exchange_" # Variant,
|
||||
[Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
|
||||
PointerType<TypePair[1], GenericAS>, TypePair[1]]>;
|
||||
}
|
||||
}
|
||||
|
||||
foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
|
||||
[AtomicLong, Long, Long], [AtomicULong, ULong, ULong],
|
||||
[AtomicIntPtr, IntPtr, PtrDiff],
|
||||
[AtomicUIntPtr, UIntPtr, PtrDiff]] in {
|
||||
foreach ModOp = ["add", "sub"] in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
|
||||
}
|
||||
}
|
||||
foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
|
||||
[AtomicLong, Long, Long], [AtomicULong, ULong, ULong],
|
||||
[AtomicIntPtr, IntPtr, IntPtr],
|
||||
[AtomicUIntPtr, UIntPtr, UIntPtr]] in {
|
||||
foreach ModOp = ["or", "xor", "and", "min", "max"] in {
|
||||
def : Builtin<"atomic_fetch_" # ModOp,
|
||||
[TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// OpenCL v1.1 s6.11.12, v1.2 s6.12.12, v2.0 s6.13.12 - Miscellaneous Vector Functions
|
||||
|
|
Loading…
Reference in New Issue