blob: 9d6bb411eff8064b214ffa2768e54038ca57767e [file] [log] [blame]
Sven van Haastregt79a222f2019-06-03 09:39:11 +00001//==--- 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> {
Sven van Haastregted69faa2019-09-19 13:41:51 +000023 int ID = _Version;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000024}
Sven van Haastregted69faa2019-09-19 13:41:51 +000025def CLAll : Version< 0>;
26def CL10 : Version<100>;
27def CL11 : Version<110>;
28def CL12 : Version<120>;
29def CL20 : Version<200>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000030
31// Address spaces
32// Pointer types need to be assigned an address space.
33class AddressSpace<string _AS> {
Sven van Haastregt89fb9e82019-07-29 14:55:29 +000034 string Name = _AS;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000035}
Sven van Haastregt89fb9e82019-07-29 14:55:29 +000036def 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">;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000042
Sven van Haastregt308b8b72019-12-18 10:13:51 +000043// 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">;
Sven van Haastregtb7145832019-12-23 12:29:01 +000058def 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">;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +000062def FuncExtKhrMipmapImage : FunctionExtension<"cl_khr_mipmap_image">;
Sven van Haastregt92451f02020-01-14 14:46:42 +000063def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sharing">;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +000064
65// Multiple extensions
66def FuncExtKhrMipmapAndWrite3d : FunctionExtension<"cl_khr_mipmap_image cl_khr_3d_image_writes">;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000067
Sven van Haastregtb21a3652019-08-19 11:56:03 +000068// Qualified Type. These map to ASTContext::QualType.
69class QualType<string _Name, bit _IsAbstract=0> {
Sven van Haastregt79a222f2019-06-03 09:39:11 +000070 // 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;
Sven van Haastregtb21a3652019-08-19 11:56:03 +000073 // 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;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000077}
78
Sven van Haastregtb21a3652019-08-19 11:56:03 +000079// List of integers.
80class IntList<string _Name, list<int> _List> {
81 string Name = _Name;
82 list<int> List = _List;
83}
84
Sven van Haastregt79a222f2019-06-03 09:39:11 +000085//===----------------------------------------------------------------------===//
86// OpenCL C classes for types
87//===----------------------------------------------------------------------===//
Sven van Haastregtb21a3652019-08-19 11:56:03 +000088// OpenCL C basic data types (int, float, image2d_t, ...).
Sven van Haastregt47e95ff2019-09-17 13:32:56 +000089// Its child classes can represent concrete types (e.g. VectorType) or
90// abstract types (e.g. GenType).
Sven van Haastregt79a222f2019-06-03 09:39:11 +000091class Type<string _Name, QualType _QTName> {
Sven van Haastregtb21a3652019-08-19 11:56:03 +000092 // Name of the Type.
Sven van Haastregt79a222f2019-06-03 09:39:11 +000093 string Name = _Name;
Sven van Haastregtb21a3652019-08-19 11:56:03 +000094 // QualType associated with this type.
Sven van Haastregt79a222f2019-06-03 09:39:11 +000095 QualType QTName = _QTName;
Sven van Haastregtb21a3652019-08-19 11:56:03 +000096 // Size of the vector (if applicable).
97 int VecWidth = 1;
98 // Is a pointer.
Sven van Haastregt79a222f2019-06-03 09:39:11 +000099 bit IsPointer = 0;
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000100 // "const" qualifier.
101 bit IsConst = 0;
102 // "volatile" qualifier.
103 bit IsVolatile = 0;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000104 // Access qualifier. Must be one of ("RO", "WO", "RW").
105 string AccessQualifier = "";
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000106 // Address space.
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000107 string AddrSpace = DefaultAS.Name;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000108}
109
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000110// OpenCL vector types (e.g. int2, int3, int16, float8, ...).
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000111class VectorType<Type _Ty, int _VecWidth> : Type<_Ty.Name, _Ty.QTName> {
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000112 let VecWidth = _VecWidth;
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000113 let AccessQualifier = "";
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000114 // Inherited fields
115 let IsPointer = _Ty.IsPointer;
116 let IsConst = _Ty.IsConst;
117 let IsVolatile = _Ty.IsVolatile;
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000118 let AddrSpace = _Ty.AddrSpace;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000119}
120
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000121// OpenCL pointer types (e.g. int*, float*, ...).
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000122class PointerType<Type _Ty, AddressSpace _AS = DefaultAS> :
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000123 Type<_Ty.Name, _Ty.QTName> {
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000124 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;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000153}
154
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000155// 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;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000159 let AccessQualifier = _AccessQualifier;
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000160 // Inherited fields
161 let IsPointer = _Ty.IsPointer;
162 let IsConst = _Ty.IsConst;
163 let IsVolatile = _Ty.IsVolatile;
164 let AddrSpace = _Ty.AddrSpace;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000165}
166
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000167// 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//
Sven van Haastregt47e95ff2019-09-17 13:32:56 +0000176// For example, if TypeList = <int, float> and VectorList = <1, 2, 4>, then it
177// represents <int, int2, int4, float, float2, float4>.
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000178//
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
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000207// 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
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000215//===----------------------------------------------------------------------===//
216// OpenCL C class for builtin functions
217//===----------------------------------------------------------------------===//
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000218class Builtin<string _Name, list<Type> _Signature, list<bit> _Attributes = Attr.None> {
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000219 // 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;
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000225 // 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];
Sven van Haastregt308b8b72019-12-18 10:13:51 +0000231 // OpenCL extensions to which the function belongs.
232 FunctionExtension Extension = FuncExtNone;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000233 // 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;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000240}
241
242//===----------------------------------------------------------------------===//
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000243// Definitions of OpenCL C types
244//===----------------------------------------------------------------------===//
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000245
246// OpenCL v1.0/1.2/2.0 s6.1.1: Built-in Scalar Data Types.
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000247def 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">>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000264
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000265// 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.
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000267
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000268// 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>>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000283
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000284def Sampler : Type<"Sampler", QualType<"OCLSamplerTy">>;
285def Event : Type<"Event", QualType<"OCLEventTy">>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000286
287//===----------------------------------------------------------------------===//
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000288// 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]>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000301def Vec2 : IntList<"Vec2", [2]>;
302def Vec4 : IntList<"Vec4", [4]>;
303def Vec8 : IntList<"Vec8", [8]>;
304def Vec16 : IntList<"Vec16", [16]>;
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000305def Vec1234 : IntList<"Vec1234", [1, 2, 3, 4]>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000306
307// Type lists.
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000308def 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]>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000310def TLFloat : TypeList<"TLFloat", [Float, Double, Half]>;
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000311def TLSignedInts : TypeList<"TLSignedInts", [Char, Short, Int, Long]>;
312def TLUnsignedInts : TypeList<"TLUnsignedInts", [UChar, UShort, UInt, ULong]>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000313
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000314def TLIntLongFloats : TypeList<"TLIntLongFloats", [Int, UInt, Long, ULong, Float, Double, Half]>;
315
Sven van Haastregt0e70c352019-11-06 11:53:19 +0000316// 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
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000321def 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).
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000325// All types
326def AGenTypeN : GenericType<"AGenTypeN", TLAll, VecAndScalar>;
327def AGenTypeNNoScalar : GenericType<"AGenTypeNNoScalar", TLAll, VecNoScalar>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000328// All integer
329def AIGenType1 : GenericType<"AIGenType1", TLAllInts, Vec1>;
330def AIGenTypeN : GenericType<"AIGenTypeN", TLAllInts, VecAndScalar>;
331def AIGenTypeNNoScalar : GenericType<"AIGenTypeNNoScalar", TLAllInts, VecNoScalar>;
Sven van Haastregt0e70c352019-11-06 11:53:19 +0000332// All integer to unsigned
333def AI2UGenTypeN : GenericType<"AI2UGenTypeN", TLAllUIntsTwice, VecAndScalar>;
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000334// Signed integer
335def SGenTypeN : GenericType<"SGenTypeN", TLSignedInts, VecAndScalar>;
336// Unsigned integer
337def UGenTypeN : GenericType<"UGenTypeN", TLUnsignedInts, VecAndScalar>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000338// Float
339def FGenTypeN : GenericType<"FGenTypeN", TLFloat, VecAndScalar>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000340// (u)int, (u)long, and all floats
341def IntLongFloatGenType1 : GenericType<"IntLongFloatGenType1", TLIntLongFloats, Vec1>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000342
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
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000356// 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
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000364
365//===----------------------------------------------------------------------===//
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000366// Definitions of OpenCL builtin functions
367//===----------------------------------------------------------------------===//
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000368//--------------------------------------------------------------------
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 {
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000377 foreach sat = ["", "_sat"] in {
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000378 foreach rnd = ["", "_rte", "_rtn", "_rtp", "_rtz"] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000379 def : Builtin<"convert_" # RType.Name # sat # rnd, [RType, IType],
380 Attr.Const>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000381 foreach v = [2, 3, 4, 8, 16] in {
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000382 def : Builtin<"convert_" # RType.Name # v # sat # rnd,
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000383 [VectorType<RType, v>, VectorType<IType, v>],
384 Attr.Const>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000385 }
386 }
387 }
388 }
389}
390
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000391//--------------------------------------------------------------------
Sven van Haastregted69faa2019-09-19 13:41:51 +0000392// OpenCL v1.1 s6.11.1, v1.2 s6.12.1, v2.0 s6.13.1 - Work-item Functions
393// --- Table 7 ---
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000394def : Builtin<"get_work_dim", [UInt], Attr.Const>;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000395foreach 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 {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000398 def : Builtin<name, [Size, UInt], Attr.Const>;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000399}
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
Sven van Haastregt6fc73f62019-11-05 19:47:21 +0000408
Sven van Haastregted69faa2019-09-19 13:41:51 +0000409//--------------------------------------------------------------------
Sven van Haastregt6fc73f62019-11-05 19:47:21 +0000410// 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//--------------------------------------------------------------------
Sven van Haastregt0e70c352019-11-06 11:53:19 +0000525// 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//--------------------------------------------------------------------
Sven van Haastregt6fc73f62019-11-05 19:47:21 +0000580// 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
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000617//--------------------------------------------------------------------
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
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000702//--------------------------------------------------------------------
Sven van Haastregted69faa2019-09-19 13:41:51 +0000703// OpenCL v1.1 s6.11.7, v1.2 s6.12.7, v2.0 s6.13.7 - Vector Data Load and Store Functions
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000704// 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
Sven van Haastregted69faa2019-09-19 13:41:51 +0000705// --- 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}
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000815let 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}
Sven van Haastregted69faa2019-09-19 13:41:51 +0000864
865//--------------------------------------------------------------------
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000866// 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
Sven van Haastregt308b8b72019-12-18 10:13:51 +0000889// OpenCL v1.0 s9.5, s9.6, s9.7 - Atomic Functions for 32-bit integers
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000890// --- Table 9.1 ---
Sven van Haastregt308b8b72019-12-18 10:13:51 +0000891let 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 }
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000902 }
903}
Sven van Haastregtb7145832019-12-23 12:29:01 +0000904// --- 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}
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000979
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000980//--------------------------------------------------------------------
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000981// OpenCL v1.1 s6.11.12, v1.2 s6.12.12, v2.0 s6.13.12 - Miscellaneous Vector Functions
982// --- Table 19 ---
Sven van Haastregtff429c52019-12-31 15:30:02 +0000983foreach 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>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000989 }
990}
Sven van Haastregtff429c52019-12-31 15:30:02 +0000991foreach 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>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000998 }
999}
1000
1001//--------------------------------------------------------------------
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001002// 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 {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001007 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001010 }
1011}
1012foreach imgTy = [Image2d, Image1dArray] in {
1013 foreach coordTy = [Int, Float] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001014 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001017 }
1018}
1019foreach imgTy = [Image3d, Image2dArray] in {
1020 foreach coordTy = [Int, Float] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001021 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001024 }
1025}
1026foreach coordTy = [Int, Float] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001027 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001029}
1030
1031// --- Table 23: Sampler-less Read Functions ---
1032foreach aQual = ["RO", "RW"] in {
1033 foreach imgTy = [Image2d, Image1dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001034 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001037 }
1038 foreach imgTy = [Image3d, Image2dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001039 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001042 }
1043 foreach imgTy = [Image1d, Image1dBuffer] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001044 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001047 }
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001048 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>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001050}
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
Sven van Haastregt2a69ed02019-09-25 09:12:59 +00001083// --- 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
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001108// 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 {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001114 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001115 }
1116 foreach imgTy = [Image3d, Image2dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001117 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001118 }
1119 foreach imgTy = [Image1d] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001120 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, coordTy], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001121 }
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 {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001130 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001131 }
1132 foreach imgTy = [Image3d, Image2dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001133 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001134 }
1135 foreach imgTy = [Image1d, Image1dBuffer] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001136 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001137 }
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}
Sven van Haastregt79a222f2019-06-03 09:39:11 +00001152
1153
Sven van Haastregte54c83e2019-11-26 10:44:49 +00001154//--------------------------------------------------------------------
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
Sven van Haastregt79a222f2019-06-03 09:39:11 +00001175// OpenCL v2.0 s9.17.3: Additions to section 6.13.1: Work-Item Functions
Sven van Haastregted69faa2019-09-19 13:41:51 +00001176let MinVersion = CL20 in {
Sven van Haastregt308b8b72019-12-18 10:13:51 +00001177 let Extension = FuncExtKhrSubgroups in {
Sven van Haastregt89fb9e82019-07-29 14:55:29 +00001178 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]>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +00001181 }
1182}
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001183
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 {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001280 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>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001283 }
Sven van Haastregtff429c52019-12-31 15:30:02 +00001284 def : Builtin<"write_imagef", [Void, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>, Int, Float]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001285 foreach imgTy = [Image1d] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001286 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>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001289 }
1290 foreach imgTy = [Image1dArray] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001291 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>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001294 }
1295 foreach imgTy = [Image2dArray] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001296 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>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001299 }
Sven van Haastregtff429c52019-12-31 15:30:02 +00001300 def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Int, Float]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001301 let Extension = FuncExtKhrMipmapAndWrite3d in {
1302 foreach imgTy = [Image3d] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001303 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>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001306 }
1307 }
1308 }
1309 // Added to section 6.13.14.5
1310 foreach aQual = ["RO", "WO", "RW"] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001311 foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in {
1312 def : Builtin<"get_image_num_mip_levels", [Int, ImageType<imgTy, aQual>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001313 }
1314 }
1315}
Sven van Haastregt92451f02020-01-14 14:46:42 +00001316
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}