[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:
Sven van Haastregt 2020-02-26 14:08:23 +00:00
parent cfbe889af5
commit 319ea2dd9e
1 changed files with 52 additions and 1 deletions

View File

@ -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