1bdd1243dSDimitry Andric//===-- SPIRVBuiltins.td - Describe SPIRV Builtins ---------*- tablegen -*-===// 2bdd1243dSDimitry Andric // 3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bdd1243dSDimitry Andric // 7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8bdd1243dSDimitry Andric // 9bdd1243dSDimitry Andric // TableGen records defining implementation details of demangled builtin 10bdd1243dSDimitry Andric // functions and types. 11bdd1243dSDimitry Andric // 12bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 13bdd1243dSDimitry Andric 14bdd1243dSDimitry Andric// Define SPIR-V external builtin/instruction sets 15bdd1243dSDimitry Andricdef InstructionSet : GenericEnum { 16bdd1243dSDimitry Andric let FilterClass = "InstructionSet"; 17bdd1243dSDimitry Andric let NameField = "Name"; 18bdd1243dSDimitry Andric let ValueField = "Value"; 19bdd1243dSDimitry Andric} 20bdd1243dSDimitry Andric 21bdd1243dSDimitry Andricclass InstructionSet<bits<32> value> { 22bdd1243dSDimitry Andric string Name = NAME; 23bdd1243dSDimitry Andric bits<32> Value = value; 24bdd1243dSDimitry Andric} 25bdd1243dSDimitry Andric 26bdd1243dSDimitry Andricdef OpenCL_std : InstructionSet<0>; 27bdd1243dSDimitry Andricdef GLSL_std_450 : InstructionSet<1>; 28bdd1243dSDimitry Andricdef SPV_AMD_shader_trinary_minmax : InstructionSet<2>; 29*0fca6ea1SDimitry Andricdef NonSemantic_Shader_DebugInfo_100 : InstructionSet<3>; 30bdd1243dSDimitry Andric 31bdd1243dSDimitry Andric// Define various builtin groups 32bdd1243dSDimitry Andricdef BuiltinGroup : GenericEnum { 33bdd1243dSDimitry Andric let FilterClass = "BuiltinGroup"; 34bdd1243dSDimitry Andric} 35bdd1243dSDimitry Andric 36bdd1243dSDimitry Andricclass BuiltinGroup; 37bdd1243dSDimitry Andric 38bdd1243dSDimitry Andricdef Extended : BuiltinGroup; 39bdd1243dSDimitry Andricdef Relational : BuiltinGroup; 40bdd1243dSDimitry Andricdef Group : BuiltinGroup; 41bdd1243dSDimitry Andricdef Variable : BuiltinGroup; 42bdd1243dSDimitry Andricdef Atomic : BuiltinGroup; 43bdd1243dSDimitry Andricdef Barrier : BuiltinGroup; 44bdd1243dSDimitry Andricdef Dot : BuiltinGroup; 45*0fca6ea1SDimitry Andricdef Wave : BuiltinGroup; 46bdd1243dSDimitry Andricdef GetQuery : BuiltinGroup; 47bdd1243dSDimitry Andricdef ImageSizeQuery : BuiltinGroup; 48bdd1243dSDimitry Andricdef ImageMiscQuery : BuiltinGroup; 49bdd1243dSDimitry Andricdef Convert : BuiltinGroup; 50bdd1243dSDimitry Andricdef ReadImage : BuiltinGroup; 51bdd1243dSDimitry Andricdef WriteImage : BuiltinGroup; 52bdd1243dSDimitry Andricdef SampleImage : BuiltinGroup; 53bdd1243dSDimitry Andricdef Select : BuiltinGroup; 54bdd1243dSDimitry Andricdef SpecConstant : BuiltinGroup; 55bdd1243dSDimitry Andricdef Enqueue : BuiltinGroup; 56bdd1243dSDimitry Andricdef AsyncCopy : BuiltinGroup; 57bdd1243dSDimitry Andricdef VectorLoadStore : BuiltinGroup; 58bdd1243dSDimitry Andricdef LoadStore : BuiltinGroup; 59*0fca6ea1SDimitry Andricdef IntelSubgroups : BuiltinGroup; 60*0fca6ea1SDimitry Andricdef AtomicFloating : BuiltinGroup; 61*0fca6ea1SDimitry Andricdef GroupUniform : BuiltinGroup; 62*0fca6ea1SDimitry Andricdef KernelClock : BuiltinGroup; 63*0fca6ea1SDimitry Andricdef CastToPtr : BuiltinGroup; 64*0fca6ea1SDimitry Andricdef Construct : BuiltinGroup; 65*0fca6ea1SDimitry Andricdef CoopMatr : BuiltinGroup; 66bdd1243dSDimitry Andric 67bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 68bdd1243dSDimitry Andric// Class defining a demangled builtin record. The information in the record 69bdd1243dSDimitry Andric// should be used to expand the builtin into either native SPIR-V instructions 70bdd1243dSDimitry Andric// or an external call (in case of builtins without a direct mapping). 71bdd1243dSDimitry Andric// 72bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 73bdd1243dSDimitry Andric// set specifies which external instruction set the builtin belongs to. 74bdd1243dSDimitry Andric// group specifies to which implementation group given record belongs. 75bdd1243dSDimitry Andric// minNumArgs is the minimum required number of arguments for lowering. 76bdd1243dSDimitry Andric// maxNumArgs specifies the maximum used number of arguments for lowering. 77bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 78bdd1243dSDimitry Andricclass DemangledBuiltin<string name, InstructionSet set, BuiltinGroup group, bits<8> minNumArgs, bits<8> maxNumArgs> { 79bdd1243dSDimitry Andric string Name = name; 80bdd1243dSDimitry Andric InstructionSet Set = set; 81bdd1243dSDimitry Andric BuiltinGroup Group = group; 82bdd1243dSDimitry Andric bits<8> MinNumArgs = minNumArgs; 83bdd1243dSDimitry Andric bits<8> MaxNumArgs = maxNumArgs; 84bdd1243dSDimitry Andric} 85bdd1243dSDimitry Andric 86bdd1243dSDimitry Andric// Table gathering all the builtins. 87bdd1243dSDimitry Andricdef DemangledBuiltins : GenericTable { 88bdd1243dSDimitry Andric let FilterClass = "DemangledBuiltin"; 89bdd1243dSDimitry Andric let Fields = ["Name", "Set", "Group", "MinNumArgs", "MaxNumArgs"]; 90bdd1243dSDimitry Andric string TypeOf_Set = "InstructionSet"; 91bdd1243dSDimitry Andric string TypeOf_Group = "BuiltinGroup"; 92bdd1243dSDimitry Andric} 93bdd1243dSDimitry Andric 94bdd1243dSDimitry Andric// Function to lookup builtins by their demangled name and set. 95bdd1243dSDimitry Andricdef lookupBuiltin : SearchIndex { 96bdd1243dSDimitry Andric let Table = DemangledBuiltins; 97bdd1243dSDimitry Andric let Key = ["Name", "Set"]; 98bdd1243dSDimitry Andric} 99bdd1243dSDimitry Andric 100bdd1243dSDimitry Andric// Dot builtin record: 101bdd1243dSDimitry Andricdef : DemangledBuiltin<"dot", OpenCL_std, Dot, 2, 2>; 102*0fca6ea1SDimitry Andricdef : DemangledBuiltin<"__spirv_Dot", OpenCL_std, Dot, 2, 2>; 103bdd1243dSDimitry Andric 104bdd1243dSDimitry Andric// Image builtin records: 105bdd1243dSDimitry Andricdef : DemangledBuiltin<"read_imagei", OpenCL_std, ReadImage, 2, 4>; 106bdd1243dSDimitry Andricdef : DemangledBuiltin<"read_imageui", OpenCL_std, ReadImage, 2, 4>; 107bdd1243dSDimitry Andricdef : DemangledBuiltin<"read_imagef", OpenCL_std, ReadImage, 2, 4>; 108bdd1243dSDimitry Andric 109bdd1243dSDimitry Andricdef : DemangledBuiltin<"write_imagef", OpenCL_std, WriteImage, 3, 4>; 110bdd1243dSDimitry Andricdef : DemangledBuiltin<"write_imagei", OpenCL_std, WriteImage, 3, 4>; 111bdd1243dSDimitry Andricdef : DemangledBuiltin<"write_imageui", OpenCL_std, WriteImage, 3, 4>; 112bdd1243dSDimitry Andricdef : DemangledBuiltin<"write_imageh", OpenCL_std, WriteImage, 3, 4>; 113bdd1243dSDimitry Andric 114bdd1243dSDimitry Andricdef : DemangledBuiltin<"__translate_sampler_initializer", OpenCL_std, SampleImage, 1, 1>; 115bdd1243dSDimitry Andricdef : DemangledBuiltin<"__spirv_SampledImage", OpenCL_std, SampleImage, 2, 2>; 116bdd1243dSDimitry Andricdef : DemangledBuiltin<"__spirv_ImageSampleExplicitLod", OpenCL_std, SampleImage, 3, 4>; 117bdd1243dSDimitry Andric 118bdd1243dSDimitry Andric// Select builtin record: 119bdd1243dSDimitry Andricdef : DemangledBuiltin<"__spirv_Select", OpenCL_std, Select, 3, 3>; 120bdd1243dSDimitry Andric 121*0fca6ea1SDimitry Andric// Composite Construct builtin record: 122*0fca6ea1SDimitry Andricdef : DemangledBuiltin<"__spirv_CompositeConstruct", OpenCL_std, Construct, 1, 0>; 123*0fca6ea1SDimitry Andric 124bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 125bdd1243dSDimitry Andric// Class defining an extended builtin record used for lowering into an 126bdd1243dSDimitry Andric// OpExtInst instruction. 127bdd1243dSDimitry Andric// 128bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 129bdd1243dSDimitry Andric// set specifies which external instruction set the builtin belongs to. 130bdd1243dSDimitry Andric// number specifies the number of the instruction in the external set. 131bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 132bdd1243dSDimitry Andricclass ExtendedBuiltin<string name, InstructionSet set, int number> { 133bdd1243dSDimitry Andric string Name = name; 134bdd1243dSDimitry Andric InstructionSet Set = set; 135bdd1243dSDimitry Andric bits<32> Number = number; 136bdd1243dSDimitry Andric} 137bdd1243dSDimitry Andric 138bdd1243dSDimitry Andric// Table gathering all the extended builtins. 139bdd1243dSDimitry Andricdef ExtendedBuiltins : GenericTable { 140bdd1243dSDimitry Andric let FilterClass = "ExtendedBuiltin"; 141bdd1243dSDimitry Andric let Fields = ["Name", "Set", "Number"]; 142bdd1243dSDimitry Andric string TypeOf_Set = "InstructionSet"; 143bdd1243dSDimitry Andric} 144bdd1243dSDimitry Andric 145bdd1243dSDimitry Andric// Function to lookup extended builtins by their name and set. 146bdd1243dSDimitry Andricdef lookupExtendedBuiltin : SearchIndex { 147bdd1243dSDimitry Andric let Table = ExtendedBuiltins; 148bdd1243dSDimitry Andric let Key = ["Name", "Set"]; 149bdd1243dSDimitry Andric} 150bdd1243dSDimitry Andric 151bdd1243dSDimitry Andric// Function to lookup extended builtins by their set and number. 152bdd1243dSDimitry Andricdef lookupExtendedBuiltinBySetAndNumber : SearchIndex { 153bdd1243dSDimitry Andric let Table = ExtendedBuiltins; 154bdd1243dSDimitry Andric let Key = ["Set", "Number"]; 155bdd1243dSDimitry Andric} 156bdd1243dSDimitry Andric 157bdd1243dSDimitry Andric// OpenCL extended instruction enums 158bdd1243dSDimitry Andricdef OpenCLExtInst : GenericEnum { 159bdd1243dSDimitry Andric let FilterClass = "OpenCLExtInst"; 160bdd1243dSDimitry Andric let NameField = "Name"; 161bdd1243dSDimitry Andric let ValueField = "Value"; 162bdd1243dSDimitry Andric} 163bdd1243dSDimitry Andric 164bdd1243dSDimitry Andricclass OpenCLExtInst<string name, bits<32> value> { 165bdd1243dSDimitry Andric string Name = name; 166bdd1243dSDimitry Andric bits<32> Value = value; 167bdd1243dSDimitry Andric} 168bdd1243dSDimitry Andric 169bdd1243dSDimitry Andric// GLSL extended instruction enums 170bdd1243dSDimitry Andricdef GLSLExtInst : GenericEnum { 171bdd1243dSDimitry Andric let FilterClass = "GLSLExtInst"; 172bdd1243dSDimitry Andric let NameField = "Name"; 173bdd1243dSDimitry Andric let ValueField = "Value"; 174bdd1243dSDimitry Andric} 175bdd1243dSDimitry Andric 176bdd1243dSDimitry Andricclass GLSLExtInst<string name, bits<32> value> { 177bdd1243dSDimitry Andric string Name = name; 178bdd1243dSDimitry Andric bits<32> Value = value; 179bdd1243dSDimitry Andric} 180bdd1243dSDimitry Andric 181*0fca6ea1SDimitry Andricdef NonSemanticExtInst : GenericEnum { 182*0fca6ea1SDimitry Andric let FilterClass = "NonSemanticExtInst"; 183*0fca6ea1SDimitry Andric let NameField = "Name"; 184*0fca6ea1SDimitry Andric let ValueField = "Value"; 185*0fca6ea1SDimitry Andric} 186*0fca6ea1SDimitry Andric 187*0fca6ea1SDimitry Andricclass NonSemanticExtInst<string name, bits<32> value> { 188*0fca6ea1SDimitry Andric string Name = name; 189*0fca6ea1SDimitry Andric bits<32> Value = value; 190*0fca6ea1SDimitry Andric} 191*0fca6ea1SDimitry Andric 192bdd1243dSDimitry Andric// Multiclass used to define at the same time both a demangled builtin record 193bdd1243dSDimitry Andric// and a corresponding extended builtin record. 194bdd1243dSDimitry Andricmulticlass DemangledExtendedBuiltin<string name, InstructionSet set, int number> { 195bdd1243dSDimitry Andric def : DemangledBuiltin<name, set, Extended, 1, 3>; 196bdd1243dSDimitry Andric def : ExtendedBuiltin<name, set, number>; 197bdd1243dSDimitry Andric 198bdd1243dSDimitry Andric if !eq(set, OpenCL_std) then { 199bdd1243dSDimitry Andric def : OpenCLExtInst<name, number>; 200bdd1243dSDimitry Andric } 201bdd1243dSDimitry Andric 202bdd1243dSDimitry Andric if !eq(set, GLSL_std_450) then { 203bdd1243dSDimitry Andric def : GLSLExtInst<name, number>; 204bdd1243dSDimitry Andric } 205*0fca6ea1SDimitry Andric 206*0fca6ea1SDimitry Andric if !eq(set, NonSemantic_Shader_DebugInfo_100) then { 207*0fca6ea1SDimitry Andric def : NonSemanticExtInst<name, number>; 208*0fca6ea1SDimitry Andric } 209bdd1243dSDimitry Andric} 210bdd1243dSDimitry Andric 211bdd1243dSDimitry Andric// Extended builtin records: 212bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"acos", OpenCL_std, 0>; 213bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"acosh", OpenCL_std, 1>; 214bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"acospi", OpenCL_std, 2>; 215bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"asin", OpenCL_std, 3>; 216bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"asinh", OpenCL_std, 4>; 217bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"asinpi", OpenCL_std, 5>; 218bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"atan", OpenCL_std, 6>; 219bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"atan2", OpenCL_std, 7>; 220bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"atanh", OpenCL_std, 8>; 221bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"atanpi", OpenCL_std, 9>; 222bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"atan2pi", OpenCL_std, 10>; 223bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"cbrt", OpenCL_std, 11>; 224bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"ceil", OpenCL_std, 12>; 225bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"copysign", OpenCL_std, 13>; 226bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"cos", OpenCL_std, 14>; 227bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"cosh", OpenCL_std, 15>; 228bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"cospi", OpenCL_std, 16>; 229bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"erfc", OpenCL_std, 17>; 230bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"erf", OpenCL_std, 18>; 231bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"exp", OpenCL_std, 19>; 232bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"exp2", OpenCL_std, 20>; 233bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"exp10", OpenCL_std, 21>; 234bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"expm1", OpenCL_std, 22>; 235bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fabs", OpenCL_std, 23>; 236bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fdim", OpenCL_std, 24>; 237bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"floor", OpenCL_std, 25>; 238bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fma", OpenCL_std, 26>; 239bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fmax", OpenCL_std, 27>; 240bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fmin", OpenCL_std, 28>; 241bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fmod", OpenCL_std, 29>; 242bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fract", OpenCL_std, 30>; 243bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"frexp", OpenCL_std, 31>; 244bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"hypot", OpenCL_std, 32>; 245bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"ilogb", OpenCL_std, 33>; 246bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"ldexp", OpenCL_std, 34>; 247bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"lgamma", OpenCL_std, 35>; 248bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"lgamma_r", OpenCL_std, 36>; 249bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"log", OpenCL_std, 37>; 250bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"log2", OpenCL_std, 38>; 251bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"log10", OpenCL_std, 39>; 252bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"log1p", OpenCL_std, 40>; 253bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"logb", OpenCL_std, 41>; 254bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"mad", OpenCL_std, 42>; 255bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"maxmag", OpenCL_std, 43>; 256bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"minmag", OpenCL_std, 44>; 257bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"modf", OpenCL_std, 45>; 258bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"nan", OpenCL_std, 46>; 259bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"nextafter", OpenCL_std, 47>; 260bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"pow", OpenCL_std, 48>; 261bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"pown", OpenCL_std, 49>; 262bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"powr", OpenCL_std, 50>; 263bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"remainder", OpenCL_std, 51>; 264bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"remquo", OpenCL_std, 52>; 265bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"rint", OpenCL_std, 53>; 266bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"rootn", OpenCL_std, 54>; 267bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"round", OpenCL_std, 55>; 268bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"rsqrt", OpenCL_std, 56>; 269bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"sin", OpenCL_std, 57>; 270bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"sincos", OpenCL_std, 58>; 271bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"sinh", OpenCL_std, 59>; 272bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"sinpi", OpenCL_std, 60>; 273bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"sqrt", OpenCL_std, 61>; 274bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"tan", OpenCL_std, 62>; 275bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"tanh", OpenCL_std, 63>; 276bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"tanpi", OpenCL_std, 64>; 277bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"tgamma", OpenCL_std, 65>; 278bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"trunc", OpenCL_std, 66>; 279bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_cos", OpenCL_std, 67>; 280bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_divide", OpenCL_std, 68>; 281bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_exp", OpenCL_std, 69>; 282bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_exp2", OpenCL_std, 70>; 283bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_exp10", OpenCL_std, 71>; 284bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_log", OpenCL_std, 72>; 285bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_log2", OpenCL_std, 73>; 286bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_log10", OpenCL_std, 74>; 287bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_powr", OpenCL_std, 75>; 288bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_recip", OpenCL_std, 76>; 289bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_rsqrt", OpenCL_std, 77>; 290bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_sin", OpenCL_std, 78>; 291bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_sqrt", OpenCL_std, 79>; 292bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"half_tan", OpenCL_std, 80>; 293bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_cos", OpenCL_std, 81>; 294bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_divide", OpenCL_std, 82>; 295bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_exp", OpenCL_std, 83>; 296bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_exp2", OpenCL_std, 84>; 297bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_exp10", OpenCL_std, 85>; 298bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_log", OpenCL_std, 86>; 299bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_log2", OpenCL_std, 87>; 300bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_log10", OpenCL_std, 88>; 301bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_powr", OpenCL_std, 89>; 302bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_recip", OpenCL_std, 90>; 303bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_rsqrt", OpenCL_std, 91>; 304bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_sin", OpenCL_std, 92>; 305bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_sqrt", OpenCL_std, 93>; 306bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"native_tan", OpenCL_std, 94>; 307bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_abs", OpenCL_std, 141>; 308bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_abs_diff", OpenCL_std, 142>; 309bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_add_sat", OpenCL_std, 143>; 310bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_add_sat", OpenCL_std, 144>; 311bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_hadd", OpenCL_std, 145>; 312bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_hadd", OpenCL_std, 146>; 313bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_rhadd", OpenCL_std, 147>; 314bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_rhadd", OpenCL_std, 148>; 315bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_clamp", OpenCL_std, 149>; 316bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_clamp", OpenCL_std, 150>; 317bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"clz", OpenCL_std, 151>; 318bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"ctz", OpenCL_std, 152>; 319bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_mad_hi", OpenCL_std, 153>; 320bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_mad_sat", OpenCL_std, 154>; 321bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_mad_sat", OpenCL_std, 155>; 322bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_max", OpenCL_std, 156>; 323bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_max", OpenCL_std, 157>; 324bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_min", OpenCL_std, 158>; 325bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_min", OpenCL_std, 159>; 326bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_mul_hi", OpenCL_std, 160>; 327bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"rotate", OpenCL_std, 161>; 328bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_sub_sat", OpenCL_std, 162>; 329bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_sub_sat", OpenCL_std, 163>; 330bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_upsample", OpenCL_std, 164>; 331bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_upsample", OpenCL_std, 165>; 332bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"popcount", OpenCL_std, 166>; 333bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_mad24", OpenCL_std, 167>; 334bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_mad24", OpenCL_std, 168>; 335bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"s_mul24", OpenCL_std, 169>; 336bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_mul24", OpenCL_std, 170>; 337bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_abs", OpenCL_std, 201>; 338bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_abs_diff", OpenCL_std, 202>; 339bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_mul_hi", OpenCL_std, 203>; 340bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"u_mad_hi", OpenCL_std, 204>; 341bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fclamp", OpenCL_std, 95>; 342bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"degrees", OpenCL_std, 96>; 343bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fmax_common", OpenCL_std, 97>; 344bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fmin_common", OpenCL_std, 98>; 345bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"mix", OpenCL_std, 99>; 346bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"radians", OpenCL_std, 100>; 347bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"step", OpenCL_std, 101>; 348bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"smoothstep", OpenCL_std, 102>; 349bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"sign", OpenCL_std, 103>; 350bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"cross", OpenCL_std, 104>; 351bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"distance", OpenCL_std, 105>; 352bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"length", OpenCL_std, 106>; 353bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"normalize", OpenCL_std, 107>; 354bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fast_distance", OpenCL_std, 108>; 355bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fast_length", OpenCL_std, 109>; 356bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"fast_normalize", OpenCL_std, 110>; 357bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"bitselect", OpenCL_std, 186>; 358bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"select", OpenCL_std, 187>; 359bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vloadn", OpenCL_std, 171>; 360bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vstoren", OpenCL_std, 172>; 361bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vload_half", OpenCL_std, 173>; 362bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vload_halfn", OpenCL_std, 174>; 363bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vstore_half", OpenCL_std, 175>; 364bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vstore_half_r", OpenCL_std, 176>; 365bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vstore_halfn", OpenCL_std, 177>; 366bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vstore_halfn_r", OpenCL_std, 178>; 367bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vloada_halfn", OpenCL_std, 179>; 368bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vstorea_halfn", OpenCL_std, 180>; 369bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"vstorea_halfn_r", OpenCL_std, 181>; 370bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"shuffle", OpenCL_std, 182>; 371bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"shuffle2", OpenCL_std, 183>; 372bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"printf", OpenCL_std, 184>; 373bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"prefetch", OpenCL_std, 185>; 374bdd1243dSDimitry Andric 375bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Round", GLSL_std_450, 1>; 376bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"RoundEven", GLSL_std_450, 2>; 377bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Trunc", GLSL_std_450, 3>; 378bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FAbs", GLSL_std_450, 4>; 379bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"SAbs", GLSL_std_450, 5>; 380bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FSign", GLSL_std_450, 6>; 381bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"SSign", GLSL_std_450, 7>; 382bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Floor", GLSL_std_450, 8>; 383bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Ceil", GLSL_std_450, 9>; 384bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Fract", GLSL_std_450, 10>; 385bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Radians", GLSL_std_450, 11>; 386bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Degrees", GLSL_std_450, 12>; 387bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Sin", GLSL_std_450, 13>; 388bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Cos", GLSL_std_450, 14>; 389bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Tan", GLSL_std_450, 15>; 390bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Asin", GLSL_std_450, 16>; 391bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Acos", GLSL_std_450, 17>; 392bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Atan", GLSL_std_450, 18>; 393bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Sinh", GLSL_std_450, 19>; 394bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Cosh", GLSL_std_450, 20>; 395bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Tanh", GLSL_std_450, 21>; 396bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Asinh", GLSL_std_450, 22>; 397bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Acosh", GLSL_std_450, 23>; 398bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Atanh", GLSL_std_450, 24>; 399bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Atan2", GLSL_std_450, 25>; 400bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Pow", GLSL_std_450, 26>; 401bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Exp", GLSL_std_450, 27>; 402bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Log", GLSL_std_450, 28>; 403bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Exp2", GLSL_std_450, 29>; 404bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Log2", GLSL_std_450, 30>; 405bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Sqrt", GLSL_std_450, 31>; 406bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"InverseSqrt", GLSL_std_450, 32>; 407bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Determinant", GLSL_std_450, 33>; 408bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"MatrixInverse", GLSL_std_450, 34>; 409bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Modf", GLSL_std_450, 35>; 410bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"ModfStruct", GLSL_std_450, 36>; 411bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FMin", GLSL_std_450, 37>; 412bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UMin", GLSL_std_450, 38>; 413bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"SMin", GLSL_std_450, 39>; 414bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FMax", GLSL_std_450, 40>; 415bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UMax", GLSL_std_450, 41>; 416bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"SMax", GLSL_std_450, 42>; 417bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FClamp", GLSL_std_450, 43>; 418bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UClamp", GLSL_std_450, 44>; 419bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"SClamp", GLSL_std_450, 45>; 420bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FMix", GLSL_std_450, 46>; 421bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Step", GLSL_std_450, 48>; 422bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"SmoothStep", GLSL_std_450, 49>; 423bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Fma", GLSL_std_450, 50>; 424bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Frexp", GLSL_std_450, 51>; 425bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FrexpStruct", GLSL_std_450, 52>; 426bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Ldexp", GLSL_std_450, 53>; 427bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"PackSnorm4x8", GLSL_std_450, 54>; 428bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"PackUnorm4x8", GLSL_std_450, 55>; 429bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"PackSnorm2x16", GLSL_std_450, 56>; 430bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"PackUnorm2x16", GLSL_std_450, 57>; 431bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"PackHalf2x16", GLSL_std_450, 58>; 432bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"PackDouble2x32", GLSL_std_450, 59>; 433bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UnpackSnorm2x16", GLSL_std_450, 60>; 434bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UnpackUnorm2x16", GLSL_std_450, 61>; 435bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UnpackHalf2x16", GLSL_std_450, 62>; 436bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UnpackSnorm4x8", GLSL_std_450, 63>; 437bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UnpackUnorm4x8", GLSL_std_450, 64>; 438bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"UnpackDouble2x32", GLSL_std_450, 65>; 439bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Length", GLSL_std_450, 66>; 440bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Distance", GLSL_std_450, 67>; 441bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Cross", GLSL_std_450, 68>; 442bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Normalize", GLSL_std_450, 69>; 443bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FaceForward", GLSL_std_450, 70>; 444bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Reflect", GLSL_std_450, 71>; 445bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"Refract", GLSL_std_450, 72>; 446bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FindILsb", GLSL_std_450, 73>; 447bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FindSMsb", GLSL_std_450, 74>; 448bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"FindUMsb", GLSL_std_450, 75>; 449bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"InterpolateAtCentroid", GLSL_std_450, 76>; 450bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"InterpolateAtSample", GLSL_std_450, 77>; 451bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"InterpolateAtOffset", GLSL_std_450, 78>; 452bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"NMin", GLSL_std_450, 79>; 453bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"NMax", GLSL_std_450, 80>; 454bdd1243dSDimitry Andricdefm : DemangledExtendedBuiltin<"NClamp", GLSL_std_450, 81>; 455bdd1243dSDimitry Andric 456*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugInfoNone", NonSemantic_Shader_DebugInfo_100, 0>; 457*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugCompilationUnit", NonSemantic_Shader_DebugInfo_100, 1>; 458*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeBasic", NonSemantic_Shader_DebugInfo_100, 2>; 459*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypePointer", NonSemantic_Shader_DebugInfo_100, 3>; 460*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeQualifier", NonSemantic_Shader_DebugInfo_100, 4>; 461*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeArray", NonSemantic_Shader_DebugInfo_100, 5>; 462*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeVector", NonSemantic_Shader_DebugInfo_100, 6>; 463*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypedef", NonSemantic_Shader_DebugInfo_100, 7>; 464*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeFunction", NonSemantic_Shader_DebugInfo_100, 8>; 465*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeEnum", NonSemantic_Shader_DebugInfo_100, 9>; 466*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeComposite", NonSemantic_Shader_DebugInfo_100, 10>; 467*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeMember", NonSemantic_Shader_DebugInfo_100, 11>; 468*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeInheritance", NonSemantic_Shader_DebugInfo_100, 12>; 469*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypePtrToMember", NonSemantic_Shader_DebugInfo_100, 13>; 470*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeTemplate", NonSemantic_Shader_DebugInfo_100, 14>; 471*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeTemplateParameter", NonSemantic_Shader_DebugInfo_100, 15>; 472*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeTemplateTemplateParameter", NonSemantic_Shader_DebugInfo_100, 16>; 473*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeTemplateParameterPack", NonSemantic_Shader_DebugInfo_100, 17>; 474*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugGlobalVariable", NonSemantic_Shader_DebugInfo_100, 18>; 475*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugFunctionDeclaration", NonSemantic_Shader_DebugInfo_100, 19>; 476*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugFunction", NonSemantic_Shader_DebugInfo_100, 20>; 477*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugLexicalBlock", NonSemantic_Shader_DebugInfo_100, 21>; 478*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugLexicalBlockDiscriminator", NonSemantic_Shader_DebugInfo_100, 22>; 479*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugScope", NonSemantic_Shader_DebugInfo_100, 23>; 480*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugNoScope", NonSemantic_Shader_DebugInfo_100, 24>; 481*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugInlinedAt", NonSemantic_Shader_DebugInfo_100, 25>; 482*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugLocalVariable", NonSemantic_Shader_DebugInfo_100, 26>; 483*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugInlinedVariable", NonSemantic_Shader_DebugInfo_100, 27>; 484*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugDeclare", NonSemantic_Shader_DebugInfo_100, 28>; 485*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugValue", NonSemantic_Shader_DebugInfo_100, 29>; 486*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugOperation", NonSemantic_Shader_DebugInfo_100, 30>; 487*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugExpression", NonSemantic_Shader_DebugInfo_100, 31>; 488*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugMacroDef", NonSemantic_Shader_DebugInfo_100, 32>; 489*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugMacroUndef", NonSemantic_Shader_DebugInfo_100, 33>; 490*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugImportedEntity", NonSemantic_Shader_DebugInfo_100, 34>; 491*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugSource", NonSemantic_Shader_DebugInfo_100, 35>; 492*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugFunctionDefinition", NonSemantic_Shader_DebugInfo_100, 101>; 493*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugSourceContinued", NonSemantic_Shader_DebugInfo_100, 102>; 494*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugLine", NonSemantic_Shader_DebugInfo_100, 103>; 495*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugNoLine", NonSemantic_Shader_DebugInfo_100, 104>; 496*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugBuildIdentifier", NonSemantic_Shader_DebugInfo_100, 105>; 497*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugStoragePath", NonSemantic_Shader_DebugInfo_100, 106>; 498*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugEntryPoint", NonSemantic_Shader_DebugInfo_100, 107>; 499*0fca6ea1SDimitry Andricdefm : DemangledExtendedBuiltin<"DebugTypeMatrix", NonSemantic_Shader_DebugInfo_100, 108>; 500bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 501bdd1243dSDimitry Andric// Class defining an native builtin record used for direct translation into a 502bdd1243dSDimitry Andric// SPIR-V instruction. 503bdd1243dSDimitry Andric// 504bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 505bdd1243dSDimitry Andric// set specifies which external instruction set the builtin belongs to. 506bdd1243dSDimitry Andric// opcode specifies the SPIR-V operation code of the generated instruction. 507bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 508bdd1243dSDimitry Andricclass NativeBuiltin<string name, InstructionSet set, Op operation> { 509bdd1243dSDimitry Andric string Name = name; 510bdd1243dSDimitry Andric InstructionSet Set = set; 511bdd1243dSDimitry Andric Op Opcode = operation; 512bdd1243dSDimitry Andric} 513bdd1243dSDimitry Andric 514bdd1243dSDimitry Andric// Table gathering all the native builtins. 515bdd1243dSDimitry Andricdef NativeBuiltins : GenericTable { 516bdd1243dSDimitry Andric let FilterClass = "NativeBuiltin"; 517bdd1243dSDimitry Andric let Fields = ["Name", "Set", "Opcode"]; 518bdd1243dSDimitry Andric string TypeOf_Set = "InstructionSet"; 519bdd1243dSDimitry Andric} 520bdd1243dSDimitry Andric 521bdd1243dSDimitry Andric// Function to lookup native builtins by their name and set. 522bdd1243dSDimitry Andricdef lookupNativeBuiltin : SearchIndex { 523bdd1243dSDimitry Andric let Table = NativeBuiltins; 524bdd1243dSDimitry Andric let Key = ["Name", "Set"]; 525bdd1243dSDimitry Andric} 526bdd1243dSDimitry Andric 527bdd1243dSDimitry Andric// Multiclass used to define at the same time both an incoming builtin record 528bdd1243dSDimitry Andric// and a corresponding native builtin record. 529bdd1243dSDimitry Andricmulticlass DemangledNativeBuiltin<string name, InstructionSet set, BuiltinGroup group, bits<8> minNumArgs, bits<8> maxNumArgs, Op operation> { 530bdd1243dSDimitry Andric def : DemangledBuiltin<name, set, group, minNumArgs, maxNumArgs>; 531bdd1243dSDimitry Andric def : NativeBuiltin<name, set, operation>; 532bdd1243dSDimitry Andric} 533bdd1243dSDimitry Andric 534bdd1243dSDimitry Andric// Relational builtin records: 535bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isequal", OpenCL_std, Relational, 2, 2, OpFOrdEqual>; 536bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FOrdEqual", OpenCL_std, Relational, 2, 2, OpFOrdEqual>; 537bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isnotequal", OpenCL_std, Relational, 2, 2, OpFUnordNotEqual>; 538bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FUnordNotEqual", OpenCL_std, Relational, 2, 2, OpFUnordNotEqual>; 539bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isgreater", OpenCL_std, Relational, 2, 2, OpFOrdGreaterThan>; 540bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FOrdGreaterThan", OpenCL_std, Relational, 2, 2, OpFOrdGreaterThan>; 541bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isgreaterequal", OpenCL_std, Relational, 2, 2, OpFOrdGreaterThanEqual>; 542bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FOrdGreaterThanEqual", OpenCL_std, Relational, 2, 2, OpFOrdGreaterThanEqual>; 543bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isless", OpenCL_std, Relational, 2, 2, OpFOrdLessThan>; 544bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FOrdLessThan", OpenCL_std, Relational, 2, 2, OpFOrdLessThan>; 545bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"islessequal", OpenCL_std, Relational, 2, 2, OpFOrdLessThanEqual>; 546bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FOrdLessThanEqual", OpenCL_std, Relational, 2, 2, OpFOrdLessThanEqual>; 547bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"islessgreater", OpenCL_std, Relational, 2, 2, OpFOrdNotEqual>; 548bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FOrdNotEqual", OpenCL_std, Relational, 2, 2, OpFOrdNotEqual>; 549bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isordered", OpenCL_std, Relational, 2, 2, OpOrdered>; 550bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_Ordered", OpenCL_std, Relational, 2, 2, OpOrdered>; 551bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isunordered", OpenCL_std, Relational, 2, 2, OpUnordered>; 552bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_Unordered", OpenCL_std, Relational, 2, 2, OpUnordered>; 553bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isfinite", OpenCL_std, Relational, 1, 1, OpIsFinite>; 554bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_IsFinite", OpenCL_std, Relational, 1, 1, OpIsFinite>; 555bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isinf", OpenCL_std, Relational, 1, 1, OpIsInf>; 556bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_IsInf", OpenCL_std, Relational, 1, 1, OpIsInf>; 557bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isnan", OpenCL_std, Relational, 1, 1, OpIsNan>; 558bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_IsNan", OpenCL_std, Relational, 1, 1, OpIsNan>; 559bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"isnormal", OpenCL_std, Relational, 1, 1, OpIsNormal>; 560bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_IsNormal", OpenCL_std, Relational, 1, 1, OpIsNormal>; 561bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"signbit", OpenCL_std, Relational, 1, 1, OpSignBitSet>; 562bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_SignBitSet", OpenCL_std, Relational, 1, 1, OpSignBitSet>; 563bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"any", OpenCL_std, Relational, 1, 1, OpAny>; 564bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_Any", OpenCL_std, Relational, 1, 1, OpAny>; 565bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"all", OpenCL_std, Relational, 1, 1, OpAll>; 566bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_All", OpenCL_std, Relational, 1, 1, OpAll>; 567bdd1243dSDimitry Andric 568bdd1243dSDimitry Andric// Atomic builtin records: 569bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_init", OpenCL_std, Atomic, 2, 2, OpStore>; 570bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_load", OpenCL_std, Atomic, 1, 1, OpAtomicLoad>; 571bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_load_explicit", OpenCL_std, Atomic, 2, 3, OpAtomicLoad>; 572*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicLoad", OpenCL_std, Atomic, 3, 3, OpAtomicLoad>; 573bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_store", OpenCL_std, Atomic, 2, 2, OpAtomicStore>; 574bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_store_explicit", OpenCL_std, Atomic, 2, 4, OpAtomicStore>; 575*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicStore", OpenCL_std, Atomic, 4, 4, OpAtomicStore>; 576bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_compare_exchange_strong", OpenCL_std, Atomic, 3, 6, OpAtomicCompareExchange>; 577*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicCompareExchange", OpenCL_std, Atomic, 6, 6, OpAtomicCompareExchange>; 578bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_compare_exchange_strong_explicit", OpenCL_std, Atomic, 5, 6, OpAtomicCompareExchange>; 579bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_compare_exchange_weak", OpenCL_std, Atomic, 3, 6, OpAtomicCompareExchangeWeak>; 580bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_compare_exchange_weak_explicit", OpenCL_std, Atomic, 5, 6, OpAtomicCompareExchangeWeak>; 581*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicCompareExchangeWeak", OpenCL_std, Atomic, 6, 6, OpAtomicCompareExchangeWeak>; 582bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atom_cmpxchg", OpenCL_std, Atomic, 3, 6, OpAtomicCompareExchange>; 583bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_cmpxchg", OpenCL_std, Atomic, 3, 6, OpAtomicCompareExchange>; 584bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atom_add", OpenCL_std, Atomic, 2, 4, OpAtomicIAdd>; 585bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_add", OpenCL_std, Atomic, 2, 4, OpAtomicIAdd>; 586*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicIAdd", OpenCL_std, Atomic, 4, 4, OpAtomicIAdd>; 587bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atom_sub", OpenCL_std, Atomic, 2, 4, OpAtomicISub>; 588bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_sub", OpenCL_std, Atomic, 2, 4, OpAtomicISub>; 589*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicISub", OpenCL_std, Atomic, 4, 4, OpAtomicISub>; 590bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atom_or", OpenCL_std, Atomic, 2, 4, OpAtomicOr>; 591bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_or", OpenCL_std, Atomic, 2, 4, OpAtomicOr>; 592*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicOr", OpenCL_std, Atomic, 4, 4, OpAtomicOr>; 593bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atom_xor", OpenCL_std, Atomic, 2, 4, OpAtomicXor>; 594bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_xor", OpenCL_std, Atomic, 2, 4, OpAtomicXor>; 595*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicXor", OpenCL_std, Atomic, 4, 4, OpAtomicXor>; 596bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atom_and", OpenCL_std, Atomic, 2, 4, OpAtomicAnd>; 597bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_and", OpenCL_std, Atomic, 2, 4, OpAtomicAnd>; 598*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicAnd", OpenCL_std, Atomic, 4, 4, OpAtomicAnd>; 599bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_exchange", OpenCL_std, Atomic, 2, 4, OpAtomicExchange>; 600bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_exchange_explicit", OpenCL_std, Atomic, 2, 4, OpAtomicExchange>; 601*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"AtomicEx__spirv_change", OpenCL_std, Atomic, 2, 4, OpAtomicExchange>; 602*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicExchange", OpenCL_std, Atomic, 4, 4, OpAtomicExchange>; 603bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_work_item_fence", OpenCL_std, Atomic, 1, 3, OpMemoryBarrier>; 604*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_MemoryBarrier", OpenCL_std, Atomic, 2, 2, OpMemoryBarrier>; 605bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_add", OpenCL_std, Atomic, 2, 4, OpAtomicIAdd>; 606bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_sub", OpenCL_std, Atomic, 2, 4, OpAtomicISub>; 607bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_or", OpenCL_std, Atomic, 2, 4, OpAtomicOr>; 608bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_xor", OpenCL_std, Atomic, 2, 4, OpAtomicXor>; 609bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_and", OpenCL_std, Atomic, 2, 4, OpAtomicAnd>; 610*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_add_explicit", OpenCL_std, Atomic, 3, 4, OpAtomicIAdd>; 611*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_sub_explicit", OpenCL_std, Atomic, 3, 4, OpAtomicISub>; 612*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_or_explicit", OpenCL_std, Atomic, 3, 4, OpAtomicOr>; 613*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_xor_explicit", OpenCL_std, Atomic, 3, 4, OpAtomicXor>; 614*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"atomic_fetch_and_explicit", OpenCL_std, Atomic, 3, 4, OpAtomicAnd>; 615bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_flag_test_and_set", OpenCL_std, Atomic, 1, 1, OpAtomicFlagTestAndSet>; 616*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicFlagTestAndSet", OpenCL_std, Atomic, 3, 3, OpAtomicFlagTestAndSet>; 617bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_flag_test_and_set_explicit", OpenCL_std, Atomic, 2, 3, OpAtomicFlagTestAndSet>; 618bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_flag_clear", OpenCL_std, Atomic, 1, 1, OpAtomicFlagClear>; 619*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicFlagClear", OpenCL_std, Atomic, 3, 3, OpAtomicFlagClear>; 620bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"atomic_flag_clear_explicit", OpenCL_std, Atomic, 2, 3, OpAtomicFlagClear>; 621*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicSMin", OpenCL_std, Atomic, 4, 4, OpAtomicSMin>; 622*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicSMax", OpenCL_std, Atomic, 4, 4, OpAtomicSMax>; 623*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicUMin", OpenCL_std, Atomic, 4, 4, OpAtomicUMin>; 624*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_AtomicUMax", OpenCL_std, Atomic, 4, 4, OpAtomicUMax>; 625bdd1243dSDimitry Andric 626bdd1243dSDimitry Andric// Barrier builtin records: 627bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"barrier", OpenCL_std, Barrier, 1, 3, OpControlBarrier>; 628bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"work_group_barrier", OpenCL_std, Barrier, 1, 3, OpControlBarrier>; 629*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ControlBarrier", OpenCL_std, Barrier, 3, 3, OpControlBarrier>; 630bdd1243dSDimitry Andric 631bdd1243dSDimitry Andric// Kernel enqueue builtin records: 632bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__enqueue_kernel_basic", OpenCL_std, Enqueue, 5, 5, OpEnqueueKernel>; 633bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__enqueue_kernel_basic_events", OpenCL_std, Enqueue, 8, 8, OpEnqueueKernel>; 634bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__enqueue_kernel_varargs", OpenCL_std, Enqueue, 7, 7, OpEnqueueKernel>; 635bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__enqueue_kernel_events_varargs", OpenCL_std, Enqueue, 10, 10, OpEnqueueKernel>; 636*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_EnqueueKernel", OpenCL_std, Enqueue, 10, 0, OpEnqueueKernel>; 637bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"retain_event", OpenCL_std, Enqueue, 1, 1, OpRetainEvent>; 638*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_RetainEvent", OpenCL_std, Enqueue, 1, 1, OpRetainEvent>; 639bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"release_event", OpenCL_std, Enqueue, 1, 1, OpReleaseEvent>; 640*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ReleaseEvent", OpenCL_std, Enqueue, 1, 1, OpReleaseEvent>; 641bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"create_user_event", OpenCL_std, Enqueue, 0, 0, OpCreateUserEvent>; 642*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_CreateUserEvent", OpenCL_std, Enqueue, 0, 0, OpCreateUserEvent>; 643bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"is_valid_event", OpenCL_std, Enqueue, 1, 1, OpIsValidEvent>; 644*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_IsValidEvent", OpenCL_std, Enqueue, 1, 1, OpIsValidEvent>; 645bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"set_user_event_status", OpenCL_std, Enqueue, 2, 2, OpSetUserEventStatus>; 646*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_SetUserEventStatus", OpenCL_std, Enqueue, 2, 2, OpSetUserEventStatus>; 647bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"capture_event_profiling_info", OpenCL_std, Enqueue, 3, 3, OpCaptureEventProfilingInfo>; 648*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_CaptureEventProfilingInfo", OpenCL_std, Enqueue, 3, 3, OpCaptureEventProfilingInfo>; 649bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"get_default_queue", OpenCL_std, Enqueue, 0, 0, OpGetDefaultQueue>; 650*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GetDefaultQueue", OpenCL_std, Enqueue, 0, 0, OpGetDefaultQueue>; 651bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"ndrange_1D", OpenCL_std, Enqueue, 1, 3, OpBuildNDRange>; 652bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"ndrange_2D", OpenCL_std, Enqueue, 1, 3, OpBuildNDRange>; 653bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"ndrange_3D", OpenCL_std, Enqueue, 1, 3, OpBuildNDRange>; 654bdd1243dSDimitry Andric 655bdd1243dSDimitry Andric// Spec constant builtin records: 656bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_SpecConstant", OpenCL_std, SpecConstant, 2, 2, OpSpecConstant>; 657bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_SpecConstantComposite", OpenCL_std, SpecConstant, 1, 0, OpSpecConstantComposite>; 658bdd1243dSDimitry Andric 659bdd1243dSDimitry Andric// Async Copy and Prefetch builtin records: 660bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"async_work_group_copy", OpenCL_std, AsyncCopy, 4, 4, OpGroupAsyncCopy>; 661*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"async_work_group_strided_copy", OpenCL_std, AsyncCopy, 5, 5, OpGroupAsyncCopy>; 662*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GroupAsyncCopy", OpenCL_std, AsyncCopy, 6, 6, OpGroupAsyncCopy>; 663bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"wait_group_events", OpenCL_std, AsyncCopy, 2, 2, OpGroupWaitEvents>; 664*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GroupWaitEvents", OpenCL_std, AsyncCopy, 3, 3, OpGroupWaitEvents>; 665bdd1243dSDimitry Andric 666bdd1243dSDimitry Andric// Load and store builtin records: 667bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_Load", OpenCL_std, LoadStore, 1, 3, OpLoad>; 668bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_Store", OpenCL_std, LoadStore, 2, 4, OpStore>; 669bdd1243dSDimitry Andric 670*0fca6ea1SDimitry Andric// Address Space Qualifier Functions/Pointers Conversion Instructions: 671*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"to_global", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtr>; 672*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"to_local", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtr>; 673*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"to_private", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtr>; 674*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToGlobal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>; 675*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToLocal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>; 676*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToPrivate", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>; 677*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToGlobal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>; 678*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToLocal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>; 679*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToPrivate", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>; 680*0fca6ea1SDimitry Andric 681*0fca6ea1SDimitry Andric// Cooperative Matrix builtin records: 682*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixLoadKHR", OpenCL_std, CoopMatr, 2, 0, OpCooperativeMatrixLoadKHR>; 683*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixStoreKHR", OpenCL_std, CoopMatr, 3, 0, OpCooperativeMatrixStoreKHR>; 684*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixMulAddKHR", OpenCL_std, CoopMatr, 3, 0, OpCooperativeMatrixMulAddKHR>; 685*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixLengthKHR", OpenCL_std, CoopMatr, 1, 1, OpCooperativeMatrixLengthKHR>; 686*0fca6ea1SDimitry Andric 687bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 688bdd1243dSDimitry Andric// Class defining a work/sub group builtin that should be translated into a 689bdd1243dSDimitry Andric// SPIR-V instruction using the defined properties. 690bdd1243dSDimitry Andric// 691bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 692bdd1243dSDimitry Andric// opcode specifies the SPIR-V operation code of the generated instruction. 693bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 694bdd1243dSDimitry Andricclass GroupBuiltin<string name, Op operation> { 695bdd1243dSDimitry Andric string Name = name; 696bdd1243dSDimitry Andric Op Opcode = operation; 697bdd1243dSDimitry Andric bits<32> GroupOperation = !cond(!not(!eq(!find(name, "group_reduce"), -1)) : Reduce.Value, 698bdd1243dSDimitry Andric !not(!eq(!find(name, "group_scan_inclusive"), -1)) : InclusiveScan.Value, 699bdd1243dSDimitry Andric !not(!eq(!find(name, "group_scan_exclusive"), -1)) : ExclusiveScan.Value, 700bdd1243dSDimitry Andric !not(!eq(!find(name, "group_ballot_bit_count"), -1)) : Reduce.Value, 701bdd1243dSDimitry Andric !not(!eq(!find(name, "group_ballot_inclusive_scan"), -1)) : InclusiveScan.Value, 702bdd1243dSDimitry Andric !not(!eq(!find(name, "group_ballot_exclusive_scan"), -1)) : ExclusiveScan.Value, 703bdd1243dSDimitry Andric !not(!eq(!find(name, "group_non_uniform_reduce"), -1)) : Reduce.Value, 704bdd1243dSDimitry Andric !not(!eq(!find(name, "group_non_uniform_scan_inclusive"), -1)) : InclusiveScan.Value, 705bdd1243dSDimitry Andric !not(!eq(!find(name, "group_non_uniform_scan_exclusive"), -1)) : ExclusiveScan.Value, 706bdd1243dSDimitry Andric !not(!eq(!find(name, "group_non_uniform_reduce_logical"), -1)) : Reduce.Value, 707bdd1243dSDimitry Andric !not(!eq(!find(name, "group_non_uniform_scan_inclusive_logical"), -1)) : InclusiveScan.Value, 708bdd1243dSDimitry Andric !not(!eq(!find(name, "group_non_uniform_scan_exclusive_logical"), -1)) : ExclusiveScan.Value, 709bdd1243dSDimitry Andric !not(!eq(!find(name, "group_clustered_reduce"), -1)) : ClusteredReduce.Value, 710bdd1243dSDimitry Andric !not(!eq(!find(name, "group_clustered_reduce_logical"), -1)) : ClusteredReduce.Value, 711bdd1243dSDimitry Andric true : 0); 712bdd1243dSDimitry Andric bit IsElect = !eq(operation, OpGroupNonUniformElect); 713bdd1243dSDimitry Andric bit IsAllOrAny = !or(!eq(operation, OpGroupAll), 714bdd1243dSDimitry Andric !eq(operation, OpGroupAny), 715bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformAll), 716bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformAny)); 717bdd1243dSDimitry Andric bit IsAllEqual = !eq(operation, OpGroupNonUniformAllEqual); 718bdd1243dSDimitry Andric bit IsBallot = !eq(operation, OpGroupNonUniformBallot); 719bdd1243dSDimitry Andric bit IsInverseBallot = !eq(operation, OpGroupNonUniformInverseBallot); 720bdd1243dSDimitry Andric bit IsBallotBitExtract = !eq(operation, OpGroupNonUniformBallotBitExtract); 721bdd1243dSDimitry Andric bit IsBallotFindBit = !or(!eq(operation, OpGroupNonUniformBallotFindLSB), 722bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformBallotFindMSB)); 723bdd1243dSDimitry Andric bit IsLogical = !or(!eq(operation, OpGroupNonUniformLogicalAnd), 724bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformLogicalOr), 725*0fca6ea1SDimitry Andric !eq(operation, OpGroupNonUniformLogicalXor), 726*0fca6ea1SDimitry Andric !eq(operation, OpGroupLogicalAndKHR), 727*0fca6ea1SDimitry Andric !eq(operation, OpGroupLogicalOrKHR), 728*0fca6ea1SDimitry Andric !eq(operation, OpGroupLogicalXorKHR)); 729bdd1243dSDimitry Andric bit NoGroupOperation = !or(IsElect, IsAllOrAny, IsAllEqual, 730bdd1243dSDimitry Andric IsBallot, IsInverseBallot, 731bdd1243dSDimitry Andric IsBallotBitExtract, IsBallotFindBit, 732bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformShuffle), 733bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformShuffleXor), 734bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformShuffleUp), 735bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformShuffleDown), 736bdd1243dSDimitry Andric !eq(operation, OpGroupBroadcast), 737bdd1243dSDimitry Andric !eq(operation, OpGroupNonUniformBroadcast), 738*0fca6ea1SDimitry Andric !eq(operation, OpGroupNonUniformBroadcastFirst), 739*0fca6ea1SDimitry Andric !eq(operation, OpGroupNonUniformRotateKHR)); 740bdd1243dSDimitry Andric bit HasBoolArg = !or(!and(IsAllOrAny, !eq(IsAllEqual, false)), IsBallot, IsLogical); 741bdd1243dSDimitry Andric} 742bdd1243dSDimitry Andric 743bdd1243dSDimitry Andric// Table gathering all the work/sub group builtins. 744bdd1243dSDimitry Andricdef GroupBuiltins : GenericTable { 745bdd1243dSDimitry Andric let FilterClass = "GroupBuiltin"; 746bdd1243dSDimitry Andric let Fields = ["Name", "Opcode", "GroupOperation", "IsElect", "IsAllOrAny", 747bdd1243dSDimitry Andric "IsAllEqual", "IsBallot", "IsInverseBallot", "IsBallotBitExtract", 748bdd1243dSDimitry Andric "IsBallotFindBit", "IsLogical", "NoGroupOperation", "HasBoolArg"]; 749bdd1243dSDimitry Andric} 750bdd1243dSDimitry Andric 751*0fca6ea1SDimitry Andric// Function to lookup group builtins by their name and set. 752bdd1243dSDimitry Andricdef lookupGroupBuiltin : SearchIndex { 753bdd1243dSDimitry Andric let Table = GroupBuiltins; 754bdd1243dSDimitry Andric let Key = ["Name"]; 755bdd1243dSDimitry Andric} 756bdd1243dSDimitry Andric 757bdd1243dSDimitry Andric// Multiclass used to define at the same time both incoming builtin records 758bdd1243dSDimitry Andric// and corresponding work/sub group builtin records. 759bdd1243dSDimitry Andricdefvar OnlyWork = 0; defvar OnlySub = 1; defvar WorkOrSub = 2; 760bdd1243dSDimitry Andricmulticlass DemangledGroupBuiltin<string name, int level /* OnlyWork/OnlySub/... */, Op operation> { 761bdd1243dSDimitry Andric assert !and(!ge(level, 0), !le(level, 2)), "group level is invalid: " # level; 762bdd1243dSDimitry Andric 763bdd1243dSDimitry Andric if !or(!eq(level, OnlyWork), !eq(level, WorkOrSub)) then { 764bdd1243dSDimitry Andric def : DemangledBuiltin<!strconcat("work_", name), OpenCL_std, Group, 0, 4>; 765bdd1243dSDimitry Andric def : GroupBuiltin<!strconcat("work_", name), operation>; 766bdd1243dSDimitry Andric } 767bdd1243dSDimitry Andric 768bdd1243dSDimitry Andric if !or(!eq(level, OnlySub), !eq(level, WorkOrSub)) then { 769bdd1243dSDimitry Andric def : DemangledBuiltin<!strconcat("sub_", name), OpenCL_std, Group, 0, 4>; 770bdd1243dSDimitry Andric def : GroupBuiltin<!strconcat("sub_", name), operation>; 771bdd1243dSDimitry Andric } 772bdd1243dSDimitry Andric} 773bdd1243dSDimitry Andric 774*0fca6ea1SDimitry Andricmulticlass DemangledGroupBuiltinWrapper<string name, bits<8> minNumArgs, bits<8> maxNumArgs, Op operation> { 775*0fca6ea1SDimitry Andric def : DemangledBuiltin<name, OpenCL_std, Group, minNumArgs, maxNumArgs>; 776*0fca6ea1SDimitry Andric def : GroupBuiltin<name, operation>; 777*0fca6ea1SDimitry Andric} 778*0fca6ea1SDimitry Andric 779bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_all", WorkOrSub, OpGroupAll>; 780*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupAll", 2, 2, OpGroupAll>; 781bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_any", WorkOrSub, OpGroupAny>; 782*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupAny", 2, 2, OpGroupAny>; 783bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_broadcast", WorkOrSub, OpGroupBroadcast>; 784*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupBroadcast", 3, 3, OpGroupBroadcast>; 785bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_broadcast", OnlySub, OpGroupNonUniformBroadcast>; 786bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_broadcast_first", OnlySub, OpGroupNonUniformBroadcastFirst>; 787bdd1243dSDimitry Andric 788bdd1243dSDimitry Andric// cl_khr_subgroup_non_uniform_vote 789bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_elect", OnlySub, OpGroupNonUniformElect>; 790*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformElect", 1, 1, OpGroupNonUniformElect>; 791bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_all", OnlySub, OpGroupNonUniformAll>; 792*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformAll", 2, 2, OpGroupNonUniformAll>; 793bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_any", OnlySub, OpGroupNonUniformAny>; 794*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformAny", 2, 2, OpGroupNonUniformAny>; 795bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_all_equal", OnlySub, OpGroupNonUniformAllEqual>; 796*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformAllEqual", 2, 2, OpGroupNonUniformAllEqual>; 797bdd1243dSDimitry Andric 798bdd1243dSDimitry Andric// cl_khr_subgroup_ballot 799bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_ballot", OnlySub, OpGroupNonUniformBallot>; 800*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBallot", 2, 2, OpGroupNonUniformBallot>; 801bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_inverse_ballot", OnlySub, OpGroupNonUniformInverseBallot>; 802*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformInverseBallot", 2, 2, OpGroupNonUniformInverseBallot>; 803bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_ballot_bit_extract", OnlySub, OpGroupNonUniformBallotBitExtract>; 804*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBallotBitExtract", 3, 3, OpGroupNonUniformBallotBitExtract>; 805bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_ballot_bit_count", OnlySub, OpGroupNonUniformBallotBitCount>; 806bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_ballot_inclusive_scan", OnlySub, OpGroupNonUniformBallotBitCount>; 807bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_ballot_exclusive_scan", OnlySub, OpGroupNonUniformBallotBitCount>; 808*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBallotBitCount", 3, 3, OpGroupNonUniformBallotBitCount>; 809bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_ballot_find_lsb", OnlySub, OpGroupNonUniformBallotFindLSB>; 810*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBallotFindLSB", 2, 2, OpGroupNonUniformBallotFindLSB>; 811bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_ballot_find_msb", OnlySub, OpGroupNonUniformBallotFindMSB>; 812*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBallotFindMSB", 2, 2, OpGroupNonUniformBallotFindMSB>; 813bdd1243dSDimitry Andric 814bdd1243dSDimitry Andric// cl_khr_subgroup_shuffle 815bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_shuffle", OnlySub, OpGroupNonUniformShuffle>; 816*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformShuffle", 3, 3, OpGroupNonUniformShuffle>; 817bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_shuffle_xor", OnlySub, OpGroupNonUniformShuffleXor>; 818*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformShuffleXor", 3, 3, OpGroupNonUniformShuffleXor>; 819bdd1243dSDimitry Andric 820bdd1243dSDimitry Andric// cl_khr_subgroup_shuffle_relative 821bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_shuffle_up", OnlySub, OpGroupNonUniformShuffleUp>; 822*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformShuffleUp", 3, 3, OpGroupNonUniformShuffleUp>; 823bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_shuffle_down", OnlySub, OpGroupNonUniformShuffleDown>; 824*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformShuffleDown", 3, 3, OpGroupNonUniformShuffleDown>; 825bdd1243dSDimitry Andric 826bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_iadd", WorkOrSub, OpGroupIAdd>; 827bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_adds", WorkOrSub, OpGroupIAdd>; 828bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_adds", WorkOrSub, OpGroupIAdd>; 829bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_adds", WorkOrSub, OpGroupIAdd>; 830bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_addu", WorkOrSub, OpGroupIAdd>; 831bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_addu", WorkOrSub, OpGroupIAdd>; 832bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_addu", WorkOrSub, OpGroupIAdd>; 833*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupIAdd", 3, 3, OpGroupIAdd>; 834bdd1243dSDimitry Andric 835bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_fadd", WorkOrSub, OpGroupFAdd>; 836bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_addf", WorkOrSub, OpGroupFAdd>; 837bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_addf", WorkOrSub, OpGroupFAdd>; 838bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_addf", WorkOrSub, OpGroupFAdd>; 839*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupFAdd", 3, 3, OpGroupFAdd>; 840bdd1243dSDimitry Andric 841bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_fmin", WorkOrSub, OpGroupFMin>; 842bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_minf", WorkOrSub, OpGroupFMin>; 843bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_minf", WorkOrSub, OpGroupFMin>; 844bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_minf", WorkOrSub, OpGroupFMin>; 845*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupFMin", 3, 3, OpGroupFMin>; 846bdd1243dSDimitry Andric 847bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_umin", WorkOrSub, OpGroupUMin>; 848bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_minu", WorkOrSub, OpGroupUMin>; 849bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_minu", WorkOrSub, OpGroupUMin>; 850bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_minu", WorkOrSub, OpGroupUMin>; 851*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupUMin", 3, 3, OpGroupUMin>; 852bdd1243dSDimitry Andric 853bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_smin", WorkOrSub, OpGroupSMin>; 854bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_mins", WorkOrSub, OpGroupSMin>; 855bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_mins", WorkOrSub, OpGroupSMin>; 856bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_mins", WorkOrSub, OpGroupSMin>; 857*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupSMin", 3, 3, OpGroupSMin>; 858bdd1243dSDimitry Andric 859bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_fmax", WorkOrSub, OpGroupFMax>; 860bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_maxf", WorkOrSub, OpGroupFMax>; 861bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_maxf", WorkOrSub, OpGroupFMax>; 862bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_maxf", WorkOrSub, OpGroupFMax>; 863*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupFMax", 3, 3, OpGroupFMax>; 864bdd1243dSDimitry Andric 865bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_umax", WorkOrSub, OpGroupUMax>; 866bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_maxu", WorkOrSub, OpGroupUMax>; 867bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_maxu", WorkOrSub, OpGroupUMax>; 868bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_maxu", WorkOrSub, OpGroupUMax>; 869*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupUMax", 3, 3, OpGroupUMax>; 870bdd1243dSDimitry Andric 871bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_smax", WorkOrSub, OpGroupSMax>; 872bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_maxs", WorkOrSub, OpGroupSMax>; 873bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_maxs", WorkOrSub, OpGroupSMax>; 874bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_maxs", WorkOrSub, OpGroupSMax>; 875*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupSMax", 3, 3, OpGroupSMax>; 876bdd1243dSDimitry Andric 877bdd1243dSDimitry Andric// cl_khr_subgroup_non_uniform_arithmetic 878bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_iadd", WorkOrSub, OpGroupNonUniformIAdd>; 879bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_addu", WorkOrSub, OpGroupNonUniformIAdd>; 880bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_adds", WorkOrSub, OpGroupNonUniformIAdd>; 881bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_addu", WorkOrSub, OpGroupNonUniformIAdd>; 882bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_adds", WorkOrSub, OpGroupNonUniformIAdd>; 883bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_addu", WorkOrSub, OpGroupNonUniformIAdd>; 884bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_adds", WorkOrSub, OpGroupNonUniformIAdd>; 885bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_addu", WorkOrSub, OpGroupNonUniformIAdd>; 886bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_adds", WorkOrSub, OpGroupNonUniformIAdd>; 887*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformIAdd", 3, 4, OpGroupNonUniformIAdd>; 888bdd1243dSDimitry Andric 889bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_fadd", WorkOrSub, OpGroupNonUniformFAdd>; 890bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_addf", WorkOrSub, OpGroupNonUniformFAdd>; 891bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_addh", WorkOrSub, OpGroupNonUniformFAdd>; 892bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_addd", WorkOrSub, OpGroupNonUniformFAdd>; 893bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_addf", WorkOrSub, OpGroupNonUniformFAdd>; 894bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_addh", WorkOrSub, OpGroupNonUniformFAdd>; 895bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_addd", WorkOrSub, OpGroupNonUniformFAdd>; 896bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_addf", WorkOrSub, OpGroupNonUniformFAdd>; 897bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_addh", WorkOrSub, OpGroupNonUniformFAdd>; 898bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_addd", WorkOrSub, OpGroupNonUniformFAdd>; 899bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_addf", WorkOrSub, OpGroupNonUniformFAdd>; 900bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_addh", WorkOrSub, OpGroupNonUniformFAdd>; 901bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_addd", WorkOrSub, OpGroupNonUniformFAdd>; 902*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformFAdd", 3, 4, OpGroupNonUniformFAdd>; 903bdd1243dSDimitry Andric 904bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_imul", WorkOrSub, OpGroupNonUniformIMul>; 905bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_mulu", WorkOrSub, OpGroupNonUniformIMul>; 906bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_muls", WorkOrSub, OpGroupNonUniformIMul>; 907bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_mulu", WorkOrSub, OpGroupNonUniformIMul>; 908bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_muls", WorkOrSub, OpGroupNonUniformIMul>; 909bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_mulu", WorkOrSub, OpGroupNonUniformIMul>; 910bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_muls", WorkOrSub, OpGroupNonUniformIMul>; 911bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_mulu", WorkOrSub, OpGroupNonUniformIMul>; 912bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_muls", WorkOrSub, OpGroupNonUniformIMul>; 913*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformIMul", 3, 4, OpGroupNonUniformIMul>; 914bdd1243dSDimitry Andric 915bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_fmul", WorkOrSub, OpGroupNonUniformFMul>; 916bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_mulf", WorkOrSub, OpGroupNonUniformFMul>; 917bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_mulh", WorkOrSub, OpGroupNonUniformFMul>; 918bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_muld", WorkOrSub, OpGroupNonUniformFMul>; 919bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_mulf", WorkOrSub, OpGroupNonUniformFMul>; 920bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_mulh", WorkOrSub, OpGroupNonUniformFMul>; 921bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_muld", WorkOrSub, OpGroupNonUniformFMul>; 922bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_mulf", WorkOrSub, OpGroupNonUniformFMul>; 923bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_mulh", WorkOrSub, OpGroupNonUniformFMul>; 924bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_muld", WorkOrSub, OpGroupNonUniformFMul>; 925bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_mulf", WorkOrSub, OpGroupNonUniformFMul>; 926bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_mulh", WorkOrSub, OpGroupNonUniformFMul>; 927bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_muld", WorkOrSub, OpGroupNonUniformFMul>; 928*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformFMul", 3, 4, OpGroupNonUniformFMul>; 929bdd1243dSDimitry Andric 930bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_smin", WorkOrSub, OpGroupNonUniformSMin>; 931bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_mins", WorkOrSub, OpGroupNonUniformSMin>; 932bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_mins", WorkOrSub, OpGroupNonUniformSMin>; 933bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_mins", WorkOrSub, OpGroupNonUniformSMin>; 934bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_mins", WorkOrSub, OpGroupNonUniformSMin>; 935*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformSMin", 3, 4, OpGroupNonUniformSMin>; 936bdd1243dSDimitry Andric 937bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_umin", WorkOrSub, OpGroupNonUniformUMin>; 938bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_minu", WorkOrSub, OpGroupNonUniformUMin>; 939bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_minu", WorkOrSub, OpGroupNonUniformUMin>; 940bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_minu", WorkOrSub, OpGroupNonUniformUMin>; 941bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_minu", WorkOrSub, OpGroupNonUniformUMin>; 942*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformUMin", 3, 4, OpGroupNonUniformUMin>; 943bdd1243dSDimitry Andric 944bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_fmin", WorkOrSub, OpGroupNonUniformFMin>; 945bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_minf", WorkOrSub, OpGroupNonUniformFMin>; 946bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_minh", WorkOrSub, OpGroupNonUniformFMin>; 947bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_mind", WorkOrSub, OpGroupNonUniformFMin>; 948bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_minf", WorkOrSub, OpGroupNonUniformFMin>; 949bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_minh", WorkOrSub, OpGroupNonUniformFMin>; 950bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_mind", WorkOrSub, OpGroupNonUniformFMin>; 951bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_minf", WorkOrSub, OpGroupNonUniformFMin>; 952bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_minh", WorkOrSub, OpGroupNonUniformFMin>; 953bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_mind", WorkOrSub, OpGroupNonUniformFMin>; 954bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_minf", WorkOrSub, OpGroupNonUniformFMin>; 955bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_minh", WorkOrSub, OpGroupNonUniformFMin>; 956bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_mind", WorkOrSub, OpGroupNonUniformFMin>; 957*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformFMin", 3, 4, OpGroupNonUniformFMin>; 958bdd1243dSDimitry Andric 959bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_smax", WorkOrSub, OpGroupNonUniformSMax>; 960bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_maxs", WorkOrSub, OpGroupNonUniformSMax>; 961bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_maxs", WorkOrSub, OpGroupNonUniformSMax>; 962bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_maxs", WorkOrSub, OpGroupNonUniformSMax>; 963bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_maxs", WorkOrSub, OpGroupNonUniformSMax>; 964*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformSMax", 3, 4, OpGroupNonUniformSMax>; 965bdd1243dSDimitry Andric 966bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_umax", WorkOrSub, OpGroupNonUniformUMax>; 967bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_maxu", WorkOrSub, OpGroupNonUniformUMax>; 968bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_maxu", WorkOrSub, OpGroupNonUniformUMax>; 969bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_maxu", WorkOrSub, OpGroupNonUniformUMax>; 970bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_maxu", WorkOrSub, OpGroupNonUniformUMax>; 971*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformUMax", 3, 4, OpGroupNonUniformUMax>; 972bdd1243dSDimitry Andric 973bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_fmax", WorkOrSub, OpGroupNonUniformFMax>; 974bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_maxf", WorkOrSub, OpGroupNonUniformFMax>; 975bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_maxh", WorkOrSub, OpGroupNonUniformFMax>; 976bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_maxd", WorkOrSub, OpGroupNonUniformFMax>; 977bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_maxf", WorkOrSub, OpGroupNonUniformFMax>; 978bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_maxh", WorkOrSub, OpGroupNonUniformFMax>; 979bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_maxd", WorkOrSub, OpGroupNonUniformFMax>; 980bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_maxf", WorkOrSub, OpGroupNonUniformFMax>; 981bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_maxh", WorkOrSub, OpGroupNonUniformFMax>; 982bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_maxd", WorkOrSub, OpGroupNonUniformFMax>; 983bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_maxf", WorkOrSub, OpGroupNonUniformFMax>; 984bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_maxh", WorkOrSub, OpGroupNonUniformFMax>; 985bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_maxd", WorkOrSub, OpGroupNonUniformFMax>; 986*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformFMax", 3, 4, OpGroupNonUniformFMax>; 987bdd1243dSDimitry Andric 988bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_iand", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 989bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_andu", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 990bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_ands", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 991bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_andu", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 992bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_ands", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 993bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_andu", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 994bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_ands", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 995bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_andu", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 996bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_ands", WorkOrSub, OpGroupNonUniformBitwiseAnd>; 997*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBitwiseAnd", 3, 4, OpGroupNonUniformBitwiseAnd>; 998bdd1243dSDimitry Andric 999bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_ior", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1000bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_oru", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1001bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_ors", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1002bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_oru", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1003bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_ors", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1004bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_oru", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1005bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_ors", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1006bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_oru", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1007bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_ors", WorkOrSub, OpGroupNonUniformBitwiseOr>; 1008*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBitwiseOr", 3, 4, OpGroupNonUniformBitwiseOr>; 1009bdd1243dSDimitry Andric 1010bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_ixor", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1011bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_xoru", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1012bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_xors", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1013bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_xoru", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1014bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_xors", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1015bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_xoru", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1016bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_xors", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1017bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_xoru", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1018bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_xors", WorkOrSub, OpGroupNonUniformBitwiseXor>; 1019*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformBitwiseXor", 3, 4, OpGroupNonUniformBitwiseXor>; 1020bdd1243dSDimitry Andric 1021bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_logical_iand", WorkOrSub, OpGroupNonUniformLogicalAnd>; 1022bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_logical_ands", WorkOrSub, OpGroupNonUniformLogicalAnd>; 1023bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_logical_ands", WorkOrSub, OpGroupNonUniformLogicalAnd>; 1024bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_logical_ands", WorkOrSub, OpGroupNonUniformLogicalAnd>; 1025bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_logical_and", WorkOrSub, OpGroupNonUniformLogicalAnd>; 1026*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformLogicalAnd", 3, 4, OpGroupNonUniformLogicalAnd>; 1027bdd1243dSDimitry Andric 1028bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_logical_ior", WorkOrSub, OpGroupNonUniformLogicalOr>; 1029bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_logical_ors", WorkOrSub, OpGroupNonUniformLogicalOr>; 1030bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_logical_ors", WorkOrSub, OpGroupNonUniformLogicalOr>; 1031bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_logical_ors", WorkOrSub, OpGroupNonUniformLogicalOr>; 1032bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_logical_or", WorkOrSub, OpGroupNonUniformLogicalOr>; 1033*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformLogicalOr", 3, 4, OpGroupNonUniformLogicalOr>; 1034bdd1243dSDimitry Andric 1035bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_logical_ixor", WorkOrSub, OpGroupNonUniformLogicalXor>; 1036bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_reduce_logical_xors", WorkOrSub, OpGroupNonUniformLogicalXor>; 1037bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_logical_xors", WorkOrSub, OpGroupNonUniformLogicalXor>; 1038bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_logical_xors", WorkOrSub, OpGroupNonUniformLogicalXor>; 1039bdd1243dSDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_reduce_logical_xor", WorkOrSub, OpGroupNonUniformLogicalXor>; 1040*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltinWrapper<"__spirv_GroupNonUniformLogicalXor", 3, 4, OpGroupNonUniformLogicalXor>; 1041bdd1243dSDimitry Andric 1042*0fca6ea1SDimitry Andric// cl_khr_subgroup_rotate / SPV_KHR_subgroup_rotate 1043*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_rotate", OnlySub, OpGroupNonUniformRotateKHR>; 1044*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_clustered_rotate", OnlySub, OpGroupNonUniformRotateKHR>; 1045*0fca6ea1SDimitry Andric 1046*0fca6ea1SDimitry Andric// cl_khr_work_group_uniform_arithmetic / SPV_KHR_uniform_group_instructions 1047*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_imul", OnlyWork, OpGroupIMulKHR>; 1048*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_mulu", OnlyWork, OpGroupIMulKHR>; 1049*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_muls", OnlyWork, OpGroupIMulKHR>; 1050*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_imul", OnlyWork, OpGroupIMulKHR>; 1051*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_mulu", OnlyWork, OpGroupIMulKHR>; 1052*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_muls", OnlyWork, OpGroupIMulKHR>; 1053*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_imul", OnlyWork, OpGroupIMulKHR>; 1054*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_mulu", OnlyWork, OpGroupIMulKHR>; 1055*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_muls", OnlyWork, OpGroupIMulKHR>; 1056*0fca6ea1SDimitry Andric 1057*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_mulf", OnlyWork, OpGroupFMulKHR>; 1058*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_mulh", OnlyWork, OpGroupFMulKHR>; 1059*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_muld", OnlyWork, OpGroupFMulKHR>; 1060*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_mulf", OnlyWork, OpGroupFMulKHR>; 1061*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_mulh", OnlyWork, OpGroupFMulKHR>; 1062*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_muld", OnlyWork, OpGroupFMulKHR>; 1063*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_mulf", OnlyWork, OpGroupFMulKHR>; 1064*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_mulh", OnlyWork, OpGroupFMulKHR>; 1065*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_muld", OnlyWork, OpGroupFMulKHR>; 1066*0fca6ea1SDimitry Andric 1067*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_and", OnlyWork, OpGroupBitwiseAndKHR>; 1068*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_and", OnlyWork, OpGroupBitwiseAndKHR>; 1069*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_and", OnlyWork, OpGroupBitwiseAndKHR>; 1070*0fca6ea1SDimitry Andric 1071*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_or", OnlyWork, OpGroupBitwiseOrKHR>; 1072*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_or", OnlyWork, OpGroupBitwiseOrKHR>; 1073*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_or", OnlyWork, OpGroupBitwiseOrKHR>; 1074*0fca6ea1SDimitry Andric 1075*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_xor", OnlyWork, OpGroupBitwiseXorKHR>; 1076*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_xor", OnlyWork, OpGroupBitwiseXorKHR>; 1077*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_xor", OnlyWork, OpGroupBitwiseXorKHR>; 1078*0fca6ea1SDimitry Andric 1079*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_logical_and", OnlyWork, OpGroupLogicalAndKHR>; 1080*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_logical_and", OnlyWork, OpGroupLogicalAndKHR>; 1081*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_logical_and", OnlyWork, OpGroupLogicalAndKHR>; 1082*0fca6ea1SDimitry Andric 1083*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_logical_or", OnlyWork, OpGroupLogicalOrKHR>; 1084*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_logical_or", OnlyWork, OpGroupLogicalOrKHR>; 1085*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_logical_or", OnlyWork, OpGroupLogicalOrKHR>; 1086*0fca6ea1SDimitry Andric 1087*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_exclusive_logical_xor", OnlyWork, OpGroupLogicalXorKHR>; 1088*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_scan_inclusive_logical_xor", OnlyWork, OpGroupLogicalXorKHR>; 1089*0fca6ea1SDimitry Andricdefm : DemangledGroupBuiltin<"group_reduce_logical_xor", OnlyWork, OpGroupLogicalXorKHR>; 1090*0fca6ea1SDimitry Andric 1091*0fca6ea1SDimitry Andric// cl_khr_kernel_clock / SPV_KHR_shader_clock 1092*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"clock_read_device", OpenCL_std, KernelClock, 0, 0, OpReadClockKHR>; 1093*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"clock_read_work_group", OpenCL_std, KernelClock, 0, 0, OpReadClockKHR>; 1094*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"clock_read_sub_group", OpenCL_std, KernelClock, 0, 0, OpReadClockKHR>; 1095*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"clock_read_hilo_device", OpenCL_std, KernelClock, 0, 0, OpReadClockKHR>; 1096*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"clock_read_hilo_work_group", OpenCL_std, KernelClock, 0, 0, OpReadClockKHR>; 1097*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"clock_read_hilo_sub_group", OpenCL_std, KernelClock, 0, 0, OpReadClockKHR>; 1098*0fca6ea1SDimitry Andric 1099*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1100*0fca6ea1SDimitry Andric// Class defining an atomic instruction on floating-point numbers. 1101*0fca6ea1SDimitry Andric// 1102*0fca6ea1SDimitry Andric// name is the demangled name of the given builtin. 1103*0fca6ea1SDimitry Andric// opcode specifies the SPIR-V operation code of the generated instruction. 1104*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1105*0fca6ea1SDimitry Andricclass AtomicFloatingBuiltin<string name, Op operation> { 1106*0fca6ea1SDimitry Andric string Name = name; 1107*0fca6ea1SDimitry Andric Op Opcode = operation; 1108*0fca6ea1SDimitry Andric} 1109*0fca6ea1SDimitry Andric 1110*0fca6ea1SDimitry Andric// Table gathering all builtins for atomic instructions on floating-point numbers 1111*0fca6ea1SDimitry Andricdef AtomicFloatingBuiltins : GenericTable { 1112*0fca6ea1SDimitry Andric let FilterClass = "AtomicFloatingBuiltin"; 1113*0fca6ea1SDimitry Andric let Fields = ["Name", "Opcode"]; 1114*0fca6ea1SDimitry Andric} 1115*0fca6ea1SDimitry Andric 1116*0fca6ea1SDimitry Andric// Function to lookup builtins by their name and set. 1117*0fca6ea1SDimitry Andricdef lookupAtomicFloatingBuiltin : SearchIndex { 1118*0fca6ea1SDimitry Andric let Table = AtomicFloatingBuiltins; 1119*0fca6ea1SDimitry Andric let Key = ["Name"]; 1120*0fca6ea1SDimitry Andric} 1121*0fca6ea1SDimitry Andric 1122*0fca6ea1SDimitry Andric// Multiclass used to define incoming demangled builtin records and 1123*0fca6ea1SDimitry Andric// corresponding builtin records for atomic instructions on floating-point numbers. 1124*0fca6ea1SDimitry Andricmulticlass DemangledAtomicFloatingBuiltin<string name, bits<8> minNumArgs, bits<8> maxNumArgs, Op operation> { 1125*0fca6ea1SDimitry Andric def : DemangledBuiltin<!strconcat("__spirv_AtomicF", name), OpenCL_std, AtomicFloating, minNumArgs, maxNumArgs>; 1126*0fca6ea1SDimitry Andric def : AtomicFloatingBuiltin<!strconcat("__spirv_AtomicF", name), operation>; 1127*0fca6ea1SDimitry Andric} 1128*0fca6ea1SDimitry Andric 1129*0fca6ea1SDimitry Andric// SPV_EXT_shader_atomic_float_add, SPV_EXT_shader_atomic_float_min_max, SPV_EXT_shader_atomic_float16_add 1130*0fca6ea1SDimitry Andric// Atomic add, min and max instruction on floating-point numbers: 1131*0fca6ea1SDimitry Andricdefm : DemangledAtomicFloatingBuiltin<"AddEXT", 4, 4, OpAtomicFAddEXT>; 1132*0fca6ea1SDimitry Andricdefm : DemangledAtomicFloatingBuiltin<"MinEXT", 4, 4, OpAtomicFMinEXT>; 1133*0fca6ea1SDimitry Andricdefm : DemangledAtomicFloatingBuiltin<"MaxEXT", 4, 4, OpAtomicFMaxEXT>; 1134*0fca6ea1SDimitry Andric 1135*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1136*0fca6ea1SDimitry Andric// Class defining a sub group builtin that should be translated into a 1137*0fca6ea1SDimitry Andric// SPIR-V instruction using the SPV_INTEL_subgroups extension. 1138*0fca6ea1SDimitry Andric// 1139*0fca6ea1SDimitry Andric// name is the demangled name of the given builtin. 1140*0fca6ea1SDimitry Andric// opcode specifies the SPIR-V operation code of the generated instruction. 1141*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1142*0fca6ea1SDimitry Andricclass IntelSubgroupsBuiltin<string name, Op operation> { 1143*0fca6ea1SDimitry Andric string Name = name; 1144*0fca6ea1SDimitry Andric Op Opcode = operation; 1145*0fca6ea1SDimitry Andric bit IsBlock = !or(!eq(operation, OpSubgroupBlockReadINTEL), 1146*0fca6ea1SDimitry Andric !eq(operation, OpSubgroupBlockWriteINTEL)); 1147*0fca6ea1SDimitry Andric bit IsWrite = !eq(operation, OpSubgroupBlockWriteINTEL); 1148*0fca6ea1SDimitry Andric} 1149*0fca6ea1SDimitry Andric 1150*0fca6ea1SDimitry Andric// Table gathering all the Intel sub group builtins. 1151*0fca6ea1SDimitry Andricdef IntelSubgroupsBuiltins : GenericTable { 1152*0fca6ea1SDimitry Andric let FilterClass = "IntelSubgroupsBuiltin"; 1153*0fca6ea1SDimitry Andric let Fields = ["Name", "Opcode", "IsBlock", "IsWrite"]; 1154*0fca6ea1SDimitry Andric} 1155*0fca6ea1SDimitry Andric 1156*0fca6ea1SDimitry Andric// Function to lookup group builtins by their name and set. 1157*0fca6ea1SDimitry Andricdef lookupIntelSubgroupsBuiltin : SearchIndex { 1158*0fca6ea1SDimitry Andric let Table = IntelSubgroupsBuiltins; 1159*0fca6ea1SDimitry Andric let Key = ["Name"]; 1160*0fca6ea1SDimitry Andric} 1161*0fca6ea1SDimitry Andric 1162*0fca6ea1SDimitry Andric// Multiclass used to define incoming builtin records for the SPV_INTEL_subgroups extension 1163*0fca6ea1SDimitry Andric// and corresponding work/sub group builtin records. 1164*0fca6ea1SDimitry Andricmulticlass DemangledIntelSubgroupsBuiltin<string name, bits<8> minNumArgs, bits<8> maxNumArgs, Op operation> { 1165*0fca6ea1SDimitry Andric def : DemangledBuiltin<!strconcat("intel_sub_group_", name), OpenCL_std, IntelSubgroups, minNumArgs, maxNumArgs>; 1166*0fca6ea1SDimitry Andric def : IntelSubgroupsBuiltin<!strconcat("intel_sub_group_", name), operation>; 1167*0fca6ea1SDimitry Andric} 1168*0fca6ea1SDimitry Andric 1169*0fca6ea1SDimitry Andric// cl_intel_subgroups 1170*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltin<"shuffle", 2, 2, OpSubgroupShuffleINTEL>; 1171*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltin<"shuffle_down", 3, 3, OpSubgroupShuffleDownINTEL>; 1172*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltin<"shuffle_up", 3, 3, OpSubgroupShuffleUpINTEL>; 1173*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltin<"shuffle_xor", 2, 2, OpSubgroupShuffleXorINTEL>; 1174*0fca6ea1SDimitry Andricforeach i = ["", "2", "4", "8"] in { 1175*0fca6ea1SDimitry Andric // cl_intel_subgroups 1176*0fca6ea1SDimitry Andric defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_read", i), 1, 2, OpSubgroupBlockReadINTEL>; 1177*0fca6ea1SDimitry Andric defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_write", i), 2, 3, OpSubgroupBlockWriteINTEL>; 1178*0fca6ea1SDimitry Andric // cl_intel_subgroups_short 1179*0fca6ea1SDimitry Andric defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_read_ui", i), 1, 2, OpSubgroupBlockReadINTEL>; 1180*0fca6ea1SDimitry Andric defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_write_ui", i), 2, 3, OpSubgroupBlockWriteINTEL>; 1181*0fca6ea1SDimitry Andric} 1182*0fca6ea1SDimitry Andric// cl_intel_subgroups_char, cl_intel_subgroups_short, cl_intel_subgroups_long 1183*0fca6ea1SDimitry Andricforeach i = ["", "2", "4", "8", "16"] in { 1184*0fca6ea1SDimitry Andric foreach j = ["c", "s", "l"] in { 1185*0fca6ea1SDimitry Andric defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_read_u", j, i), 1, 2, OpSubgroupBlockReadINTEL>; 1186*0fca6ea1SDimitry Andric defm : DemangledIntelSubgroupsBuiltin<!strconcat("block_write_u", j, i), 2, 3, OpSubgroupBlockWriteINTEL>; 1187*0fca6ea1SDimitry Andric } 1188*0fca6ea1SDimitry Andric} 1189*0fca6ea1SDimitry Andric// OpSubgroupImageBlockReadINTEL and OpSubgroupImageBlockWriteINTEL are to be resolved later on (in code) 1190*0fca6ea1SDimitry Andric 1191*0fca6ea1SDimitry Andric// Multiclass used to define builtin wrappers for the SPV_INTEL_subgroups extension. 1192*0fca6ea1SDimitry Andricmulticlass DemangledIntelSubgroupsBuiltinWrapper<string name, bits<8> numArgs, Op operation> { 1193*0fca6ea1SDimitry Andric def : DemangledBuiltin<!strconcat("__spirv_", name), OpenCL_std, IntelSubgroups, numArgs, numArgs>; 1194*0fca6ea1SDimitry Andric def : IntelSubgroupsBuiltin<!strconcat("__spirv_", name), operation>; 1195*0fca6ea1SDimitry Andric} 1196*0fca6ea1SDimitry Andric 1197*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupShuffleINTEL", 2, OpSubgroupShuffleINTEL>; 1198*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupShuffleDownINTEL", 3, OpSubgroupShuffleDownINTEL>; 1199*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupShuffleUpINTEL", 3, OpSubgroupShuffleUpINTEL>; 1200*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupShuffleXorINTEL", 2, OpSubgroupShuffleXorINTEL>; 1201*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupBlockReadINTEL", 1, OpSubgroupBlockReadINTEL>; 1202*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupBlockWriteINTEL", 2, OpSubgroupBlockWriteINTEL>; 1203*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupImageBlockReadINTEL", 2, OpSubgroupImageBlockReadINTEL>; 1204*0fca6ea1SDimitry Andricdefm : DemangledIntelSubgroupsBuiltinWrapper<"SubgroupImageBlockWriteINTEL", 3, OpSubgroupImageBlockWriteINTEL>; 1205*0fca6ea1SDimitry Andric 1206*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1207*0fca6ea1SDimitry Andric// Class defining a builtin for group operations within uniform control flow. 1208*0fca6ea1SDimitry Andric// It should be translated into a SPIR-V instruction using 1209*0fca6ea1SDimitry Andric// the SPV_KHR_uniform_group_instructions extension. 1210*0fca6ea1SDimitry Andric// 1211*0fca6ea1SDimitry Andric// name is the demangled name of the given builtin. 1212*0fca6ea1SDimitry Andric// opcode specifies the SPIR-V operation code of the generated instruction. 1213*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1214*0fca6ea1SDimitry Andricclass GroupUniformBuiltin<string name, Op operation> { 1215*0fca6ea1SDimitry Andric string Name = name; 1216*0fca6ea1SDimitry Andric Op Opcode = operation; 1217*0fca6ea1SDimitry Andric bit IsLogical = !or(!eq(operation, OpGroupLogicalAndKHR), 1218*0fca6ea1SDimitry Andric !eq(operation, OpGroupLogicalOrKHR), 1219*0fca6ea1SDimitry Andric !eq(operation, OpGroupLogicalXorKHR)); 1220*0fca6ea1SDimitry Andric} 1221*0fca6ea1SDimitry Andric 1222*0fca6ea1SDimitry Andric// Table gathering all the Intel sub group builtins. 1223*0fca6ea1SDimitry Andricdef GroupUniformBuiltins : GenericTable { 1224*0fca6ea1SDimitry Andric let FilterClass = "GroupUniformBuiltin"; 1225*0fca6ea1SDimitry Andric let Fields = ["Name", "Opcode", "IsLogical"]; 1226*0fca6ea1SDimitry Andric} 1227*0fca6ea1SDimitry Andric 1228*0fca6ea1SDimitry Andric// Function to lookup group builtins by their name and set. 1229*0fca6ea1SDimitry Andricdef lookupGroupUniformBuiltin : SearchIndex { 1230*0fca6ea1SDimitry Andric let Table = GroupUniformBuiltins; 1231*0fca6ea1SDimitry Andric let Key = ["Name"]; 1232*0fca6ea1SDimitry Andric} 1233*0fca6ea1SDimitry Andric 1234*0fca6ea1SDimitry Andric// Multiclass used to define incoming builtin records for 1235*0fca6ea1SDimitry Andric// the SPV_KHR_uniform_group_instructions extension 1236*0fca6ea1SDimitry Andric// and corresponding work group builtin records. 1237*0fca6ea1SDimitry Andricmulticlass DemangledGroupUniformBuiltin<string name, bits<8> minNumArgs, bits<8> maxNumArgs, Op operation> { 1238*0fca6ea1SDimitry Andric def : DemangledBuiltin<!strconcat("__spirv_Group", name), OpenCL_std, GroupUniform, minNumArgs, maxNumArgs>; 1239*0fca6ea1SDimitry Andric def : GroupUniformBuiltin<!strconcat("__spirv_Group", name), operation>; 1240*0fca6ea1SDimitry Andric} 1241*0fca6ea1SDimitry Andric 1242*0fca6ea1SDimitry Andric// cl_khr_work_group_uniform_arithmetic / SPV_KHR_uniform_group_instructions 1243*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"IMulKHR", 3, 3, OpGroupIMulKHR>; 1244*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"FMulKHR", 3, 3, OpGroupFMulKHR>; 1245*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"BitwiseAndKHR", 3, 3, OpGroupBitwiseAndKHR>; 1246*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"BitwiseOrKHR", 3, 3, OpGroupBitwiseOrKHR>; 1247*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"BitwiseXorKHR", 3, 3, OpGroupBitwiseXorKHR>; 1248*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"LogicalAndKHR", 3, 3, OpGroupLogicalAndKHR>; 1249*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"LogicalOrKHR", 3, 3, OpGroupLogicalOrKHR>; 1250*0fca6ea1SDimitry Andricdefm : DemangledGroupUniformBuiltin<"LogicalXorKHR", 3, 3, OpGroupLogicalXorKHR>; 1251bdd1243dSDimitry Andric 1252bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1253bdd1243dSDimitry Andric// Class defining a get builtin record used for lowering builtin calls such as 1254bdd1243dSDimitry Andric// "get_sub_group_eq_mask" or "get_global_id" to SPIR-V instructions. 1255bdd1243dSDimitry Andric// 1256bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 1257bdd1243dSDimitry Andric// set specifies which external instruction set the builtin belongs to. 1258bdd1243dSDimitry Andric// value specifies the value of the BuiltIn enum. 1259bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1260bdd1243dSDimitry Andricclass GetBuiltin<string name, InstructionSet set, BuiltIn value> { 1261bdd1243dSDimitry Andric string Name = name; 1262bdd1243dSDimitry Andric InstructionSet Set = set; 1263bdd1243dSDimitry Andric BuiltIn Value = value; 1264bdd1243dSDimitry Andric} 1265bdd1243dSDimitry Andric 1266bdd1243dSDimitry Andric// Table gathering all the get builtin records. 1267bdd1243dSDimitry Andricdef GetBuiltins : GenericTable { 1268bdd1243dSDimitry Andric let FilterClass = "GetBuiltin"; 1269bdd1243dSDimitry Andric let Fields = ["Name", "Set", "Value"]; 1270bdd1243dSDimitry Andric string TypeOf_Set = "InstructionSet"; 1271bdd1243dSDimitry Andric string TypeOf_Value = "BuiltIn"; 1272bdd1243dSDimitry Andric} 1273bdd1243dSDimitry Andric 1274bdd1243dSDimitry Andric// Function to lookup get builtin records by their name and set. 1275bdd1243dSDimitry Andricdef lookupGetBuiltin : SearchIndex { 1276bdd1243dSDimitry Andric let Table = GetBuiltins; 1277bdd1243dSDimitry Andric let Key = ["Name", "Set"]; 1278bdd1243dSDimitry Andric} 1279bdd1243dSDimitry Andric 1280bdd1243dSDimitry Andric// Multiclass used to define at the same time both a demangled builtin record 1281bdd1243dSDimitry Andric// and a corresponding get builtin record. 1282bdd1243dSDimitry Andricmulticlass DemangledGetBuiltin<string name, InstructionSet set, BuiltinGroup group, BuiltIn value> { 1283bdd1243dSDimitry Andric def : DemangledBuiltin<name, set, group, 0, 1>; 1284bdd1243dSDimitry Andric def : GetBuiltin<name, set, value>; 1285bdd1243dSDimitry Andric} 1286bdd1243dSDimitry Andric 1287bdd1243dSDimitry Andric// Builtin variable records: 1288bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_sub_group_eq_mask", OpenCL_std, Variable, SubgroupEqMask>; 1289bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_sub_group_ge_mask", OpenCL_std, Variable, SubgroupGeMask>; 1290bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_sub_group_gt_mask", OpenCL_std, Variable, SubgroupGtMask>; 1291bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_sub_group_le_mask", OpenCL_std, Variable, SubgroupLeMask>; 1292bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_sub_group_lt_mask", OpenCL_std, Variable, SubgroupLtMask>; 1293bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"__spirv_BuiltInGlobalLinearId", OpenCL_std, Variable, GlobalLinearId>; 1294bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"__spirv_BuiltInGlobalInvocationId", OpenCL_std, Variable, GlobalInvocationId>; 1295bdd1243dSDimitry Andric 1296bdd1243dSDimitry Andric// GetQuery builtin records: 1297bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_local_id", OpenCL_std, GetQuery, LocalInvocationId>; 1298bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_global_id", OpenCL_std, GetQuery, GlobalInvocationId>; 1299bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_local_size", OpenCL_std, GetQuery, WorkgroupSize>; 1300bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_global_size", OpenCL_std, GetQuery, GlobalSize>; 1301bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_group_id", OpenCL_std, GetQuery, WorkgroupId>; 1302bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_enqueued_local_size", OpenCL_std, GetQuery, EnqueuedWorkgroupSize>; 1303bdd1243dSDimitry Andricdefm : DemangledGetBuiltin<"get_num_groups", OpenCL_std, GetQuery, NumWorkgroups>; 1304*0fca6ea1SDimitry Andricdefm : DemangledGetBuiltin<"__hlsl_wave_get_lane_index", GLSL_std_450, Wave, SubgroupLocalInvocationId>; 1305bdd1243dSDimitry Andric 1306bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1307bdd1243dSDimitry Andric// Class defining an image query builtin record used for lowering the OpenCL 1308bdd1243dSDimitry Andric// "get_image_*" calls into OpImageQuerySize/OpImageQuerySizeLod instructions. 1309bdd1243dSDimitry Andric// 1310bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 1311bdd1243dSDimitry Andric// set specifies which external instruction set the builtin belongs to. 1312bdd1243dSDimitry Andric// component specifies the unsigned number of the query component. 1313bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1314bdd1243dSDimitry Andricclass ImageQueryBuiltin<string name, InstructionSet set, bits<32> component> { 1315bdd1243dSDimitry Andric string Name = name; 1316bdd1243dSDimitry Andric InstructionSet Set = set; 1317bdd1243dSDimitry Andric bits<32> Component = component; 1318bdd1243dSDimitry Andric} 1319bdd1243dSDimitry Andric 1320bdd1243dSDimitry Andric// Table gathering all the image query builtins. 1321bdd1243dSDimitry Andricdef ImageQueryBuiltins : GenericTable { 1322bdd1243dSDimitry Andric let FilterClass = "ImageQueryBuiltin"; 1323bdd1243dSDimitry Andric let Fields = ["Name", "Set", "Component"]; 1324bdd1243dSDimitry Andric string TypeOf_Set = "InstructionSet"; 1325bdd1243dSDimitry Andric} 1326bdd1243dSDimitry Andric 1327bdd1243dSDimitry Andric// Function to lookup image query builtins by their name and set. 1328bdd1243dSDimitry Andricdef lookupImageQueryBuiltin : SearchIndex { 1329bdd1243dSDimitry Andric let Table = ImageQueryBuiltins; 1330bdd1243dSDimitry Andric let Key = ["Name", "Set"]; 1331bdd1243dSDimitry Andric} 1332bdd1243dSDimitry Andric 1333bdd1243dSDimitry Andric// Multiclass used to define at the same time both a demangled builtin record 1334bdd1243dSDimitry Andric// and a corresponding image query builtin record. 1335bdd1243dSDimitry Andricmulticlass DemangledImageQueryBuiltin<string name, InstructionSet set, int component> { 1336bdd1243dSDimitry Andric def : DemangledBuiltin<name, set, ImageSizeQuery, 1, 1>; 1337bdd1243dSDimitry Andric def : ImageQueryBuiltin<name, set, component>; 1338bdd1243dSDimitry Andric} 1339bdd1243dSDimitry Andric 1340bdd1243dSDimitry Andric// Image query builtin records: 1341bdd1243dSDimitry Andricdefm : DemangledImageQueryBuiltin<"get_image_width", OpenCL_std, 0>; 1342bdd1243dSDimitry Andricdefm : DemangledImageQueryBuiltin<"get_image_height", OpenCL_std, 1>; 1343bdd1243dSDimitry Andricdefm : DemangledImageQueryBuiltin<"get_image_depth", OpenCL_std, 2>; 1344bdd1243dSDimitry Andricdefm : DemangledImageQueryBuiltin<"get_image_dim", OpenCL_std, 0>; 1345bdd1243dSDimitry Andricdefm : DemangledImageQueryBuiltin<"get_image_array_size", OpenCL_std, 3>; 1346bdd1243dSDimitry Andric 1347bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"get_image_num_samples", OpenCL_std, ImageMiscQuery, 1, 1, OpImageQuerySamples>; 1348bdd1243dSDimitry Andricdefm : DemangledNativeBuiltin<"get_image_num_mip_levels", OpenCL_std, ImageMiscQuery, 1, 1, OpImageQueryLevels>; 1349bdd1243dSDimitry Andric 1350bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1351bdd1243dSDimitry Andric// Class defining a "convert_destType<_sat><_roundingMode>" call record for 1352bdd1243dSDimitry Andric// lowering into OpConvert instructions. 1353bdd1243dSDimitry Andric// 1354bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 1355bdd1243dSDimitry Andric// set specifies which external instruction set the builtin belongs to. 1356bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1357bdd1243dSDimitry Andricclass ConvertBuiltin<string name, InstructionSet set> { 1358bdd1243dSDimitry Andric string Name = name; 1359bdd1243dSDimitry Andric InstructionSet Set = set; 1360bdd1243dSDimitry Andric bit IsDestinationSigned = !eq(!find(name, "convert_u"), -1); 1361bdd1243dSDimitry Andric bit IsSaturated = !not(!eq(!find(name, "_sat"), -1)); 1362bdd1243dSDimitry Andric bit IsRounded = !not(!eq(!find(name, "_rt"), -1)); 1363*0fca6ea1SDimitry Andric bit IsBfloat16 = !or(!not(!eq(!find(name, "BF16"), -1)), 1364*0fca6ea1SDimitry Andric !not(!eq(!find(name, "bfloat16"), -1))); 1365bdd1243dSDimitry Andric FPRoundingMode RoundingMode = !cond(!not(!eq(!find(name, "_rte"), -1)) : RTE, 1366bdd1243dSDimitry Andric !not(!eq(!find(name, "_rtz"), -1)) : RTZ, 1367bdd1243dSDimitry Andric !not(!eq(!find(name, "_rtp"), -1)) : RTP, 1368bdd1243dSDimitry Andric !not(!eq(!find(name, "_rtn"), -1)) : RTN, 1369bdd1243dSDimitry Andric true : RTE); 1370bdd1243dSDimitry Andric} 1371bdd1243dSDimitry Andric 1372bdd1243dSDimitry Andric// Table gathering all the convert builtins. 1373bdd1243dSDimitry Andricdef ConvertBuiltins : GenericTable { 1374bdd1243dSDimitry Andric let FilterClass = "ConvertBuiltin"; 1375*0fca6ea1SDimitry Andric let Fields = ["Name", "Set", "IsDestinationSigned", "IsSaturated", 1376*0fca6ea1SDimitry Andric "IsRounded", "IsBfloat16", "RoundingMode"]; 1377bdd1243dSDimitry Andric string TypeOf_Set = "InstructionSet"; 1378bdd1243dSDimitry Andric string TypeOf_RoundingMode = "FPRoundingMode"; 1379bdd1243dSDimitry Andric} 1380bdd1243dSDimitry Andric 1381bdd1243dSDimitry Andric// Function to lookup convert builtins by their name and set. 1382bdd1243dSDimitry Andricdef lookupConvertBuiltin : SearchIndex { 1383bdd1243dSDimitry Andric let Table = ConvertBuiltins; 1384bdd1243dSDimitry Andric let Key = ["Name", "Set"]; 1385bdd1243dSDimitry Andric} 1386bdd1243dSDimitry Andric 1387bdd1243dSDimitry Andric// Multiclass used to define at the same time both a demangled builtin records 1388bdd1243dSDimitry Andric// and a corresponding convert builtin records. 1389bdd1243dSDimitry Andricmulticlass DemangledConvertBuiltin<string name, InstructionSet set> { 1390bdd1243dSDimitry Andric // Create records for scalar and 2, 4, 8, and 16 element vector conversions. 1391bdd1243dSDimitry Andric foreach i = ["", "2", "3", "4", "8", "16"] in { 1392bdd1243dSDimitry Andric // Also create records for each rounding mode. 1393bdd1243dSDimitry Andric foreach j = ["", "_rte", "_rtz", "_rtp", "_rtn"] in { 1394bdd1243dSDimitry Andric def : DemangledBuiltin<!strconcat(name, i, j), set, Convert, 1, 1>; 1395bdd1243dSDimitry Andric def : ConvertBuiltin<!strconcat(name, i, j), set>; 1396bdd1243dSDimitry Andric 1397bdd1243dSDimitry Andric // Create records with the "_sat" modifier for all conversions except 1398bdd1243dSDimitry Andric // those targeting floating-point types. 1399bdd1243dSDimitry Andric if !eq(!find(name, "float"), -1) then { 1400bdd1243dSDimitry Andric def : DemangledBuiltin<!strconcat(name, i, "_sat", j), set, Convert, 1, 1>; 1401bdd1243dSDimitry Andric def : ConvertBuiltin<!strconcat(name, i, "_sat", j), set>; 1402bdd1243dSDimitry Andric } 1403bdd1243dSDimitry Andric } 1404bdd1243dSDimitry Andric } 1405bdd1243dSDimitry Andric} 1406bdd1243dSDimitry Andric 1407bdd1243dSDimitry Andric// Explicit conversion builtin records: 1408bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_char", OpenCL_std>; 1409bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_uchar", OpenCL_std>; 1410bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_short", OpenCL_std>; 1411bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_ushort", OpenCL_std>; 1412bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_int", OpenCL_std>; 1413bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_uint", OpenCL_std>; 1414bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_long", OpenCL_std>; 1415bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_ulong", OpenCL_std>; 1416bdd1243dSDimitry Andricdefm : DemangledConvertBuiltin<"convert_float", OpenCL_std>; 1417bdd1243dSDimitry Andric 1418*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ConvertFToU", OpenCL_std, Convert, 1, 1, OpConvertFToU>; 1419*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ConvertFToS", OpenCL_std, Convert, 1, 1, OpConvertFToS>; 1420*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ConvertSToF", OpenCL_std, Convert, 1, 1, OpConvertSToF>; 1421*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ConvertUToF", OpenCL_std, Convert, 1, 1, OpConvertUToF>; 1422*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_UConvert", OpenCL_std, Convert, 1, 1, OpUConvert>; 1423*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_SConvert", OpenCL_std, Convert, 1, 1, OpSConvert>; 1424*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_FConvert", OpenCL_std, Convert, 1, 1, OpFConvert>; 1425*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_QuantizeToF16", OpenCL_std, Convert, 1, 1, OpQuantizeToF16>; 1426*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ConvertPtrToU", OpenCL_std, Convert, 1, 1, OpConvertPtrToU>; 1427*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_SatConvertSToU", OpenCL_std, Convert, 1, 1, OpSatConvertSToU>; 1428*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_SatConvertUToS", OpenCL_std, Convert, 1, 1, OpSatConvertUToS>; 1429*0fca6ea1SDimitry Andricdefm : DemangledNativeBuiltin<"__spirv_ConvertUToPtr", OpenCL_std, Convert, 1, 1, OpConvertUToPtr>; 1430*0fca6ea1SDimitry Andric 1431*0fca6ea1SDimitry Andric// cl_intel_bfloat16_conversions / SPV_INTEL_bfloat16_conversion 1432*0fca6ea1SDimitry Andric// Multiclass used to define at the same time both a demangled builtin records 1433*0fca6ea1SDimitry Andric// and a corresponding convert builtin records. 1434*0fca6ea1SDimitry Andricmulticlass DemangledBF16ConvertBuiltin<string name1, string name2> { 1435*0fca6ea1SDimitry Andric // Create records for scalar and vector conversions. 1436*0fca6ea1SDimitry Andric foreach i = ["", "2", "3", "4", "8", "16"] in { 1437*0fca6ea1SDimitry Andric def : DemangledBuiltin<!strconcat("intel_convert_", name1, i, name2, i), OpenCL_std, Convert, 1, 1>; 1438*0fca6ea1SDimitry Andric def : ConvertBuiltin<!strconcat("intel_convert_", name1, i, name2, i), OpenCL_std>; 1439*0fca6ea1SDimitry Andric } 1440*0fca6ea1SDimitry Andric} 1441*0fca6ea1SDimitry Andric 1442*0fca6ea1SDimitry Andricdefm : DemangledBF16ConvertBuiltin<"bfloat16", "_as_ushort">; 1443*0fca6ea1SDimitry Andricdefm : DemangledBF16ConvertBuiltin<"as_bfloat16", "_float">; 1444*0fca6ea1SDimitry Andric 1445*0fca6ea1SDimitry Andricforeach conv = ["FToBF16INTEL", "BF16ToFINTEL"] in { 1446*0fca6ea1SDimitry Andric def : DemangledBuiltin<!strconcat("__spirv_Convert", conv), OpenCL_std, Convert, 1, 1>; 1447*0fca6ea1SDimitry Andric def : ConvertBuiltin<!strconcat("__spirv_Convert", conv), OpenCL_std>; 1448*0fca6ea1SDimitry Andric} 1449*0fca6ea1SDimitry Andric 1450bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1451bdd1243dSDimitry Andric// Class defining a vector data load/store builtin record used for lowering 1452bdd1243dSDimitry Andric// into OpExtInst instruction. 1453bdd1243dSDimitry Andric// 1454bdd1243dSDimitry Andric// name is the demangled name of the given builtin. 1455bdd1243dSDimitry Andric// set specifies which external instruction set the builtin belongs to. 1456bdd1243dSDimitry Andric// number specifies the number of the instruction in the external set. 1457bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1458bdd1243dSDimitry Andricclass VectorLoadStoreBuiltin<string name, InstructionSet set, int number> { 1459bdd1243dSDimitry Andric string Name = name; 1460bdd1243dSDimitry Andric InstructionSet Set = set; 1461bdd1243dSDimitry Andric bits<32> Number = number; 1462*0fca6ea1SDimitry Andric bits<32> ElementCount = !cond(!not(!eq(!find(name, "2"), -1)) : 2, 1463*0fca6ea1SDimitry Andric !not(!eq(!find(name, "3"), -1)) : 3, 1464*0fca6ea1SDimitry Andric !not(!eq(!find(name, "4"), -1)) : 4, 1465*0fca6ea1SDimitry Andric !not(!eq(!find(name, "8"), -1)) : 8, 1466*0fca6ea1SDimitry Andric !not(!eq(!find(name, "16"), -1)) : 16, 1467*0fca6ea1SDimitry Andric true : 1); 1468bdd1243dSDimitry Andric bit IsRounded = !not(!eq(!find(name, "_rt"), -1)); 1469bdd1243dSDimitry Andric FPRoundingMode RoundingMode = !cond(!not(!eq(!find(name, "_rte"), -1)) : RTE, 1470bdd1243dSDimitry Andric !not(!eq(!find(name, "_rtz"), -1)) : RTZ, 1471bdd1243dSDimitry Andric !not(!eq(!find(name, "_rtp"), -1)) : RTP, 1472bdd1243dSDimitry Andric !not(!eq(!find(name, "_rtn"), -1)) : RTN, 1473bdd1243dSDimitry Andric true : RTE); 1474bdd1243dSDimitry Andric} 1475bdd1243dSDimitry Andric 1476bdd1243dSDimitry Andric// Table gathering all the vector data load/store builtins. 1477bdd1243dSDimitry Andricdef VectorLoadStoreBuiltins : GenericTable { 1478bdd1243dSDimitry Andric let FilterClass = "VectorLoadStoreBuiltin"; 1479*0fca6ea1SDimitry Andric let Fields = ["Name", "Set", "Number", "ElementCount", "IsRounded", "RoundingMode"]; 1480bdd1243dSDimitry Andric string TypeOf_Set = "InstructionSet"; 1481bdd1243dSDimitry Andric string TypeOf_RoundingMode = "FPRoundingMode"; 1482bdd1243dSDimitry Andric} 1483bdd1243dSDimitry Andric 1484bdd1243dSDimitry Andric// Function to lookup vector data load/store builtins by their name and set. 1485bdd1243dSDimitry Andricdef lookupVectorLoadStoreBuiltin : SearchIndex { 1486bdd1243dSDimitry Andric let Table = VectorLoadStoreBuiltins; 1487bdd1243dSDimitry Andric let Key = ["Name", "Set"]; 1488bdd1243dSDimitry Andric} 1489bdd1243dSDimitry Andric 1490bdd1243dSDimitry Andric// Multiclass used to define at the same time both a demangled builtin record 1491bdd1243dSDimitry Andric// and a corresponding vector data load/store builtin record. 1492bdd1243dSDimitry Andricmulticlass DemangledVectorLoadStoreBuiltin<string name, bits<8> minNumArgs, bits<8> maxNumArgs, int number> { 1493bdd1243dSDimitry Andric def : DemangledBuiltin<name, OpenCL_std, VectorLoadStore, minNumArgs, maxNumArgs>; 1494bdd1243dSDimitry Andric def : VectorLoadStoreBuiltin<name, OpenCL_std, number>; 1495bdd1243dSDimitry Andric} 1496bdd1243dSDimitry Andric 1497bdd1243dSDimitry Andric// Create records for scalar and 2, 4, 8, and 16 vector element count. 1498bdd1243dSDimitry Andricforeach i = ["", "2", "3", "4", "8", "16"] in { 1499bdd1243dSDimitry Andric if !eq(i, "") then { 1500bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<"vload_half", 2, 2, 173>; 1501bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<"vstore_half", 3, 3, 175>; 1502bdd1243dSDimitry Andric } else { 1503bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vload_half", i), 3, 3, 174>; 1504bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vstore_half", i), 3, 3, 177>; 1505bdd1243dSDimitry Andric } 1506bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vload", i), 2, 2, 171>; 1507bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vstore", i), 3, 3, 172>; 1508bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vloada_half", i), 2, 2, 174>; 1509bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vstorea_half", i), 3, 3, 180>; 1510bdd1243dSDimitry Andric 1511bdd1243dSDimitry Andric // Also create records for each rounding mode. 1512bdd1243dSDimitry Andric foreach j = ["_rte", "_rtz", "_rtp", "_rtn"] in { 1513bdd1243dSDimitry Andric if !eq(i, "") then { 1514bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vstore_half", j), 3, 3, 176>; 1515bdd1243dSDimitry Andric } else { 1516bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vstore_half", i, j), 3, 3, 178>; 1517bdd1243dSDimitry Andric } 1518bdd1243dSDimitry Andric defm : DemangledVectorLoadStoreBuiltin<!strconcat("vstorea_half", i, j), 3, 3, 181>; 1519bdd1243dSDimitry Andric } 1520bdd1243dSDimitry Andric} 1521bdd1243dSDimitry Andric 1522bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 152306c3fb27SDimitry Andric// Class defining implementation details of SPIR-V builtin types. The info 1524bdd1243dSDimitry Andric// in the record is used for lowering into OpType. 1525bdd1243dSDimitry Andric// 152606c3fb27SDimitry Andric// name is the name of the given SPIR-V builtin type. 1527bdd1243dSDimitry Andric// operation specifies the SPIR-V opcode the StructType should be lowered to. 1528bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 152906c3fb27SDimitry Andricclass BuiltinType<string name, Op operation> { 1530bdd1243dSDimitry Andric string Name = name; 1531bdd1243dSDimitry Andric Op Opcode = operation; 1532bdd1243dSDimitry Andric} 1533bdd1243dSDimitry Andric 153406c3fb27SDimitry Andric// Table gathering all the builtin type records. 153506c3fb27SDimitry Andricdef BuiltinTypes : GenericTable { 153606c3fb27SDimitry Andric let FilterClass = "BuiltinType"; 1537bdd1243dSDimitry Andric let Fields = ["Name", "Opcode"]; 1538bdd1243dSDimitry Andric} 1539bdd1243dSDimitry Andric 1540bdd1243dSDimitry Andric// Function to lookup builtin types by their demangled name. 1541bdd1243dSDimitry Andricdef lookupBuiltinType : SearchIndex { 154206c3fb27SDimitry Andric let Table = BuiltinTypes; 1543bdd1243dSDimitry Andric let Key = ["Name"]; 1544bdd1243dSDimitry Andric} 1545bdd1243dSDimitry Andric 154606c3fb27SDimitry Andricdef : BuiltinType<"spirv.ReserveId", OpTypeReserveId>; 154706c3fb27SDimitry Andricdef : BuiltinType<"spirv.PipeStorage", OpTypePipeStorage>; 154806c3fb27SDimitry Andricdef : BuiltinType<"spirv.Queue", OpTypeQueue>; 154906c3fb27SDimitry Andricdef : BuiltinType<"spirv.Event", OpTypeEvent>; 155006c3fb27SDimitry Andricdef : BuiltinType<"spirv.Sampler", OpTypeSampler>; 155106c3fb27SDimitry Andricdef : BuiltinType<"spirv.DeviceEvent", OpTypeDeviceEvent>; 155206c3fb27SDimitry Andricdef : BuiltinType<"spirv.Image", OpTypeImage>; 155306c3fb27SDimitry Andricdef : BuiltinType<"spirv.SampledImage", OpTypeSampledImage>; 155406c3fb27SDimitry Andricdef : BuiltinType<"spirv.Pipe", OpTypePipe>; 1555*0fca6ea1SDimitry Andricdef : BuiltinType<"spirv.CooperativeMatrixKHR", OpTypeCooperativeMatrixKHR>; 1556bdd1243dSDimitry Andric 155706c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 155806c3fb27SDimitry Andric// Class matching an OpenCL builtin type name to an equivalent SPIR-V 155906c3fb27SDimitry Andric// builtin type literal. 156006c3fb27SDimitry Andric// 156106c3fb27SDimitry Andric// name is the name of the given OpenCL builtin type. 156206c3fb27SDimitry Andric// spirvTypeLiteral is the literal of an equivalent SPIR-V builtin type. 156306c3fb27SDimitry Andric//===----------------------------------------------------------------------===// 156406c3fb27SDimitry Andricclass OpenCLType<string name, string spirvTypeLiteral> { 1565bdd1243dSDimitry Andric string Name = name; 156606c3fb27SDimitry Andric string SpirvTypeLiteral = spirvTypeLiteral; 1567bdd1243dSDimitry Andric} 1568bdd1243dSDimitry Andric 156906c3fb27SDimitry Andric// Table gathering all the OpenCL type records. 157006c3fb27SDimitry Andricdef OpenCLTypes : GenericTable { 157106c3fb27SDimitry Andric let FilterClass = "OpenCLType"; 157206c3fb27SDimitry Andric let Fields = ["Name", "SpirvTypeLiteral"]; 1573bdd1243dSDimitry Andric} 1574bdd1243dSDimitry Andric 157506c3fb27SDimitry Andric// Function to lookup OpenCL types by their name. 157606c3fb27SDimitry Andricdef lookupOpenCLType : SearchIndex { 157706c3fb27SDimitry Andric let Table = OpenCLTypes; 1578bdd1243dSDimitry Andric let Key = ["Name"]; 1579bdd1243dSDimitry Andric} 1580bdd1243dSDimitry Andric 158106c3fb27SDimitry Andricdef : OpenCLType<"opencl.reserve_id_t", "spirv.ReserveId">; 158206c3fb27SDimitry Andricdef : OpenCLType<"opencl.event_t", "spirv.Event">; 158306c3fb27SDimitry Andricdef : OpenCLType<"opencl.queue_t", "spirv.Queue">; 158406c3fb27SDimitry Andricdef : OpenCLType<"opencl.sampler_t", "spirv.Sampler">; 158506c3fb27SDimitry Andricdef : OpenCLType<"opencl.clk_event_t", "spirv.DeviceEvent">; 158606c3fb27SDimitry Andric 158706c3fb27SDimitry Andricforeach aq = ["_t", "_ro_t", "_wo_t", "_rw_t"] in { 158806c3fb27SDimitry Andric defvar p = !cond(!not(!eq(!find(aq, "_rw_t"), -1)) : "2", 158906c3fb27SDimitry Andric !not(!eq(!find(aq, "_wo_t"), -1)) : "1", 159006c3fb27SDimitry Andric true : "0"); 159106c3fb27SDimitry Andric def : OpenCLType<!strconcat("opencl.pipe", aq), 159206c3fb27SDimitry Andric !strconcat("spirv.Pipe._", p)>; 1593bdd1243dSDimitry Andric} 1594bdd1243dSDimitry Andric 1595bdd1243dSDimitry Andricforeach aq = ["_t", "_ro_t", "_wo_t", "_rw_t"] in { 159606c3fb27SDimitry Andric defvar p7 = !cond(!not(!eq(!find(aq, "_rw_t"), -1)) : "2", 159706c3fb27SDimitry Andric !not(!eq(!find(aq, "_wo_t"), -1)) : "1", 159806c3fb27SDimitry Andric true : "0"); 159906c3fb27SDimitry Andric 160006c3fb27SDimitry Andric def : OpenCLType<!strconcat("opencl.image1d", aq), 160106c3fb27SDimitry Andric !strconcat("spirv.Image._void_0_0_0_0_0_0_", p7)>; 160206c3fb27SDimitry Andric def : OpenCLType<!strconcat("opencl.image1d_array", aq), 160306c3fb27SDimitry Andric !strconcat("spirv.Image._void_0_0_1_0_0_0_", p7)>; 160406c3fb27SDimitry Andric def : OpenCLType<!strconcat("opencl.image1d_buffer", aq), 160506c3fb27SDimitry Andric !strconcat("spirv.Image._void_5_0_0_0_0_0_", p7)>; 1606bdd1243dSDimitry Andric 1607bdd1243dSDimitry Andric foreach a1 = ["", "_array"] in { 1608bdd1243dSDimitry Andric foreach a2 = ["", "_msaa"] in { 1609bdd1243dSDimitry Andric foreach a3 = ["", "_depth"] in { 161006c3fb27SDimitry Andric defvar p2 = !cond(!not(!eq(!find(a3, "_depth"), -1)) : "1", true : "0"); 161106c3fb27SDimitry Andric defvar p3 = !cond(!not(!eq(!find(a1, "_array"), -1)) : "1", true : "0"); 161206c3fb27SDimitry Andric defvar p4 = !cond(!not(!eq(!find(a2, "msaa"), -1)) : "1", true : "0"); 161306c3fb27SDimitry Andric 161406c3fb27SDimitry Andric def : OpenCLType<!strconcat("opencl.image2d", a1, a2, a3, aq), 161506c3fb27SDimitry Andric !strconcat("spirv.Image._void_1_", p2 , "_", p3, "_", p4, "_0_0_", p7)>; 1616bdd1243dSDimitry Andric } 1617bdd1243dSDimitry Andric } 1618bdd1243dSDimitry Andric } 1619bdd1243dSDimitry Andric 162006c3fb27SDimitry Andric def : OpenCLType<!strconcat("opencl.image3d", aq), 162106c3fb27SDimitry Andric !strconcat("spirv.Image._void_2_0_0_0_0_0_", p7)>; 1622bdd1243dSDimitry Andric} 1623bdd1243dSDimitry Andric 1624bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1625bdd1243dSDimitry Andric// Classes definining various OpenCL enums. 1626bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 1627bdd1243dSDimitry Andric 1628bdd1243dSDimitry Andric// OpenCL memory_scope enum 1629bdd1243dSDimitry Andricdef CLMemoryScope : GenericEnum { 1630bdd1243dSDimitry Andric let FilterClass = "CLMemoryScope"; 1631bdd1243dSDimitry Andric let NameField = "Name"; 1632bdd1243dSDimitry Andric let ValueField = "Value"; 1633bdd1243dSDimitry Andric} 1634bdd1243dSDimitry Andric 1635bdd1243dSDimitry Andricclass CLMemoryScope<bits<32> value> { 1636bdd1243dSDimitry Andric string Name = NAME; 1637bdd1243dSDimitry Andric bits<32> Value = value; 1638bdd1243dSDimitry Andric} 1639bdd1243dSDimitry Andric 1640bdd1243dSDimitry Andricdef memory_scope_work_item : CLMemoryScope<0>; 1641bdd1243dSDimitry Andricdef memory_scope_work_group : CLMemoryScope<1>; 1642bdd1243dSDimitry Andricdef memory_scope_device : CLMemoryScope<2>; 1643bdd1243dSDimitry Andricdef memory_scope_all_svm_devices : CLMemoryScope<3>; 1644bdd1243dSDimitry Andricdef memory_scope_sub_group : CLMemoryScope<4>; 1645bdd1243dSDimitry Andric 1646bdd1243dSDimitry Andric// OpenCL sampler addressing mode/bitmask enum 1647bdd1243dSDimitry Andricdef CLSamplerAddressingMode : GenericEnum { 1648bdd1243dSDimitry Andric let FilterClass = "CLSamplerAddressingMode"; 1649bdd1243dSDimitry Andric let NameField = "Name"; 1650bdd1243dSDimitry Andric let ValueField = "Value"; 1651bdd1243dSDimitry Andric} 1652bdd1243dSDimitry Andric 1653bdd1243dSDimitry Andricclass CLSamplerAddressingMode<bits<32> value> { 1654bdd1243dSDimitry Andric string Name = NAME; 1655bdd1243dSDimitry Andric bits<32> Value = value; 1656bdd1243dSDimitry Andric} 1657bdd1243dSDimitry Andric 1658bdd1243dSDimitry Andricdef CLK_ADDRESS_NONE : CLSamplerAddressingMode<0x0>; 1659bdd1243dSDimitry Andricdef CLK_ADDRESS_CLAMP : CLSamplerAddressingMode<0x4>; 1660bdd1243dSDimitry Andricdef CLK_ADDRESS_CLAMP_TO_EDGE : CLSamplerAddressingMode<0x2>; 1661bdd1243dSDimitry Andricdef CLK_ADDRESS_REPEAT : CLSamplerAddressingMode<0x6>; 1662bdd1243dSDimitry Andricdef CLK_ADDRESS_MIRRORED_REPEAT : CLSamplerAddressingMode<0x8>; 1663bdd1243dSDimitry Andricdef CLK_ADDRESS_MODE_MASK : CLSamplerAddressingMode<0xE>; 1664bdd1243dSDimitry Andricdef CLK_NORMALIZED_COORDS_FALSE : CLSamplerAddressingMode<0x0>; 1665bdd1243dSDimitry Andricdef CLK_NORMALIZED_COORDS_TRUE : CLSamplerAddressingMode<0x1>; 1666bdd1243dSDimitry Andricdef CLK_FILTER_NEAREST : CLSamplerAddressingMode<0x10>; 1667bdd1243dSDimitry Andricdef CLK_FILTER_LINEAR : CLSamplerAddressingMode<0x20>; 1668bdd1243dSDimitry Andric 1669bdd1243dSDimitry Andric// OpenCL memory fences 1670bdd1243dSDimitry Andricdef CLMemoryFenceFlags : GenericEnum { 1671bdd1243dSDimitry Andric let FilterClass = "CLMemoryFenceFlags"; 1672bdd1243dSDimitry Andric let NameField = "Name"; 1673bdd1243dSDimitry Andric let ValueField = "Value"; 1674bdd1243dSDimitry Andric} 1675bdd1243dSDimitry Andric 1676bdd1243dSDimitry Andricclass CLMemoryFenceFlags<bits<32> value> { 1677bdd1243dSDimitry Andric string Name = NAME; 1678bdd1243dSDimitry Andric bits<32> Value = value; 1679bdd1243dSDimitry Andric} 1680bdd1243dSDimitry Andric 1681bdd1243dSDimitry Andricdef CLK_LOCAL_MEM_FENCE : CLMemoryFenceFlags<0x1>; 1682bdd1243dSDimitry Andricdef CLK_GLOBAL_MEM_FENCE : CLMemoryFenceFlags<0x2>; 1683bdd1243dSDimitry Andricdef CLK_IMAGE_MEM_FENCE : CLMemoryFenceFlags<0x4>; 1684