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