diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /clang/lib/Sema/OpenCLBuiltins.td | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'clang/lib/Sema/OpenCLBuiltins.td')
-rw-r--r-- | clang/lib/Sema/OpenCLBuiltins.td | 331 |
1 files changed, 245 insertions, 86 deletions
diff --git a/clang/lib/Sema/OpenCLBuiltins.td b/clang/lib/Sema/OpenCLBuiltins.td index 9d6bb411eff8..745363a6b43f 100644 --- a/clang/lib/Sema/OpenCLBuiltins.td +++ b/clang/lib/Sema/OpenCLBuiltins.td @@ -60,10 +60,17 @@ def FuncExtKhrLocalInt32ExtendedAtomics : FunctionExtension<"cl_khr_local_int32 def FuncExtKhrInt64BaseAtomics : FunctionExtension<"cl_khr_int64_base_atomics">; def FuncExtKhrInt64ExtendedAtomics : FunctionExtension<"cl_khr_int64_extended_atomics">; def FuncExtKhrMipmapImage : FunctionExtension<"cl_khr_mipmap_image">; +def FuncExtKhrMipmapImageWrites : FunctionExtension<"cl_khr_mipmap_image_writes">; def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sharing">; // Multiple extensions -def FuncExtKhrMipmapAndWrite3d : FunctionExtension<"cl_khr_mipmap_image cl_khr_3d_image_writes">; +def FuncExtKhrMipmapWritesAndWrite3d : FunctionExtension<"cl_khr_mipmap_image_writes cl_khr_3d_image_writes">; + +// Arm extensions. +def ArmIntegerDotProductInt8 : FunctionExtension<"cl_arm_integer_dot_product_int8">; +def ArmIntegerDotProductAccumulateInt8 : FunctionExtension<"cl_arm_integer_dot_product_accumulate_int8">; +def ArmIntegerDotProductAccumulateInt16 : FunctionExtension<"cl_arm_integer_dot_product_accumulate_int16">; +def ArmIntegerDotProductAccumulateSaturateInt8 : FunctionExtension<"cl_arm_integer_dot_product_accumulate_saturate_int8">; // Qualified Type. These map to ASTContext::QualType. class QualType<string _Name, bit _IsAbstract=0> { @@ -120,7 +127,7 @@ class VectorType<Type _Ty, int _VecWidth> : Type<_Ty.Name, _Ty.QTName> { // OpenCL pointer types (e.g. int*, float*, ...). class PointerType<Type _Ty, AddressSpace _AS = DefaultAS> : - Type<_Ty.Name, _Ty.QTName> { + Type<_Ty.Name, _Ty.QTName> { let AddrSpace = _AS.Name; // Inherited fields let VecWidth = _Ty.VecWidth; @@ -154,7 +161,7 @@ class VolatileType<Type _Ty> : Type<_Ty.Name, _Ty.QTName> { // OpenCL image types (e.g. image2d). class ImageType<Type _Ty, string _AccessQualifier> : - Type<_Ty.Name, QualType<_Ty.QTName.Name#_AccessQualifier#"Ty", 0>> { + Type<_Ty.Name, QualType<_Ty.QTName.Name#_AccessQualifier#"Ty", 0>> { let VecWidth = 0; let AccessQualifier = _AccessQualifier; // Inherited fields @@ -165,8 +172,7 @@ class ImageType<Type _Ty, string _AccessQualifier> : } // List of Types. -class TypeList<string _Name, list<Type> _Type> { - string Name = _Name; +class TypeList<list<Type> _Type> { list<Type> List = _Type; } @@ -195,7 +201,7 @@ class TypeList<string _Name, list<Type> _Type> { // A declaration f(GenT, SGenT) results in the combinations // f(half, half), f(half2, half), f(int, int), f(int2, int) . class GenericType<string _Ty, TypeList _TypeList, IntList _VectorList> : - Type<_Ty, QualType<"null", 1>> { + Type<_Ty, QualType<"null", 1>> { // Possible element types of the generic type. TypeList TypeList = _TypeList; // Possible vector sizes of the types in the TypeList. @@ -259,8 +265,8 @@ 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 Void : Type<"void_t", QualType<"VoidTy">>; +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. // Built-in vector data types are created by TableGen's OpenCLBuiltinEmitter. @@ -268,21 +274,36 @@ def Void : Type<"void_t", QualType<"VoidTy">>; // OpenCL v1.0/1.2/2.0 s6.1.3: Other Built-in Data Types. // The image definitions are "abstract". They should not be used without // specifying an access qualifier (RO/WO/RW). -def Image1d : Type<"Image1d", QualType<"OCLImage1d", 1>>; -def Image2d : Type<"Image2d", QualType<"OCLImage2d", 1>>; -def Image3d : Type<"Image3d", QualType<"OCLImage3d", 1>>; -def Image1dArray : Type<"Image1dArray", QualType<"OCLImage1dArray", 1>>; -def Image1dBuffer : Type<"Image1dBuffer", QualType<"OCLImage1dBuffer", 1>>; -def Image2dArray : Type<"Image2dArray", QualType<"OCLImage2dArray", 1>>; -def Image2dDepth : Type<"Image2dDepth", QualType<"OCLImage2dDepth", 1>>; -def Image2dArrayDepth : Type<"Image2dArrayDepth", QualType<"OCLImage2dArrayDepth", 1>>; -def Image2dMsaa : Type<"Image2dMsaa", QualType<"OCLImage2dMSAA", 1>>; -def Image2dArrayMsaa : Type<"Image2dArrayMsaa", QualType<"OCLImage2dArrayMSAA", 1>>; -def Image2dMsaaDepth : Type<"Image2dMsaaDepth", QualType<"OCLImage2dMSAADepth", 1>>; -def Image2dArrayMsaaDepth : Type<"Image2dArrayMsaaDepth", QualType<"OCLImage2dArrayMSAADepth", 1>>; - -def Sampler : Type<"Sampler", QualType<"OCLSamplerTy">>; -def Event : Type<"Event", QualType<"OCLEventTy">>; +def Image1d : Type<"image1d_t", QualType<"OCLImage1d", 1>>; +def Image2d : Type<"image2d_t", QualType<"OCLImage2d", 1>>; +def Image3d : Type<"image3d_t", QualType<"OCLImage3d", 1>>; +def Image1dArray : Type<"image1d_array_t", QualType<"OCLImage1dArray", 1>>; +def Image1dBuffer : Type<"image1d_buffer_t", QualType<"OCLImage1dBuffer", 1>>; +def Image2dArray : Type<"image2d_array_t", QualType<"OCLImage2dArray", 1>>; +def Image2dDepth : Type<"image2d_depth_t", QualType<"OCLImage2dDepth", 1>>; +def Image2dArrayDepth : Type<"image2d_array_depth_t", QualType<"OCLImage2dArrayDepth", 1>>; +def Image2dMsaa : Type<"image2d_msaa_t", QualType<"OCLImage2dMSAA", 1>>; +def Image2dArrayMsaa : Type<"image2d_array_msaa_t", QualType<"OCLImage2dArrayMSAA", 1>>; +def Image2dMsaaDepth : Type<"image2d_msaa_depth_t", QualType<"OCLImage2dMSAADepth", 1>>; +def Image2dArrayMsaaDepth : Type<"image2d_array_msaa_depth_t", QualType<"OCLImage2dArrayMSAADepth", 1>>; + +def Sampler : Type<"sampler_t", QualType<"OCLSamplerTy">>; +def ClkEvent : Type<"clk_event_t", QualType<"OCLClkEventTy">>; +def Event : Type<"event_t", QualType<"OCLEventTy">>; +def Queue : Type<"queue_t", QualType<"OCLQueueTy">>; +def ReserveId : Type<"reserve_id_t", QualType<"OCLReserveIDTy">>; + +// 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 @@ -305,20 +326,20 @@ def Vec16 : IntList<"Vec16", [16]>; def Vec1234 : IntList<"Vec1234", [1, 2, 3, 4]>; // Type lists. -def TLAll : TypeList<"TLAll", [Char, UChar, Short, UShort, Int, UInt, Long, ULong, Float, Double, Half]>; -def TLAllUnsigned : TypeList<"TLAllUnsigned", [UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong, UInt, ULong, UShort]>; -def TLFloat : TypeList<"TLFloat", [Float, Double, Half]>; -def TLSignedInts : TypeList<"TLSignedInts", [Char, Short, Int, Long]>; -def TLUnsignedInts : TypeList<"TLUnsignedInts", [UChar, UShort, UInt, ULong]>; +def TLAll : TypeList<[Char, UChar, Short, UShort, Int, UInt, Long, ULong, Float, Double, Half]>; +def TLAllUnsigned : TypeList<[UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong, UInt, ULong, UShort]>; +def TLFloat : TypeList<[Float, Double, Half]>; +def TLSignedInts : TypeList<[Char, Short, Int, Long]>; +def TLUnsignedInts : TypeList<[UChar, UShort, UInt, ULong]>; -def TLIntLongFloats : TypeList<"TLIntLongFloats", [Int, UInt, Long, ULong, Float, Double, Half]>; +def TLIntLongFloats : TypeList<[Int, UInt, Long, ULong, Float, Double, Half]>; // All unsigned integer types twice, to facilitate unsigned return types for e.g. // uchar abs(char) and // uchar abs(uchar). -def TLAllUIntsTwice : TypeList<"TLAllUIntsTwice", [UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong]>; +def TLAllUIntsTwice : TypeList<[UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong]>; -def TLAllInts : TypeList<"TLAllInts", [Char, UChar, Short, UShort, Int, UInt, Long, ULong]>; +def TLAllInts : TypeList<[Char, UChar, Short, UShort, Int, UInt, Long, ULong]>; // GenType definitions for multiple base types (e.g. all floating point types, // or all integer types). @@ -348,8 +369,7 @@ foreach Type = [Char, UChar, Short, UShort, foreach VecSizes = [VecAndScalar, VecNoScalar] in { def "GenType" # Type # VecSizes : GenericType<"GenType" # Type # VecSizes, - TypeList<"GL" # Type.Name, [Type]>, - VecSizes>; + TypeList<[Type]>, VecSizes>; } } @@ -357,8 +377,7 @@ foreach Type = [Char, UChar, Short, UShort, foreach Type = [Float, Double, Half] in { def "GenType" # Type # Vec1234 : GenericType<"GenType" # Type # Vec1234, - TypeList<"GL" # Type.Name, [Type]>, - Vec1234>; + TypeList<[Type]>, Vec1234>; } @@ -374,7 +393,11 @@ foreach RType = [Float, Double, Half, Char, UChar, Short, UShort, Int, UInt, Long, ULong] in { foreach IType = [Float, Double, Half, Char, UChar, Short, UShort, Int, UInt, Long, ULong] in { - foreach sat = ["", "_sat"] in { + // Conversions to integer type have a sat and non-sat variant. + foreach sat = !cond(!eq(RType.Name, "float") : [""], + !eq(RType.Name, "double") : [""], + !eq(RType.Name, "half") : [""], + 1 : ["", "_sat"]) in { foreach rnd = ["", "_rte", "_rtn", "_rtp", "_rtz"] in { def : Builtin<"convert_" # RType.Name # sat # rnd, [RType, IType], Attr.Const>; @@ -667,7 +690,7 @@ foreach name = ["isfinite", "isinf", "isnan", "isnormal", "signbit"] in { def : Builtin<name, [GenTypeShortVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>; } foreach name = ["any", "all"] in { - def : Builtin<name, [Int, AIGenTypeN], Attr.Const>; + def : Builtin<name, [Int, SGenTypeN], Attr.Const>; } // --- 2 arguments --- @@ -722,17 +745,17 @@ let MaxVersion = CL20 in { def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, AS>]>; } foreach name = ["vstore" # VSize] in { - def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, AS>]>; - def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, AS>]>; - def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, AS>]>; - def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, AS>]>; - def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, AS>]>; - def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, AS>]>; - def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, AS>]>; - def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, AS>]>; - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, AS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, AS>]>; - def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, AS>]>; + def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, AS>]>; + def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, AS>]>; + def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, AS>]>; + def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, AS>]>; + def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, AS>]>; + def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, AS>]>; + def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, AS>]>; + def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, AS>]>; + def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, AS>]>; + def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, AS>]>; + def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, AS>]>; } foreach name = ["vloada_half" # VSize] in { def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; @@ -764,17 +787,17 @@ let MinVersion = CL20 in { def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; } foreach name = ["vstore" # VSize] in { - def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, GenericAS>]>; - def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; + def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, GenericAS>]>; + def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, GenericAS>]>; + def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, GenericAS>]>; + def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, GenericAS>]>; + def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, GenericAS>]>; + def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, GenericAS>]>; + def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, GenericAS>]>; + def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, GenericAS>]>; + def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, GenericAS>]>; + def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, GenericAS>]>; + def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, GenericAS>]>; } foreach name = ["vloada_half" # VSize] in { def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; @@ -805,24 +828,21 @@ foreach VSize = [2, 3, 4, 8, 16] in { foreach name = ["vloada_half" # VSize] in { def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>; } - foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { - foreach name = ["vstorea_half" # VSize # rnd] in { - def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, ConstantAS>]>; - def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, ConstantAS>]>; - } - } } let MaxVersion = CL20 in { foreach AS = [GlobalAS, LocalAS, PrivateAS] in { def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; + def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; foreach VSize = [2, 3, 4, 8, 16] in { foreach name = ["vload_half" # VSize] in { def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; } } foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { - def : Builtin<"vstore_half" # rnd, [Void, Float, Size, PointerType<Half, AS>]>; - def : Builtin<"vstore_half" # rnd, [Void, Double, Size, PointerType<Half, AS>]>; + foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in { + def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>; + def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>; + } foreach VSize = [2, 3, 4, 8, 16] in { foreach name = ["vstore_half" # VSize # rnd] in { def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; @@ -835,14 +855,17 @@ let MaxVersion = CL20 in { let MinVersion = CL20 in { foreach AS = [GenericAS] in { def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; + def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; foreach VSize = [2, 3, 4, 8, 16] in { foreach name = ["vload_half" # VSize] in { def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; } } foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { - def : Builtin<"vstore_half" # rnd, [Void, Float, Size, PointerType<Half, AS>]>; - def : Builtin<"vstore_half" # rnd, [Void, Double, Size, PointerType<Half, AS>]>; + foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in { + def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>; + def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>; + } foreach VSize = [2, 3, 4, 8, 16] in { foreach name = ["vstore_half" # VSize # rnd] in { def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; @@ -855,6 +878,7 @@ let MinVersion = CL20 in { foreach AS = [ConstantAS] in { def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; + def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; foreach VSize = [2, 3, 4, 8, 16] in { foreach name = ["vload_half" # VSize] in { def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; @@ -976,6 +1000,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 @@ -1172,14 +1235,43 @@ let MinVersion = CL20 in { } -// OpenCL v2.0 s9.17.3: Additions to section 6.13.1: Work-Item Functions -let MinVersion = CL20 in { - let Extension = FuncExtKhrSubgroups in { - def get_sub_group_size : Builtin<"get_sub_group_size", [UInt]>; - def get_max_sub_group_size : Builtin<"get_max_sub_group_size", [UInt]>; - def get_num_sub_groups : Builtin<"get_num_sub_groups", [UInt]>; - } -} +//-------------------------------------------------------------------- +// OpenCL2.0 : 6.13.16 : Pipe Functions +// --- Table 27 --- +// Defined in Builtins.def + +// --- Table 28 --- +// Builtins taking pipe arguments are defined in Builtins.def +def : Builtin<"is_valid_reserve_id", [Bool, ReserveId]>; + +// --- Table 29 --- +// Defined in Builtins.def + + +//-------------------------------------------------------------------- +// OpenCL2.0 : 6.13.17 : Enqueuing Kernels +// --- Table 30 --- +// Defined in Builtins.def + +// --- Table 32 --- +// Defined in Builtins.def + +// --- Table 33 --- +def : Builtin<"enqueue_marker", + [Int, Queue, UInt, PointerType<ConstType<ClkEvent>, GenericAS>, PointerType<ClkEvent, GenericAS>]>; + +// --- Table 34 --- +def : Builtin<"retain_event", [Void, ClkEvent]>; +def : Builtin<"release_event", [Void, ClkEvent]>; +def : Builtin<"create_user_event", [ClkEvent]>; +def : Builtin<"is_valid_event", [Bool, ClkEvent]>; +def : Builtin<"set_user_event_status", [Void, ClkEvent, Int]>; +// TODO: capture_event_profiling_info + +// --- Table 35 --- +def : Builtin<"get_default_queue", [Queue]>; +// TODO: ndrange functions + //-------------------------------------------------------------------- // End of the builtin functions defined in the OpenCL C specification. @@ -1274,6 +1366,16 @@ let Extension = FuncExtKhrMipmapImage in { } } } + // Added to section 6.13.14.5 + foreach aQual = ["RO", "WO", "RW"] in { + foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in { + def : Builtin<"get_image_num_mip_levels", [Int, ImageType<imgTy, aQual>]>; + } + } +} + +// Write functions are enabled using a separate extension. +let Extension = FuncExtKhrMipmapImageWrites in { // Added to section 6.13.14.4. foreach aQual = ["WO"] in { foreach imgTy = [Image2d] in { @@ -1298,7 +1400,7 @@ let Extension = FuncExtKhrMipmapImage in { def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<UInt, 4>]>; } def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Int, Float]>; - let Extension = FuncExtKhrMipmapAndWrite3d in { + let Extension = FuncExtKhrMipmapWritesAndWrite3d in { foreach imgTy = [Image3d] in { def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Float, 4>]>; def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Int, 4>]>; @@ -1306,15 +1408,8 @@ let Extension = FuncExtKhrMipmapImage in { } } } - // Added to section 6.13.14.5 - foreach aQual = ["RO", "WO", "RW"] in { - foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in { - def : Builtin<"get_image_num_mip_levels", [Int, ImageType<imgTy, aQual>]>; - } - } } - //-------------------------------------------------------------------- // OpenCL Extension v2.0 s18.3 - Creating OpenCL Memory Objects from OpenGL MSAA Textures let Extension = FuncExtKhrGlMsaaSharing in { @@ -1346,6 +1441,70 @@ let Extension = FuncExtKhrGlMsaaSharing in { } def : Builtin<"get_image_dim", [VectorType<Int, 2>, ImageType<imgTy, aQual>], Attr.Const>; } - def : Builtin<"get_image_array_size", [Size, ImageType<Image2dArrayMsaaDepth, aQual>], Attr.Const>; + foreach imgTy = [Image2dArrayMsaa, Image2dArrayMsaaDepth] in { + def : Builtin<"get_image_array_size", [Size, ImageType<imgTy, aQual>], Attr.Const>; + } + } +} + +//-------------------------------------------------------------------- +// OpenCL Extension v2.0 s28 - Subgroups +// --- Table 28.2.1 --- +let Extension = FuncExtKhrSubgroups in { + foreach name = ["get_sub_group_size", "get_max_sub_group_size", + "get_num_sub_groups", "get_sub_group_id", + "get_sub_group_local_id"] in { + def : Builtin<name, [UInt]>; + } + let MinVersion = CL20 in { + foreach name = ["get_enqueued_num_sub_groups"] in { + def : Builtin<name, [UInt]>; + } + } +} + +// --- Table 28.2.2 --- +// TODO: sub_group_barrier + +// --- Table 28.2.4 --- +let Extension = FuncExtKhrSubgroups in { + foreach name = ["sub_group_all", "sub_group_any"] in { + def : Builtin<name, [Int, Int], Attr.Convergent>; + } + foreach name = ["sub_group_broadcast"] in { + def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, UInt], Attr.Convergent>; + } + foreach name = ["sub_group_reduce_", "sub_group_scan_exclusive_", + "sub_group_scan_inclusive_"] in { + foreach op = ["add", "min", "max"] in { + def : Builtin<name # op, [IntLongFloatGenType1, IntLongFloatGenType1], Attr.Convergent>; + } + } +} + +//-------------------------------------------------------------------- +// Arm extensions. +let Extension = ArmIntegerDotProductInt8 in { + foreach name = ["arm_dot"] in { + def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>]>; + def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>]>; + } +} +let Extension = ArmIntegerDotProductAccumulateInt8 in { + foreach name = ["arm_dot_acc"] in { + def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>, UInt]>; + def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>, Int]>; + } +} +let Extension = ArmIntegerDotProductAccumulateInt16 in { + foreach name = ["arm_dot_acc"] in { + def : Builtin<name, [UInt, VectorType<UShort, 2>, VectorType<UShort, 2>, UInt]>; + def : Builtin<name, [Int, VectorType<Short, 2>, VectorType<Short, 2>, Int]>; + } +} +let Extension = ArmIntegerDotProductAccumulateSaturateInt8 in { + foreach name = ["arm_dot_acc_sat"] in { + def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>, UInt]>; + def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>, Int]>; } } |