blob: 40798b744ced049695201c1ca6522104ea2275f5 [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 Haastregt91b30832020-02-05 16:05:20 +000063def FuncExtKhrMipmapImageWrites : FunctionExtension<"cl_khr_mipmap_image_writes">;
Sven van Haastregt92451f02020-01-14 14:46:42 +000064def FuncExtKhrGlMsaaSharing : FunctionExtension<"cl_khr_gl_msaa_sharing">;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +000065
66// Multiple extensions
Sven van Haastregt91b30832020-02-05 16:05:20 +000067def FuncExtKhrMipmapWritesAndWrite3d : FunctionExtension<"cl_khr_mipmap_image_writes cl_khr_3d_image_writes">;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000068
Sven van Haastregt8b65f792020-02-18 10:02:06 +000069// Arm extensions.
70def ArmIntegerDotProductInt8 : FunctionExtension<"cl_arm_integer_dot_product_int8">;
71def ArmIntegerDotProductAccumulateInt8 : FunctionExtension<"cl_arm_integer_dot_product_accumulate_int8">;
72def ArmIntegerDotProductAccumulateInt16 : FunctionExtension<"cl_arm_integer_dot_product_accumulate_int16">;
73def ArmIntegerDotProductAccumulateSaturateInt8 : FunctionExtension<"cl_arm_integer_dot_product_accumulate_saturate_int8">;
74
Sven van Haastregtb21a3652019-08-19 11:56:03 +000075// Qualified Type. These map to ASTContext::QualType.
76class QualType<string _Name, bit _IsAbstract=0> {
Sven van Haastregt79a222f2019-06-03 09:39:11 +000077 // Name of the field or function in a clang::ASTContext
78 // E.g. Name="IntTy" for the int type, and "getIntPtrType()" for an intptr_t
79 string Name = _Name;
Sven van Haastregtb21a3652019-08-19 11:56:03 +000080 // Some QualTypes in this file represent an abstract type for which there is
81 // no corresponding AST QualType, e.g. a GenType or an `image2d_t` type
82 // without access qualifiers.
83 bit IsAbstract = _IsAbstract;
Sven van Haastregt79a222f2019-06-03 09:39:11 +000084}
85
Sven van Haastregtb21a3652019-08-19 11:56:03 +000086// List of integers.
87class IntList<string _Name, list<int> _List> {
88 string Name = _Name;
89 list<int> List = _List;
90}
91
Sven van Haastregt79a222f2019-06-03 09:39:11 +000092//===----------------------------------------------------------------------===//
93// OpenCL C classes for types
94//===----------------------------------------------------------------------===//
Sven van Haastregtb21a3652019-08-19 11:56:03 +000095// OpenCL C basic data types (int, float, image2d_t, ...).
Sven van Haastregt47e95ff2019-09-17 13:32:56 +000096// Its child classes can represent concrete types (e.g. VectorType) or
97// abstract types (e.g. GenType).
Sven van Haastregt79a222f2019-06-03 09:39:11 +000098class Type<string _Name, QualType _QTName> {
Sven van Haastregtb21a3652019-08-19 11:56:03 +000099 // Name of the Type.
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000100 string Name = _Name;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000101 // QualType associated with this type.
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000102 QualType QTName = _QTName;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000103 // Size of the vector (if applicable).
104 int VecWidth = 1;
105 // Is a pointer.
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000106 bit IsPointer = 0;
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000107 // "const" qualifier.
108 bit IsConst = 0;
109 // "volatile" qualifier.
110 bit IsVolatile = 0;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000111 // Access qualifier. Must be one of ("RO", "WO", "RW").
112 string AccessQualifier = "";
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000113 // Address space.
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000114 string AddrSpace = DefaultAS.Name;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000115}
116
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000117// OpenCL vector types (e.g. int2, int3, int16, float8, ...).
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000118class VectorType<Type _Ty, int _VecWidth> : Type<_Ty.Name, _Ty.QTName> {
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000119 let VecWidth = _VecWidth;
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000120 let AccessQualifier = "";
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000121 // Inherited fields
122 let IsPointer = _Ty.IsPointer;
123 let IsConst = _Ty.IsConst;
124 let IsVolatile = _Ty.IsVolatile;
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000125 let AddrSpace = _Ty.AddrSpace;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000126}
127
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000128// OpenCL pointer types (e.g. int*, float*, ...).
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000129class PointerType<Type _Ty, AddressSpace _AS = DefaultAS> :
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000130 Type<_Ty.Name, _Ty.QTName> {
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000131 let AddrSpace = _AS.Name;
132 // Inherited fields
133 let VecWidth = _Ty.VecWidth;
134 let IsPointer = 1;
135 let IsConst = _Ty.IsConst;
136 let IsVolatile = _Ty.IsVolatile;
137 let AccessQualifier = _Ty.AccessQualifier;
138}
139
140// OpenCL const types (e.g. const int).
141class ConstType<Type _Ty> : Type<_Ty.Name, _Ty.QTName> {
142 let IsConst = 1;
143 // Inherited fields
144 let VecWidth = _Ty.VecWidth;
145 let IsPointer = _Ty.IsPointer;
146 let IsVolatile = _Ty.IsVolatile;
147 let AccessQualifier = _Ty.AccessQualifier;
148 let AddrSpace = _Ty.AddrSpace;
149}
150
151// OpenCL volatile types (e.g. volatile int).
152class VolatileType<Type _Ty> : Type<_Ty.Name, _Ty.QTName> {
153 let IsVolatile = 1;
154 // Inherited fields
155 let VecWidth = _Ty.VecWidth;
156 let IsPointer = _Ty.IsPointer;
157 let IsConst = _Ty.IsConst;
158 let AccessQualifier = _Ty.AccessQualifier;
159 let AddrSpace = _Ty.AddrSpace;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000160}
161
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000162// OpenCL image types (e.g. image2d).
163class ImageType<Type _Ty, string _AccessQualifier> :
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000164 Type<_Ty.Name, QualType<_Ty.QTName.Name#_AccessQualifier#"Ty", 0>> {
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000165 let VecWidth = 0;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000166 let AccessQualifier = _AccessQualifier;
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000167 // Inherited fields
168 let IsPointer = _Ty.IsPointer;
169 let IsConst = _Ty.IsConst;
170 let IsVolatile = _Ty.IsVolatile;
171 let AddrSpace = _Ty.AddrSpace;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000172}
173
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000174// List of Types.
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000175class TypeList<list<Type> _Type> {
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000176 list<Type> List = _Type;
177}
178
179// A GenericType is an abstract type that defines a set of types as a
180// combination of Types and vector sizes.
181//
Sven van Haastregt47e95ff2019-09-17 13:32:56 +0000182// For example, if TypeList = <int, float> and VectorList = <1, 2, 4>, then it
183// represents <int, int2, int4, float, float2, float4>.
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000184//
185// Some rules apply when using multiple GenericType arguments in a declaration:
186// 1. The number of vector sizes must be equal or 1 for all gentypes in a
187// declaration.
188// 2. The number of Types must be equal or 1 for all gentypes in a
189// declaration.
190// 3. Generic types are combined by iterating over all generic types at once.
191// For example, for the following GenericTypes
192// GenT1 = GenericType<half, [1, 2]> and
193// GenT2 = GenericType<float, int, [1, 2]>
194// A declaration f(GenT1, GenT2) results in the combinations
195// f(half, float), f(half2, float2), f(half, int), f(half2, int2) .
196// 4. "sgentype" from the OpenCL specification is supported by specifying
197// a single vector size.
198// For example, for the following GenericTypes
199// GenT = GenericType<half, int, [1, 2]> and
200// SGenT = GenericType<half, int, [1]>
201// A declaration f(GenT, SGenT) results in the combinations
202// f(half, half), f(half2, half), f(int, int), f(int2, int) .
203class GenericType<string _Ty, TypeList _TypeList, IntList _VectorList> :
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000204 Type<_Ty, QualType<"null", 1>> {
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000205 // Possible element types of the generic type.
206 TypeList TypeList = _TypeList;
207 // Possible vector sizes of the types in the TypeList.
208 IntList VectorList = _VectorList;
209 // The VecWidth field is ignored for GenericTypes. Use VectorList instead.
210 let VecWidth = 0;
211}
212
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000213// Builtin function attributes.
214def Attr {
215 list<bit> None = [0, 0, 0];
216 list<bit> Pure = [1, 0, 0];
217 list<bit> Const = [0, 1, 0];
218 list<bit> Convergent = [0, 0, 1];
219}
220
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000221//===----------------------------------------------------------------------===//
222// OpenCL C class for builtin functions
223//===----------------------------------------------------------------------===//
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000224class Builtin<string _Name, list<Type> _Signature, list<bit> _Attributes = Attr.None> {
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000225 // Name of the builtin function
226 string Name = _Name;
227 // List of types used by the function. The first one is the return type and
228 // the following are the arguments. The list must have at least one element
229 // (the return type).
230 list<Type> Signature = _Signature;
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000231 // Function attribute __attribute__((pure))
232 bit IsPure = _Attributes[0];
233 // Function attribute __attribute__((const))
234 bit IsConst = _Attributes[1];
235 // Function attribute __attribute__((convergent))
236 bit IsConv = _Attributes[2];
Sven van Haastregt308b8b72019-12-18 10:13:51 +0000237 // OpenCL extensions to which the function belongs.
238 FunctionExtension Extension = FuncExtNone;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000239 // Version of OpenCL from which the function is available (e.g.: CL10).
240 // MinVersion is inclusive.
241 Version MinVersion = CL10;
242 // Version of OpenCL from which the function is not supported anymore.
243 // MaxVersion is exclusive.
244 // CLAll makes the function available for all versions.
245 Version MaxVersion = CLAll;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000246}
247
248//===----------------------------------------------------------------------===//
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000249// Definitions of OpenCL C types
250//===----------------------------------------------------------------------===//
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000251
252// OpenCL v1.0/1.2/2.0 s6.1.1: Built-in Scalar Data Types.
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000253def Bool : Type<"bool", QualType<"BoolTy">>;
254def Char : Type<"char", QualType<"CharTy">>;
255def UChar : Type<"uchar", QualType<"UnsignedCharTy">>;
256def Short : Type<"short", QualType<"ShortTy">>;
257def UShort : Type<"ushort", QualType<"UnsignedShortTy">>;
258def Int : Type<"int", QualType<"IntTy">>;
259def UInt : Type<"uint", QualType<"UnsignedIntTy">>;
260def Long : Type<"long", QualType<"LongTy">>;
261def ULong : Type<"ulong", QualType<"UnsignedLongTy">>;
262def Float : Type<"float", QualType<"FloatTy">>;
263def Double : Type<"double", QualType<"DoubleTy">>;
264def Half : Type<"half", QualType<"HalfTy">>;
265def Size : Type<"size_t", QualType<"getSizeType()">>;
266def PtrDiff : Type<"ptrdiff_t", QualType<"getPointerDiffType()">>;
267def IntPtr : Type<"intptr_t", QualType<"getIntPtrType()">>;
Sven van Haastregt319ea2d2020-02-26 14:08:23 +0000268def UIntPtr : Type<"uintptr_t", QualType<"getUIntPtrType()">>;
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000269def Void : Type<"void", QualType<"VoidTy">>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000270
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000271// OpenCL v1.0/1.2/2.0 s6.1.2: Built-in Vector Data Types.
272// Built-in vector data types are created by TableGen's OpenCLBuiltinEmitter.
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000273
Sven van Haastregt988f1e32019-09-05 10:01:24 +0000274// OpenCL v1.0/1.2/2.0 s6.1.3: Other Built-in Data Types.
275// The image definitions are "abstract". They should not be used without
276// specifying an access qualifier (RO/WO/RW).
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000277def Image1d : Type<"image1d_t", QualType<"OCLImage1d", 1>>;
278def Image2d : Type<"image2d_t", QualType<"OCLImage2d", 1>>;
279def Image3d : Type<"image3d_t", QualType<"OCLImage3d", 1>>;
280def Image1dArray : Type<"image1d_array_t", QualType<"OCLImage1dArray", 1>>;
281def Image1dBuffer : Type<"image1d_buffer_t", QualType<"OCLImage1dBuffer", 1>>;
282def Image2dArray : Type<"image2d_array_t", QualType<"OCLImage2dArray", 1>>;
283def Image2dDepth : Type<"image2d_depth_t", QualType<"OCLImage2dDepth", 1>>;
284def Image2dArrayDepth : Type<"image2d_array_depth_t", QualType<"OCLImage2dArrayDepth", 1>>;
285def Image2dMsaa : Type<"image2d_msaa_t", QualType<"OCLImage2dMSAA", 1>>;
286def Image2dArrayMsaa : Type<"image2d_array_msaa_t", QualType<"OCLImage2dArrayMSAA", 1>>;
287def Image2dMsaaDepth : Type<"image2d_msaa_depth_t", QualType<"OCLImage2dMSAADepth", 1>>;
288def Image2dArrayMsaaDepth : Type<"image2d_array_msaa_depth_t", QualType<"OCLImage2dArrayMSAADepth", 1>>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000289
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000290def Sampler : Type<"sampler_t", QualType<"OCLSamplerTy">>;
Sven van Haastregt211ba002020-03-17 13:15:32 +0000291def ClkEvent : Type<"clk_event_t", QualType<"OCLClkEventTy">>;
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000292def Event : Type<"event_t", QualType<"OCLEventTy">>;
Sven van Haastregt211ba002020-03-17 13:15:32 +0000293def Queue : Type<"queue_t", QualType<"OCLQueueTy">>;
294def ReserveId : Type<"reserve_id_t", QualType<"OCLReserveIDTy">>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000295
Sven van Haastregt319ea2d2020-02-26 14:08:23 +0000296// OpenCL v2.0 s6.13.11: Atomic integer and floating-point types.
297def AtomicInt : Type<"atomic_int", QualType<"getAtomicType(Context.IntTy)">>;
298def AtomicUInt : Type<"atomic_uint", QualType<"getAtomicType(Context.UnsignedIntTy)">>;
299def AtomicLong : Type<"atomic_long", QualType<"getAtomicType(Context.LongTy)">>;
300def AtomicULong : Type<"atomic_ulong", QualType<"getAtomicType(Context.UnsignedLongTy)">>;
301def AtomicFloat : Type<"atomic_float", QualType<"getAtomicType(Context.FloatTy)">>;
302def AtomicDouble : Type<"atomic_double", QualType<"getAtomicType(Context.DoubleTy)">>;
303def AtomicIntPtr : Type<"atomic_intptr_t", QualType<"getAtomicType(Context.getIntPtrType())">>;
304def AtomicUIntPtr : Type<"atomic_uintptr_t", QualType<"getAtomicType(Context.getUIntPtrType())">>;
305def AtomicSize : Type<"atomic_size_t", QualType<"getAtomicType(Context.getSizeType())">>;
306def AtomicPtrDiff : Type<"atomic_ptrdiff_t", QualType<"getAtomicType(Context.getPointerDiffType())">>;
307
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000308//===----------------------------------------------------------------------===//
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000309// Definitions of OpenCL gentype variants
310//===----------------------------------------------------------------------===//
311// The OpenCL specification often uses "gentype" in builtin function
312// declarations to indicate that a builtin function is available with various
313// argument and return types. The types represented by "gentype" vary between
314// different parts of the specification. The following definitions capture
315// the different type lists for gentypes in different parts of the
316// specification.
317
318// Vector width lists.
319def VecAndScalar: IntList<"VecAndScalar", [1, 2, 3, 4, 8, 16]>;
320def VecNoScalar : IntList<"VecNoScalar", [2, 3, 4, 8, 16]>;
321def Vec1 : IntList<"Vec1", [1]>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000322def Vec2 : IntList<"Vec2", [2]>;
323def Vec4 : IntList<"Vec4", [4]>;
324def Vec8 : IntList<"Vec8", [8]>;
325def Vec16 : IntList<"Vec16", [16]>;
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000326def Vec1234 : IntList<"Vec1234", [1, 2, 3, 4]>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000327
328// Type lists.
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000329def TLAll : TypeList<[Char, UChar, Short, UShort, Int, UInt, Long, ULong, Float, Double, Half]>;
330def TLAllUnsigned : TypeList<[UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong, UInt, ULong, UShort]>;
331def TLFloat : TypeList<[Float, Double, Half]>;
332def TLSignedInts : TypeList<[Char, Short, Int, Long]>;
333def TLUnsignedInts : TypeList<[UChar, UShort, UInt, ULong]>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000334
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000335def TLIntLongFloats : TypeList<[Int, UInt, Long, ULong, Float, Double, Half]>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000336
Sven van Haastregt0e70c352019-11-06 11:53:19 +0000337// All unsigned integer types twice, to facilitate unsigned return types for e.g.
338// uchar abs(char) and
339// uchar abs(uchar).
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000340def TLAllUIntsTwice : TypeList<[UChar, UChar, UShort, UShort, UInt, UInt, ULong, ULong]>;
Sven van Haastregt0e70c352019-11-06 11:53:19 +0000341
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000342def TLAllInts : TypeList<[Char, UChar, Short, UShort, Int, UInt, Long, ULong]>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000343
344// GenType definitions for multiple base types (e.g. all floating point types,
345// or all integer types).
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000346// All types
347def AGenTypeN : GenericType<"AGenTypeN", TLAll, VecAndScalar>;
348def AGenTypeNNoScalar : GenericType<"AGenTypeNNoScalar", TLAll, VecNoScalar>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000349// All integer
350def AIGenType1 : GenericType<"AIGenType1", TLAllInts, Vec1>;
351def AIGenTypeN : GenericType<"AIGenTypeN", TLAllInts, VecAndScalar>;
352def AIGenTypeNNoScalar : GenericType<"AIGenTypeNNoScalar", TLAllInts, VecNoScalar>;
Sven van Haastregt0e70c352019-11-06 11:53:19 +0000353// All integer to unsigned
354def AI2UGenTypeN : GenericType<"AI2UGenTypeN", TLAllUIntsTwice, VecAndScalar>;
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000355// Signed integer
356def SGenTypeN : GenericType<"SGenTypeN", TLSignedInts, VecAndScalar>;
357// Unsigned integer
358def UGenTypeN : GenericType<"UGenTypeN", TLUnsignedInts, VecAndScalar>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000359// Float
360def FGenTypeN : GenericType<"FGenTypeN", TLFloat, VecAndScalar>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +0000361// (u)int, (u)long, and all floats
362def IntLongFloatGenType1 : GenericType<"IntLongFloatGenType1", TLIntLongFloats, Vec1>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000363
364// GenType definitions for every single base type (e.g. fp32 only).
365// Names are like: GenTypeFloatVecAndScalar.
366foreach Type = [Char, UChar, Short, UShort,
367 Int, UInt, Long, ULong,
368 Float, Double, Half] in {
369 foreach VecSizes = [VecAndScalar, VecNoScalar] in {
370 def "GenType" # Type # VecSizes :
371 GenericType<"GenType" # Type # VecSizes,
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000372 TypeList<[Type]>, VecSizes>;
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000373 }
374}
375
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000376// GenType definitions for vec1234.
377foreach Type = [Float, Double, Half] in {
378 def "GenType" # Type # Vec1234 :
379 GenericType<"GenType" # Type # Vec1234,
Sven van Haastregt89b8b422020-02-04 10:56:53 +0000380 TypeList<[Type]>, Vec1234>;
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000381}
382
Sven van Haastregtb21a3652019-08-19 11:56:03 +0000383
384//===----------------------------------------------------------------------===//
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000385// Definitions of OpenCL builtin functions
386//===----------------------------------------------------------------------===//
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000387//--------------------------------------------------------------------
388// OpenCL v1.1/1.2/2.0 s6.2.3 - Explicit conversions.
389// OpenCL v2.0 Extensions s5.1.1 and s6.1.1 - Conversions.
390
391// Generate the convert_* builtins functions.
392foreach RType = [Float, Double, Half, Char, UChar, Short,
393 UShort, Int, UInt, Long, ULong] in {
394 foreach IType = [Float, Double, Half, Char, UChar, Short,
395 UShort, Int, UInt, Long, ULong] in {
Sven van Haastregt81e8b602020-02-19 13:52:58 +0000396 // Conversions to integer type have a sat and non-sat variant.
397 foreach sat = !cond(!eq(RType.Name, "float") : [""],
398 !eq(RType.Name, "double") : [""],
399 !eq(RType.Name, "half") : [""],
400 1 : ["", "_sat"]) in {
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000401 foreach rnd = ["", "_rte", "_rtn", "_rtp", "_rtz"] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000402 def : Builtin<"convert_" # RType.Name # sat # rnd, [RType, IType],
403 Attr.Const>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000404 foreach v = [2, 3, 4, 8, 16] in {
Sven van Haastregt89fb9e82019-07-29 14:55:29 +0000405 def : Builtin<"convert_" # RType.Name # v # sat # rnd,
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000406 [VectorType<RType, v>, VectorType<IType, v>],
407 Attr.Const>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000408 }
409 }
410 }
411 }
412}
413
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000414//--------------------------------------------------------------------
Sven van Haastregted69faa2019-09-19 13:41:51 +0000415// OpenCL v1.1 s6.11.1, v1.2 s6.12.1, v2.0 s6.13.1 - Work-item Functions
416// --- Table 7 ---
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000417def : Builtin<"get_work_dim", [UInt], Attr.Const>;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000418foreach name = ["get_global_size", "get_global_id", "get_local_size",
419 "get_local_id", "get_num_groups", "get_group_id",
420 "get_global_offset"] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +0000421 def : Builtin<name, [Size, UInt], Attr.Const>;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000422}
423
424let MinVersion = CL20 in {
425 def : Builtin<"get_enqueued_local_size", [Size, UInt]>;
426 foreach name = ["get_global_linear_id", "get_local_linear_id"] in {
427 def : Builtin<name, [Size]>;
428 }
429}
430
Sven van Haastregt6fc73f62019-11-05 19:47:21 +0000431
Sven van Haastregted69faa2019-09-19 13:41:51 +0000432//--------------------------------------------------------------------
Sven van Haastregt6fc73f62019-11-05 19:47:21 +0000433// OpenCL v1.1 s6.11.2, v1.2 s6.12.2, v2.0 s6.13.2 - Math functions
434// OpenCL Extension v2.0 s5.1.2 and s6.1.2 - Math Functions
435// --- Table 8 ---
436// --- 1 argument ---
437foreach name = ["acos", "acosh", "acospi",
438 "asin", "asinh", "asinpi",
439 "atan", "atanh", "atanpi",
440 "cbrt", "ceil",
441 "cos", "cosh", "cospi",
442 "erfc", "erf",
443 "exp", "exp2", "exp10", "expm1",
444 "fabs", "floor",
445 "log", "log2", "log10", "log1p", "logb",
446 "rint", "round", "rsqrt",
447 "sin", "sinh", "sinpi",
448 "sqrt",
449 "tan", "tanh", "tanpi",
450 "tgamma", "trunc",
451 "lgamma"] in {
452 def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>;
453}
454foreach name = ["nan"] in {
455 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
456 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeULongVecAndScalar], Attr.Const>;
457 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
458}
459
460// --- 2 arguments ---
461foreach name = ["atan2", "atan2pi", "copysign", "fdim", "fmod", "hypot",
462 "maxmag", "minmag", "nextafter", "pow", "powr",
463 "remainder"] in {
464 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
465}
466foreach name = ["fmax", "fmin"] in {
467 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
468 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
469 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
470 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
471}
472foreach name = ["ilogb"] in {
473 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
474 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeDoubleVecAndScalar], Attr.Const>;
475 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeHalfVecAndScalar], Attr.Const>;
476}
477foreach name = ["ldexp"] in {
478 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
479 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Int], Attr.Const>;
480 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
481 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Int], Attr.Const>;
482 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
483 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Int], Attr.Const>;
484}
485foreach name = ["pown", "rootn"] in {
486 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
487 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
488 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
489}
490
491// --- 3 arguments ---
492foreach name = ["fma", "mad"] in {
493 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
494}
495
496// --- Version dependent ---
497let MaxVersion = CL20 in {
498 foreach AS = [GlobalAS, LocalAS, PrivateAS] in {
499 foreach name = ["fract", "modf", "sincos"] in {
500 def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, AS>]>;
501 }
502 foreach name = ["frexp", "lgamma_r"] in {
503 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
504 def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>;
505 }
506 }
507 foreach name = ["remquo"] in {
508 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
509 def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, AS>]>;
510 }
511 }
512 }
513}
514let MinVersion = CL20 in {
515 foreach name = ["fract", "modf", "sincos"] in {
516 def : Builtin<name, [FGenTypeN, FGenTypeN, PointerType<FGenTypeN, GenericAS>]>;
517 }
518 foreach name = ["frexp", "lgamma_r"] in {
519 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
520 def : Builtin<name, [Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>;
521 } }
522 foreach name = ["remquo"] in {
523 foreach Type = [GenTypeFloatVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeHalfVecAndScalar] in {
524 def : Builtin<name, [Type, Type, Type, PointerType<GenTypeIntVecAndScalar, GenericAS>]>;
525 }
526 }
527}
528
529// --- Table 9 ---
530foreach name = ["half_cos",
531 "half_exp", "half_exp2", "half_exp10",
532 "half_log", "half_log2", "half_log10",
533 "half_recip", "half_rsqrt",
534 "half_sin", "half_sqrt", "half_tan",
535 "native_cos",
536 "native_exp", "native_exp2", "native_exp10",
537 "native_log", "native_log2", "native_log10",
538 "native_recip", "native_rsqrt",
539 "native_sin", "native_sqrt", "native_tan"] in {
540 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
541}
542foreach name = ["half_divide", "half_powr",
543 "native_divide", "native_powr"] in {
544 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
545}
546
547//--------------------------------------------------------------------
Sven van Haastregt0e70c352019-11-06 11:53:19 +0000548// OpenCL v1.1 s6.11.3, v1.2 s6.12.3, v2.0 s6.13.3 - Integer Functions
549// --- Table 10 ---
550// --- 1 argument ---
551foreach name = ["abs"] in {
552 def : Builtin<name, [AI2UGenTypeN, AIGenTypeN], Attr.Const>;
553}
554foreach name = ["clz", "popcount"] in {
555 def : Builtin<name, [AIGenTypeN, AIGenTypeN], Attr.Const>;
556}
557let MinVersion = CL20 in {
558 foreach name = ["ctz"] in {
559 def : Builtin<name, [AIGenTypeN, AIGenTypeN]>;
560 }
561}
562
563// --- 2 arguments ---
564foreach name = ["abs_diff"] in {
565 def : Builtin<name, [AI2UGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
566}
567foreach name = ["add_sat", "hadd", "rhadd", "mul_hi", "rotate", "sub_sat"] in {
568 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
569}
570foreach name = ["max", "min"] in {
571 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
572 def : Builtin<name, [AIGenTypeNNoScalar, AIGenTypeNNoScalar, AIGenType1], Attr.Const>;
573}
574foreach name = ["upsample"] in {
575 def : Builtin<name, [GenTypeShortVecAndScalar, GenTypeCharVecAndScalar, GenTypeUCharVecAndScalar], Attr.Const>;
576 def : Builtin<name, [GenTypeUShortVecAndScalar, GenTypeUCharVecAndScalar, GenTypeUCharVecAndScalar], Attr.Const>;
577 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeShortVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
578 def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUShortVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
579 def : Builtin<name, [GenTypeLongVecAndScalar, GenTypeIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
580 def : Builtin<name, [GenTypeULongVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
581}
582
583// --- 3 arguments ---
584foreach name = ["clamp"] in {
585 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
586 def : Builtin<name, [AIGenTypeNNoScalar, AIGenTypeNNoScalar, AIGenType1, AIGenType1], Attr.Const>;
587}
588foreach name = ["mad_hi", "mad_sat"] in {
589 def : Builtin<name, [AIGenTypeN, AIGenTypeN, AIGenTypeN, AIGenTypeN], Attr.Const>;
590}
591
592// --- Table 11 ---
593foreach name = ["mad24"] in {
594 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
595 def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
596}
597foreach name = ["mul24"] in {
598 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeIntVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
599 def : Builtin<name, [GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
600}
601
602//--------------------------------------------------------------------
Sven van Haastregt6fc73f62019-11-05 19:47:21 +0000603// OpenCL v1.1 s6.11.4, v1.2 s6.12.4, v2.0 s6.13.4 - Common Functions
604// OpenCL Extension v2.0 s5.1.3 and s6.1.3 - Common Functions
605// --- Table 12 ---
606// --- 1 argument ---
607foreach name = ["degrees", "radians", "sign"] in {
608 def : Builtin<name, [FGenTypeN, FGenTypeN], Attr.Const>;
609}
610
611// --- 2 arguments ---
612foreach name = ["max", "min"] in {
613 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
614 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float], Attr.Const>;
615 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double], Attr.Const>;
616 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half], Attr.Const>;
617}
618foreach name = ["step"] in {
619 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
620 def : Builtin<name, [GenTypeFloatVecNoScalar, Float, GenTypeFloatVecNoScalar], Attr.Const>;
621 def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, GenTypeDoubleVecNoScalar], Attr.Const>;
622 def : Builtin<name, [GenTypeHalfVecNoScalar, Half, GenTypeHalfVecNoScalar], Attr.Const>;
623}
624
625// --- 3 arguments ---
626foreach name = ["clamp", "mix"] in {
627 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
628 def : Builtin<name, [GenTypeFloatVecNoScalar, GenTypeFloatVecNoScalar, Float, Float], Attr.Const>;
629 def : Builtin<name, [GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar, Double, Double], Attr.Const>;
630 def : Builtin<name, [GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar, Half, Half], Attr.Const>;
631}
632foreach name = ["smoothstep"] in {
633 def : Builtin<name, [FGenTypeN, FGenTypeN, FGenTypeN, FGenTypeN], Attr.Const>;
634 def : Builtin<name, [GenTypeFloatVecNoScalar, Float, Float, GenTypeFloatVecNoScalar], Attr.Const>;
635 def : Builtin<name, [GenTypeDoubleVecNoScalar, Double, Double, GenTypeDoubleVecNoScalar], Attr.Const>;
636 def : Builtin<name, [GenTypeHalfVecNoScalar, Half, Half, GenTypeHalfVecNoScalar], Attr.Const>;
637}
638
639
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000640//--------------------------------------------------------------------
641// OpenCL v1.1 s6.11.5, v1.2 s6.12.5, v2.0 s6.13.5 - Geometric Functions
642// OpenCL Extension v2.0 s5.1.4 and s6.1.4 - Geometric Functions
643// --- Table 13 ---
644// --- 1 argument ---
645foreach name = ["length"] in {
646 def : Builtin<name, [Float, GenTypeFloatVec1234], Attr.Const>;
647 def : Builtin<name, [Double, GenTypeDoubleVec1234], Attr.Const>;
648 def : Builtin<name, [Half, GenTypeHalfVec1234], Attr.Const>;
649}
650foreach name = ["normalize"] in {
651 def : Builtin<name, [GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
652 def : Builtin<name, [GenTypeDoubleVec1234, GenTypeDoubleVec1234], Attr.Const>;
653 def : Builtin<name, [GenTypeHalfVec1234, GenTypeHalfVec1234], Attr.Const>;
654}
655foreach name = ["fast_length"] in {
656 def : Builtin<name, [Float, GenTypeFloatVec1234], Attr.Const>;
657}
658foreach name = ["fast_normalize"] in {
659 def : Builtin<name, [GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
660}
661
662// --- 2 arguments ---
663foreach name = ["cross"] in {
664 foreach VSize = [3, 4] in {
665 def : Builtin<name, [VectorType<Float, VSize>, VectorType<Float, VSize>, VectorType<Float, VSize>], Attr.Const>;
666 def : Builtin<name, [VectorType<Double, VSize>, VectorType<Double, VSize>, VectorType<Double, VSize>], Attr.Const>;
667 def : Builtin<name, [VectorType<Half, VSize>, VectorType<Half, VSize>, VectorType<Half, VSize>], Attr.Const>;
668 }
669}
670foreach name = ["dot", "distance"] in {
671 def : Builtin<name, [Float, GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
672 def : Builtin<name, [Double, GenTypeDoubleVec1234, GenTypeDoubleVec1234], Attr.Const>;
673 def : Builtin<name, [Half, GenTypeHalfVec1234, GenTypeHalfVec1234], Attr.Const>;
674}
675foreach name = ["fast_distance"] in {
676 def : Builtin<name, [Float, GenTypeFloatVec1234, GenTypeFloatVec1234], Attr.Const>;
677}
678
679
680//--------------------------------------------------------------------
681// OpenCL v1.1 s6.11.6, v1.2 s6.12.6, v2.0 s6.13.6 - Relational Functions
682// OpenCL Extension v2.0 s5.1.5 and s6.1.5 - Relational Functions
683// --- Table 14 ---
684// --- 1 argument ---
685foreach name = ["isfinite", "isinf", "isnan", "isnormal", "signbit"] in {
686 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
687 def : Builtin<name, [Int, Double], Attr.Const>;
688 def : Builtin<name, [GenTypeLongVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>;
689 def : Builtin<name, [Int, Half], Attr.Const>;
690 def : Builtin<name, [GenTypeShortVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>;
691}
692foreach name = ["any", "all"] in {
Sven van Haastregt25f26392020-03-09 10:26:11 +0000693 def : Builtin<name, [Int, SGenTypeN], Attr.Const>;
Sven van Haastregt3d30f2c2019-11-07 15:00:19 +0000694}
695
696// --- 2 arguments ---
697foreach name = ["isequal", "isnotequal", "isgreater", "isgreaterequal",
698 "isless", "islessequal", "islessgreater", "isordered",
699 "isunordered"] in {
700 def : Builtin<name, [GenTypeIntVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar], Attr.Const>;
701 def : Builtin<name, [Int, Double, Double], Attr.Const>;
702 def : Builtin<name, [GenTypeLongVecNoScalar, GenTypeDoubleVecNoScalar, GenTypeDoubleVecNoScalar], Attr.Const>;
703 def : Builtin<name, [Int, Half, Half], Attr.Const>;
704 def : Builtin<name, [GenTypeShortVecNoScalar, GenTypeHalfVecNoScalar, GenTypeHalfVecNoScalar], Attr.Const>;
705}
706
707// --- 3 arguments ---
708foreach name = ["bitselect"] in {
709 def : Builtin<name, [AGenTypeN, AGenTypeN, AGenTypeN, AGenTypeN], Attr.Const>;
710}
711foreach name = ["select"] in {
712 def : Builtin<name, [SGenTypeN, SGenTypeN, SGenTypeN, SGenTypeN], Attr.Const>;
713 def : Builtin<name, [SGenTypeN, SGenTypeN, SGenTypeN, UGenTypeN], Attr.Const>;
714 def : Builtin<name, [UGenTypeN, UGenTypeN, UGenTypeN, UGenTypeN], Attr.Const>;
715 def : Builtin<name, [UGenTypeN, UGenTypeN, UGenTypeN, SGenTypeN], Attr.Const>;
716 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeIntVecAndScalar], Attr.Const>;
717 def : Builtin<name, [GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeFloatVecAndScalar, GenTypeUIntVecAndScalar], Attr.Const>;
718 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeLongVecAndScalar], Attr.Const>;
719 def : Builtin<name, [GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeDoubleVecAndScalar, GenTypeULongVecAndScalar], Attr.Const>;
720 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeShortVecAndScalar], Attr.Const>;
721 def : Builtin<name, [GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeHalfVecAndScalar, GenTypeUShortVecAndScalar], Attr.Const>;
722}
723
724
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000725//--------------------------------------------------------------------
Sven van Haastregted69faa2019-09-19 13:41:51 +0000726// 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 +0000727// 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 +0000728// --- Table 15 ---
729// Variants for OpenCL versions below 2.0, using pointers to the global, local
730// and private address spaces.
731let MaxVersion = CL20 in {
732 foreach AS = [GlobalAS, LocalAS, PrivateAS] in {
733 foreach VSize = [2, 3, 4, 8, 16] in {
734 foreach name = ["vload" # VSize] in {
735 def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, AS>]>;
736 def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, AS>]>;
737 def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, AS>]>;
738 def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, AS>]>;
739 def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, AS>]>;
740 def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, AS>]>;
741 def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, AS>]>;
742 def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, AS>]>;
743 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, AS>]>;
744 def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, AS>]>;
745 def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
746 }
747 foreach name = ["vstore" # VSize] in {
Sven van Haastregt6ef953c2020-03-06 12:45:28 +0000748 def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, AS>]>;
749 def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, AS>]>;
750 def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, AS>]>;
751 def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, AS>]>;
752 def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, AS>]>;
753 def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, AS>]>;
754 def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, AS>]>;
755 def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, AS>]>;
756 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, AS>]>;
757 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, AS>]>;
758 def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, AS>]>;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000759 }
760 foreach name = ["vloada_half" # VSize] in {
761 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
762 }
763 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
764 foreach name = ["vstorea_half" # VSize # rnd] in {
765 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>;
766 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>;
767 }
768 }
769 }
770 }
771}
772// Variants for OpenCL versions above 2.0, using pointers to the generic
773// address space.
774let MinVersion = CL20 in {
775 foreach VSize = [2, 3, 4, 8, 16] in {
776 foreach name = ["vload" # VSize] in {
777 def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, GenericAS>]>;
778 def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, GenericAS>]>;
779 def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, GenericAS>]>;
780 def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, GenericAS>]>;
781 def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, GenericAS>]>;
782 def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, GenericAS>]>;
783 def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, GenericAS>]>;
784 def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, GenericAS>]>;
785 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, GenericAS>]>;
786 def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, GenericAS>]>;
787 def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>;
788 }
789 foreach name = ["vstore" # VSize] in {
Sven van Haastregt6ef953c2020-03-06 12:45:28 +0000790 def : Builtin<name, [Void, VectorType<Char, VSize>, Size, PointerType<Char, GenericAS>]>;
791 def : Builtin<name, [Void, VectorType<UChar, VSize>, Size, PointerType<UChar, GenericAS>]>;
792 def : Builtin<name, [Void, VectorType<Short, VSize>, Size, PointerType<Short, GenericAS>]>;
793 def : Builtin<name, [Void, VectorType<UShort, VSize>, Size, PointerType<UShort, GenericAS>]>;
794 def : Builtin<name, [Void, VectorType<Int, VSize>, Size, PointerType<Int, GenericAS>]>;
795 def : Builtin<name, [Void, VectorType<UInt, VSize>, Size, PointerType<UInt, GenericAS>]>;
796 def : Builtin<name, [Void, VectorType<Long, VSize>, Size, PointerType<Long, GenericAS>]>;
797 def : Builtin<name, [Void, VectorType<ULong, VSize>, Size, PointerType<ULong, GenericAS>]>;
798 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Float, GenericAS>]>;
799 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Double, GenericAS>]>;
800 def : Builtin<name, [Void, VectorType<Half, VSize>, Size, PointerType<Half, GenericAS>]>;
Sven van Haastregted69faa2019-09-19 13:41:51 +0000801 }
802 foreach name = ["vloada_half" # VSize] in {
803 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, GenericAS>]>;
804 }
805 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
806 foreach name = ["vstorea_half" # VSize # rnd] in {
807 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, GenericAS>]>;
808 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, GenericAS>]>;
809 }
810 }
811 }
812}
813// Variants using pointers to the constant address space.
814foreach VSize = [2, 3, 4, 8, 16] in {
815 foreach name = ["vload" # VSize] in {
816 def : Builtin<name, [VectorType<Char, VSize>, Size, PointerType<ConstType<Char>, ConstantAS>]>;
817 def : Builtin<name, [VectorType<UChar, VSize>, Size, PointerType<ConstType<UChar>, ConstantAS>]>;
818 def : Builtin<name, [VectorType<Short, VSize>, Size, PointerType<ConstType<Short>, ConstantAS>]>;
819 def : Builtin<name, [VectorType<UShort, VSize>, Size, PointerType<ConstType<UShort>, ConstantAS>]>;
820 def : Builtin<name, [VectorType<Int, VSize>, Size, PointerType<ConstType<Int>, ConstantAS>]>;
821 def : Builtin<name, [VectorType<UInt, VSize>, Size, PointerType<ConstType<UInt>, ConstantAS>]>;
822 def : Builtin<name, [VectorType<Long, VSize>, Size, PointerType<ConstType<Long>, ConstantAS>]>;
823 def : Builtin<name, [VectorType<ULong, VSize>, Size, PointerType<ConstType<ULong>, ConstantAS>]>;
824 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Float>, ConstantAS>]>;
825 def : Builtin<name, [VectorType<Double, VSize>, Size, PointerType<ConstType<Double>, ConstantAS>]>;
826 def : Builtin<name, [VectorType<Half, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>;
827 }
828 foreach name = ["vloada_half" # VSize] in {
829 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, ConstantAS>]>;
830 }
Sven van Haastregted69faa2019-09-19 13:41:51 +0000831}
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000832let MaxVersion = CL20 in {
833 foreach AS = [GlobalAS, LocalAS, PrivateAS] in {
834 def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
Sven van Haastregt6ef953c2020-03-06 12:45:28 +0000835 def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000836 foreach VSize = [2, 3, 4, 8, 16] in {
837 foreach name = ["vload_half" # VSize] in {
838 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
839 }
840 }
841 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
Sven van Haastregt6ef953c2020-03-06 12:45:28 +0000842 foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in {
843 def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>;
844 def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>;
845 }
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000846 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}
855let MinVersion = CL20 in {
856 foreach AS = [GenericAS] in {
857 def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
Sven van Haastregt6ef953c2020-03-06 12:45:28 +0000858 def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000859 foreach VSize = [2, 3, 4, 8, 16] in {
860 foreach name = ["vload_half" # VSize] in {
861 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
862 }
863 }
864 foreach rnd = ["", "_rte", "_rtz", "_rtp", "_rtn"] in {
Sven van Haastregt6ef953c2020-03-06 12:45:28 +0000865 foreach name = ["vstore_half" # rnd, "vstorea_half" # rnd] in {
866 def : Builtin<name, [Void, Float, Size, PointerType<Half, AS>]>;
867 def : Builtin<name, [Void, Double, Size, PointerType<Half, AS>]>;
868 }
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000869 foreach VSize = [2, 3, 4, 8, 16] in {
870 foreach name = ["vstore_half" # VSize # rnd] in {
871 def : Builtin<name, [Void, VectorType<Float, VSize>, Size, PointerType<Half, AS>]>;
872 def : Builtin<name, [Void, VectorType<Double, VSize>, Size, PointerType<Half, AS>]>;
873 }
874 }
875 }
876 }
877}
878
879foreach AS = [ConstantAS] in {
880 def : Builtin<"vload_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
Sven van Haastregt6ef953c2020-03-06 12:45:28 +0000881 def : Builtin<"vloada_half", [Float, Size, PointerType<ConstType<Half>, AS>]>;
Sven van Haastregt2fe674b2019-11-13 10:16:33 +0000882 foreach VSize = [2, 3, 4, 8, 16] in {
883 foreach name = ["vload_half" # VSize] in {
884 def : Builtin<name, [VectorType<Float, VSize>, Size, PointerType<ConstType<Half>, AS>]>;
885 }
886 }
887}
Sven van Haastregted69faa2019-09-19 13:41:51 +0000888
889//--------------------------------------------------------------------
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000890// 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
891// OpenCL Extension v2.0 s5.1.7 and s6.1.7: Async Copies from Global to Local Memory, Local to Global Memory, and Prefetch
892// --- Table 18 ---
893foreach name = ["async_work_group_copy"] in {
894 def : Builtin<name, [Event, PointerType<AGenTypeN, LocalAS>, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size, Event]>;
895 def : Builtin<name, [Event, PointerType<AGenTypeN, GlobalAS>, PointerType<ConstType<AGenTypeN>, LocalAS>, Size, Event]>;
896}
897foreach name = ["async_work_group_strided_copy"] in {
898 def : Builtin<name, [Event, PointerType<AGenTypeN, LocalAS>, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size, Size, Event]>;
899 def : Builtin<name, [Event, PointerType<AGenTypeN, GlobalAS>, PointerType<ConstType<AGenTypeN>, LocalAS>, Size, Size, Event]>;
900}
901foreach name = ["wait_group_events"] in {
902 def : Builtin<name, [Void, Int, PointerType<Event, GenericAS>]>;
903}
904foreach name = ["prefetch"] in {
905 def : Builtin<name, [Void, PointerType<ConstType<AGenTypeN>, GlobalAS>, Size]>;
906}
907
908//--------------------------------------------------------------------
909// OpenCL v2.0 s6.13.11 - Atomics Functions.
910// Functions that use memory_order and cl_mem_fence_flags enums are not
911// declared here as the TableGen backend does not handle enums.
912
Sven van Haastregt308b8b72019-12-18 10:13:51 +0000913// OpenCL v1.0 s9.5, s9.6, s9.7 - Atomic Functions for 32-bit integers
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000914// --- Table 9.1 ---
Sven van Haastregt308b8b72019-12-18 10:13:51 +0000915let Extension = FuncExtKhrGlobalInt32BaseAtomics in {
916 foreach Type = [Int, UInt] in {
917 foreach name = ["atom_add", "atom_sub", "atom_xchg"] in {
918 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type]>;
919 }
920 foreach name = ["atom_inc", "atom_dec"] in {
921 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>]>;
922 }
923 foreach name = ["atom_cmpxchg"] in {
924 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type, Type]>;
925 }
Sven van Haastregtcc0ba282019-08-20 12:21:03 +0000926 }
927}
Sven van Haastregtb7145832019-12-23 12:29:01 +0000928// --- Table 9.3 ---
929let Extension = FuncExtKhrLocalInt32BaseAtomics in {
930 foreach Type = [Int, UInt] in {
931 foreach name = ["atom_add", "atom_sub", "atom_xchg"] in {
932 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type]>;
933 }
934 foreach name = ["atom_inc", "atom_dec"] in {
935 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>]>;
936 }
937 foreach name = ["atom_cmpxchg"] in {
938 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type, Type]>;
939 }
940 }
941}
942// --- Table 9.5 ---
943let Extension = FuncExtKhrInt64BaseAtomics in {
944 foreach AS = [GlobalAS, LocalAS] in {
945 foreach Type = [Long, ULong] in {
946 foreach name = ["atom_add", "atom_sub", "atom_xchg"] in {
947 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>;
948 }
949 foreach name = ["atom_inc", "atom_dec"] in {
950 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>]>;
951 }
952 foreach name = ["atom_cmpxchg"] in {
953 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type, Type]>;
954 }
955 }
956 }
957}
958// --- Table 9.2 ---
959let Extension = FuncExtKhrGlobalInt32ExtendedAtomics in {
960 foreach Type = [Int, UInt] in {
961 foreach name = ["atom_min", "atom_max", "atom_and",
962 "atom_or", "atom_xor"] in {
963 def : Builtin<name, [Type, PointerType<VolatileType<Type>, GlobalAS>, Type]>;
964 }
965 }
966}
967// --- Table 9.4 ---
968let Extension = FuncExtKhrLocalInt32ExtendedAtomics in {
969 foreach Type = [Int, UInt] in {
970 foreach name = ["atom_min", "atom_max", "atom_and",
971 "atom_or", "atom_xor"] in {
972 def : Builtin<name, [Type, PointerType<VolatileType<Type>, LocalAS>, Type]>;
973 }
974 }
975}
976// --- Table 9.6 ---
977let Extension = FuncExtKhrInt64ExtendedAtomics in {
978 foreach AS = [GlobalAS, LocalAS] in {
979 foreach Type = [Long, ULong] in {
980 foreach name = ["atom_min", "atom_max", "atom_and",
981 "atom_or", "atom_xor"] in {
982 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>;
983 }
984 }
985 }
986}
987// OpenCL v1.1 s6.11.1, v1.2 s6.12.11 - Atomic Functions
988foreach AS = [GlobalAS, LocalAS] in {
989 foreach Type = [Int, UInt] in {
990 foreach name = ["atomic_add", "atomic_sub", "atomic_xchg",
991 "atomic_min", "atomic_max", "atomic_and",
992 "atomic_or", "atomic_xor"] in {
993 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type]>;
994 }
995 foreach name = ["atomic_inc", "atomic_dec"] in {
996 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>]>;
997 }
998 foreach name = ["atomic_cmpxchg"] in {
999 def : Builtin<name, [Type, PointerType<VolatileType<Type>, AS>, Type, Type]>;
1000 }
1001 }
1002}
Sven van Haastregt319ea2d2020-02-26 14:08:23 +00001003// OpenCL v2.0 s6.13.11 - Atomic Functions.
1004let MinVersion = CL20 in {
1005 foreach TypePair = [[AtomicInt, Int], [AtomicUInt, UInt],
1006 [AtomicLong, Long], [AtomicULong, ULong],
1007 [AtomicFloat, Float], [AtomicDouble, Double]] in {
1008 def : Builtin<"atomic_init",
1009 [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
1010 def : Builtin<"atomic_store",
1011 [Void, PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
1012 def : Builtin<"atomic_load",
1013 [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>]>;
1014 def : Builtin<"atomic_exchange",
1015 [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[1]]>;
1016 foreach Variant = ["weak", "strong"] in {
1017 def : Builtin<"atomic_compare_exchange_" # Variant,
1018 [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS>,
1019 PointerType<TypePair[1], GenericAS>, TypePair[1]]>;
1020 }
1021 }
1022
1023 foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
1024 [AtomicLong, Long, Long], [AtomicULong, ULong, ULong],
1025 [AtomicIntPtr, IntPtr, PtrDiff],
1026 [AtomicUIntPtr, UIntPtr, PtrDiff]] in {
1027 foreach ModOp = ["add", "sub"] in {
1028 def : Builtin<"atomic_fetch_" # ModOp,
1029 [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
1030 }
1031 }
1032 foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
1033 [AtomicLong, Long, Long], [AtomicULong, ULong, ULong],
1034 [AtomicIntPtr, IntPtr, IntPtr],
1035 [AtomicUIntPtr, UIntPtr, UIntPtr]] in {
1036 foreach ModOp = ["or", "xor", "and", "min", "max"] in {
1037 def : Builtin<"atomic_fetch_" # ModOp,
1038 [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS>, TypePair[2]]>;
1039 }
1040 }
1041}
Sven van Haastregtcc0ba282019-08-20 12:21:03 +00001042
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001043//--------------------------------------------------------------------
Sven van Haastregte54c83e2019-11-26 10:44:49 +00001044// OpenCL v1.1 s6.11.12, v1.2 s6.12.12, v2.0 s6.13.12 - Miscellaneous Vector Functions
1045// --- Table 19 ---
Sven van Haastregtff429c52019-12-31 15:30:02 +00001046foreach VSize1 = [Vec2, Vec4, Vec8, Vec16] in {
1047 foreach VSize2 = [Vec2, Vec4, Vec8, Vec16] in {
1048 def : Builtin<"shuffle", [GenericType<"TLAll" # VSize1.Name, TLAll, VSize1>,
1049 GenericType<"TLAll" # VSize2.Name, TLAll, VSize2>,
1050 GenericType<"TLAllUnsigned" # VSize1.Name, TLAllUnsigned, VSize1>],
1051 Attr.Const>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +00001052 }
1053}
Sven van Haastregtff429c52019-12-31 15:30:02 +00001054foreach VSize1 = [Vec2, Vec4, Vec8, Vec16] in {
1055 foreach VSize2 = [Vec2, Vec4, Vec8, Vec16] in {
1056 def : Builtin<"shuffle2", [GenericType<"TLAll" # VSize1.Name, TLAll, VSize1>,
1057 GenericType<"TLAll" # VSize2.Name, TLAll, VSize2>,
1058 GenericType<"TLAll" # VSize2.Name, TLAll, VSize2>,
1059 GenericType<"TLAllUnsigned" # VSize1.Name, TLAllUnsigned, VSize1>],
1060 Attr.Const>;
Sven van Haastregte54c83e2019-11-26 10:44:49 +00001061 }
1062}
1063
1064//--------------------------------------------------------------------
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001065// OpenCL v1.1 s6.11.3, v1.2 s6.12.14, v2.0 s6.13.14: Image Read and Write Functions
1066// OpenCL Extension v2.0 s5.1.8 and s6.1.8: Image Read and Write Functions
1067// --- Table 22: Image Read Functions with Samplers ---
1068foreach imgTy = [Image1d] in {
1069 foreach coordTy = [Int, Float] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001070 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>;
1071 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>;
1072 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, coordTy], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001073 }
1074}
1075foreach imgTy = [Image2d, Image1dArray] in {
1076 foreach coordTy = [Int, Float] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001077 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
1078 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
1079 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001080 }
1081}
1082foreach imgTy = [Image3d, Image2dArray] in {
1083 foreach coordTy = [Int, Float] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001084 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
1085 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
1086 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001087 }
1088}
1089foreach coordTy = [Int, Float] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001090 def : Builtin<"read_imagef", [Float, ImageType<Image2dDepth, "RO">, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
1091 def : Builtin<"read_imagef", [Float, ImageType<Image2dArrayDepth, "RO">, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001092}
1093
1094// --- Table 23: Sampler-less Read Functions ---
1095foreach aQual = ["RO", "RW"] in {
1096 foreach imgTy = [Image2d, Image1dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001097 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
1098 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
1099 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001100 }
1101 foreach imgTy = [Image3d, Image2dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001102 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
1103 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
1104 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001105 }
1106 foreach imgTy = [Image1d, Image1dBuffer] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001107 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
1108 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
1109 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001110 }
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001111 def : Builtin<"read_imagef", [Float, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>], Attr.Pure>;
1112 def : Builtin<"read_imagef", [Float, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001113}
1114
1115// --- Table 24: Image Write Functions ---
1116foreach aQual = ["WO", "RW"] in {
1117 foreach imgTy = [Image2d] in {
1118 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Float, 4>]>;
1119 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Int, 4>]>;
1120 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<UInt, 4>]>;
1121 }
1122 foreach imgTy = [Image2dArray] in {
1123 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Float, 4>]>;
1124 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Int, 4>]>;
1125 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<UInt, 4>]>;
1126 }
1127 foreach imgTy = [Image1d, Image1dBuffer] in {
1128 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, Int, VectorType<Float, 4>]>;
1129 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, Int, VectorType<Int, 4>]>;
1130 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, Int, VectorType<UInt, 4>]>;
1131 }
1132 foreach imgTy = [Image1dArray] in {
1133 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Float, 4>]>;
1134 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<Int, 4>]>;
1135 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, VectorType<UInt, 4>]>;
1136 }
1137 foreach imgTy = [Image3d] in {
1138 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Float, 4>]>;
1139 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<Int, 4>]>;
1140 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, VectorType<UInt, 4>]>;
1141 }
1142 def : Builtin<"write_imagef", [Void, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>, Float]>;
1143 def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Float]>;
1144}
1145
Sven van Haastregt2a69ed02019-09-25 09:12:59 +00001146// --- Table 25: Image Query Functions ---
1147foreach aQual = ["RO", "WO", "RW"] in {
1148 foreach imgTy = [Image1d, Image1dBuffer, Image2d, Image3d,
1149 Image1dArray, Image2dArray, Image2dDepth,
1150 Image2dArrayDepth] in {
1151 foreach name = ["get_image_width", "get_image_channel_data_type",
1152 "get_image_channel_order"] in {
1153 def : Builtin<name, [Int, ImageType<imgTy, aQual>]>;
1154 }
1155 }
1156 foreach imgTy = [Image2d, Image3d, Image2dArray, Image2dDepth,
1157 Image2dArrayDepth] in {
1158 def : Builtin<"get_image_height", [Int, ImageType<imgTy, aQual>]>;
1159 }
1160 def : Builtin<"get_image_depth", [Int, ImageType<Image3d, aQual>]>;
1161 foreach imgTy = [Image2d, Image2dArray, Image2dDepth,
1162 Image2dArrayDepth] in {
1163 def : Builtin<"get_image_dim", [VectorType<Int, 2>, ImageType<imgTy, aQual>]>;
1164 }
1165 def : Builtin<"get_image_dim", [VectorType<Int, 4>, ImageType<Image3d, aQual>]>;
1166 foreach imgTy = [Image1dArray, Image2dArray, Image2dArrayDepth] in {
1167 def : Builtin<"get_image_array_size", [Size, ImageType<imgTy, aQual>]>;
1168 }
1169}
1170
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001171// OpenCL extension v2.0 s5.1.9: Built-in Image Read Functions
1172// --- Table 8 ---
1173foreach aQual = ["RO"] in {
1174 foreach name = ["read_imageh"] in {
1175 foreach coordTy = [Int, Float] in {
1176 foreach imgTy = [Image2d, Image1dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001177 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 2>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001178 }
1179 foreach imgTy = [Image3d, Image2dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001180 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<coordTy, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001181 }
1182 foreach imgTy = [Image1d] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001183 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Sampler, coordTy], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001184 }
1185 }
1186 }
1187}
1188// OpenCL extension v2.0 s5.1.10: Built-in Image Sampler-less Read Functions
1189// --- Table 9 ---
1190foreach aQual = ["RO", "RW"] in {
1191 foreach name = ["read_imageh"] in {
1192 foreach imgTy = [Image2d, Image1dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001193 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001194 }
1195 foreach imgTy = [Image3d, Image2dArray] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001196 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001197 }
1198 foreach imgTy = [Image1d, Image1dBuffer] in {
Sven van Haastregt9a8d4772019-11-05 10:07:43 +00001199 def : Builtin<name, [VectorType<Half, 4>, ImageType<imgTy, aQual>, Int], Attr.Pure>;
Sven van Haastregt988f1e32019-09-05 10:01:24 +00001200 }
1201 }
1202}
1203// OpenCL extension v2.0 s5.1.11: Built-in Image Write Functions
1204// --- Table 10 ---
1205foreach aQual = ["WO", "RW"] in {
1206 foreach name = ["write_imageh"] in {
1207 def : Builtin<name, [Void, ImageType<Image2d, aQual>, VectorType<Int, 2>, VectorType<Half, 4>]>;
1208 def : Builtin<name, [Void, ImageType<Image2dArray, aQual>, VectorType<Int, 4>, VectorType<Half, 4>]>;
1209 def : Builtin<name, [Void, ImageType<Image1d, aQual>, Int, VectorType<Half, 4>]>;
1210 def : Builtin<name, [Void, ImageType<Image1dBuffer, aQual>, Int, VectorType<Half, 4>]>;
1211 def : Builtin<name, [Void, ImageType<Image1dArray, aQual>, VectorType<Int, 2>, VectorType<Half, 4>]>;
1212 def : Builtin<name, [Void, ImageType<Image3d, aQual>, VectorType<Int, 4>, VectorType<Half, 4>]>;
1213 }
1214}
Sven van Haastregt79a222f2019-06-03 09:39:11 +00001215
1216
Sven van Haastregte54c83e2019-11-26 10:44:49 +00001217//--------------------------------------------------------------------
1218// OpenCL v2.0 s6.13.15 - Work-group Functions
1219// --- Table 26 ---
1220let MinVersion = CL20 in {
1221 foreach name = ["work_group_all", "work_group_any"] in {
1222 def : Builtin<name, [Int, Int], Attr.Convergent>;
1223 }
1224 foreach name = ["work_group_broadcast"] in {
1225 def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size], Attr.Convergent>;
1226 def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size, Size], Attr.Convergent>;
1227 def : Builtin<name, [IntLongFloatGenType1, IntLongFloatGenType1, Size, Size, Size], Attr.Convergent>;
1228 }
1229 foreach op = ["add", "min", "max"] in {
1230 foreach name = ["work_group_reduce_", "work_group_scan_exclusive_",
1231 "work_group_scan_inclusive_"] in {
1232 def : Builtin<name # op, [IntLongFloatGenType1, IntLongFloatGenType1], Attr.Convergent>;
1233 }
1234 }
1235}
1236
1237
Sven van Haastregt211ba002020-03-17 13:15:32 +00001238//--------------------------------------------------------------------
1239// OpenCL2.0 : 6.13.16 : Pipe Functions
1240// --- Table 27 ---
1241// Defined in Builtins.def
1242
1243// --- Table 28 ---
1244// Builtins taking pipe arguments are defined in Builtins.def
1245def : Builtin<"is_valid_reserve_id", [Bool, ReserveId]>;
1246
1247// --- Table 29 ---
1248// Defined in Builtins.def
1249
1250
1251//--------------------------------------------------------------------
1252// OpenCL2.0 : 6.13.17 : Enqueuing Kernels
1253// --- Table 30 ---
1254// Defined in Builtins.def
1255
1256// --- Table 32 ---
1257// Defined in Builtins.def
1258
1259// --- Table 33 ---
1260def : Builtin<"enqueue_marker",
1261 [Int, Queue, UInt, PointerType<ConstType<ClkEvent>, GenericAS>, PointerType<ClkEvent, GenericAS>]>;
1262
1263// --- Table 34 ---
1264def : Builtin<"retain_event", [Void, ClkEvent]>;
1265def : Builtin<"release_event", [Void, ClkEvent]>;
1266def : Builtin<"create_user_event", [ClkEvent]>;
1267def : Builtin<"is_valid_event", [Bool, ClkEvent]>;
1268def : Builtin<"set_user_event_status", [Void, ClkEvent, Int]>;
1269// TODO: capture_event_profiling_info
1270
1271// --- Table 35 ---
1272def : Builtin<"get_default_queue", [Queue]>;
1273// TODO: ndrange functions
1274
1275
Sven van Haastregt79a222f2019-06-03 09:39:11 +00001276// OpenCL v2.0 s9.17.3: Additions to section 6.13.1: Work-Item Functions
Sven van Haastregted69faa2019-09-19 13:41:51 +00001277let MinVersion = CL20 in {
Sven van Haastregt308b8b72019-12-18 10:13:51 +00001278 let Extension = FuncExtKhrSubgroups in {
Sven van Haastregt89fb9e82019-07-29 14:55:29 +00001279 def get_sub_group_size : Builtin<"get_sub_group_size", [UInt]>;
1280 def get_max_sub_group_size : Builtin<"get_max_sub_group_size", [UInt]>;
1281 def get_num_sub_groups : Builtin<"get_num_sub_groups", [UInt]>;
Sven van Haastregt79a222f2019-06-03 09:39:11 +00001282 }
1283}
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001284
1285//--------------------------------------------------------------------
1286// End of the builtin functions defined in the OpenCL C specification.
1287// Builtin functions defined in the OpenCL C Extension are below.
1288//--------------------------------------------------------------------
1289
1290
1291// OpenCL Extension v2.0 s9.18 - Mipmaps
1292let Extension = FuncExtKhrMipmapImage in {
1293 // Added to section 6.13.14.2.
1294 foreach aQual = ["RO"] in {
1295 foreach imgTy = [Image2d] in {
1296 foreach name = ["read_imagef"] in {
1297 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
1298 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1299 }
1300 foreach name = ["read_imagei"] in {
1301 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
1302 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1303 }
1304 foreach name = ["read_imageui"] in {
1305 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
1306 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1307 }
1308 }
1309 foreach imgTy = [Image2dDepth] in {
1310 foreach name = ["read_imagef"] in {
1311 def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
1312 def : Builtin<name, [Float, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1313 }
1314 }
1315 foreach imgTy = [Image1d] in {
1316 foreach name = ["read_imagef"] in {
1317 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>;
1318 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>;
1319 }
1320 foreach name = ["read_imagei"] in {
1321 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>;
1322 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>;
1323 }
1324 foreach name = ["read_imageui"] in {
1325 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float], Attr.Pure>;
1326 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, Float, Float, Float], Attr.Pure>;
1327 }
1328 }
1329 foreach imgTy = [Image3d] in {
1330 foreach name = ["read_imagef"] in {
1331 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>;
1332 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
1333 }
1334 foreach name = ["read_imagei"] in {
1335 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>;
1336 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
1337 }
1338 foreach name = ["read_imageui"] in {
1339 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 4>, VectorType<Float, 4>], Attr.Pure>;
1340 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
1341 }
1342 }
1343 foreach imgTy = [Image1dArray] in {
1344 foreach name = ["read_imagef"] in {
1345 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
1346 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>;
1347 }
1348 foreach name = ["read_imagei"] in {
1349 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
1350 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>;
1351 }
1352 foreach name = ["read_imageui"] in {
1353 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float], Attr.Pure>;
1354 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 2>, Float, Float], Attr.Pure>;
1355 }
1356 }
1357 foreach imgTy = [Image2dArray] in {
1358 foreach name = ["read_imagef"] in {
1359 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
1360 def : Builtin<name, [VectorType<Float, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1361 }
1362 foreach name = ["read_imagei"] in {
1363 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
1364 def : Builtin<name, [VectorType<Int, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1365 }
1366 foreach name = ["read_imageui"] in {
1367 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
1368 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1369 }
1370 }
1371 foreach imgTy = [Image2dArrayDepth] in {
1372 foreach name = ["read_imagef"] in {
1373 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, Float], Attr.Pure>;
1374 def : Builtin<name, [VectorType<UInt, 4>, ImageType<imgTy, aQual>, Sampler, VectorType<Float, 4>, VectorType<Float, 2>, VectorType<Float, 2>], Attr.Pure>;
1375 }
1376 }
1377 }
Sven van Haastregt91b30832020-02-05 16:05:20 +00001378 // Added to section 6.13.14.5
1379 foreach aQual = ["RO", "WO", "RW"] in {
1380 foreach imgTy = [Image1d, Image2d, Image3d, Image1dArray, Image2dArray, Image2dDepth, Image2dArrayDepth] in {
1381 def : Builtin<"get_image_num_mip_levels", [Int, ImageType<imgTy, aQual>]>;
1382 }
1383 }
1384}
1385
1386// Write functions are enabled using a separate extension.
1387let Extension = FuncExtKhrMipmapImageWrites in {
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001388 // Added to section 6.13.14.4.
1389 foreach aQual = ["WO"] in {
1390 foreach imgTy = [Image2d] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001391 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Float, 4>]>;
1392 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Int, 4>]>;
1393 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<UInt, 4>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001394 }
Sven van Haastregtff429c52019-12-31 15:30:02 +00001395 def : Builtin<"write_imagef", [Void, ImageType<Image2dDepth, aQual>, VectorType<Int, 2>, Int, Float]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001396 foreach imgTy = [Image1d] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001397 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<Float, 4>]>;
1398 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<Int, 4>]>;
1399 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, Int, Int, VectorType<UInt, 4>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001400 }
1401 foreach imgTy = [Image1dArray] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001402 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Float, 4>]>;
1403 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<Int, 4>]>;
1404 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int, VectorType<UInt, 4>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001405 }
1406 foreach imgTy = [Image2dArray] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001407 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Float, 4>]>;
1408 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Int, 4>]>;
1409 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<UInt, 4>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001410 }
Sven van Haastregtff429c52019-12-31 15:30:02 +00001411 def : Builtin<"write_imagef", [Void, ImageType<Image2dArrayDepth, aQual>, VectorType<Int, 4>, Int, Float]>;
Sven van Haastregt91b30832020-02-05 16:05:20 +00001412 let Extension = FuncExtKhrMipmapWritesAndWrite3d in {
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001413 foreach imgTy = [Image3d] in {
Sven van Haastregtff429c52019-12-31 15:30:02 +00001414 def : Builtin<"write_imagef", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Float, 4>]>;
1415 def : Builtin<"write_imagei", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<Int, 4>]>;
1416 def : Builtin<"write_imageui", [Void, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int, VectorType<UInt, 4>]>;
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001417 }
1418 }
1419 }
Sven van Haastregt4a188fd2019-12-30 10:47:58 +00001420}
Sven van Haastregt92451f02020-01-14 14:46:42 +00001421
Sven van Haastregt92451f02020-01-14 14:46:42 +00001422//--------------------------------------------------------------------
1423// OpenCL Extension v2.0 s18.3 - Creating OpenCL Memory Objects from OpenGL MSAA Textures
1424let Extension = FuncExtKhrGlMsaaSharing in {
1425 // --- Table 6.13.14.3 ---
1426 foreach aQual = ["RO", "RW"] in {
1427 foreach imgTy = [Image2dMsaa] in {
1428 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
1429 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
1430 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
1431 }
1432 foreach imgTy = [Image2dArrayMsaa] in {
1433 def : Builtin<"read_imagef", [VectorType<Float, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
1434 def : Builtin<"read_imagei", [VectorType<Int, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
1435 def : Builtin<"read_imageui", [VectorType<UInt, 4>, ImageType<imgTy, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
1436 }
1437 foreach name = ["read_imagef"] in {
1438 def : Builtin<name, [Float, ImageType<Image2dMsaaDepth, aQual>, VectorType<Int, 2>, Int], Attr.Pure>;
1439 def : Builtin<name, [Float, ImageType<Image2dArrayMsaaDepth, aQual>, VectorType<Int, 4>, Int], Attr.Pure>;
1440 }
1441 }
1442
1443 // --- Table 6.13.14.5 ---
1444 foreach aQual = ["RO", "WO", "RW"] in {
1445 foreach imgTy = [Image2dMsaa, Image2dArrayMsaa, Image2dMsaaDepth, Image2dArrayMsaaDepth] in {
1446 foreach name = ["get_image_width", "get_image_height",
1447 "get_image_channel_data_type", "get_image_channel_order",
1448 "get_image_num_samples"] in {
1449 def : Builtin<name, [Int, ImageType<imgTy, aQual>], Attr.Const>;
1450 }
1451 def : Builtin<"get_image_dim", [VectorType<Int, 2>, ImageType<imgTy, aQual>], Attr.Const>;
1452 }
Sven van Haastregt592cec72020-03-12 13:43:51 +00001453 foreach imgTy = [Image2dArrayMsaa, Image2dArrayMsaaDepth] in {
1454 def : Builtin<"get_image_array_size", [Size, ImageType<imgTy, aQual>], Attr.Const>;
1455 }
Sven van Haastregt92451f02020-01-14 14:46:42 +00001456 }
1457}
Sven van Haastregt8b65f792020-02-18 10:02:06 +00001458
1459//--------------------------------------------------------------------
1460// Arm extensions.
1461let Extension = ArmIntegerDotProductInt8 in {
1462 foreach name = ["arm_dot"] in {
1463 def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>]>;
1464 def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>]>;
1465 }
1466}
1467let Extension = ArmIntegerDotProductAccumulateInt8 in {
1468 foreach name = ["arm_dot_acc"] in {
1469 def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>, UInt]>;
1470 def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>, Int]>;
1471 }
1472}
1473let Extension = ArmIntegerDotProductAccumulateInt16 in {
1474 foreach name = ["arm_dot_acc"] in {
1475 def : Builtin<name, [UInt, VectorType<UShort, 2>, VectorType<UShort, 2>, UInt]>;
1476 def : Builtin<name, [Int, VectorType<Short, 2>, VectorType<Short, 2>, Int]>;
1477 }
1478}
1479let Extension = ArmIntegerDotProductAccumulateSaturateInt8 in {
1480 foreach name = ["arm_dot_acc_sat"] in {
1481 def : Builtin<name, [UInt, VectorType<UChar, 4>, VectorType<UChar, 4>, UInt]>;
1482 def : Builtin<name, [Int, VectorType<Char, 4>, VectorType<Char, 4>, Int]>;
1483 }
1484}