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 22class Version<int _Version> { 23 int ID = _Version; 24} 25def CLAll : Version< 0>; 26def CL10 : Version<100>; 27def CL11 : Version<110>; 28def CL12 : Version<120>; 29def CL20 : Version<200>; 30 31// Address spaces 32// Pointer types need to be assigned an address space. 33class AddressSpace<string _AS> { 34 string Name = _AS; 35} 36def DefaultAS : AddressSpace<"clang::LangAS::Default">; 37def PrivateAS : AddressSpace<"clang::LangAS::opencl_private">; 38def GlobalAS : AddressSpace<"clang::LangAS::opencl_global">; 39def ConstantAS : AddressSpace<"clang::LangAS::opencl_constant">; 40def LocalAS : AddressSpace<"clang::LangAS::opencl_local">; 41def GenericAS : AddressSpace<"clang::LangAS::opencl_generic">; 42 43// OpenCL language extension. 44class 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. 51class FunctionExtension<string _Ext> : AbstractExtension<_Ext>; 52 53// FunctionExtension definitions. 54def FuncExtNone : FunctionExtension<"">; 55def FuncExtKhrSubgroups : FunctionExtension<"cl_khr_subgroups">; 56def FuncExtKhrGlobalInt32BaseAtomics : FunctionExtension<"cl_khr_global_int32_base_atomics">; 57def FuncExtKhrGlobalInt32ExtendedAtomics : FunctionExtension<"cl_khr_global_int32_extended_atomics">; 58def FuncExtKhrLocalInt32BaseAtomics : FunctionExtension<"cl_khr_local_int32_base_atomics">; 59def FuncExtKhrLocalInt32ExtendedAtomics : FunctionExtension<"cl_khr_local_int32_extended_atomics">; 60def FuncExtKhrInt64BaseAtomics : FunctionExtension<"cl_khr_int64_base_atomics">; 61def FuncExtKhrInt64ExtendedAtomics : FunctionExtension<"cl_khr_int64_extended_atomics">; 62def FuncExtKhrMipmapImage : FunctionExtension<"cl_khr_mipmap_image">; 63def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sharing">; 64 65// Multiple extensions 66def FuncExtKhrMipmapAndWrite3d : FunctionExtension<"cl_khr_mipmap_image cl_khr_3d_image_writes">; 67 68// Qualified Type. These map to ASTContext::QualType. 69class QualType<string _Name, bit _IsAbstract=0> { 70 // Name of the field or function in a clang::ASTContext 71 // E.g. Name="IntTy" for the int type, and "getIntPtrType()" for an intptr_t 72 string Name = _Name; 73 // Some QualTypes in this file represent an abstract type for which there is 74 // no corresponding AST QualType, e.g. a GenType or an `image2d_t` type 75 // without access qualifiers. 76 bit IsAbstract = _IsAbstract; 77} 78 79// List of integers. 80class IntList<string _Name, list<int> _List> { 81 string Name = _Name; 82 list<int> List = _List; 83} 84 85//===----------------------------------------------------------------------===// 86// OpenCL C classes for types 87//===----------------------------------------------------------------------===// 88// OpenCL C basic data types (int, float, image2d_t, ...). 89// Its child classes can represent concrete types (e.g. VectorType) or 90// abstract types (e.g. GenType). 91class Type<string _Name, QualType _QTName> { 92 // Name of the Type. 93 string Name = _Name; 94 // QualType associated with this type. 95 QualType QTName = _QTName; 96 // Size of the vector (if applicable). 97 int VecWidth = 1; 98 // Is a pointer. 99 bit IsPointer = 0; 100 // "const" qualifier. 101 bit IsConst = 0; 102 // "volatile" qualifier. 103 bit IsVolatile = 0; 104 // Access qualifier. Must be one of ("RO", "WO", "RW"). 105 string AccessQualifier = ""; 106 // Address space. 107 string AddrSpace = DefaultAS.Name; 108} 109 110// OpenCL vector types (e.g. int2, int3, int16, float8, ...). 111class VectorType<Type _Ty, int _VecWidth> : Type<_Ty.Name, _Ty.QTName> { 112 let VecWidth = _VecWidth; 113 let AccessQualifier = ""; 114 // Inherited fields 115 let IsPointer = _Ty.IsPointer; 116 let IsConst = _Ty.IsConst; 117 let IsVolatile = _Ty.IsVolatile; 118 let AddrSpace = _Ty.AddrSpace; 119} 120 121// OpenCL pointer types (e.g. int*, float*, ...). 122class PointerType<Type _Ty, AddressSpace _AS = DefaultAS> : 123 Type<_Ty.Name, _Ty.QTName> { 124 let AddrSpace = _AS.Name; 125 // Inherited fields 126 let VecWidth = _Ty.VecWidth; 127 let IsPointer = 1; 128 let IsConst = _Ty.IsConst; 129 let IsVolatile = _Ty.IsVolatile; 130 let AccessQualifier = _Ty.AccessQualifier; 131} 132 133// OpenCL const types (e.g. const int). 134class ConstType<Type _Ty> : Type<_Ty.Name, _Ty.QTName> { 135 let IsConst = 1; 136 // Inherited fields 137 let VecWidth = _Ty.VecWidth; 138 let IsPointer = _Ty.IsPointer; 139 let IsVolatile = _Ty.IsVolatile; 140 let AccessQualifier = _Ty.AccessQualifier; 141 let AddrSpace = _Ty.AddrSpace; 142} 143 144// OpenCL volatile types (e.g. volatile int). 145class VolatileType<Type _Ty> : Type<_Ty.Name, _Ty.QTName> { 146 let IsVolatile = 1; 147 // Inherited fields 148 let VecWidth = _Ty.VecWidth; 149 let IsPointer = _Ty.IsPointer; 150 let IsConst = _Ty.IsConst; 151 let AccessQualifier = _Ty.AccessQualifier; 152 let AddrSpace = _Ty.AddrSpace; 153} 154 155// OpenCL image types (e.g. image2d). 156class ImageType<Type _Ty, string _AccessQualifier> : 157 Type<_Ty.Name, QualType<_Ty.QTName.Name#_AccessQualifier#"Ty", 0>> { 158 let VecWidth = 0; 159 let AccessQualifier = _AccessQualifier; 160 // Inherited fields 161 let IsPointer = _Ty.IsPointer; 162 let IsConst = _Ty.IsConst; 163 let IsVolatile = _Ty.IsVolatile; 164 let AddrSpace = _Ty.AddrSpace; 165} 166 167// List of Types. 168class TypeList<string _Name, list<Type> _Type> { 169 string Name = _Name; 170 list<Type> List = _Type; 171} 172 173// A GenericType is an abstract type that defines a set of types as a 174// combination of Types and vector sizes. 175// 176// For example, if TypeList = <int, float> and VectorList = <1, 2, 4>, then it 177// represents <int, int2, int4, float, float2, float4>. 178// 179// Some rules apply when using multiple GenericType arguments in a declaration: 180// 1. The number of vector sizes must be equal or 1 for all gentypes in a 181// declaration. 182// 2. The number of Types must be equal or 1 for all gentypes in a 183// declaration. 184// 3. Generic types are combined by iterating over all generic types at once. 185// For example, for the following GenericTypes 186// GenT1 = GenericType<half, [1, 2]> and 187// GenT2 = GenericType<float, int, [1, 2]> 188// A declaration f(GenT1, GenT2) results in the combinations 189// f(half, float), f(half2, float2), f(half, int), f(half2, int2) . 190// 4. "sgentype" from the OpenCL specification is supported by specifying 191// a single vector size. 192// For example, for the following GenericTypes 193// GenT = GenericType<half, int, [1, 2]> and 194// SGenT = GenericType<half, int, [1]> 195// A declaration f(GenT, SGenT) results in the combinations 196// f(half, half), f(half2, half), f(int, int), f(int2, int) . 197class GenericType<string _Ty, TypeList _TypeList, IntList _VectorList> : 198 Type<_Ty, QualType<"null", 1>> { 199 // Possible element types of the generic type. 200 TypeList TypeList = _TypeList; 201 // Possible vector sizes of the types in the TypeList. 202 IntList VectorList = _VectorList; 203 // The VecWidth field is ignored for GenericTypes. Use VectorList instead. 204 let VecWidth = 0; 205} 206 207// Builtin function attributes. 208def Attr { 209 list<bit> None = [0, 0, 0]; 210 list<bit> Pure = [1, 0, 0]; 211 list<bit> Const = [0, 1, 0]; 212 list<bit> Convergent = [0, 0, 1]; 213} 214 215//===----------------------------------------------------------------------===// 216// OpenCL C class for builtin functions 217//===----------------------------------------------------------------------===// 218class Builtin<string _Name, list<Type> _Signature, list<bit> _Attributes = Attr.None> { 219 // Name of the builtin function 220 string Name = _Name; 221 // List of types used by the function. The first one is the return type and 222 // the following are the arguments. The list must have at least one element 223 // (the return type). 224 list<Type> Signature = _Signature; 225 // Function attribute __attribute__((pure)) 226 bit IsPure = _Attributes[0]; 227 // Function attribute __attribute__((const)) 228 bit IsConst = _Attributes[1]; 229 // Function attribute __attribute__((convergent)) 230 bit IsConv = _Attributes[2]; 231 // OpenCL extensions to which the function belongs. 232 FunctionExtension Extension = FuncExtNone; 233 // Version of OpenCL from which the function is available (e.g.: CL10). 234 // MinVersion is inclusive. 235 Version MinVersion = CL10; 236 // Version of OpenCL from which the function is not supported anymore. 237 // MaxVersion is exclusive. 238 // CLAll makes the function available for all versions. 239 Version MaxVersion = CLAll; 240} 241 242//===----------------------------------------------------------------------===// 243// Definitions of OpenCL C types 244//===----------------------------------------------------------------------===// 245 246// OpenCL v1.0/1.2/2.0 s6.1.1: Built-in Scalar Data Types. 247def Bool : Type<"bool", QualType<"BoolTy">>; 248def Char : Type<"char", QualType<"CharTy">>; 249def UChar : Type<"uchar", QualType<"UnsignedCharTy">>; 250def Short : Type<"short", QualType<"ShortTy">>; 251def UShort : Type<"ushort", QualType<"UnsignedShortTy">>; 252def Int : Type<"int", QualType<"IntTy">>; 253def UInt : Type<"uint", QualType<"UnsignedIntTy">>; 254def Long : Type<"long", QualType<"LongTy">>; 255def ULong : Type<"ulong", QualType<"UnsignedLongTy">>; 256def Float : Type<"float", QualType<"FloatTy">>; 257def Double : Type<"double", QualType<"DoubleTy">>; 258def Half : Type<"half", QualType<"HalfTy">>; 259def Size : Type<"size_t", QualType<"getSizeType()">>; 260def PtrDiff : Type<"ptrdiff_t", QualType<"getPointerDiffType()">>; 261def IntPtr : Type<"intptr_t", QualType<"getIntPtrType()">>; 262def UIntPtr : Type<"uintPtr_t", QualType<"getUIntPtrType()">>; 263def Void : Type<"void_t", QualType<"VoidTy">>; 264 265// OpenCL v1.0/1.2/2.0 s6.1.2: Built-in Vector Data Types. 266// Built-in vector data types are created by TableGen's OpenCLBuiltinEmitter. 267 268// OpenCL v1.0/1.2/2.0 s6.1.3: Other Built-in Data Types. 269// The image definitions are "abstract". They should not be used without 270// specifying an access qualifier (RO/WO/RW). 271def Image1d : Type<"Image1d", QualType<"OCLImage1d", 1>>; 272def Image2d : Type<"Image2d", QualType<"OCLImage2d", 1>>; 273def Image3d : Type<"Image3d", QualType<"OCLImage3d", 1>>; 274def Image1dArray : Type<"Image1dArray", QualType<"OCLImage1dArray", 1>>; 275def Image1dBuffer : Type<"Image1dBuffer", QualType<"OCLImage1dBuffer", 1>>; 276def Image2dArray : Type<"Image2dArray", QualType<"OCLImage2dArray", 1>>; 277def Image2dDepth : Type<"Image2dDepth", QualType<"OCLImage2dDepth", 1>>; 278def Image2dArrayDepth : Type<"Image2dArrayDepth", QualType<"OCLImage2dArrayDepth", 1>>; 279def Image2dMsaa : Type<"Image2dMsaa", QualType<"OCLImage2dMSAA", 1>>; 280def Image2dArrayMsaa : Type<"Image2dArrayMsaa", QualType<"OCLImage2dArrayMSAA", 1>>; 281def Image2dMsaaDepth : Type<"Image2dMsaaDepth", QualType<"OCLImage2dMSAADepth", 1>>; 282def Image2dArrayMsaaDepth : Type<"Image2dArrayMsaaDepth", QualType<"OCLImage2dArrayMSAADepth", 1>>; 283 284def Sampler : Type<"Sampler", QualType<"OCLSamplerTy">>; 285def Event : Type<"Event", QualType<"OCLEventTy">>; 286 287//===----------------------------------------------------------------------===// 288// Definitions of OpenCL gentype variants 289//===----------------------------------------------------------------------===// 290// The OpenCL specification often uses "gentype" in builtin function 291// declarations to indicate that a builtin function is available with various 292// argument and return types. The types represented by "gentype" vary between 293// different parts of the specification. The following definitions capture 294// the different type lists for gentypes in different parts of the 295// specification. 296 297// Vector width lists. 298def VecAndScalar: IntList<"VecAndScalar", [1, 2, 3, 4, 8, 16]>; 299def VecNoScalar : IntList<"VecNoScalar", [2, 3, 4, 8, 16]>; 300def Vec1 : IntList<"Vec1", [1]>; 301def Vec2 : IntList<"Vec2", [2]>; 302def Vec4 : IntList<"Vec4", [4]>; 303def Vec8 : IntList<"Vec8", [8]>; 304def Vec16 : IntList<"Vec16", [16]>; 305def Vec1234 : IntList<"Vec1234", [1, 2, 3, 4]>; 306 307// Type lists. 308def TLAll : TypeList<"TLAll", [Char, UChar, Short, UShort, Int, UInt, Long, ULong, Float, Double, Half]>; 309def TLAllUnsigned : TypeList<"TLAllUnsigned", [UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong, UInt, ULong, UShort]>; 310def TLFloat : TypeList<"TLFloat", [Float, Double, Half]>; 311def TLSignedInts : TypeList<"TLSignedInts", [Char, Short, Int, Long]>; 312def TLUnsignedInts : TypeList<"TLUnsignedInts", [UChar, UShort, UInt, ULong]>; 313 314def TLIntLongFloats : TypeList<"TLIntLongFloats", [Int, UInt, Long, ULong, Float, Double, Half]>; 315 316// All unsigned integer types twice, to facilitate unsigned return types for e.g. 317// uchar abs(char) and 318// uchar abs(uchar). 319def TLAllUIntsTwice : TypeList<"TLAllUIntsTwice", [UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong]>; 320 321def TLAllInts : TypeList<"TLAllInts", [Char, UChar, Short, UShort, Int, UInt, Long, ULong]>; 322 323// GenType definitions for multiple base types (e.g. all floating point types, 324// or all integer types). 325// All types 326def AGenTypeN : GenericType<"AGenTypeN", TLAll, VecAndScalar>; 327def AGenTypeNNoScalar : GenericType<"AGenTypeNNoScalar", TLAll, VecNoScalar>; 328// All integer 329def AIGenType1 : GenericType<"AIGenType1", TLAllInts, Vec1>; 330def AIGenTypeN : GenericType<"AIGenTypeN", TLAllInts, VecAndScalar>; 331def AIGenTypeNNoScalar : GenericType<"AIGenTypeNNoScalar", TLAllInts, VecNoScalar>; 332// All integer to unsigned 333def AI2UGenTypeN : GenericType<"AI2UGenTypeN", TLAllUIntsTwice, VecAndScalar>; 334// Signed integer 335def SGenTypeN : GenericType<"SGenTypeN", TLSignedInts, VecAndScalar>; 336// Unsigned integer 337def UGenTypeN : GenericType<"UGenTypeN", TLUnsignedInts, VecAndScalar>; 338// Float 339def FGenTypeN : GenericType<"FGenTypeN", TLFloat, VecAndScalar>; 340// (u)int, (u)long, and all floats 341def IntLongFloatGenType1 : GenericType<"IntLongFloatGenType1", TLIntLongFloats, Vec1>; 342 343// GenType definitions for every single base type (e.g. fp32 only). 344// Names are like: GenTypeFloatVecAndScalar. 345foreach Type = [Char, UChar, Short, UShort, 346 Int, UInt, Long, ULong, 347 Float, Double, Half] in { 348 foreach VecSizes = [VecAndScalar, VecNoScalar] in { 349 def "GenType" # Type # VecSizes : 350 GenericType<"GenType" # Type # VecSizes, 351 TypeList<"GL" # Type.Name, [Type]>, 352 VecSizes>; 353 } 354} 355 356// GenType definitions for vec1234. 357foreach Type = [Float, Double, Half] in { 358 def "GenType" # Type # Vec1234 : 359 GenericType<"GenType" # Type # Vec1234, 360 TypeList<"GL" # Type.Name, [Type]>, 361 Vec1234>; 362} 363 364 365//===----------------------------------------------------------------------===// 366// Definitions of OpenCL builtin functions 367//===----------------------------------------------------------------------===// 368//-------------------------------------------------------------------- 369// OpenCL v1.1/1.2/2.0 s6.2.3 - Explicit conversions. 370// OpenCL v2.0 Extensions s5.1.1 and s6.1.1 - Conversions. 371 372// Generate the convert_* builtins functions. 373foreach RType = [Float, Double, Half, Char, UChar, Short, 374 UShort, Int, UInt, Long, ULong] in { 375 foreach IType = [Float, Double, Half, Char, UChar, Short, 376 UShort, Int, UInt, Long, ULong] in { 377 foreach sat = ["", "_sat"] in { 378 foreach rnd = ["", "_rte", "_rtn", "_rtp", "_rtz"] in { 379 def : Builtin<"convert_" # RType.Name # sat # rnd, [RType, IType], 380 Attr.Const>; 381 foreach v = [2, 3, 4, 8, 16] in { 382 def : Builtin<"convert_" # RType.Name # v # sat # rnd, 383 [VectorType<RType, v>, VectorType<IType, v>], 384 Attr.Const>; 385 } 386 } 387 } 388 } 389} 390 391//-------------------------------------------------------------------- 392// OpenCL v1.1 s6.11.1, v1.2 s6.12.1, v2.0 s6.13.1 - Work-item Functions 393// --- Table 7 --- 394def : Builtin<"get_work_dim", [UInt], Attr.Const>; 395foreach name = ["get_global_size", "get_global_id", "get_local_size", 396 "get_local_id", "get_num_groups", "get_group_id", 397 "get_global_offset"] in { 398 def : Builtin<name, [Size, UInt], Attr.Const>; 399} 400 401let MinVersion = CL20 in { 402 def : Builtin<"get_enqueued_local_size", [Size, UInt]>; 403 foreach name = ["get_global_linear_id", "get_local_linear_id"] in { 404 def : Builtin<name, [Size]>; 405 } 406} 407 408 409//-------------------------------------------------------------------- 410// OpenCL v1.1 s6.11.2, v1.2 s6.12.2, v2.0 s6.13.2 - Math functions 411// OpenCL Extension v2.0 s5.1.2 and s6.1.2 - Math Functions 412// --- Table 8 --- 413// --- 1 argument --- 414foreach name = ["acos", "acosh", "acospi", 415 "asin", "asinh", "asinpi", 416 "atan", "atanh", "atanpi", 417 "cbrt", "ceil", 418 "cos", "cosh", "cospi", 419 "erfc", "erf", 420 "exp", "exp2", "exp10", "expm1", 421 "fabs", "floor", 422 "log", "log2", "log10", "log1p", "logb", 423 "rint", "round", "rsqrt", 424 "sin", "sinh", "sinpi", 425 "sqrt", 426 "tan", "tanh", "tanpi", 427 "tgamma", "trunc", 428 "lgamma"] in { 429 def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>; 430} 431foreach name = ["nan"] in { 432 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>; 433 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeULongVecAndScalar], Attr.Const>; 434 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>; 435} 436 437// --- 2 arguments --- 438foreach name = ["atan2", "atan2pi", "copysign", "fdim", "fmod", "hypot", 439 "maxmag", "minmag", "nextafter", "pow", "powr", 440 "remainder"] in { 441 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; 442} 443foreach name = ["fmax", "fmin"] in { 444 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; 445 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>; 446 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>; 447 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>; 448} 449foreach name = ["ilogb"] in { 450 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>; 451 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeDoubleVecAndScalar], Attr.Const>; 452 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeHalfVecAndScalar], Attr.Const>; 453} 454foreach name = ["ldexp"] in { 455 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 456 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Int], Attr.Const>; 457 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 458 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Int], Attr.Const>; 459 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 460 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Int], Attr.Const>; 461} 462foreach name = ["pown", "rootn"] in { 463 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 464 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 465 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 466} 467 468// --- 3 arguments --- 469foreach name = ["fma", "mad"] in { 470 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; 471} 472 473// --- Version dependent --- 474let MaxVersion = CL20 in { 475 foreach AS = [GlobalAS, LocalAS, PrivateAS] in { 476 foreach name = ["fract", "modf", "sincos"] in { 477 def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, AS>]>; 478 } 479 foreach name = ["frexp", "lgamma_r"] in { 480 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in { 481 def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>; 482 } 483 } 484 foreach name = ["remquo"] in { 485 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in { 486 def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>; 487 } 488 } 489 } 490} 491let MinVersion = CL20 in { 492 foreach name = ["fract", "modf", "sincos"] in { 493 def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, GenericAS>]>; 494 } 495 foreach name = ["frexp", "lgamma_r"] in { 496 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in { 497 def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>; 498 } } 499 foreach name = ["remquo"] in { 500 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in { 501 def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>; 502 } 503 } 504} 505 506// --- Table 9 --- 507foreach name = ["half_cos", 508 "half_exp", "half_exp2", "half_exp10", 509 "half_log", "half_log2", "half_log10", 510 "half_recip", "half_rsqrt", 511 "half_sin", "half_sqrt", "half_tan", 512 "native_cos", 513 "native_exp", "native_exp2", "native_exp10", 514 "native_log", "native_log2", "native_log10", 515 "native_recip", "native_rsqrt", 516 "native_sin", "native_sqrt", "native_tan"] in { 517 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>; 518} 519foreach name = ["half_divide", "half_powr", 520 "native_divide", "native_powr"] in { 521 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>; 522} 523 524//-------------------------------------------------------------------- 525// OpenCL v1.1 s6.11.3, v1.2 s6.12.3, v2.0 s6.13.3 - Integer Functions 526// --- Table 10 --- 527// --- 1 argument --- 528foreach name = ["abs"] in { 529 def : Builtin<name, [AI2UGenTypeN, AIGenTypeN], Attr.Const>; 530} 531foreach name = ["clz", "popcount"] in { 532 def : Builtin<name, [AIGenTypeN, AIGenTypeN], Attr.Const>; 533} 534let MinVersion = CL20 in { 535 foreach name = ["ctz"] in { 536 def : Builtin<name, [AIGenTypeN, AIGenTypeN]>; 537 } 538} 539 540// --- 2 arguments --- 541foreach name = ["abs_diff"] in { 542 def : Builtin<name, [AI2UGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>; 543} 544foreach name = ["add_sat", "hadd", "rhadd", "mul_hi", "rotate", "sub_sat"] in { 545 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>; 546} 547foreach name = ["max", "min"] in { 548 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>; 549 def : Builtin<name, [AIGenTypeNNoScalar, AIGenTypeNNoScalar, AIGenType1], Attr.Const>; 550} 551foreach name = ["upsample"] in { 552 def : Builtin<name, [GenTypeShortVecAndScalar, GenTypeCharVecAndScalar, GenTypeUCharVecAndScalar], Attr.Const>; 553 def : Builtin<name, [GenTypeUShortVecAndScalar, GenTypeUCharVecAndScalar, GenTypeUCharVecAndScalar], Attr.Const>; 554 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeShortVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>; 555 def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUShortVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>; 556 def : Builtin<name, [GenTypeLongVecAndScalar, GenTypeIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>; 557 def : Builtin<name, [GenTypeULongVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>; 558} 559 560// --- 3 arguments --- 561foreach name = ["clamp"] in { 562 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>; 563 def : Builtin<name, [AIGenTypeNNoScalar, AIGenTypeNNoScalar, AIGenType1, AIGenType1], Attr.Const>; 564} 565foreach name = ["mad_hi", "mad_sat"] in { 566 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>; 567} 568 569// --- Table 11 --- 570foreach name = ["mad24"] in { 571 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 572 def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>; 573} 574foreach name = ["mul24"] in { 575 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 576 def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>; 577} 578 579//-------------------------------------------------------------------- 580// OpenCL v1.1 s6.11.4, v1.2 s6.12.4, v2.0 s6.13.4 - Common Functions 581// OpenCL Extension v2.0 s5.1.3 and s6.1.3 - Common Functions 582// --- Table 12 --- 583// --- 1 argument --- 584foreach name = ["degrees", "radians", "sign"] in { 585 def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>; 586} 587 588// --- 2 arguments --- 589foreach name = ["max", "min"] in { 590 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; 591 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>; 592 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>; 593 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>; 594} 595foreach name = ["step"] in { 596 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; 597 def : Builtin<name, [GenTypeFloatVecNoScalar, Float, GenTypeFloatVecNoScalar], Attr.Const>; 598 def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, GenTypeDoubleVecNoScalar], Attr.Const>; 599 def : Builtin<name, [GenTypeHalfVecNoScalar, Half, GenTypeHalfVecNoScalar], Attr.Const>; 600} 601 602// --- 3 arguments --- 603foreach name = ["clamp", "mix"] in { 604 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; 605 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float, Float], Attr.Const>; 606 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double, Double], Attr.Const>; 607 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half, Half], Attr.Const>; 608} 609foreach name = ["smoothstep"] in { 610 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>; 611 def : Builtin<name, [GenTypeFloatVecNoScalar, Float, Float, GenTypeFloatVecNoScalar], Attr.Const>; 612 def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, Double, GenTypeDoubleVecNoScalar], Attr.Const>; 613 def : Builtin<name, [GenTypeHalfVecNoScalar, Half, Half, GenTypeHalfVecNoScalar], Attr.Const>; 614} 615 616 617//-------------------------------------------------------------------- 618// OpenCL v1.1 s6.11.5, v1.2 s6.12.5, v2.0 s6.13.5 - Geometric Functions 619// OpenCL Extension v2.0 s5.1.4 and s6.1.4 - Geometric Functions 620// --- Table 13 --- 621// --- 1 argument --- 622foreach name = ["length"] in { 623 def : Builtin<name, [Float, GenTypeFloatVec1234], Attr.Const>; 624 def : Builtin<name, [Double, GenTypeDoubleVec1234], Attr.Const>; 625 def : Builtin<name, [Half, GenTypeHalfVec1234], Attr.Const>; 626} 627foreach name = ["normalize"] in { 628 def : Builtin<name, [GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>; 629 def : Builtin<name, [GenTypeDoubleVec1234, GenTypeDoubleVec1234], Attr.Const>; 630 def : Builtin<name, [GenTypeHalfVec1234, GenTypeHalfVec1234], Attr.Const>; 631} 632foreach name = ["fast_length"] in { 633 def : Builtin<name, [Float, GenTypeFloatVec1234], Attr.Const>; 634} 635foreach name = ["fast_normalize"] in { 636 def : Builtin<name, [GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>; 637} 638 639// --- 2 arguments --- 640foreach name = ["cross"] in { 641 foreach VSize = [3, 4] in { 642 def : Builtin<name, [VectorType<Float, VSize>, VectorType<Float, VSize>, VectorType<Float, VSize>], Attr.Const>; 643 def : Builtin<name, [VectorType<Double, VSize>, VectorType<Double, VSize>, VectorType<Double, VSize>], Attr.Const>; 644 def : Builtin<name, [VectorType<Half, VSize>, VectorType<Half, VSize>, VectorType<Half, VSize>], Attr.Const>; 645 } 646} 647foreach name = ["dot", "distance"] in { 648 def : Builtin<name, [Float, GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>; 649 def : Builtin<name, [Double, GenTypeDoubleVec1234, GenTypeDoubleVec1234], Attr.Const>; 650 def : Builtin<name, [Half, GenTypeHalfVec1234, GenTypeHalfVec1234], Attr.Const>; 651} 652foreach name = ["fast_distance"] in { 653 def : Builtin<name, [Float, GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>; 654} 655 656 657//-------------------------------------------------------------------- 658// OpenCL v1.1 s6.11.6, v1.2 s6.12.6, v2.0 s6.13.6 - Relational Functions 659// OpenCL Extension v2.0 s5.1.5 and s6.1.5 - Relational Functions 660// --- Table 14 --- 661// --- 1 argument --- 662foreach name = ["isfinite", "isinf", "isnan", "isnormal", "signbit"] in { 663 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>; 664 def : Builtin<name, [Int, Double], Attr.Const>; 665 def : Builtin<name, [GenTypeLongVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>; 666 def : Builtin<name, [Int, Half], Attr.Const>; 667 def : Builtin<name, [GenTypeShortVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>; 668} 669foreach name = ["any", "all"] in { 670 def : Builtin<name, [Int, AIGenTypeN], Attr.Const>; 671} 672 673// --- 2 arguments --- 674foreach name = ["isequal", "isnotequal", "isgreater", "isgreaterequal", 675 "isless", "islessequal", "islessgreater", "isordered", 676 "isunordered"] in { 677 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>; 678 def : Builtin<name, [Int, Double, Double], Attr.Const>; 679 def : Builtin<name, [GenTypeLongVecNoScalar, GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>; 680 def : Builtin<name, [Int, Half, Half], Attr.Const>; 681 def : Builtin<name, [GenTypeShortVecNoScalar, GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>; 682} 683 684// --- 3 arguments --- 685foreach name = ["bitselect"] in { 686 def : Builtin<name, [AGenTypeN, AGenTypeN, AGenTypeN, AGenTypeN], Attr.Const>; 687} 688foreach name = ["select"] in { 689 def : Builtin<name, [SGenTypeN, SGenTypeN, SGenTypeN, SGenTypeN], Attr.Const>; 690 def : Builtin<name, [SGenTypeN, SGenTypeN, SGenTypeN, UGenTypeN], Attr.Const>; 691 def : Builtin<name, [UGenTypeN, UGenTypeN, UGenTypeN, UGenTypeN], Attr.Const>; 692 def : Builtin<name, [UGenTypeN, UGenTypeN, UGenTypeN, SGenTypeN], Attr.Const>; 693 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>; 694 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>; 695 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeLongVecAndScalar], Attr.Const>; 696 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeULongVecAndScalar], Attr.Const>; 697 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeShortVecAndScalar], Attr.Const>; 698 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>; 699} 700 701 702//-------------------------------------------------------------------- 703// OpenCL v1.1 s6.11.7, v1.2 s6.12.7, v2.0 s6.13.7 - Vector Data Load and Store Functions 704// 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 705// --- Table 15 --- 706// Variants for OpenCL versions below 2.0, using pointers to the global, local 707// and private address spaces. 708let MaxVersion = CL20 in { 709 foreach AS = [GlobalAS, LocalAS, PrivateAS] in { 710 foreach VSize = [2, 3, 4, 8, 16] in { 711 foreach name = ["vload" # VSize] in { 712 def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, AS>]>; 713 def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, AS>]>; 714 def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, AS>]>; 715 def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, AS>]>; 716 def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, AS>]>; 717 def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, AS>]>; 718 def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, AS>]>; 719 def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, AS>]>; 720 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, AS>]>; 721 def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, AS>]>; 722 def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, AS>]>; 723 } 724 foreach name = ["vstore" # VSize] in { 725 def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, AS>]>; 726 def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, AS>]>; 727 def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, AS>]>; 728 def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, AS>]>; 729 def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, AS>]>; 730 def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, AS>]>; 731 def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, AS>]>; 732 def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, AS>]>; 733 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, AS>]>; 734 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, AS>]>; 735 def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, AS>]>; 736 } 737 foreach name = ["vloada_half" # VSize] in { 738 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; 739 } 740 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { 741 foreach name = ["vstorea_half" # VSize # rnd] in { 742 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; 743 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; 744 } 745 } 746 } 747 } 748} 749// Variants for OpenCL versions above 2.0, using pointers to the generic 750// address space. 751let MinVersion = CL20 in { 752 foreach VSize = [2, 3, 4, 8, 16] in { 753 foreach name = ["vload" # VSize] in { 754 def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, GenericAS>]>; 755 def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, GenericAS>]>; 756 def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, GenericAS>]>; 757 def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, GenericAS>]>; 758 def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, GenericAS>]>; 759 def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, GenericAS>]>; 760 def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, GenericAS>]>; 761 def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, GenericAS>]>; 762 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, GenericAS>]>; 763 def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, GenericAS>]>; 764 def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; 765 } 766 foreach name = ["vstore" # VSize] in { 767 def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, GenericAS>]>; 768 def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, GenericAS>]>; 769 def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, GenericAS>]>; 770 def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, GenericAS>]>; 771 def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, GenericAS>]>; 772 def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, GenericAS>]>; 773 def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, GenericAS>]>; 774 def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, GenericAS>]>; 775 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, GenericAS>]>; 776 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, GenericAS>]>; 777 def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; 778 } 779 foreach name = ["vloada_half" # VSize] in { 780 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>; 781 } 782 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { 783 foreach name = ["vstorea_half" # VSize # rnd] in { 784 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, GenericAS>]>; 785 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, GenericAS>]>; 786 } 787 } 788 } 789} 790// Variants using pointers to the constant address space. 791foreach VSize = [2, 3, 4, 8, 16] in { 792 foreach name = ["vload" # VSize] in { 793 def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, ConstantAS>]>; 794 def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, ConstantAS>]>; 795 def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, ConstantAS>]>; 796 def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, ConstantAS>]>; 797 def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, ConstantAS>]>; 798 def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, ConstantAS>]>; 799 def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, ConstantAS>]>; 800 def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, ConstantAS>]>; 801 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, ConstantAS>]>; 802 def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, ConstantAS>]>; 803 def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>; 804 } 805 foreach name = ["vloada_half" # VSize] in { 806 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>; 807 } 808 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { 809 foreach name = ["vstorea_half" # VSize # rnd] in { 810 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, ConstantAS>]>; 811 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, ConstantAS>]>; 812 } 813 } 814} 815let MaxVersion = CL20 in { 816 foreach AS = [GlobalAS, LocalAS, PrivateAS] in { 817 def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; 818 foreach VSize = [2, 3, 4, 8, 16] in { 819 foreach name = ["vload_half" # VSize] in { 820 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; 821 } 822 } 823 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { 824 def : Builtin<"vstore_half" # rnd, [Void, Float, Size, PointerType<Half, AS>]>; 825 def : Builtin<"vstore_half" # rnd, [Void, Double, Size, PointerType<Half, AS>]>; 826 foreach VSize = [2, 3, 4, 8, 16] in { 827 foreach name = ["vstore_half" # VSize # rnd] in { 828 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; 829 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; 830 } 831 } 832 } 833 } 834} 835let MinVersion = CL20 in { 836 foreach AS = [GenericAS] in { 837 def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; 838 foreach VSize = [2, 3, 4, 8, 16] in { 839 foreach name = ["vload_half" # VSize] in { 840 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; 841 } 842 } 843 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { 844 def : Builtin<"vstore_half" # rnd, [Void, Float, Size, PointerType<Half, AS>]>; 845 def : Builtin<"vstore_half" # rnd, [Void, Double, Size, PointerType<Half, AS>]>; 846 foreach VSize = [2, 3, 4, 8, 16] in { 847 foreach name = ["vstore_half" # VSize # rnd] in { 848 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>; 849 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>; 850 } 851 } 852 } 853 } 854} 855 856foreach AS = [ConstantAS] in { 857 def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>; 858 foreach VSize = [2, 3, 4, 8, 16] in { 859 foreach name = ["vload_half" # VSize] in { 860 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>; 861 } 862 } 863} 864 865//-------------------------------------------------------------------- 866// 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 867// OpenCL Extension v2.0 s5.1.7 and s6.1.7: Async Copies from Global to Local Memory, Local to Global Memory, and Prefetch 868// --- Table 18 --- 869foreach name = ["async_work_group_copy"] in { 870 def : Builtin<name, [Event, PointerType<AGenTypeN, LocalAS>, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size, Event]>; 871 def : Builtin<name, [Event, PointerType<AGenTypeN, GlobalAS>, PointerType<ConstType<AGenTypeN>, LocalAS>, Size, Event]>; 872} 873foreach name = ["async_work_group_strided_copy"] in { 874 def : Builtin<name, [Event, PointerType<AGenTypeN, LocalAS>, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size, Size, Event]>; 875 def : Builtin<name, [Event, PointerType<AGenTypeN, GlobalAS>, PointerType<ConstType<AGenTypeN>, LocalAS>, Size, Size, Event]>; 876} 877foreach name = ["wait_group_events"] in { 878 def : Builtin<name, [Void, Int, PointerType<Event, GenericAS>]>; 879} 880foreach name = ["prefetch"] in { 881 def : Builtin<name, [Void, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size]>; 882} 883 884//-------------------------------------------------------------------- 885// OpenCL v2.0 s6.13.11 - Atomics Functions. 886// Functions that use memory_order and cl_mem_fence_flags enums are not 887// declared here as the TableGen backend does not handle enums. 888 889// OpenCL v1.0 s9.5, s9.6, s9.7 - Atomic Functions for 32-bit integers 890// --- Table 9.1 --- 891let Extension = FuncExtKhrGlobalInt32BaseAtomics in { 892 foreach Type = [Int, UInt] in { 893 foreach name = ["atom_add", "atom_sub", "atom_xchg"] in { 894 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type]>; 895 } 896 foreach name = ["atom_inc", "atom_dec"] in { 897 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>]>; 898 } 899 foreach name = ["atom_cmpxchg"] in { 900 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type, Type]>; 901 } 902 } 903} 904// --- Table 9.3 --- 905let Extension = FuncExtKhrLocalInt32BaseAtomics in { 906 foreach Type = [Int, UInt] in { 907 foreach name = ["atom_add", "atom_sub", "atom_xchg"] in { 908 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type]>; 909 } 910 foreach name = ["atom_inc", "atom_dec"] in { 911 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>]>; 912 } 913 foreach name = ["atom_cmpxchg"] in { 914 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type, Type]>; 915 } 916 } 917} 918// --- Table 9.5 --- 919let Extension = FuncExtKhrInt64BaseAtomics in { 920 foreach AS = [GlobalAS, LocalAS] in { 921 foreach Type = [Long, ULong] in { 922 foreach name = ["atom_add", "atom_sub", "atom_xchg"] in { 923 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>; 924 } 925 foreach name = ["atom_inc", "atom_dec"] in { 926 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>]>; 927 } 928 foreach name = ["atom_cmpxchg"] in { 929 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type, Type]>; 930 } 931 } 932 } 933} 934// --- Table 9.2 --- 935let Extension = FuncExtKhrGlobalInt32ExtendedAtomics in { 936 foreach Type = [Int, UInt] in { 937 foreach name = ["atom_min", "atom_max", "atom_and", 938 "atom_or", "atom_xor"] in { 939 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type]>; 940 } 941 } 942} 943// --- Table 9.4 --- 944let Extension = FuncExtKhrLocalInt32ExtendedAtomics in { 945 foreach Type = [Int, UInt] in { 946 foreach name = ["atom_min", "atom_max", "atom_and", 947 "atom_or", "atom_xor"] in { 948 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type]>; 949 } 950 } 951} 952// --- Table 9.6 --- 953let Extension = FuncExtKhrInt64ExtendedAtomics in { 954 foreach AS = [GlobalAS, LocalAS] in { 955 foreach Type = [Long, ULong] in { 956 foreach name = ["atom_min", "atom_max", "atom_and", 957 "atom_or", "atom_xor"] in { 958 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>; 959 } 960 } 961 } 962} 963// OpenCL v1.1 s6.11.1, v1.2 s6.12.11 - Atomic Functions 964foreach AS = [GlobalAS, LocalAS] in { 965 foreach Type = [Int, UInt] in { 966 foreach name = ["atomic_add", "atomic_sub", "atomic_xchg", 967 "atomic_min", "atomic_max", "atomic_and", 968 "atomic_or", "atomic_xor"] in { 969 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>; 970 } 971 foreach name = ["atomic_inc", "atomic_dec"] in { 972 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>]>; 973 } 974 foreach name = ["atomic_cmpxchg"] in { 975 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type, Type]>; 976 } 977 } 978} 979 980//-------------------------------------------------------------------- 981// OpenCL v1.1 s6.11.12, v1.2 s6.12.12, v2.0 s6.13.12 - Miscellaneous Vector Functions 982// --- Table 19 --- 983foreach VSize1 = [Vec2, Vec4, Vec8, Vec16] in { 984 foreach VSize2 = [Vec2, Vec4, Vec8, Vec16] in { 985 def : Builtin<"shuffle", [GenericType<"TLAll" # VSize1.Name, TLAll, VSize1>, 986 GenericType<"TLAll" # VSize2.Name, TLAll, VSize2>, 987 GenericType<"TLAllUnsigned" # VSize1.Name, TLAllUnsigned, VSize1>], 988 Attr.Const>; 989 } 990} 991foreach VSize1 = [Vec2, Vec4, Vec8, Vec16] in { 992 foreach VSize2 = [Vec2, Vec4, Vec8, Vec16] in { 993 def : Builtin<"shuffle2", [GenericType<"TLAll" # VSize1.Name, TLAll, VSize1>, 994 GenericType<"TLAll" # VSize2.Name, TLAll, VSize2>, 995 GenericType<"TLAll" # VSize2.Name, TLAll, VSize2>, 996 GenericType<"TLAllUnsigned" # VSize1.Name, TLAllUnsigned, VSize1>], 997 Attr.Const>; 998 } 999} 1000 1001//-------------------------------------------------------------------- 1002// OpenCL v1.1 s6.11.3, v1.2 s6.12.14, v2.0 s6.13.14: Image Read and Write Functions 1003// OpenCL Extension v2.0 s5.1.8 and s6.1.8: Image Read and Write Functions 1004// --- Table 22: Image Read Functions with Samplers --- 1005foreach imgTy = [Image1d] in { 1006 foreach coordTy = [Int, Float] in { 1007 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>; 1008 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>; 1009 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>; 1010 } 1011} 1012foreach imgTy = [Image2d, Image1dArray] in { 1013 foreach coordTy = [Int, Float] in { 1014 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>; 1015 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>; 1016 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>; 1017 } 1018} 1019foreach imgTy = [Image3d, Image2dArray] in { 1020 foreach coordTy = [Int, Float] in { 1021 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>; 1022 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>; 1023 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>; 1024 } 1025} 1026foreach coordTy = [Int, Float] in { 1027 def : Builtin<"read_imagef", [Float, ImageType<Image2dDepth, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>; 1028 def : Builtin<"read_imagef", [Float, ImageType<Image2dArrayDepth, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>; 1029} 1030 1031// --- Table 23: Sampler-less Read Functions --- 1032foreach aQual = ["RO", "RW"] in { 1033 foreach imgTy = [Image2d, Image1dArray] in { 1034 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>; 1035 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>; 1036 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>; 1037 } 1038 foreach imgTy = [Image3d, Image2dArray] in { 1039 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>; 1040 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>; 1041 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>; 1042 } 1043 foreach imgTy = [Image1d, Image1dBuffer] in { 1044 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>; 1045 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>; 1046 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>; 1047 } 1048 def : Builtin<"read_imagef", [Float, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>], Attr.Pure>; 1049 def : Builtin<"read_imagef", [Float, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>], Attr.Pure>; 1050} 1051 1052// --- Table 24: Image Write Functions --- 1053foreach aQual = ["WO", "RW"] in { 1054 foreach imgTy = [Image2d] in { 1055 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Float, 4>]>; 1056 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Int, 4>]>; 1057 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<UInt, 4>]>; 1058 } 1059 foreach imgTy = [Image2dArray] in { 1060 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Float, 4>]>; 1061 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Int, 4>]>; 1062 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<UInt, 4>]>; 1063 } 1064 foreach imgTy = [Image1d, Image1dBuffer] in { 1065 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, Int, VectorType<Float, 4>]>; 1066 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, Int, VectorType<Int, 4>]>; 1067 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, Int, VectorType<UInt, 4>]>; 1068 } 1069 foreach imgTy = [Image1dArray] in { 1070 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Float, 4>]>; 1071 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Int, 4>]>; 1072 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<UInt, 4>]>; 1073 } 1074 foreach imgTy = [Image3d] in { 1075 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Float, 4>]>; 1076 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Int, 4>]>; 1077 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<UInt, 4>]>; 1078 } 1079 def : Builtin<"write_imagef", [Void, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>, Float]>; 1080 def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Float]>; 1081} 1082 1083// --- Table 25: Image Query Functions --- 1084foreach aQual = ["RO", "WO", "RW"] in { 1085 foreach imgTy = [Image1d, Image1dBuffer, Image2d, Image3d, 1086 Image1dArray, Image2dArray, Image2dDepth, 1087 Image2dArrayDepth] in { 1088 foreach name = ["get_image_width", "get_image_channel_data_type", 1089 "get_image_channel_order"] in { 1090 def : Builtin<name, [Int, ImageType<imgTy, aQual>]>; 1091 } 1092 } 1093 foreach imgTy = [Image2d, Image3d, Image2dArray, Image2dDepth, 1094 Image2dArrayDepth] in { 1095 def : Builtin<"get_image_height", [Int, ImageType<imgTy, aQual>]>; 1096 } 1097 def : Builtin<"get_image_depth", [Int, ImageType<Image3d, aQual>]>; 1098 foreach imgTy = [Image2d, Image2dArray, Image2dDepth, 1099 Image2dArrayDepth] in { 1100 def : Builtin<"get_image_dim", [VectorType<Int, 2>, ImageType<imgTy, aQual>]>; 1101 } 1102 def : Builtin<"get_image_dim", [VectorType<Int, 4>, ImageType<Image3d, aQual>]>; 1103 foreach imgTy = [Image1dArray, Image2dArray, Image2dArrayDepth] in { 1104 def : Builtin<"get_image_array_size", [Size, ImageType<imgTy, aQual>]>; 1105 } 1106} 1107 1108// OpenCL extension v2.0 s5.1.9: Built-in Image Read Functions 1109// --- Table 8 --- 1110foreach aQual = ["RO"] in { 1111 foreach name = ["read_imageh"] in { 1112 foreach coordTy = [Int, Float] in { 1113 foreach imgTy = [Image2d, Image1dArray] in { 1114 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 2>], Attr.Pure>; 1115 } 1116 foreach imgTy = [Image3d, Image2dArray] in { 1117 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 4>], Attr.Pure>; 1118 } 1119 foreach imgTy = [Image1d] in { 1120 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, coordTy], Attr.Pure>; 1121 } 1122 } 1123 } 1124} 1125// OpenCL extension v2.0 s5.1.10: Built-in Image Sampler-less Read Functions 1126// --- Table 9 --- 1127foreach aQual = ["RO", "RW"] in { 1128 foreach name = ["read_imageh"] in { 1129 foreach imgTy = [Image2d, Image1dArray] in { 1130 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>; 1131 } 1132 foreach imgTy = [Image3d, Image2dArray] in { 1133 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>; 1134 } 1135 foreach imgTy = [Image1d, Image1dBuffer] in { 1136 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>; 1137 } 1138 } 1139} 1140// OpenCL extension v2.0 s5.1.11: Built-in Image Write Functions 1141// --- Table 10 --- 1142foreach aQual = ["WO", "RW"] in { 1143 foreach name = ["write_imageh"] in { 1144 def : Builtin<name, [Void, ImageType<Image2d, aQual>, VectorType<Int, 2>, VectorType<Half, 4>]>; 1145 def : Builtin<name, [Void, ImageType<Image2dArray, aQual>, VectorType<Int, 4>, VectorType<Half, 4>]>; 1146 def : Builtin<name, [Void, ImageType<Image1d, aQual>, Int, VectorType<Half, 4>]>; 1147 def : Builtin<name, [Void, ImageType<Image1dBuffer, aQual>, Int, VectorType<Half, 4>]>; 1148 def : Builtin<name, [Void, ImageType<Image1dArray, aQual>, VectorType<Int, 2>, VectorType<Half, 4>]>; 1149 def : Builtin<name, [Void, ImageType<Image3d, aQual>, VectorType<Int, 4>, VectorType<Half, 4>]>; 1150 } 1151} 1152 1153 1154//-------------------------------------------------------------------- 1155// OpenCL v2.0 s6.13.15 - Work-group Functions 1156// --- Table 26 --- 1157let MinVersion = CL20 in { 1158 foreach name = ["work_group_all", "work_group_any"] in { 1159 def : Builtin<name, [Int, Int], Attr.Convergent>; 1160 } 1161 foreach name = ["work_group_broadcast"] in { 1162 def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size], Attr.Convergent>; 1163 def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size, Size], Attr.Convergent>; 1164 def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size, Size, Size], Attr.Convergent>; 1165 } 1166 foreach op = ["add", "min", "max"] in { 1167 foreach name = ["work_group_reduce_", "work_group_scan_exclusive_", 1168 "work_group_scan_inclusive_"] in { 1169 def : Builtin<name # op, [IntLongFloatGenType1, IntLongFloatGenType1], Attr.Convergent>; 1170 } 1171 } 1172} 1173 1174 1175// OpenCL v2.0 s9.17.3: Additions to section 6.13.1: Work-Item Functions 1176let MinVersion = CL20 in { 1177 let Extension = FuncExtKhrSubgroups in { 1178 def get_sub_group_size : Builtin<"get_sub_group_size", [UInt]>; 1179 def get_max_sub_group_size : Builtin<"get_max_sub_group_size", [UInt]>; 1180 def get_num_sub_groups : Builtin<"get_num_sub_groups", [UInt]>; 1181 } 1182} 1183 1184//-------------------------------------------------------------------- 1185// End of the builtin functions defined in the OpenCL C specification. 1186// Builtin functions defined in the OpenCL C Extension are below. 1187//-------------------------------------------------------------------- 1188 1189 1190// OpenCL Extension v2.0 s9.18 - Mipmaps 1191let Extension = FuncExtKhrMipmapImage in { 1192 // Added to section 6.13.14.2. 1193 foreach aQual = ["RO"] in { 1194 foreach imgTy = [Image2d] in { 1195 foreach name = ["read_imagef"] in { 1196 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>; 1197 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1198 } 1199 foreach name = ["read_imagei"] in { 1200 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>; 1201 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1202 } 1203 foreach name = ["read_imageui"] in { 1204 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>; 1205 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1206 } 1207 } 1208 foreach imgTy = [Image2dDepth] in { 1209 foreach name = ["read_imagef"] in { 1210 def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>; 1211 def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1212 } 1213 } 1214 foreach imgTy = [Image1d] in { 1215 foreach name = ["read_imagef"] in { 1216 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>; 1217 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>; 1218 } 1219 foreach name = ["read_imagei"] in { 1220 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>; 1221 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>; 1222 } 1223 foreach name = ["read_imageui"] in { 1224 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>; 1225 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>; 1226 } 1227 } 1228 foreach imgTy = [Image3d] in { 1229 foreach name = ["read_imagef"] in { 1230 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>; 1231 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>; 1232 } 1233 foreach name = ["read_imagei"] in { 1234 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>; 1235 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>; 1236 } 1237 foreach name = ["read_imageui"] in { 1238 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>; 1239 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>; 1240 } 1241 } 1242 foreach imgTy = [Image1dArray] in { 1243 foreach name = ["read_imagef"] in { 1244 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>; 1245 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>; 1246 } 1247 foreach name = ["read_imagei"] in { 1248 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>; 1249 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>; 1250 } 1251 foreach name = ["read_imageui"] in { 1252 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>; 1253 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>; 1254 } 1255 } 1256 foreach imgTy = [Image2dArray] in { 1257 foreach name = ["read_imagef"] in { 1258 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>; 1259 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1260 } 1261 foreach name = ["read_imagei"] in { 1262 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>; 1263 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1264 } 1265 foreach name = ["read_imageui"] in { 1266 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>; 1267 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1268 } 1269 } 1270 foreach imgTy = [Image2dArrayDepth] in { 1271 foreach name = ["read_imagef"] in { 1272 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>; 1273 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>; 1274 } 1275 } 1276 } 1277 // Added to section 6.13.14.4. 1278 foreach aQual = ["WO"] in { 1279 foreach imgTy = [Image2d] in { 1280 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Float, 4>]>; 1281 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Int, 4>]>; 1282 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<UInt, 4>]>; 1283 } 1284 def : Builtin<"write_imagef", [Void, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>, Int, Float]>; 1285 foreach imgTy = [Image1d] in { 1286 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<Float, 4>]>; 1287 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<Int, 4>]>; 1288 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<UInt, 4>]>; 1289 } 1290 foreach imgTy = [Image1dArray] in { 1291 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Float, 4>]>; 1292 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Int, 4>]>; 1293 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<UInt, 4>]>; 1294 } 1295 foreach imgTy = [Image2dArray] in { 1296 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Float, 4>]>; 1297 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Int, 4>]>; 1298 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<UInt, 4>]>; 1299 } 1300 def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Int, Float]>; 1301 let Extension = FuncExtKhrMipmapAndWrite3d in { 1302 foreach imgTy = [Image3d] in { 1303 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Float, 4>]>; 1304 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Int, 4>]>; 1305 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<UInt, 4>]>; 1306 } 1307 } 1308 } 1309 // Added to section 6.13.14.5 1310 foreach aQual = ["RO", "WO", "RW"] in { 1311 foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in { 1312 def : Builtin<"get_image_num_mip_levels", [Int, ImageType<imgTy, aQual>]>; 1313 } 1314 } 1315} 1316 1317 1318//-------------------------------------------------------------------- 1319// OpenCL Extension v2.0 s18.3 - Creating OpenCL Memory Objects from OpenGL MSAA Textures 1320let Extension = FuncExtKhrGlMsaaSharing in { 1321 // --- Table 6.13.14.3 --- 1322 foreach aQual = ["RO", "RW"] in { 1323 foreach imgTy = [Image2dMsaa] in { 1324 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>; 1325 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>; 1326 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>; 1327 } 1328 foreach imgTy = [Image2dArrayMsaa] in { 1329 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>; 1330 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>; 1331 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>; 1332 } 1333 foreach name = ["read_imagef"] in { 1334 def : Builtin<name, [Float, ImageType<Image2dMsaaDepth, aQual>, VectorType<Int, 2>, Int], Attr.Pure>; 1335 def : Builtin<name, [Float, ImageType<Image2dArrayMsaaDepth, aQual>, VectorType<Int, 4>, Int], Attr.Pure>; 1336 } 1337 } 1338 1339 // --- Table 6.13.14.5 --- 1340 foreach aQual = ["RO", "WO", "RW"] in { 1341 foreach imgTy = [Image2dMsaa, Image2dArrayMsaa, Image2dMsaaDepth, Image2dArrayMsaaDepth] in { 1342 foreach name = ["get_image_width", "get_image_height", 1343 "get_image_channel_data_type", "get_image_channel_order", 1344 "get_image_num_samples"] in { 1345 def : Builtin<name, [Int, ImageType<imgTy, aQual>], Attr.Const>; 1346 } 1347 def : Builtin<"get_image_dim", [VectorType<Int, 2>, ImageType<imgTy, aQual>], Attr.Const>; 1348 } 1349 def : Builtin<"get_image_array_size", [Size, ImageType<Image2dArrayMsaaDepth, aQual>], Attr.Const>; 1350 } 1351} 1352