Home | History | Annotate | Line # | Download | only in Sema
      1 //==--- OpenCLBuiltins.td - OpenCL builtin declarations -------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      6 // See https://llvm.org/LICENSE.txt for license information.
      7 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      8 //
      9 //===----------------------------------------------------------------------===//
     10 //
     11 // This file contains TableGen definitions for OpenCL builtin function
     12 // declarations.  In case of an unresolved function name in OpenCL, Clang will
     13 // check for a function described in this file when -fdeclare-opencl-builtins
     14 // is specified.
     15 //
     16 //===----------------------------------------------------------------------===//
     17 
     18 //===----------------------------------------------------------------------===//
     19 //              Definitions of miscellaneous basic entities.
     20 //===----------------------------------------------------------------------===//
     21 // Versions of OpenCL
     22 class Version<int _Version> {
     23   int ID = _Version;
     24 }
     25 def CLAll : Version<  0>;
     26 def CL10  : Version<100>;
     27 def CL11  : Version<110>;
     28 def CL12  : Version<120>;
     29 def CL20  : Version<200>;
     30 
     31 // Address spaces
     32 // Pointer types need to be assigned an address space.
     33 class AddressSpace<string _AS> {
     34   string Name = _AS;
     35 }
     36 def DefaultAS    : AddressSpace<"clang::LangAS::Default">;
     37 def PrivateAS    : AddressSpace<"clang::LangAS::opencl_private">;
     38 def GlobalAS     : AddressSpace<"clang::LangAS::opencl_global">;
     39 def ConstantAS   : AddressSpace<"clang::LangAS::opencl_constant">;
     40 def LocalAS      : AddressSpace<"clang::LangAS::opencl_local">;
     41 def GenericAS    : AddressSpace<"clang::LangAS::opencl_generic">;
     42 
     43 // OpenCL language extension.
     44 class AbstractExtension<string _Ext> {
     45   // One or more OpenCL extensions, space separated.  Each extension must be
     46   // a valid extension name for the opencl extension pragma.
     47   string ExtName = _Ext;
     48 }
     49 
     50 // Extension associated to a builtin function.
     51 class FunctionExtension<string _Ext> : AbstractExtension<_Ext>;
     52 
     53 // Extension associated to a type.  This enables implicit conditionalization of
     54 // builtin function overloads containing a type that depends on an extension.
     55 // During overload resolution, when a builtin function overload contains a type
     56 // with a TypeExtension, those overloads are skipped when the extension is
     57 // disabled.
     58 class TypeExtension<string _Ext> : AbstractExtension<_Ext>;
     59 
     60 // TypeExtension definitions.
     61 def NoTypeExt   : TypeExtension<"">;
     62 def Fp16TypeExt : TypeExtension<"cl_khr_fp16">;
     63 def Fp64TypeExt : TypeExtension<"cl_khr_fp64">;
     64 
     65 // FunctionExtension definitions.
     66 def FuncExtNone                          : FunctionExtension<"">;
     67 def FuncExtKhrSubgroups                  : FunctionExtension<"cl_khr_subgroups">;
     68 def FuncExtKhrSubgroupExtendedTypes      : FunctionExtension<"cl_khr_subgroup_extended_types">;
     69 def FuncExtKhrSubgroupNonUniformVote     : FunctionExtension<"cl_khr_subgroup_non_uniform_vote">;
     70 def FuncExtKhrSubgroupBallot             : FunctionExtension<"cl_khr_subgroup_ballot">;
     71 def FuncExtKhrSubgroupNonUniformArithmetic: FunctionExtension<"cl_khr_subgroup_non_uniform_arithmetic">;
     72 def FuncExtKhrSubgroupShuffle            : FunctionExtension<"cl_khr_subgroup_shuffle">;
     73 def FuncExtKhrSubgroupShuffleRelative    : FunctionExtension<"cl_khr_subgroup_shuffle_relative">;
     74 def FuncExtKhrSubgroupClusteredReduce    : FunctionExtension<"cl_khr_subgroup_clustered_reduce">;
     75 def FuncExtKhrGlobalInt32BaseAtomics     : FunctionExtension<"cl_khr_global_int32_base_atomics">;
     76 def FuncExtKhrGlobalInt32ExtendedAtomics : FunctionExtension<"cl_khr_global_int32_extended_atomics">;
     77 def FuncExtKhrLocalInt32BaseAtomics      : FunctionExtension<"cl_khr_local_int32_base_atomics">;
     78 def FuncExtKhrLocalInt32ExtendedAtomics  : FunctionExtension<"cl_khr_local_int32_extended_atomics">;
     79 def FuncExtKhrInt64BaseAtomics           : FunctionExtension<"cl_khr_int64_base_atomics">;
     80 def FuncExtKhrInt64ExtendedAtomics       : FunctionExtension<"cl_khr_int64_extended_atomics">;
     81 def FuncExtKhrMipmapImage                : FunctionExtension<"cl_khr_mipmap_image">;
     82 def FuncExtKhrMipmapImageWrites          : FunctionExtension<"cl_khr_mipmap_image_writes">;
     83 def FuncExtKhrGlMsaaSharing              : FunctionExtension<"cl_khr_gl_msaa_sharing">;
     84 
     85 // Not a real extension, but a workaround to add C++ for OpenCL specific builtins.
     86 def FuncExtOpenCLCxx                     : FunctionExtension<"__cplusplus">;
     87 
     88 // Multiple extensions
     89 def FuncExtKhrMipmapWritesAndWrite3d     : FunctionExtension<"cl_khr_mipmap_image_writes cl_khr_3d_image_writes">;
     90 
     91 // Arm extensions.
     92 def ArmIntegerDotProductInt8                   : FunctionExtension<"cl_arm_integer_dot_product_int8">;
     93 def ArmIntegerDotProductAccumulateInt8         : FunctionExtension<"cl_arm_integer_dot_product_accumulate_int8">;
     94 def ArmIntegerDotProductAccumulateInt16        : FunctionExtension<"cl_arm_integer_dot_product_accumulate_int16">;
     95 def ArmIntegerDotProductAccumulateSaturateInt8 : FunctionExtension<"cl_arm_integer_dot_product_accumulate_saturate_int8">;
     96 
     97 // Qualified Type.  These map to ASTContext::QualType.
     98 class QualType<string _TypeExpr, bit _IsAbstract=0> {
     99   // Expression to obtain the QualType inside OCL2Qual.
    100   // E.g. TypeExpr="Context.IntTy" for the int type.
    101   string TypeExpr = _TypeExpr;
    102   // Some QualTypes in this file represent an abstract type for which there is
    103   // no corresponding AST QualType, e.g. a GenType or an `image2d_t` type
    104   // without access qualifiers.
    105   bit IsAbstract = _IsAbstract;
    106 }
    107 
    108 // List of integers.
    109 class IntList<string _Name, list<int> _List> {
    110   string Name = _Name;
    111   list<int> List = _List;
    112 }
    113 
    114 //===----------------------------------------------------------------------===//
    115 //                      OpenCL C classes for types
    116 //===----------------------------------------------------------------------===//
    117 // OpenCL C basic data types (int, float, image2d_t, ...).
    118 // Its child classes can represent concrete types (e.g. VectorType) or
    119 // abstract types (e.g. GenType).
    120 class Type<string _Name, QualType _QTExpr> {
    121   // Name of the Type.
    122   string Name = _Name;
    123   // QualType associated with this type.
    124   QualType QTExpr = _QTExpr;
    125   // Size of the vector (if applicable).
    126   int VecWidth = 1;
    127   // Is a pointer.
    128   bit IsPointer = 0;
    129   // "const" qualifier.
    130   bit IsConst = 0;
    131   // "volatile" qualifier.
    132   bit IsVolatile = 0;
    133   // Access qualifier. Must be one of ("RO", "WO", "RW").
    134   string AccessQualifier = "";
    135   // Address space.
    136   string AddrSpace = DefaultAS.Name;
    137   // Extension that needs to be enabled to expose a builtin that uses this type.
    138   TypeExtension Extension = NoTypeExt;
    139 }
    140 
    141 // OpenCL vector types (e.g. int2, int3, int16, float8, ...).
    142 class VectorType<Type _Ty, int _VecWidth> : Type<_Ty.Name, _Ty.QTExpr> {
    143   let VecWidth = _VecWidth;
    144   let AccessQualifier = "";
    145   // Inherited fields
    146   let IsPointer = _Ty.IsPointer;
    147   let IsConst = _Ty.IsConst;
    148   let IsVolatile = _Ty.IsVolatile;
    149   let AddrSpace = _Ty.AddrSpace;
    150   let Extension = _Ty.Extension;
    151 }
    152 
    153 // OpenCL pointer types (e.g. int*, float*, ...).
    154 class PointerType<Type _Ty, AddressSpace _AS = DefaultAS> :
    155     Type<_Ty.Name, _Ty.QTExpr> {
    156   let AddrSpace = _AS.Name;
    157   // Inherited fields
    158   let VecWidth = _Ty.VecWidth;
    159   let IsPointer = 1;
    160   let IsConst = _Ty.IsConst;
    161   let IsVolatile = _Ty.IsVolatile;
    162   let AccessQualifier = _Ty.AccessQualifier;
    163   let Extension = _Ty.Extension;
    164 }
    165 
    166 // OpenCL const types (e.g. const int).
    167 class ConstType<Type _Ty> : Type<_Ty.Name, _Ty.QTExpr> {
    168   let IsConst = 1;
    169   // Inherited fields
    170   let VecWidth = _Ty.VecWidth;
    171   let IsPointer = _Ty.IsPointer;
    172   let IsVolatile = _Ty.IsVolatile;
    173   let AccessQualifier = _Ty.AccessQualifier;
    174   let AddrSpace = _Ty.AddrSpace;
    175   let Extension = _Ty.Extension;
    176 }
    177 
    178 // OpenCL volatile types (e.g. volatile int).
    179 class VolatileType<Type _Ty> : Type<_Ty.Name, _Ty.QTExpr> {
    180   let IsVolatile = 1;
    181   // Inherited fields
    182   let VecWidth = _Ty.VecWidth;
    183   let IsPointer = _Ty.IsPointer;
    184   let IsConst = _Ty.IsConst;
    185   let AccessQualifier = _Ty.AccessQualifier;
    186   let AddrSpace = _Ty.AddrSpace;
    187   let Extension = _Ty.Extension;
    188 }
    189 
    190 // OpenCL image types (e.g. image2d).
    191 class ImageType<Type _Ty, string _AccessQualifier> :
    192     Type<_Ty.Name, QualType<_Ty.QTExpr.TypeExpr # _AccessQualifier # "Ty", 0>> {
    193   let VecWidth = 0;
    194   let AccessQualifier = _AccessQualifier;
    195   // Inherited fields
    196   let IsPointer = _Ty.IsPointer;
    197   let IsConst = _Ty.IsConst;
    198   let IsVolatile = _Ty.IsVolatile;
    199   let AddrSpace = _Ty.AddrSpace;
    200   let Extension = _Ty.Extension;
    201 }
    202 
    203 // OpenCL enum type (e.g. memory_scope).
    204 class EnumType<string _Name> :
    205     Type<_Name, QualType<"getOpenCLEnumType(S, \"" # _Name # "\")", 0>> {
    206 }
    207 
    208 // OpenCL typedef type (e.g. cl_mem_fence_flags).
    209 class TypedefType<string _Name> :
    210     Type<_Name, QualType<"getOpenCLTypedefType(S, \"" # _Name # "\")", 0>> {
    211 }
    212 
    213 // List of Types.
    214 class TypeList<list<Type> _Type> {
    215   list<Type> List = _Type;
    216 }
    217 
    218 // A GenericType is an abstract type that defines a set of types as a
    219 // combination of Types and vector sizes.
    220 //
    221 // For example, if TypeList = <int, float> and VectorList = <1, 2, 4>, then it
    222 // represents <int, int2, int4, float, float2, float4>.
    223 //
    224 // Some rules apply when using multiple GenericType arguments in a declaration:
    225 //   1. The number of vector sizes must be equal or 1 for all gentypes in a
    226 //      declaration.
    227 //   2. The number of Types must be equal or 1 for all gentypes in a
    228 //      declaration.
    229 //   3. Generic types are combined by iterating over all generic types at once.
    230 //      For example, for the following GenericTypes
    231 //        GenT1 = GenericType<half, [1, 2]> and
    232 //        GenT2 = GenericType<float, int, [1, 2]>
    233 //      A declaration f(GenT1, GenT2) results in the combinations
    234 //        f(half, float), f(half2, float2), f(half, int), f(half2, int2) .
    235 //   4. "sgentype" from the OpenCL specification is supported by specifying
    236 //      a single vector size.
    237 //      For example, for the following GenericTypes
    238 //        GenT = GenericType<half, int, [1, 2]> and
    239 //        SGenT = GenericType<half, int, [1]>
    240 //      A declaration f(GenT, SGenT) results in the combinations
    241 //        f(half, half), f(half2, half), f(int, int), f(int2, int) .
    242 class GenericType<string _Ty, TypeList _TypeList, IntList _VectorList> :
    243     Type<_Ty, QualType<"null", 1>> {
    244   // Possible element types of the generic type.
    245   TypeList TypeList = _TypeList;
    246   // Possible vector sizes of the types in the TypeList.
    247   IntList VectorList = _VectorList;
    248   // The VecWidth field is ignored for GenericTypes. Use VectorList instead.
    249   let VecWidth = 0;
    250 }
    251 
    252 // Builtin function attributes.
    253 def Attr {
    254   list<bit> None = [0, 0, 0];
    255   list<bit> Pure = [1, 0, 0];
    256   list<bit> Const = [0, 1, 0];
    257   list<bit> Convergent = [0, 0, 1];
    258 }
    259 
    260 //===----------------------------------------------------------------------===//
    261 //                      OpenCL C class for builtin functions
    262 //===----------------------------------------------------------------------===//
    263 class Builtin<string _Name, list<Type> _Signature, list<bit> _Attributes = Attr.None> {
    264   // Name of the builtin function
    265   string Name = _Name;
    266   // List of types used by the function. The first one is the return type and
    267   // the following are the arguments. The list must have at least one element
    268   // (the return type).
    269   list<Type> Signature = _Signature;
    270   // Function attribute __attribute__((pure))
    271   bit IsPure = _Attributes[0];
    272   // Function attribute __attribute__((const))
    273   bit IsConst = _Attributes[1];
    274   // Function attribute __attribute__((convergent))
    275   bit IsConv = _Attributes[2];
    276   // OpenCL extensions to which the function belongs.
    277   FunctionExtension Extension = FuncExtNone;
    278   // Version of OpenCL from which the function is available (e.g.: CL10).
    279   // MinVersion is inclusive.
    280   Version MinVersion = CL10;
    281   // Version of OpenCL from which the function is not supported anymore.
    282   // MaxVersion is exclusive.
    283   // CLAll makes the function available for all versions.
    284   Version MaxVersion = CLAll;
    285 }
    286 
    287 //===----------------------------------------------------------------------===//
    288 //                 Definitions of OpenCL C types
    289 //===----------------------------------------------------------------------===//
    290 
    291 // OpenCL v1.0/1.2/2.0 s6.1.1: Built-in Scalar Data Types.
    292 def Bool      : Type<"bool",      QualType<"Context.BoolTy">>;
    293 def Char      : Type<"char",      QualType<"Context.CharTy">>;
    294 def UChar     : Type<"uchar",     QualType<"Context.UnsignedCharTy">>;
    295 def Short     : Type<"short",     QualType<"Context.ShortTy">>;
    296 def UShort    : Type<"ushort",    QualType<"Context.UnsignedShortTy">>;
    297 def Int       : Type<"int",       QualType<"Context.IntTy">>;
    298 def UInt      : Type<"uint",      QualType<"Context.UnsignedIntTy">>;
    299 def Long      : Type<"long",      QualType<"Context.LongTy">>;
    300 def ULong     : Type<"ulong",     QualType<"Context.UnsignedLongTy">>;
    301 def Float     : Type<"float",     QualType<"Context.FloatTy">>;
    302 let Extension = Fp64TypeExt in {
    303   def Double    : Type<"double",    QualType<"Context.DoubleTy">>;
    304 }
    305 let Extension = Fp16TypeExt in {
    306   def Half      : Type<"half",      QualType<"Context.HalfTy">>;
    307 }
    308 def Size      : Type<"size_t",    QualType<"Context.getSizeType()">>;
    309 def PtrDiff   : Type<"ptrdiff_t", QualType<"Context.getPointerDiffType()">>;
    310 def IntPtr    : Type<"intptr_t",  QualType<"Context.getIntPtrType()">>;
    311 def UIntPtr   : Type<"uintptr_t", QualType<"Context.getUIntPtrType()">>;
    312 def Void      : Type<"void",      QualType<"Context.VoidTy">>;
    313 
    314 // OpenCL v1.0/1.2/2.0 s6.1.2: Built-in Vector Data Types.
    315 // Built-in vector data types are created by TableGen's OpenCLBuiltinEmitter.
    316 
    317 // OpenCL v1.0/1.2/2.0 s6.1.3: Other Built-in Data Types.
    318 // The image definitions are "abstract".  They should not be used without
    319 // specifying an access qualifier (RO/WO/RW).
    320 def Image1d               : Type<"image1d_t", QualType<"Context.OCLImage1d", 1>>;
    321 def Image2d               : Type<"image2d_t", QualType<"Context.OCLImage2d", 1>>;
    322 def Image3d               : Type<"image3d_t", QualType<"Context.OCLImage3d", 1>>;
    323 def Image1dArray          : Type<"image1d_array_t", QualType<"Context.OCLImage1dArray", 1>>;
    324 def Image1dBuffer         : Type<"image1d_buffer_t", QualType<"Context.OCLImage1dBuffer", 1>>;
    325 def Image2dArray          : Type<"image2d_array_t", QualType<"Context.OCLImage2dArray", 1>>;
    326 def Image2dDepth          : Type<"image2d_depth_t", QualType<"Context.OCLImage2dDepth", 1>>;
    327 def Image2dArrayDepth     : Type<"image2d_array_depth_t", QualType<"Context.OCLImage2dArrayDepth", 1>>;
    328 def Image2dMsaa           : Type<"image2d_msaa_t", QualType<"Context.OCLImage2dMSAA", 1>>;
    329 def Image2dArrayMsaa      : Type<"image2d_array_msaa_t", QualType<"Context.OCLImage2dArrayMSAA", 1>>;
    330 def Image2dMsaaDepth      : Type<"image2d_msaa_depth_t", QualType<"Context.OCLImage2dMSAADepth", 1>>;
    331 def Image2dArrayMsaaDepth : Type<"image2d_array_msaa_depth_t", QualType<"Context.OCLImage2dArrayMSAADepth", 1>>;
    332 
    333 def Sampler               : Type<"sampler_t", QualType<"Context.OCLSamplerTy">>;
    334 def ClkEvent              : Type<"clk_event_t", QualType<"Context.OCLClkEventTy">>;
    335 def Event                 : Type<"event_t", QualType<"Context.OCLEventTy">>;
    336 def Queue                 : Type<"queue_t", QualType<"Context.OCLQueueTy">>;
    337 def ReserveId             : Type<"reserve_id_t", QualType<"Context.OCLReserveIDTy">>;
    338 def MemFenceFlags         : TypedefType<"cl_mem_fence_flags">;
    339 def ClkProfilingInfo      : TypedefType<"clk_profiling_info">;
    340 def NDRange               : TypedefType<"ndrange_t">;
    341 
    342 // OpenCL v2.0 s6.13.11: Atomic integer and floating-point types.
    343 def AtomicInt             : Type<"atomic_int", QualType<"Context.getAtomicType(Context.IntTy)">>;
    344 def AtomicUInt            : Type<"atomic_uint", QualType<"Context.getAtomicType(Context.UnsignedIntTy)">>;
    345 def AtomicLong            : Type<"atomic_long", QualType<"Context.getAtomicType(Context.LongTy)">>;
    346 def AtomicULong           : Type<"atomic_ulong", QualType<"Context.getAtomicType(Context.UnsignedLongTy)">>;
    347 def AtomicFloat           : Type<"atomic_float", QualType<"Context.getAtomicType(Context.FloatTy)">>;
    348 def AtomicDouble          : Type<"atomic_double", QualType<"Context.getAtomicType(Context.DoubleTy)">>;
    349 def AtomicIntPtr          : Type<"atomic_intptr_t", QualType<"Context.getAtomicType(Context.getIntPtrType())">>;
    350 def AtomicUIntPtr         : Type<"atomic_uintptr_t", QualType<"Context.getAtomicType(Context.getUIntPtrType())">>;
    351 def AtomicSize            : Type<"atomic_size_t", QualType<"Context.getAtomicType(Context.getSizeType())">>;
    352 def AtomicPtrDiff         : Type<"atomic_ptrdiff_t", QualType<"Context.getAtomicType(Context.getPointerDiffType())">>;
    353 
    354 def AtomicFlag            : TypedefType<"atomic_flag">;
    355 def MemoryOrder           : EnumType<"memory_order">;
    356 def MemoryScope           : EnumType<"memory_scope">;
    357 
    358 //===----------------------------------------------------------------------===//
    359 //                 Definitions of OpenCL gentype variants
    360 //===----------------------------------------------------------------------===//
    361 // The OpenCL specification often uses "gentype" in builtin function
    362 // declarations to indicate that a builtin function is available with various
    363 // argument and return types.  The types represented by "gentype" vary between
    364 // different parts of the specification.  The following definitions capture
    365 // the different type lists for gentypes in different parts of the
    366 // specification.
    367 
    368 // Vector width lists.
    369 def VecAndScalar: IntList<"VecAndScalar", [1, 2, 3, 4, 8, 16]>;
    370 def VecNoScalar : IntList<"VecNoScalar", [2, 3, 4, 8, 16]>;
    371 def Vec1        : IntList<"Vec1", [1]>;
    372 def Vec1234     : IntList<"Vec1234", [1, 2, 3, 4]>;
    373 
    374 // Type lists.
    375 def TLAll           : TypeList<[Char,  UChar, Short,  UShort, Int,  UInt, Long,  ULong, Float, Double, Half]>;
    376 def TLFloat         : TypeList<[Float, Double, Half]>;
    377 def TLSignedInts    : TypeList<[Char, Short, Int, Long]>;
    378 def TLUnsignedInts  : TypeList<[UChar, UShort, UInt, ULong]>;
    379 
    380 def TLIntLongFloats : TypeList<[Int, UInt, Long, ULong, Float, Double, Half]>;
    381 
    382 // All unsigned integer types twice, to facilitate unsigned return types for e.g.
    383 // uchar abs(char) and
    384 // uchar abs(uchar).
    385 def TLAllUIntsTwice : TypeList<[UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong]>;
    386 
    387 def TLAllInts       : TypeList<[Char, UChar, Short, UShort, Int, UInt, Long, ULong]>;
    388 
    389 // GenType definitions for multiple base types (e.g. all floating point types,
    390 // or all integer types).
    391 // All types
    392 def AGenType1              : GenericType<"AGenType1", TLAll, Vec1>;
    393 def AGenTypeN              : GenericType<"AGenTypeN", TLAll, VecAndScalar>;
    394 def AGenTypeNNoScalar      : GenericType<"AGenTypeNNoScalar", TLAll, VecNoScalar>;
    395 // All integer
    396 def AIGenType1             : GenericType<"AIGenType1", TLAllInts, Vec1>;
    397 def AIGenTypeN             : GenericType<"AIGenTypeN", TLAllInts, VecAndScalar>;
    398 def AIGenTypeNNoScalar     : GenericType<"AIGenTypeNNoScalar", TLAllInts, VecNoScalar>;
    399 // All integer to unsigned
    400 def AI2UGenTypeN           : GenericType<"AI2UGenTypeN", TLAllUIntsTwice, VecAndScalar>;
    401 // Signed integer
    402 def SGenTypeN              : GenericType<"SGenTypeN", TLSignedInts, VecAndScalar>;
    403 // Unsigned integer
    404 def UGenTypeN              : GenericType<"UGenTypeN", TLUnsignedInts, VecAndScalar>;
    405 // Float
    406 def FGenTypeN              : GenericType<"FGenTypeN", TLFloat, VecAndScalar>;
    407 // (u)int, (u)long, and all floats
    408 def IntLongFloatGenType1   : GenericType<"IntLongFloatGenType1", TLIntLongFloats, Vec1>;
    409 // (u)char and (u)short
    410 def CharShortGenType1      : GenericType<"CharShortGenType1",
    411                                  TypeList<[Char, UChar, Short, UShort]>, Vec1>;
    412 
    413 // GenType definitions for every single base type (e.g. fp32 only).
    414 // Names are like: GenTypeFloatVecAndScalar.
    415 foreach Type = [Char, UChar, Short, UShort,
    416                 Int, UInt, Long, ULong,
    417                 Float, Double, Half] in {
    418   foreach VecSizes = [VecAndScalar, VecNoScalar] in {
    419     def "GenType" # Type # VecSizes :
    420               GenericType<"GenType" # Type # VecSizes,
    421                           TypeList<[Type]>, VecSizes>;
    422   }
    423 }
    424 
    425 // GenType definitions for vec1234.
    426 foreach Type = [Float, Double, Half] in {
    427   def "GenType" # Type # Vec1234 :
    428               GenericType<"GenType" # Type # Vec1234,
    429                           TypeList<[Type]>, Vec1234>;
    430 }
    431 
    432 
    433 //===----------------------------------------------------------------------===//
    434 //                 Definitions of OpenCL builtin functions
    435 //===----------------------------------------------------------------------===//
    436 //--------------------------------------------------------------------
    437 // OpenCL v1.1/1.2/2.0 s6.2.3 - Explicit conversions.
    438 // OpenCL v2.0 Extensions s5.1.1 and s6.1.1 - Conversions.
    439 
    440 // Generate the convert_* builtins functions.
    441 foreach RType = [Float, Double, Half, Char, UChar, Short,
    442                  UShort, Int, UInt, Long, ULong] in {
    443   foreach IType = [Float, Double, Half, Char, UChar, Short,
    444                    UShort, Int, UInt, Long, ULong] in {
    445     // Conversions to integer type have a sat and non-sat variant.
    446     foreach sat = !cond(!eq(RType.Name, "float") : [""],
    447                         !eq(RType.Name, "double") : [""],
    448                         !eq(RType.Name, "half") : [""],
    449                         1 : ["", "_sat"]) in {
    450       foreach rnd = ["", "_rte", "_rtn", "_rtp", "_rtz"] in {
    451         def : Builtin<"convert_" # RType.Name # sat # rnd, [RType, IType],
    452                       Attr.Const>;
    453         foreach v = [2, 3, 4, 8, 16] in {
    454           def : Builtin<"convert_" # RType.Name # v # sat # rnd,
    455                         [VectorType<RType, v>, VectorType<IType, v>],
    456                         Attr.Const>;
    457         }
    458       }
    459     }
    460   }
    461 }
    462 
    463 //--------------------------------------------------------------------
    464 // OpenCL v1.1 s6.11.1, v1.2 s6.12.1, v2.0 s6.13.1 - Work-item Functions
    465 // --- Table 7 ---
    466 def : Builtin<"get_work_dim", [UInt], Attr.Const>;
    467 foreach name = ["get_global_size", "get_global_id", "get_local_size",
    468                 "get_local_id", "get_num_groups", "get_group_id",
    469                 "get_global_offset"] in {
    470   def : Builtin<name, [Size, UInt], Attr.Const>;
    471 }
    472 
    473 let MinVersion = CL20 in {
    474   def : Builtin<"get_enqueued_local_size", [Size, UInt]>;
    475   foreach name = ["get_global_linear_id", "get_local_linear_id"] in {
    476     def : Builtin<name, [Size]>;
    477   }
    478 }
    479 
    480 
    481 //--------------------------------------------------------------------
    482 // OpenCL v1.1 s6.11.2, v1.2 s6.12.2, v2.0 s6.13.2 - Math functions
    483 // OpenCL Extension v2.0 s5.1.2 and s6.1.2 - Math Functions
    484 // --- Table 8 ---
    485 // --- 1 argument ---
    486 foreach name = ["acos", "acosh", "acospi",
    487                 "asin", "asinh", "asinpi",
    488                 "atan", "atanh", "atanpi",
    489                 "cbrt", "ceil",
    490                 "cos", "cosh", "cospi",
    491                 "erfc", "erf",
    492                 "exp", "exp2", "exp10", "expm1",
    493                 "fabs", "floor",
    494                 "log", "log2", "log10", "log1p", "logb",
    495                 "rint", "round", "rsqrt",
    496                 "sin", "sinh", "sinpi",
    497                 "sqrt",
    498                 "tan", "tanh", "tanpi",
    499                 "tgamma", "trunc",
    500                 "lgamma"] in {
    501     def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>;
    502 }
    503 foreach name = ["nan"] in {
    504   def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
    505   def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeULongVecAndScalar], Attr.Const>;
    506   def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
    507 }
    508 
    509 // --- 2 arguments ---
    510 foreach name = ["atan2", "atan2pi", "copysign", "fdim", "fmod", "hypot",
    511                 "maxmag", "minmag", "nextafter", "pow", "powr",
    512                 "remainder"] in {
    513   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    514 }
    515 foreach name = ["fmax", "fmin"] in {
    516   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    517   def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
    518   def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
    519   def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
    520 }
    521 foreach name = ["ilogb"] in {
    522   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
    523   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeDoubleVecAndScalar], Attr.Const>;
    524   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeHalfVecAndScalar], Attr.Const>;
    525 }
    526 foreach name = ["ldexp"] in {
    527   def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    528   def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Int], Attr.Const>;
    529   def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    530   def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Int], Attr.Const>;
    531   def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    532   def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Int], Attr.Const>;
    533 }
    534 foreach name = ["pown", "rootn"] in {
    535   def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    536   def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    537   def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    538 }
    539 
    540 // --- 3 arguments ---
    541 foreach name = ["fma", "mad"] in {
    542   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    543 }
    544 
    545 // --- Version dependent ---
    546 let MaxVersion = CL20 in {
    547   foreach AS = [GlobalAS, LocalAS, PrivateAS] in {
    548     foreach name = ["fract", "modf", "sincos"] in {
    549       def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, AS>]>;
    550     }
    551     foreach name = ["frexp", "lgamma_r"] in {
    552       foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
    553         def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>;
    554       }
    555     }
    556     foreach name = ["remquo"] in {
    557       foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
    558         def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>;
    559       }
    560     }
    561   }
    562 }
    563 let MinVersion = CL20 in {
    564   foreach name = ["fract", "modf", "sincos"] in {
    565     def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, GenericAS>]>;
    566   }
    567   foreach name = ["frexp", "lgamma_r"] in {
    568     foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
    569       def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>;
    570     }  }
    571   foreach name = ["remquo"] in {
    572     foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
    573       def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>;
    574     }
    575   }
    576 }
    577 
    578 // --- Table 9 ---
    579 foreach name = ["half_cos",
    580                 "half_exp", "half_exp2", "half_exp10",
    581                 "half_log", "half_log2", "half_log10",
    582                 "half_recip", "half_rsqrt",
    583                 "half_sin", "half_sqrt", "half_tan",
    584                 "native_cos",
    585                 "native_exp", "native_exp2", "native_exp10",
    586                 "native_log", "native_log2", "native_log10",
    587                 "native_recip", "native_rsqrt",
    588                 "native_sin", "native_sqrt", "native_tan"] in {
    589   def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
    590 }
    591 foreach name = ["half_divide", "half_powr",
    592                 "native_divide", "native_powr"] in {
    593   def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
    594 }
    595 
    596 //--------------------------------------------------------------------
    597 // OpenCL v1.1 s6.11.3, v1.2 s6.12.3, v2.0 s6.13.3 - Integer Functions
    598 // --- Table 10 ---
    599 // --- 1 argument ---
    600 foreach name = ["abs"] in {
    601   def : Builtin<name, [AI2UGenTypeN, AIGenTypeN], Attr.Const>;
    602 }
    603 def : Builtin<"clz", [AIGenTypeN, AIGenTypeN], Attr.Const>;
    604 let MinVersion = CL12 in {
    605   def : Builtin<"popcount", [AIGenTypeN, AIGenTypeN], Attr.Const>;
    606 }
    607 let MinVersion = CL20 in {
    608   foreach name = ["ctz"] in {
    609     def : Builtin<name, [AIGenTypeN, AIGenTypeN]>;
    610   }
    611 }
    612 
    613 // --- 2 arguments ---
    614 foreach name = ["abs_diff"] in {
    615   def : Builtin<name, [AI2UGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
    616 }
    617 foreach name = ["add_sat", "hadd", "rhadd", "mul_hi", "rotate", "sub_sat"] in {
    618   def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
    619 }
    620 foreach name = ["max", "min"] in {
    621   def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
    622   def : Builtin<name, [AIGenTypeNNoScalar, AIGenTypeNNoScalar, AIGenType1], Attr.Const>;
    623 }
    624 foreach name = ["upsample"] in {
    625   def : Builtin<name, [GenTypeShortVecAndScalar, GenTypeCharVecAndScalar, GenTypeUCharVecAndScalar], Attr.Const>;
    626   def : Builtin<name, [GenTypeUShortVecAndScalar, GenTypeUCharVecAndScalar, GenTypeUCharVecAndScalar], Attr.Const>;
    627   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeShortVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
    628   def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUShortVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
    629   def : Builtin<name, [GenTypeLongVecAndScalar, GenTypeIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
    630   def : Builtin<name, [GenTypeULongVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
    631 }
    632 
    633 // --- 3 arguments ---
    634 foreach name = ["clamp"] in {
    635   def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
    636   def : Builtin<name, [AIGenTypeNNoScalar, AIGenTypeNNoScalar, AIGenType1, AIGenType1], Attr.Const>;
    637 }
    638 foreach name = ["mad_hi", "mad_sat"] in {
    639   def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
    640 }
    641 
    642 // --- Table 11 ---
    643 foreach name = ["mad24"] in {
    644   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    645   def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
    646 }
    647 foreach name = ["mul24"] in {
    648   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    649   def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
    650 }
    651 
    652 //--------------------------------------------------------------------
    653 // OpenCL v1.1 s6.11.4, v1.2 s6.12.4, v2.0 s6.13.4 - Common Functions
    654 // OpenCL Extension v2.0 s5.1.3 and s6.1.3 - Common Functions
    655 // --- Table 12 ---
    656 // --- 1 argument ---
    657 foreach name = ["degrees", "radians", "sign"] in {
    658   def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>;
    659 }
    660 
    661 // --- 2 arguments ---
    662 foreach name = ["max", "min"] in {
    663   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    664   def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
    665   def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
    666   def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
    667 }
    668 foreach name = ["step"] in {
    669   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    670   def : Builtin<name, [GenTypeFloatVecNoScalar, Float, GenTypeFloatVecNoScalar], Attr.Const>;
    671   def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, GenTypeDoubleVecNoScalar], Attr.Const>;
    672   def : Builtin<name, [GenTypeHalfVecNoScalar, Half, GenTypeHalfVecNoScalar], Attr.Const>;
    673 }
    674 
    675 // --- 3 arguments ---
    676 foreach name = ["clamp"] in {
    677   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    678   def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float, Float], Attr.Const>;
    679   def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double, Double], Attr.Const>;
    680   def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half, Half], Attr.Const>;
    681 }
    682 foreach name = ["mix"] in {
    683   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    684   def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
    685   def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
    686   def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
    687 }
    688 foreach name = ["smoothstep"] in {
    689   def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
    690   def : Builtin<name, [GenTypeFloatVecNoScalar, Float, Float, GenTypeFloatVecNoScalar], Attr.Const>;
    691   def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, Double, GenTypeDoubleVecNoScalar], Attr.Const>;
    692   def : Builtin<name, [GenTypeHalfVecNoScalar, Half, Half, GenTypeHalfVecNoScalar], Attr.Const>;
    693 }
    694 
    695 
    696 //--------------------------------------------------------------------
    697 // OpenCL v1.1 s6.11.5, v1.2 s6.12.5, v2.0 s6.13.5 - Geometric Functions
    698 // OpenCL Extension v2.0 s5.1.4 and s6.1.4 - Geometric Functions
    699 // --- Table 13 ---
    700 // --- 1 argument ---
    701 foreach name = ["length"] in {
    702   def : Builtin<name, [Float, GenTypeFloatVec1234], Attr.Const>;
    703   def : Builtin<name, [Double, GenTypeDoubleVec1234], Attr.Const>;
    704   def : Builtin<name, [Half, GenTypeHalfVec1234], Attr.Const>;
    705 }
    706 foreach name = ["normalize"] in {
    707   def : Builtin<name, [GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
    708   def : Builtin<name, [GenTypeDoubleVec1234, GenTypeDoubleVec1234], Attr.Const>;
    709   def : Builtin<name, [GenTypeHalfVec1234, GenTypeHalfVec1234], Attr.Const>;
    710 }
    711 foreach name = ["fast_length"] in {
    712   def : Builtin<name, [Float, GenTypeFloatVec1234], Attr.Const>;
    713 }
    714 foreach name = ["fast_normalize"] in {
    715   def : Builtin<name, [GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
    716 }
    717 
    718 // --- 2 arguments ---
    719 foreach name = ["cross"] in {
    720   foreach VSize = [3, 4] in {
    721     def : Builtin<name, [VectorType<Float, VSize>, VectorType<Float, VSize>, VectorType<Float, VSize>], Attr.Const>;
    722     def : Builtin<name, [VectorType<Double, VSize>, VectorType<Double, VSize>, VectorType<Double, VSize>], Attr.Const>;
    723     def : Builtin<name, [VectorType<Half, VSize>, VectorType<Half, VSize>, VectorType<Half, VSize>], Attr.Const>;
    724   }
    725 }
    726 foreach name = ["dot", "distance"] in {
    727   def : Builtin<name, [Float, GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
    728   def : Builtin<name, [Double, GenTypeDoubleVec1234, GenTypeDoubleVec1234], Attr.Const>;
    729   def : Builtin<name, [Half, GenTypeHalfVec1234, GenTypeHalfVec1234], Attr.Const>;
    730 }
    731 foreach name = ["fast_distance"] in {
    732   def : Builtin<name, [Float, GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
    733 }
    734 
    735 
    736 //--------------------------------------------------------------------
    737 // OpenCL v1.1 s6.11.6, v1.2 s6.12.6, v2.0 s6.13.6 - Relational Functions
    738 // OpenCL Extension v2.0 s5.1.5 and s6.1.5 - Relational Functions
    739 // --- Table 14 ---
    740 // --- 1 argument ---
    741 foreach name = ["isfinite", "isinf", "isnan", "isnormal", "signbit"] in {
    742   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
    743   def : Builtin<name, [Int, Double], Attr.Const>;
    744   def : Builtin<name, [GenTypeLongVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>;
    745   def : Builtin<name, [Int, Half], Attr.Const>;
    746   def : Builtin<name, [GenTypeShortVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>;
    747 }
    748 foreach name = ["any", "all"] in {
    749   def : Builtin<name, [Int, SGenTypeN], Attr.Const>;
    750 }
    751 
    752 // --- 2 arguments ---
    753 foreach name = ["isequal", "isnotequal", "isgreater", "isgreaterequal",
    754                 "isless", "islessequal", "islessgreater", "isordered",
    755                 "isunordered"] in {
    756   def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
    757   def : Builtin<name, [Int, Double, Double], Attr.Const>;
    758   def : Builtin<name, [GenTypeLongVecNoScalar, GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>;
    759   def : Builtin<name, [Int, Half, Half], Attr.Const>;
    760   def : Builtin<name, [GenTypeShortVecNoScalar, GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>;
    761 }
    762 
    763 // --- 3 arguments ---
    764 foreach name = ["bitselect"] in {
    765   def : Builtin<name, [AGenTypeN, AGenTypeN, AGenTypeN, AGenTypeN], Attr.Const>;
    766 }
    767 foreach name = ["select"] in {
    768   def : Builtin<name, [SGenTypeN, SGenTypeN, SGenTypeN, SGenTypeN], Attr.Const>;
    769   def : Builtin<name, [SGenTypeN, SGenTypeN, SGenTypeN, UGenTypeN], Attr.Const>;
    770   def : Builtin<name, [UGenTypeN, UGenTypeN, UGenTypeN, UGenTypeN], Attr.Const>;
    771   def : Builtin<name, [UGenTypeN, UGenTypeN, UGenTypeN, SGenTypeN], Attr.Const>;
    772   def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
    773   def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
    774   def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeLongVecAndScalar], Attr.Const>;
    775   def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeULongVecAndScalar], Attr.Const>;
    776   def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeShortVecAndScalar], Attr.Const>;
    777   def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
    778 }
    779 
    780 
    781 //--------------------------------------------------------------------
    782 // OpenCL v1.1 s6.11.7, v1.2 s6.12.7, v2.0 s6.13.7 - Vector Data Load and Store Functions
    783 // OpenCL Extension v1.1 s9.3.6 and s9.6.6, v1.2 s9.5.6, v2.0 s5.1.6 and s6.1.6 - Vector Data Load and Store Functions
    784 // --- Table 15 ---
    785 // Variants for OpenCL versions below 2.0, using pointers to the global, local
    786 // and private address spaces.
    787 let MaxVersion = CL20 in {
    788   foreach AS = [GlobalAS, LocalAS, PrivateAS] in {
    789     foreach VSize = [2, 3, 4, 8, 16] in {
    790       foreach name = ["vload" # VSize] in {
    791         def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, AS>]>;
    792         def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, AS>]>;
    793         def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, AS>]>;
    794         def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, AS>]>;
    795         def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, AS>]>;
    796         def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, AS>]>;
    797         def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, AS>]>;
    798         def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, AS>]>;
    799         def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, AS>]>;
    800         def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, AS>]>;
    801         def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
    802       }
    803       foreach name = ["vstore" # VSize] in {
    804         def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, AS>]>;
    805         def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, AS>]>;
    806         def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, AS>]>;
    807         def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, AS>]>;
    808         def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, AS>]>;
    809         def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, AS>]>;
    810         def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, AS>]>;
    811         def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, AS>]>;
    812         def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, AS>]>;
    813         def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, AS>]>;
    814         def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, AS>]>;
    815       }
    816       foreach name = ["vloada_half" # VSize] in {
    817         def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
    818       }
    819       foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
    820         foreach name = ["vstorea_half" # VSize # rnd] in {
    821           def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>;
    822           def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>;
    823         }
    824       }
    825     }
    826   }
    827 }
    828 // Variants for OpenCL versions above 2.0, using pointers to the generic
    829 // address space.
    830 let MinVersion = CL20 in {
    831   foreach VSize = [2, 3, 4, 8, 16] in {
    832     foreach name = ["vload" # VSize] in {
    833       def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, GenericAS>]>;
    834       def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, GenericAS>]>;
    835       def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, GenericAS>]>;
    836       def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, GenericAS>]>;
    837       def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, GenericAS>]>;
    838       def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, GenericAS>]>;
    839       def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, GenericAS>]>;
    840       def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, GenericAS>]>;
    841       def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, GenericAS>]>;
    842       def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, GenericAS>]>;
    843       def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>;
    844     }
    845     foreach name = ["vstore" # VSize] in {
    846       def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, GenericAS>]>;
    847       def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, GenericAS>]>;
    848       def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, GenericAS>]>;
    849       def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, GenericAS>]>;
    850       def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, GenericAS>]>;
    851       def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, GenericAS>]>;
    852       def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, GenericAS>]>;
    853       def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, GenericAS>]>;
    854       def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, GenericAS>]>;
    855       def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, GenericAS>]>;
    856       def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, GenericAS>]>;
    857     }
    858     foreach name = ["vloada_half" # VSize] in {
    859       def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>;
    860     }
    861     foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
    862       foreach name = ["vstorea_half" # VSize # rnd] in {
    863         def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, GenericAS>]>;
    864         def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, GenericAS>]>;
    865       }
    866     }
    867   }
    868 }
    869 // Variants using pointers to the constant address space.
    870 foreach VSize = [2, 3, 4, 8, 16] in {
    871   foreach name = ["vload" # VSize] in {
    872     def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, ConstantAS>]>;
    873     def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, ConstantAS>]>;
    874     def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, ConstantAS>]>;
    875     def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, ConstantAS>]>;
    876     def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, ConstantAS>]>;
    877     def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, ConstantAS>]>;
    878     def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, ConstantAS>]>;
    879     def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, ConstantAS>]>;
    880     def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, ConstantAS>]>;
    881     def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, ConstantAS>]>;
    882     def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>;
    883   }
    884   foreach name = ["vloada_half" # VSize] in {
    885     def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>;
    886   }
    887 }
    888 let MaxVersion = CL20 in {
    889   foreach AS = [GlobalAS, LocalAS, PrivateAS] in {
    890     def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
    891     def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
    892     foreach VSize = [2, 3, 4, 8, 16] in {
    893       foreach name = ["vload_half" # VSize] in {
    894         def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
    895       }
    896     }
    897     foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
    898       foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in {
    899         def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>;
    900         def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>;
    901       }
    902       foreach VSize = [2, 3, 4, 8, 16] in {
    903         foreach name = ["vstore_half" # VSize # rnd] in {
    904           def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>;
    905           def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>;
    906         }
    907       }
    908     }
    909   }
    910 }
    911 let MinVersion = CL20 in {
    912   foreach AS = [GenericAS] in {
    913     def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
    914     def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
    915     foreach VSize = [2, 3, 4, 8, 16] in {
    916       foreach name = ["vload_half" # VSize] in {
    917         def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
    918       }
    919     }
    920     foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
    921       foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in {
    922         def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>;
    923         def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>;
    924       }
    925       foreach VSize = [2, 3, 4, 8, 16] in {
    926         foreach name = ["vstore_half" # VSize # rnd] in {
    927           def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>;
    928           def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>;
    929         }
    930       }
    931     }
    932   }
    933 }
    934 
    935 foreach AS = [ConstantAS] in {
    936   def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
    937   def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
    938   foreach VSize = [2, 3, 4, 8, 16] in {
    939     foreach name = ["vload_half" # VSize] in {
    940       def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
    941     }
    942   }
    943 }
    944 
    945 // OpenCL v3.0 s6.15.8 - Synchronization Functions.
    946 def : Builtin<"barrier", [Void, MemFenceFlags], Attr.Convergent>;
    947 let MinVersion = CL20 in {
    948   def : Builtin<"work_group_barrier", [Void, MemFenceFlags], Attr.Convergent>;
    949   def : Builtin<"work_group_barrier", [Void, MemFenceFlags, MemoryScope], Attr.Convergent>;
    950 }
    951 
    952 // OpenCL v3.0 s6.15.9 - Legacy Explicit Memory Fence Functions.
    953 def : Builtin<"mem_fence", [Void, MemFenceFlags]>;
    954 def : Builtin<"read_mem_fence", [Void, MemFenceFlags]>;
    955 def : Builtin<"write_mem_fence", [Void, MemFenceFlags]>;
    956 
    957 // OpenCL v3.0 s6.15.10 - Address Space Qualifier Functions.
    958 // to_global, to_local, to_private are declared in Builtins.def.
    959 
    960 let MinVersion = CL20 in {
    961   // The OpenCL 3.0 specification defines these with a "gentype" argument indicating any builtin
    962   // type or user-defined type, which cannot be represented currently.  Hence we slightly diverge
    963   // by providing only the following overloads with a void pointer.
    964   def : Builtin<"get_fence", [MemFenceFlags, PointerType<Void, GenericAS>]>;
    965   def : Builtin<"get_fence", [MemFenceFlags, PointerType<ConstType<Void>, GenericAS>]>;
    966 }
    967 
    968 //--------------------------------------------------------------------
    969 // OpenCL v1.1 s6.11.10, v1.2 s6.12.10, v2.0 s6.13.10: Async Copies from Global to Local Memory, Local to Global Memory, and Prefetch
    970 // OpenCL Extension v2.0 s5.1.7 and s6.1.7: Async Copies from Global to Local Memory, Local to Global Memory, and Prefetch
    971 // --- Table 18 ---
    972 foreach name = ["async_work_group_copy"] in {
    973   def : Builtin<name, [Event, PointerType<AGenTypeN, LocalAS>, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size, Event]>;
    974   def : Builtin<name, [Event, PointerType<AGenTypeN, GlobalAS>, PointerType<ConstType<AGenTypeN>, LocalAS>, Size, Event]>;
    975 }
    976 foreach name = ["async_work_group_strided_copy"] in {
    977   def : Builtin<name, [Event, PointerType<AGenTypeN, LocalAS>, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size, Size, Event]>;
    978   def : Builtin<name, [Event, PointerType<AGenTypeN, GlobalAS>, PointerType<ConstType<AGenTypeN>, LocalAS>, Size, Size, Event]>;
    979 }
    980 foreach name = ["wait_group_events"] in {
    981   def : Builtin<name, [Void, Int, PointerType<Event, GenericAS>]>;
    982 }
    983 foreach name = ["prefetch"] in {
    984   def : Builtin<name, [Void, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size]>;
    985 }
    986 
    987 //--------------------------------------------------------------------
    988 // OpenCL v2.0 s6.13.11 - Atomics Functions.
    989 // Functions that use memory_order and cl_mem_fence_flags enums are not
    990 // declared here as the TableGen backend does not handle enums.
    991 
    992 // OpenCL v1.0 s9.5, s9.6, s9.7 - Atomic Functions for 32-bit integers
    993 // --- Table 9.1 ---
    994 let Extension = FuncExtKhrGlobalInt32BaseAtomics in {
    995   foreach Type = [Int, UInt] in {
    996     foreach name = ["atom_add", "atom_sub", "atom_xchg"] in {
    997       def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type]>;
    998     }
    999     foreach name = ["atom_inc", "atom_dec"] in {
   1000       def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>]>;
   1001     }
   1002     foreach name = ["atom_cmpxchg"] in {
   1003       def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type, Type]>;
   1004     }
   1005   }
   1006 }
   1007 // --- Table 9.3 ---
   1008 let Extension = FuncExtKhrLocalInt32BaseAtomics in {
   1009   foreach Type = [Int, UInt] in {
   1010     foreach name = ["atom_add", "atom_sub", "atom_xchg"] in {
   1011       def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type]>;
   1012     }
   1013     foreach name = ["atom_inc", "atom_dec"] in {
   1014       def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>]>;
   1015     }
   1016     foreach name = ["atom_cmpxchg"] in {
   1017       def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type, Type]>;
   1018     }
   1019   }
   1020 }
   1021 // --- Table 9.5 ---
   1022 let Extension = FuncExtKhrInt64BaseAtomics in {
   1023   foreach AS = [GlobalAS, LocalAS] in {
   1024     foreach Type = [Long, ULong] in {
   1025       foreach name = ["atom_add", "atom_sub", "atom_xchg"] in {
   1026         def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>;
   1027       }
   1028       foreach name = ["atom_inc", "atom_dec"] in {
   1029         def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>]>;
   1030       }
   1031       foreach name = ["atom_cmpxchg"] in {
   1032         def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type, Type]>;
   1033       }
   1034     }
   1035   }
   1036 }
   1037 // --- Table 9.2 ---
   1038 let Extension = FuncExtKhrGlobalInt32ExtendedAtomics in {
   1039   foreach Type = [Int, UInt] in {
   1040     foreach name = ["atom_min", "atom_max", "atom_and",
   1041                     "atom_or", "atom_xor"] in {
   1042       def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type]>;
   1043     }
   1044   }
   1045 }
   1046 // --- Table 9.4 ---
   1047 let Extension = FuncExtKhrLocalInt32ExtendedAtomics in {
   1048   foreach Type = [Int, UInt] in {
   1049     foreach name = ["atom_min", "atom_max", "atom_and",
   1050                     "atom_or", "atom_xor"] in {
   1051       def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type]>;
   1052     }
   1053   }
   1054 }
   1055 // --- Table 9.6 ---
   1056 let Extension = FuncExtKhrInt64ExtendedAtomics in {
   1057   foreach AS = [GlobalAS, LocalAS] in {
   1058     foreach Type = [Long, ULong] in {
   1059       foreach name = ["atom_min", "atom_max", "atom_and",
   1060                       "atom_or", "atom_xor"] in {
   1061         def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>;
   1062       }
   1063     }
   1064   }
   1065 }
   1066 // OpenCL v1.1 s6.11.1, v1.2 s6.12.11 - Atomic Functions
   1067 foreach AS = [GlobalAS, LocalAS] in {
   1068   def : Builtin<"atomic_xchg", [Float, PointerType<VolatileType<Float>, AS>, Float]>;
   1069   foreach Type = [Int, UInt] in {
   1070     foreach name = ["atomic_add", "atomic_sub", "atomic_xchg",
   1071                     "atomic_min", "atomic_max", "atomic_and",
   1072                     "atomic_or", "atomic_xor"] in {
   1073       def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>;
   1074     }
   1075     foreach name = ["atomic_inc", "atomic_dec"] in {
   1076       def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>]>;
   1077     }
   1078     foreach name = ["atomic_cmpxchg"] in {
   1079       def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type, Type]>;
   1080     }
   1081   }
   1082 }
   1083 
   1084 let Extension = FuncExtOpenCLCxx in {
   1085   foreach Type = [Int, UInt] in {
   1086     foreach name = ["atomic_add", "atomic_sub", "atomic_xchg",
   1087                     "atomic_min", "atomic_max", "atomic_and",
   1088                     "atomic_or", "atomic_xor"] in {
   1089       def : Builtin<name, [Type, PointerType<VolatileType<Type>, GenericAS>, Type]>;
   1090     }
   1091     foreach name = ["atomic_inc", "atomic_dec"] in {
   1092       def : Builtin<name, [Type, PointerType<VolatileType<Type>, GenericAS>]>;
   1093     }
   1094     foreach name = ["atomic_cmpxchg"] in {
   1095       def : Builtin<name, [Type, PointerType<VolatileType<Type>, GenericAS>, Type, Type]>;
   1096     }
   1097   }
   1098 }
   1099 
   1100 // OpenCL v2.0 s6.13.11 - Atomic Functions.
   1101 let MinVersion = CL20 in {
   1102   def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>;
   1103 
   1104   foreach TypePair = [[AtomicInt, Int], [AtomicUInt, UInt],
   1105                       [AtomicLong, Long], [AtomicULong, ULong],
   1106                       [AtomicFloat, Float], [AtomicDouble, Double]] in {
   1107     def : Builtin<"atomic_init",
   1108         [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
   1109     def : Builtin<"atomic_store",
   1110         [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
   1111     def : Builtin<"atomic_store_explicit",
   1112         [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1], MemoryOrder]>;
   1113     def : Builtin<"atomic_store_explicit",
   1114         [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1], MemoryOrder, MemoryScope]>;
   1115     def : Builtin<"atomic_load",
   1116         [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>]>;
   1117     def : Builtin<"atomic_load_explicit",
   1118         [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, MemoryOrder]>;
   1119     def : Builtin<"atomic_load_explicit",
   1120         [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, MemoryOrder, MemoryScope]>;
   1121     def : Builtin<"atomic_exchange",
   1122         [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
   1123     def : Builtin<"atomic_exchange_explicit",
   1124         [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1], MemoryOrder]>;
   1125     def : Builtin<"atomic_exchange_explicit",
   1126         [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1], MemoryOrder, MemoryScope]>;
   1127     foreach Variant = ["weak", "strong"] in {
   1128       def : Builtin<"atomic_compare_exchange_" # Variant,
   1129           [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
   1130            PointerType<TypePair[1], GenericAS>, TypePair[1]]>;
   1131       def : Builtin<"atomic_compare_exchange_" # Variant # "_explicit",
   1132           [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
   1133            PointerType<TypePair[1], GenericAS>, TypePair[1], MemoryOrder, MemoryOrder]>;
   1134       def : Builtin<"atomic_compare_exchange_" # Variant # "_explicit",
   1135           [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
   1136            PointerType<TypePair[1], GenericAS>, TypePair[1], MemoryOrder, MemoryOrder, MemoryScope]>;
   1137     }
   1138   }
   1139 
   1140   foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
   1141                       [AtomicLong, Long, Long], [AtomicULong, ULong, ULong],
   1142                       [AtomicUIntPtr, UIntPtr, PtrDiff]] in {
   1143     foreach ModOp = ["add", "sub"] in {
   1144       def : Builtin<"atomic_fetch_" # ModOp,
   1145           [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
   1146       def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
   1147           [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2], MemoryOrder]>;
   1148       def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
   1149           [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2], MemoryOrder, MemoryScope]>;
   1150     }
   1151   }
   1152   foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
   1153                       [AtomicLong, Long, Long], [AtomicULong, ULong, ULong]] in {
   1154     foreach ModOp = ["or", "xor", "and", "min", "max"] in {
   1155       def : Builtin<"atomic_fetch_" # ModOp,
   1156           [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
   1157       def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
   1158           [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2], MemoryOrder]>;
   1159       def : Builtin<"atomic_fetch_" # ModOp # "_explicit",
   1160           [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2], MemoryOrder, MemoryScope]>;
   1161     }
   1162   }
   1163 
   1164   def : Builtin<"atomic_flag_clear",
   1165       [Void, PointerType<VolatileType<AtomicFlag>, GenericAS>]>;
   1166   def : Builtin<"atomic_flag_clear_explicit",
   1167       [Void, PointerType<VolatileType<AtomicFlag>, GenericAS>, MemoryOrder]>;
   1168   def : Builtin<"atomic_flag_clear_explicit",
   1169       [Void, PointerType<VolatileType<AtomicFlag>, GenericAS>, MemoryOrder, MemoryScope]>;
   1170 
   1171   def : Builtin<"atomic_flag_test_and_set",
   1172       [Bool, PointerType<VolatileType<AtomicFlag>, GenericAS>]>;
   1173   def : Builtin<"atomic_flag_test_and_set_explicit",
   1174       [Bool, PointerType<VolatileType<AtomicFlag>, GenericAS>, MemoryOrder]>;
   1175   def : Builtin<"atomic_flag_test_and_set_explicit",
   1176       [Bool, PointerType<VolatileType<AtomicFlag>, GenericAS>, MemoryOrder, MemoryScope]>;
   1177 }
   1178 
   1179 //--------------------------------------------------------------------
   1180 // OpenCL v1.1 s6.11.12, v1.2 s6.12.12, v2.0 s6.13.12 - Miscellaneous Vector Functions
   1181 // --- Table 19 ---
   1182 foreach VSize1 = [2, 4, 8, 16] in {
   1183   foreach VSize2 = [2, 4, 8, 16] in {
   1184     foreach VecAndMaskType = [[Char, UChar], [UChar, UChar],
   1185                               [Short, UShort], [UShort, UShort],
   1186                               [Int, UInt], [UInt, UInt],
   1187                               [Long, ULong], [ULong, ULong],
   1188                               [Float, UInt], [Double, ULong], [Half, UShort]] in {
   1189       def : Builtin<"shuffle", [VectorType<VecAndMaskType[0], VSize1>,
   1190                                 VectorType<VecAndMaskType[0], VSize2>,
   1191                                 VectorType<VecAndMaskType[1], VSize1>],
   1192                                Attr.Const>;
   1193     }
   1194   }
   1195 }
   1196 foreach VSize1 = [2, 4, 8, 16] in {
   1197   foreach VSize2 = [2, 4, 8, 16] in {
   1198     foreach VecAndMaskType = [[Char, UChar], [UChar, UChar],
   1199                               [Short, UShort], [UShort, UShort],
   1200                               [Int, UInt], [UInt, UInt],
   1201                               [Long, ULong], [ULong, ULong],
   1202                               [Float, UInt], [Double, ULong], [Half, UShort]] in {
   1203       def : Builtin<"shuffle2", [VectorType<VecAndMaskType[0], VSize1>,
   1204                                  VectorType<VecAndMaskType[0], VSize2>,
   1205                                  VectorType<VecAndMaskType[0], VSize2>,
   1206                                  VectorType<VecAndMaskType[1], VSize1>],
   1207                                 Attr.Const>;
   1208     }
   1209   }
   1210 }
   1211 
   1212 //--------------------------------------------------------------------
   1213 // OpenCL v1.1 s6.11.3, v1.2 s6.12.14, v2.0 s6.13.14: Image Read and Write Functions
   1214 // OpenCL Extension v2.0 s5.1.8 and s6.1.8: Image Read and Write Functions
   1215 // --- Table 22: Image Read Functions with Samplers ---
   1216 foreach imgTy = [Image1d] in {
   1217   foreach coordTy = [Int, Float] in {
   1218     def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>;
   1219     def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>;
   1220     def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>;
   1221   }
   1222 }
   1223 foreach imgTy = [Image2d, Image1dArray] in {
   1224   foreach coordTy = [Int, Float] in {
   1225     def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
   1226     def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
   1227     def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
   1228   }
   1229 }
   1230 foreach imgTy = [Image3d, Image2dArray] in {
   1231   foreach coordTy = [Int, Float] in {
   1232     def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
   1233     def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
   1234     def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
   1235   }
   1236 }
   1237 foreach coordTy = [Int, Float] in {
   1238   def : Builtin<"read_imagef", [Float, ImageType<Image2dDepth, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
   1239   def : Builtin<"read_imagef", [Float, ImageType<Image2dArrayDepth, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
   1240 }
   1241 
   1242 // --- Table 23: Sampler-less Read Functions ---
   1243 let MinVersion = CL12 in {
   1244   foreach aQual = ["RO", "RW"] in {
   1245     foreach imgTy = [Image2d, Image1dArray] in {
   1246       def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
   1247       def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
   1248       def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
   1249     }
   1250     foreach imgTy = [Image3d, Image2dArray] in {
   1251       def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
   1252       def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
   1253       def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
   1254     }
   1255     foreach imgTy = [Image1d, Image1dBuffer] in {
   1256       def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
   1257       def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
   1258       def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
   1259     }
   1260     def : Builtin<"read_imagef", [Float, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>], Attr.Pure>;
   1261     def : Builtin<"read_imagef", [Float, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>], Attr.Pure>;
   1262   }
   1263 }
   1264 
   1265 // --- Table 24: Image Write Functions ---
   1266 foreach aQual = ["WO", "RW"] in {
   1267   foreach imgTy = [Image2d] in {
   1268     def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Float, 4>]>;
   1269     def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Int, 4>]>;
   1270     def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<UInt, 4>]>;
   1271   }
   1272   foreach imgTy = [Image2dArray] in {
   1273     def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Float, 4>]>;
   1274     def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Int, 4>]>;
   1275     def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<UInt, 4>]>;
   1276   }
   1277   foreach imgTy = [Image1d, Image1dBuffer] in {
   1278     def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, Int, VectorType<Float, 4>]>;
   1279     def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, Int, VectorType<Int, 4>]>;
   1280     def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, Int, VectorType<UInt, 4>]>;
   1281   }
   1282   foreach imgTy = [Image1dArray] in {
   1283     def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Float, 4>]>;
   1284     def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Int, 4>]>;
   1285     def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<UInt, 4>]>;
   1286   }
   1287   foreach imgTy = [Image3d] in {
   1288     def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Float, 4>]>;
   1289     def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Int, 4>]>;
   1290     def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<UInt, 4>]>;
   1291   }
   1292   def : Builtin<"write_imagef", [Void, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>, Float]>;
   1293   def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Float]>;
   1294 }
   1295 
   1296 // --- Table 25: Image Query Functions ---
   1297 foreach aQual = ["RO", "WO", "RW"] in {
   1298   foreach imgTy = [Image1d, Image1dBuffer, Image2d, Image3d,
   1299                    Image1dArray, Image2dArray, Image2dDepth,
   1300                    Image2dArrayDepth] in {
   1301     foreach name = ["get_image_width", "get_image_channel_data_type",
   1302                     "get_image_channel_order"] in {
   1303       def : Builtin<name, [Int, ImageType<imgTy, aQual>], Attr.Const>;
   1304     }
   1305   }
   1306   foreach imgTy = [Image2d, Image3d, Image2dArray, Image2dDepth,
   1307                    Image2dArrayDepth] in {
   1308     def : Builtin<"get_image_height", [Int, ImageType<imgTy, aQual>], Attr.Const>;
   1309   }
   1310   def : Builtin<"get_image_depth", [Int, ImageType<Image3d, aQual>], Attr.Const>;
   1311   foreach imgTy = [Image2d, Image2dArray, Image2dDepth,
   1312                    Image2dArrayDepth] in {
   1313     def : Builtin<"get_image_dim", [VectorType<Int, 2>, ImageType<imgTy, aQual>], Attr.Const>;
   1314   }
   1315   def : Builtin<"get_image_dim", [VectorType<Int, 4>, ImageType<Image3d, aQual>], Attr.Const>;
   1316   foreach imgTy = [Image1dArray, Image2dArray, Image2dArrayDepth] in {
   1317     def : Builtin<"get_image_array_size", [Size, ImageType<imgTy, aQual>], Attr.Const>;
   1318   }
   1319 }
   1320 
   1321 // OpenCL extension v2.0 s5.1.9: Built-in Image Read Functions
   1322 // --- Table 8 ---
   1323 foreach aQual = ["RO"] in {
   1324   foreach name = ["read_imageh"] in {
   1325     foreach coordTy = [Int, Float] in {
   1326       foreach imgTy = [Image2d, Image1dArray] in {
   1327         def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
   1328       }
   1329       foreach imgTy = [Image3d, Image2dArray] in {
   1330         def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
   1331       }
   1332       foreach imgTy = [Image1d] in {
   1333         def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, coordTy], Attr.Pure>;
   1334       }
   1335     }
   1336   }
   1337 }
   1338 // OpenCL extension v2.0 s5.1.10: Built-in Image Sampler-less Read Functions
   1339 // --- Table 9 ---
   1340 let MinVersion = CL12 in {
   1341   foreach aQual = ["RO", "RW"] in {
   1342     foreach name = ["read_imageh"] in {
   1343       foreach imgTy = [Image2d, Image1dArray] in {
   1344         def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
   1345       }
   1346       foreach imgTy = [Image3d, Image2dArray] in {
   1347         def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
   1348       }
   1349       foreach imgTy = [Image1d, Image1dBuffer] in {
   1350         def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
   1351       }
   1352     }
   1353   }
   1354 }
   1355 // OpenCL extension v2.0 s5.1.11: Built-in Image Write Functions
   1356 // --- Table 10 ---
   1357 foreach aQual = ["WO", "RW"] in {
   1358   foreach name = ["write_imageh"] in {
   1359     def : Builtin<name, [Void, ImageType<Image2d, aQual>, VectorType<Int, 2>, VectorType<Half, 4>]>;
   1360     def : Builtin<name, [Void, ImageType<Image2dArray, aQual>, VectorType<Int, 4>, VectorType<Half, 4>]>;
   1361     def : Builtin<name, [Void, ImageType<Image1d, aQual>, Int, VectorType<Half, 4>]>;
   1362     def : Builtin<name, [Void, ImageType<Image1dBuffer, aQual>, Int, VectorType<Half, 4>]>;
   1363     def : Builtin<name, [Void, ImageType<Image1dArray, aQual>, VectorType<Int, 2>, VectorType<Half, 4>]>;
   1364     def : Builtin<name, [Void, ImageType<Image3d, aQual>, VectorType<Int, 4>, VectorType<Half, 4>]>;
   1365   }
   1366 }
   1367 
   1368 
   1369 //--------------------------------------------------------------------
   1370 // OpenCL v2.0 s6.13.15 - Work-group Functions
   1371 // --- Table 26 ---
   1372 let MinVersion = CL20 in {
   1373   foreach name = ["work_group_all", "work_group_any"] in {
   1374     def : Builtin<name, [Int, Int], Attr.Convergent>;
   1375   }
   1376   foreach name = ["work_group_broadcast"] in {
   1377     def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size], Attr.Convergent>;
   1378     def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size, Size], Attr.Convergent>;
   1379     def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size, Size, Size], Attr.Convergent>;
   1380   }
   1381   foreach op = ["add", "min", "max"] in {
   1382     foreach name = ["work_group_reduce_", "work_group_scan_exclusive_",
   1383                     "work_group_scan_inclusive_"] in {
   1384       def : Builtin<name # op, [IntLongFloatGenType1, IntLongFloatGenType1], Attr.Convergent>;
   1385     }
   1386   }
   1387 }
   1388 
   1389 
   1390 //--------------------------------------------------------------------
   1391 // OpenCL2.0 : 6.13.16 : Pipe Functions
   1392 // --- Table 27 ---
   1393 // Defined in Builtins.def
   1394 
   1395 // --- Table 28 ---
   1396 // Builtins taking pipe arguments are defined in Builtins.def
   1397 def : Builtin<"is_valid_reserve_id", [Bool, ReserveId]>;
   1398 
   1399 // --- Table 29 ---
   1400 // Defined in Builtins.def
   1401 
   1402 
   1403 //--------------------------------------------------------------------
   1404 // OpenCL2.0 : 6.13.17 : Enqueuing Kernels
   1405 // --- Table 30 ---
   1406 // Defined in Builtins.def
   1407 
   1408 // --- Table 32 ---
   1409 // Defined in Builtins.def
   1410 
   1411 // --- Table 33 ---
   1412 let MinVersion = CL20 in {
   1413   def : Builtin<"enqueue_marker",
   1414       [Int, Queue, UInt, PointerType<ConstType<ClkEvent>, GenericAS>, PointerType<ClkEvent, GenericAS>]>;
   1415 
   1416   // --- Table 34 ---
   1417   def : Builtin<"retain_event", [Void, ClkEvent]>;
   1418   def : Builtin<"release_event", [Void, ClkEvent]>;
   1419   def : Builtin<"create_user_event", [ClkEvent]>;
   1420   def : Builtin<"is_valid_event", [Bool, ClkEvent]>;
   1421   def : Builtin<"set_user_event_status", [Void, ClkEvent, Int]>;
   1422   def : Builtin<"capture_event_profiling_info",
   1423       [Void, ClkEvent, ClkProfilingInfo, PointerType<Void, GlobalAS>]>;
   1424 
   1425   // --- Table 35 ---
   1426   def : Builtin<"get_default_queue", [Queue]>;
   1427 
   1428   def : Builtin<"ndrange_1D", [NDRange, Size]>;
   1429   def : Builtin<"ndrange_1D", [NDRange, Size, Size]>;
   1430   def : Builtin<"ndrange_1D", [NDRange, Size, Size, Size]>;
   1431   def : Builtin<"ndrange_2D", [NDRange, PointerType<ConstType<Size>, PrivateAS>]>;
   1432   def : Builtin<"ndrange_2D", [NDRange, PointerType<ConstType<Size>, PrivateAS>,
   1433                                         PointerType<ConstType<Size>, PrivateAS>]>;
   1434   def : Builtin<"ndrange_2D", [NDRange, PointerType<ConstType<Size>, PrivateAS>,
   1435                                         PointerType<ConstType<Size>, PrivateAS>,
   1436                                         PointerType<ConstType<Size>, PrivateAS>]>;
   1437   def : Builtin<"ndrange_3D", [NDRange, PointerType<ConstType<Size>, PrivateAS>]>;
   1438   def : Builtin<"ndrange_3D", [NDRange, PointerType<ConstType<Size>, PrivateAS>,
   1439                                         PointerType<ConstType<Size>, PrivateAS>]>;
   1440   def : Builtin<"ndrange_3D", [NDRange, PointerType<ConstType<Size>, PrivateAS>,
   1441                                         PointerType<ConstType<Size>, PrivateAS>,
   1442                                         PointerType<ConstType<Size>, PrivateAS>]>;
   1443 }
   1444 
   1445 
   1446 //--------------------------------------------------------------------
   1447 // End of the builtin functions defined in the OpenCL C specification.
   1448 // Builtin functions defined in the OpenCL C Extension are below.
   1449 //--------------------------------------------------------------------
   1450 
   1451 
   1452 // OpenCL Extension v2.0 s9.18 - Mipmaps
   1453 let Extension = FuncExtKhrMipmapImage in {
   1454   // Added to section 6.13.14.2.
   1455   foreach aQual = ["RO"] in {
   1456     foreach imgTy = [Image2d] in {
   1457       foreach name = ["read_imagef"] in {
   1458         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
   1459         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1460       }
   1461       foreach name = ["read_imagei"] in {
   1462         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
   1463         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1464       }
   1465       foreach name = ["read_imageui"] in {
   1466         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
   1467         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1468       }
   1469     }
   1470     foreach imgTy = [Image2dDepth] in {
   1471       foreach name = ["read_imagef"] in {
   1472         def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
   1473         def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1474       }
   1475     }
   1476     foreach imgTy = [Image1d] in {
   1477       foreach name = ["read_imagef"] in {
   1478         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>;
   1479         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>;
   1480       }
   1481       foreach name = ["read_imagei"] in {
   1482         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>;
   1483         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>;
   1484       }
   1485       foreach name = ["read_imageui"] in {
   1486         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>;
   1487         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>;
   1488       }
   1489     }
   1490     foreach imgTy = [Image3d] in {
   1491       foreach name = ["read_imagef"] in {
   1492         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>;
   1493         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
   1494       }
   1495       foreach name = ["read_imagei"] in {
   1496         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>;
   1497         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
   1498       }
   1499       foreach name = ["read_imageui"] in {
   1500         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>;
   1501         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
   1502       }
   1503     }
   1504     foreach imgTy = [Image1dArray] in {
   1505       foreach name = ["read_imagef"] in {
   1506         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
   1507         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>;
   1508       }
   1509       foreach name = ["read_imagei"] in {
   1510         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
   1511         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>;
   1512       }
   1513       foreach name = ["read_imageui"] in {
   1514         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
   1515         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>;
   1516       }
   1517     }
   1518     foreach imgTy = [Image2dArray] in {
   1519       foreach name = ["read_imagef"] in {
   1520         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
   1521         def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1522       }
   1523       foreach name = ["read_imagei"] in {
   1524         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
   1525         def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1526       }
   1527       foreach name = ["read_imageui"] in {
   1528         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
   1529         def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1530       }
   1531     }
   1532     foreach imgTy = [Image2dArrayDepth] in {
   1533       foreach name = ["read_imagef"] in {
   1534         def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
   1535         def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
   1536       }
   1537     }
   1538   }
   1539   // Added to section 6.13.14.5
   1540   foreach aQual = ["RO", "WO", "RW"] in {
   1541     foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in {
   1542       def : Builtin<"get_image_num_mip_levels", [Int, ImageType<imgTy, aQual>]>;
   1543     }
   1544   }
   1545 }
   1546 
   1547 // Write functions are enabled using a separate extension.
   1548 let Extension = FuncExtKhrMipmapImageWrites in {
   1549   // Added to section 6.13.14.4.
   1550   foreach aQual = ["WO"] in {
   1551     foreach imgTy = [Image2d] in {
   1552       def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Float, 4>]>;
   1553       def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Int, 4>]>;
   1554       def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<UInt, 4>]>;
   1555     }
   1556     def : Builtin<"write_imagef", [Void, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>, Int, Float]>;
   1557     foreach imgTy = [Image1d] in {
   1558       def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<Float, 4>]>;
   1559       def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<Int, 4>]>;
   1560       def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<UInt, 4>]>;
   1561     }
   1562     foreach imgTy = [Image1dArray] in {
   1563       def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Float, 4>]>;
   1564       def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Int, 4>]>;
   1565       def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<UInt, 4>]>;
   1566     }
   1567     foreach imgTy = [Image2dArray] in {
   1568       def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Float, 4>]>;
   1569       def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Int, 4>]>;
   1570       def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<UInt, 4>]>;
   1571     }
   1572     def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Int, Float]>;
   1573     let Extension = FuncExtKhrMipmapWritesAndWrite3d in {
   1574       foreach imgTy = [Image3d] in {
   1575         def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Float, 4>]>;
   1576         def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Int, 4>]>;
   1577         def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<UInt, 4>]>;
   1578       }
   1579     }
   1580   }
   1581 }
   1582 
   1583 //--------------------------------------------------------------------
   1584 // OpenCL Extension v2.0 s18.3 - Creating OpenCL Memory Objects from OpenGL MSAA Textures
   1585 let Extension = FuncExtKhrGlMsaaSharing in {
   1586   // --- Table 6.13.14.3 ---
   1587   foreach aQual = ["RO", "RW"] in {
   1588     foreach imgTy = [Image2dMsaa] in {
   1589       def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
   1590       def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
   1591       def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
   1592     }
   1593     foreach imgTy = [Image2dArrayMsaa] in {
   1594       def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
   1595       def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
   1596       def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
   1597     }
   1598     foreach name = ["read_imagef"] in {
   1599       def : Builtin<name, [Float, ImageType<Image2dMsaaDepth, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
   1600       def : Builtin<name, [Float, ImageType<Image2dArrayMsaaDepth, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
   1601     }
   1602   }
   1603 
   1604   // --- Table 6.13.14.5 ---
   1605   foreach aQual = ["RO", "WO", "RW"] in {
   1606     foreach imgTy = [Image2dMsaa, Image2dArrayMsaa, Image2dMsaaDepth, Image2dArrayMsaaDepth] in {
   1607       foreach name = ["get_image_width", "get_image_height",
   1608                       "get_image_channel_data_type", "get_image_channel_order",
   1609                       "get_image_num_samples"] in {
   1610         def : Builtin<name, [Int, ImageType<imgTy, aQual>], Attr.Const>;
   1611       }
   1612       def : Builtin<"get_image_dim", [VectorType<Int, 2>, ImageType<imgTy, aQual>], Attr.Const>;
   1613     }
   1614     foreach imgTy = [Image2dArrayMsaa, Image2dArrayMsaaDepth] in {
   1615       def : Builtin<"get_image_array_size", [Size, ImageType<imgTy, aQual>], Attr.Const>;
   1616     }
   1617   }
   1618 }
   1619 
   1620 //--------------------------------------------------------------------
   1621 // OpenCL Extension v2.0 s28 - Subgroups
   1622 // --- Table 28.2.1 ---
   1623 let Extension = FuncExtKhrSubgroups in {
   1624   foreach name = ["get_sub_group_size", "get_max_sub_group_size",
   1625                   "get_num_sub_groups", "get_sub_group_id",
   1626                   "get_sub_group_local_id"] in {
   1627     def : Builtin<name, [UInt]>;
   1628   }
   1629   let MinVersion = CL20 in {
   1630     foreach name = ["get_enqueued_num_sub_groups"] in {
   1631       def : Builtin<name, [UInt]>;
   1632     }
   1633   }
   1634 }
   1635 
   1636 // --- Table 28.2.2 ---
   1637 let Extension = FuncExtKhrSubgroups in {
   1638   def : Builtin<"sub_group_barrier", [Void, MemFenceFlags], Attr.Convergent>;
   1639   def : Builtin<"sub_group_barrier", [Void, MemFenceFlags, MemoryScope], Attr.Convergent>;
   1640 }
   1641 
   1642 // --- Table 28.2.4 ---
   1643 let Extension = FuncExtKhrSubgroups in {
   1644   foreach name = ["sub_group_all", "sub_group_any"] in {
   1645     def : Builtin<name, [Int, Int], Attr.Convergent>;
   1646   }
   1647   foreach name = ["sub_group_broadcast"] in {
   1648     def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, UInt], Attr.Convergent>;
   1649   }
   1650   foreach name = ["sub_group_reduce_", "sub_group_scan_exclusive_",
   1651                   "sub_group_scan_inclusive_"] in {
   1652     foreach op = ["add", "min", "max"] in {
   1653       def : Builtin<name # op, [IntLongFloatGenType1, IntLongFloatGenType1], Attr.Convergent>;
   1654     }
   1655   }
   1656 }
   1657 
   1658 // OpenCL Extension v3.0 s38 - Extended Subgroup Functions
   1659 
   1660 // Section 38.4.1 - cl_khr_subgroup_extended_types
   1661 let Extension = FuncExtKhrSubgroupExtendedTypes in {
   1662   // For sub_group_broadcast, add scalar char, uchar, short, and ushort support,
   1663   def : Builtin<"sub_group_broadcast", [CharShortGenType1, CharShortGenType1, UInt], Attr.Convergent>;
   1664   // gentype may additionally be one of the supported built-in vector data types.
   1665   def : Builtin<"sub_group_broadcast", [AGenTypeNNoScalar, AGenTypeNNoScalar, UInt], Attr.Convergent>;
   1666 
   1667   foreach name = ["sub_group_reduce_", "sub_group_scan_exclusive_",
   1668                   "sub_group_scan_inclusive_"] in {
   1669     foreach op = ["add", "min", "max"] in {
   1670       def : Builtin<name # op, [CharShortGenType1, CharShortGenType1], Attr.Convergent>;
   1671     }
   1672   }
   1673 }
   1674 
   1675 // Section 38.5.1 - cl_khr_subgroup_non_uniform_vote
   1676 let Extension = FuncExtKhrSubgroupNonUniformVote in {
   1677   def : Builtin<"sub_group_elect", [Int]>;
   1678   def : Builtin<"sub_group_non_uniform_all", [Int, Int]>;
   1679   def : Builtin<"sub_group_non_uniform_any", [Int, Int]>;
   1680   def : Builtin<"sub_group_non_uniform_all_equal", [Int, AGenType1]>;
   1681 }
   1682 
   1683 // Section 38.6.1 - cl_khr_subgroup_ballot
   1684 let Extension = FuncExtKhrSubgroupBallot in {
   1685   def : Builtin<"sub_group_non_uniform_broadcast", [AGenTypeN, AGenTypeN, UInt]>;
   1686   def : Builtin<"sub_group_broadcast_first", [AGenType1, AGenType1]>;
   1687   def : Builtin<"sub_group_ballot", [VectorType<UInt, 4>, Int]>;
   1688   def : Builtin<"sub_group_inverse_ballot", [Int, VectorType<UInt, 4>], Attr.Const>;
   1689   def : Builtin<"sub_group_ballot_bit_extract", [Int, VectorType<UInt, 4>, UInt], Attr.Const>;
   1690   def : Builtin<"sub_group_ballot_bit_count", [UInt, VectorType<UInt, 4>], Attr.Const>;
   1691   def : Builtin<"sub_group_ballot_inclusive_scan", [UInt, VectorType<UInt, 4>]>;
   1692   def : Builtin<"sub_group_ballot_exclusive_scan", [UInt, VectorType<UInt, 4>]>;
   1693   def : Builtin<"sub_group_ballot_find_lsb", [UInt, VectorType<UInt, 4>]>;
   1694   def : Builtin<"sub_group_ballot_find_msb", [UInt, VectorType<UInt, 4>]>;
   1695 
   1696   foreach op = ["eq", "ge", "gt", "le", "lt"] in {
   1697     def : Builtin<"get_sub_group_" # op # "_mask", [VectorType<UInt, 4>], Attr.Const>;
   1698   }
   1699 }
   1700 
   1701 // Section 38.7.1 - cl_khr_subgroup_non_uniform_arithmetic
   1702 let Extension = FuncExtKhrSubgroupNonUniformArithmetic in {
   1703   foreach name = ["reduce_", "scan_exclusive_", "scan_inclusive_"] in {
   1704     foreach op = ["add", "min", "max", "mul"] in {
   1705       def : Builtin<"sub_group_non_uniform_" # name # op, [AGenType1, AGenType1]>;
   1706     }
   1707     foreach op = ["and", "or", "xor"] in {
   1708       def : Builtin<"sub_group_non_uniform_" # name # op, [AIGenType1, AIGenType1]>;
   1709     }
   1710     foreach op = ["and", "or", "xor"] in {
   1711       def : Builtin<"sub_group_non_uniform_" # name # "logical_" # op, [Int, Int]>;
   1712     }
   1713   }
   1714 }
   1715 
   1716 // Section 38.8.1 - cl_khr_subgroup_shuffle
   1717 let Extension = FuncExtKhrSubgroupShuffle in {
   1718   def : Builtin<"sub_group_shuffle", [AGenType1, AGenType1, UInt]>;
   1719   def : Builtin<"sub_group_shuffle_xor", [AGenType1, AGenType1, UInt]>;
   1720 }
   1721 
   1722 // Section 38.9.1 - cl_khr_subgroup_shuffle_relative
   1723 let Extension = FuncExtKhrSubgroupShuffleRelative in {
   1724   def : Builtin<"sub_group_shuffle_up", [AGenType1, AGenType1, UInt]>;
   1725   def : Builtin<"sub_group_shuffle_down", [AGenType1, AGenType1, UInt]>;
   1726 }
   1727 
   1728 // Section 38.10.1 - cl_khr_subgroup_clustered_reduce
   1729 let Extension = FuncExtKhrSubgroupClusteredReduce in {
   1730   foreach op = ["add", "min", "max", "mul"] in {
   1731     def : Builtin<"sub_group_clustered_reduce_" # op, [AGenType1, AGenType1, UInt]>;
   1732   }
   1733   foreach op = ["and", "or", "xor"] in {
   1734     def : Builtin<"sub_group_clustered_reduce_" # op, [AIGenType1, AIGenType1, UInt]>;
   1735   }
   1736   foreach op = ["and", "or", "xor"] in {
   1737     def : Builtin<"sub_group_clustered_reduce_logical_" # op, [Int, Int, UInt]>;
   1738   }
   1739 }
   1740 
   1741 //--------------------------------------------------------------------
   1742 // Arm extensions.
   1743 let Extension = ArmIntegerDotProductInt8 in {
   1744   foreach name = ["arm_dot"] in {
   1745     def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>]>;
   1746     def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>]>;
   1747   }
   1748 }
   1749 let Extension = ArmIntegerDotProductAccumulateInt8 in {
   1750   foreach name = ["arm_dot_acc"] in {
   1751     def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>, UInt]>;
   1752     def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>, Int]>;
   1753   }
   1754 }
   1755 let Extension = ArmIntegerDotProductAccumulateInt16 in {
   1756   foreach name = ["arm_dot_acc"] in {
   1757     def : Builtin<name, [UInt, VectorType<UShort, 2>, VectorType<UShort, 2>, UInt]>;
   1758     def : Builtin<name, [Int, VectorType<Short, 2>, VectorType<Short, 2>, Int]>;
   1759   }
   1760 }
   1761 let Extension = ArmIntegerDotProductAccumulateSaturateInt8 in {
   1762   foreach name = ["arm_dot_acc_sat"] in {
   1763     def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>, UInt]>;
   1764     def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>, Int]>;
   1765   }
   1766 }
   1767