xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVBaseInfo.h (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
1*81ad6265SDimitry Andric //===-- SPIRVBaseInfo.h -  Top level definitions for SPIRV ------*- C++ -*-===//
2*81ad6265SDimitry Andric //
3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*81ad6265SDimitry Andric //
7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
8*81ad6265SDimitry Andric //
9*81ad6265SDimitry Andric // This file contains small standalone helper functions and enum definitions for
10*81ad6265SDimitry Andric // the SPIRV target useful for the compiler back-end and the MC libraries.
11*81ad6265SDimitry Andric // As such, it deliberately does not include references to LLVM core
12*81ad6265SDimitry Andric // code gen types, passes, etc..
13*81ad6265SDimitry Andric //
14*81ad6265SDimitry Andric //===----------------------------------------------------------------------===//
15*81ad6265SDimitry Andric 
16*81ad6265SDimitry Andric #ifndef LLVM_LIB_TARGET_SPIRV_MCTARGETDESC_SPIRVBASEINFO_H
17*81ad6265SDimitry Andric #define LLVM_LIB_TARGET_SPIRV_MCTARGETDESC_SPIRVBASEINFO_H
18*81ad6265SDimitry Andric 
19*81ad6265SDimitry Andric #include "llvm/ADT/StringRef.h"
20*81ad6265SDimitry Andric #include <string>
21*81ad6265SDimitry Andric 
22*81ad6265SDimitry Andric namespace llvm {
23*81ad6265SDimitry Andric namespace SPIRV {
24*81ad6265SDimitry Andric enum class Capability : uint32_t {
25*81ad6265SDimitry Andric   Matrix = 0,
26*81ad6265SDimitry Andric   Shader = 1,
27*81ad6265SDimitry Andric   Geometry = 2,
28*81ad6265SDimitry Andric   Tessellation = 3,
29*81ad6265SDimitry Andric   Addresses = 4,
30*81ad6265SDimitry Andric   Linkage = 5,
31*81ad6265SDimitry Andric   Kernel = 6,
32*81ad6265SDimitry Andric   Vector16 = 7,
33*81ad6265SDimitry Andric   Float16Buffer = 8,
34*81ad6265SDimitry Andric   Float16 = 9,
35*81ad6265SDimitry Andric   Float64 = 10,
36*81ad6265SDimitry Andric   Int64 = 11,
37*81ad6265SDimitry Andric   Int64Atomics = 12,
38*81ad6265SDimitry Andric   ImageBasic = 13,
39*81ad6265SDimitry Andric   ImageReadWrite = 14,
40*81ad6265SDimitry Andric   ImageMipmap = 15,
41*81ad6265SDimitry Andric   Pipes = 17,
42*81ad6265SDimitry Andric   Groups = 18,
43*81ad6265SDimitry Andric   DeviceEnqueue = 19,
44*81ad6265SDimitry Andric   LiteralSampler = 20,
45*81ad6265SDimitry Andric   AtomicStorage = 21,
46*81ad6265SDimitry Andric   Int16 = 22,
47*81ad6265SDimitry Andric   TessellationPointSize = 23,
48*81ad6265SDimitry Andric   GeometryPointSize = 24,
49*81ad6265SDimitry Andric   ImageGatherExtended = 25,
50*81ad6265SDimitry Andric   StorageImageMultisample = 27,
51*81ad6265SDimitry Andric   UniformBufferArrayDynamicIndexing = 28,
52*81ad6265SDimitry Andric   SampledImageArrayDymnamicIndexing = 29,
53*81ad6265SDimitry Andric   ClipDistance = 32,
54*81ad6265SDimitry Andric   CullDistance = 33,
55*81ad6265SDimitry Andric   ImageCubeArray = 34,
56*81ad6265SDimitry Andric   SampleRateShading = 35,
57*81ad6265SDimitry Andric   ImageRect = 36,
58*81ad6265SDimitry Andric   SampledRect = 37,
59*81ad6265SDimitry Andric   GenericPointer = 38,
60*81ad6265SDimitry Andric   Int8 = 39,
61*81ad6265SDimitry Andric   InputAttachment = 40,
62*81ad6265SDimitry Andric   SparseResidency = 41,
63*81ad6265SDimitry Andric   MinLod = 42,
64*81ad6265SDimitry Andric   Sampled1D = 43,
65*81ad6265SDimitry Andric   Image1D = 44,
66*81ad6265SDimitry Andric   SampledCubeArray = 45,
67*81ad6265SDimitry Andric   SampledBuffer = 46,
68*81ad6265SDimitry Andric   ImageBuffer = 47,
69*81ad6265SDimitry Andric   ImageMSArray = 48,
70*81ad6265SDimitry Andric   StorageImageExtendedFormats = 49,
71*81ad6265SDimitry Andric   ImageQuery = 50,
72*81ad6265SDimitry Andric   DerivativeControl = 51,
73*81ad6265SDimitry Andric   InterpolationFunction = 52,
74*81ad6265SDimitry Andric   TransformFeedback = 53,
75*81ad6265SDimitry Andric   GeometryStreams = 54,
76*81ad6265SDimitry Andric   StorageImageReadWithoutFormat = 55,
77*81ad6265SDimitry Andric   StorageImageWriteWithoutFormat = 56,
78*81ad6265SDimitry Andric   MultiViewport = 57,
79*81ad6265SDimitry Andric   SubgroupDispatch = 58,
80*81ad6265SDimitry Andric   NamedBarrier = 59,
81*81ad6265SDimitry Andric   PipeStorage = 60,
82*81ad6265SDimitry Andric   GroupNonUniform = 61,
83*81ad6265SDimitry Andric   GroupNonUniformVote = 62,
84*81ad6265SDimitry Andric   GroupNonUniformArithmetic = 63,
85*81ad6265SDimitry Andric   GroupNonUniformBallot = 64,
86*81ad6265SDimitry Andric   GroupNonUniformShuffle = 65,
87*81ad6265SDimitry Andric   GroupNonUniformShuffleRelative = 66,
88*81ad6265SDimitry Andric   GroupNonUniformClustered = 67,
89*81ad6265SDimitry Andric   GroupNonUniformQuad = 68,
90*81ad6265SDimitry Andric   SubgroupBallotKHR = 4423,
91*81ad6265SDimitry Andric   DrawParameters = 4427,
92*81ad6265SDimitry Andric   SubgroupVoteKHR = 4431,
93*81ad6265SDimitry Andric   StorageBuffer16BitAccess = 4433,
94*81ad6265SDimitry Andric   StorageUniform16 = 4434,
95*81ad6265SDimitry Andric   StoragePushConstant16 = 4435,
96*81ad6265SDimitry Andric   StorageInputOutput16 = 4436,
97*81ad6265SDimitry Andric   DeviceGroup = 4437,
98*81ad6265SDimitry Andric   MultiView = 4439,
99*81ad6265SDimitry Andric   VariablePointersStorageBuffer = 4441,
100*81ad6265SDimitry Andric   VariablePointers = 4442,
101*81ad6265SDimitry Andric   AtomicStorageOps = 4445,
102*81ad6265SDimitry Andric   SampleMaskPostDepthCoverage = 4447,
103*81ad6265SDimitry Andric   StorageBuffer8BitAccess = 4448,
104*81ad6265SDimitry Andric   UniformAndStorageBuffer8BitAccess = 4449,
105*81ad6265SDimitry Andric   StoragePushConstant8 = 4450,
106*81ad6265SDimitry Andric   DenormPreserve = 4464,
107*81ad6265SDimitry Andric   DenormFlushToZero = 4465,
108*81ad6265SDimitry Andric   SignedZeroInfNanPreserve = 4466,
109*81ad6265SDimitry Andric   RoundingModeRTE = 4467,
110*81ad6265SDimitry Andric   RoundingModeRTZ = 4468,
111*81ad6265SDimitry Andric   Float16ImageAMD = 5008,
112*81ad6265SDimitry Andric   ImageGatherBiasLodAMD = 5009,
113*81ad6265SDimitry Andric   FragmentMaskAMD = 5010,
114*81ad6265SDimitry Andric   StencilExportEXT = 5013,
115*81ad6265SDimitry Andric   ImageReadWriteLodAMD = 5015,
116*81ad6265SDimitry Andric   SampleMaskOverrideCoverageNV = 5249,
117*81ad6265SDimitry Andric   GeometryShaderPassthroughNV = 5251,
118*81ad6265SDimitry Andric   ShaderViewportIndexLayerEXT = 5254,
119*81ad6265SDimitry Andric   ShaderViewportMaskNV = 5255,
120*81ad6265SDimitry Andric   ShaderStereoViewNV = 5259,
121*81ad6265SDimitry Andric   PerViewAttributesNV = 5260,
122*81ad6265SDimitry Andric   FragmentFullyCoveredEXT = 5265,
123*81ad6265SDimitry Andric   MeshShadingNV = 5266,
124*81ad6265SDimitry Andric   ShaderNonUniformEXT = 5301,
125*81ad6265SDimitry Andric   RuntimeDescriptorArrayEXT = 5302,
126*81ad6265SDimitry Andric   InputAttachmentArrayDynamicIndexingEXT = 5303,
127*81ad6265SDimitry Andric   UniformTexelBufferArrayDynamicIndexingEXT = 5304,
128*81ad6265SDimitry Andric   StorageTexelBufferArrayDynamicIndexingEXT = 5305,
129*81ad6265SDimitry Andric   UniformBufferArrayNonUniformIndexingEXT = 5306,
130*81ad6265SDimitry Andric   SampledImageArrayNonUniformIndexingEXT = 5307,
131*81ad6265SDimitry Andric   StorageBufferArrayNonUniformIndexingEXT = 5308,
132*81ad6265SDimitry Andric   StorageImageArrayNonUniformIndexingEXT = 5309,
133*81ad6265SDimitry Andric   InputAttachmentArrayNonUniformIndexingEXT = 5310,
134*81ad6265SDimitry Andric   UniformTexelBufferArrayNonUniformIndexingEXT = 5311,
135*81ad6265SDimitry Andric   StorageTexelBufferArrayNonUniformIndexingEXT = 5312,
136*81ad6265SDimitry Andric   RayTracingNV = 5340,
137*81ad6265SDimitry Andric   SubgroupShuffleINTEL = 5568,
138*81ad6265SDimitry Andric   SubgroupBufferBlockIOINTEL = 5569,
139*81ad6265SDimitry Andric   SubgroupImageBlockIOINTEL = 5570,
140*81ad6265SDimitry Andric   SubgroupImageMediaBlockIOINTEL = 5579,
141*81ad6265SDimitry Andric   SubgroupAvcMotionEstimationINTEL = 5696,
142*81ad6265SDimitry Andric   SubgroupAvcMotionEstimationIntraINTEL = 5697,
143*81ad6265SDimitry Andric   SubgroupAvcMotionEstimationChromaINTEL = 5698,
144*81ad6265SDimitry Andric   GroupNonUniformPartitionedNV = 5297,
145*81ad6265SDimitry Andric   VulkanMemoryModelKHR = 5345,
146*81ad6265SDimitry Andric   VulkanMemoryModelDeviceScopeKHR = 5346,
147*81ad6265SDimitry Andric   ImageFootprintNV = 5282,
148*81ad6265SDimitry Andric   FragmentBarycentricNV = 5284,
149*81ad6265SDimitry Andric   ComputeDerivativeGroupQuadsNV = 5288,
150*81ad6265SDimitry Andric   ComputeDerivativeGroupLinearNV = 5350,
151*81ad6265SDimitry Andric   FragmentDensityEXT = 5291,
152*81ad6265SDimitry Andric   PhysicalStorageBufferAddressesEXT = 5347,
153*81ad6265SDimitry Andric   CooperativeMatrixNV = 5357,
154*81ad6265SDimitry Andric };
155*81ad6265SDimitry Andric StringRef getCapabilityName(Capability e);
156*81ad6265SDimitry Andric 
157*81ad6265SDimitry Andric enum class SourceLanguage : uint32_t {
158*81ad6265SDimitry Andric   Unknown = 0,
159*81ad6265SDimitry Andric   ESSL = 1,
160*81ad6265SDimitry Andric   GLSL = 2,
161*81ad6265SDimitry Andric   OpenCL_C = 3,
162*81ad6265SDimitry Andric   OpenCL_CPP = 4,
163*81ad6265SDimitry Andric   HLSL = 5,
164*81ad6265SDimitry Andric };
165*81ad6265SDimitry Andric StringRef getSourceLanguageName(SourceLanguage e);
166*81ad6265SDimitry Andric 
167*81ad6265SDimitry Andric enum class AddressingModel : uint32_t {
168*81ad6265SDimitry Andric   Logical = 0,
169*81ad6265SDimitry Andric   Physical32 = 1,
170*81ad6265SDimitry Andric   Physical64 = 2,
171*81ad6265SDimitry Andric   PhysicalStorageBuffer64EXT = 5348,
172*81ad6265SDimitry Andric };
173*81ad6265SDimitry Andric StringRef getAddressingModelName(AddressingModel e);
174*81ad6265SDimitry Andric 
175*81ad6265SDimitry Andric enum class ExecutionModel : uint32_t {
176*81ad6265SDimitry Andric   Vertex = 0,
177*81ad6265SDimitry Andric   TessellationControl = 1,
178*81ad6265SDimitry Andric   TessellationEvaluation = 2,
179*81ad6265SDimitry Andric   Geometry = 3,
180*81ad6265SDimitry Andric   Fragment = 4,
181*81ad6265SDimitry Andric   GLCompute = 5,
182*81ad6265SDimitry Andric   Kernel = 6,
183*81ad6265SDimitry Andric   TaskNV = 5267,
184*81ad6265SDimitry Andric   MeshNV = 5268,
185*81ad6265SDimitry Andric   RayGenerationNV = 5313,
186*81ad6265SDimitry Andric   IntersectionNV = 5314,
187*81ad6265SDimitry Andric   AnyHitNV = 5315,
188*81ad6265SDimitry Andric   ClosestHitNV = 5316,
189*81ad6265SDimitry Andric   MissNV = 5317,
190*81ad6265SDimitry Andric   CallableNV = 5318,
191*81ad6265SDimitry Andric };
192*81ad6265SDimitry Andric StringRef getExecutionModelName(ExecutionModel e);
193*81ad6265SDimitry Andric 
194*81ad6265SDimitry Andric enum class MemoryModel : uint32_t {
195*81ad6265SDimitry Andric   Simple = 0,
196*81ad6265SDimitry Andric   GLSL450 = 1,
197*81ad6265SDimitry Andric   OpenCL = 2,
198*81ad6265SDimitry Andric   VulkanKHR = 3,
199*81ad6265SDimitry Andric };
200*81ad6265SDimitry Andric StringRef getMemoryModelName(MemoryModel e);
201*81ad6265SDimitry Andric 
202*81ad6265SDimitry Andric enum class ExecutionMode : uint32_t {
203*81ad6265SDimitry Andric   Invocations = 0,
204*81ad6265SDimitry Andric   SpacingEqual = 1,
205*81ad6265SDimitry Andric   SpacingFractionalEven = 2,
206*81ad6265SDimitry Andric   SpacingFractionalOdd = 3,
207*81ad6265SDimitry Andric   VertexOrderCw = 4,
208*81ad6265SDimitry Andric   VertexOrderCcw = 5,
209*81ad6265SDimitry Andric   PixelCenterInteger = 6,
210*81ad6265SDimitry Andric   OriginUpperLeft = 7,
211*81ad6265SDimitry Andric   OriginLowerLeft = 8,
212*81ad6265SDimitry Andric   EarlyFragmentTests = 9,
213*81ad6265SDimitry Andric   PointMode = 10,
214*81ad6265SDimitry Andric   Xfb = 11,
215*81ad6265SDimitry Andric   DepthReplacing = 12,
216*81ad6265SDimitry Andric   DepthGreater = 14,
217*81ad6265SDimitry Andric   DepthLess = 15,
218*81ad6265SDimitry Andric   DepthUnchanged = 16,
219*81ad6265SDimitry Andric   LocalSize = 17,
220*81ad6265SDimitry Andric   LocalSizeHint = 18,
221*81ad6265SDimitry Andric   InputPoints = 19,
222*81ad6265SDimitry Andric   InputLines = 20,
223*81ad6265SDimitry Andric   InputLinesAdjacency = 21,
224*81ad6265SDimitry Andric   Triangles = 22,
225*81ad6265SDimitry Andric   InputTrianglesAdjacency = 23,
226*81ad6265SDimitry Andric   Quads = 24,
227*81ad6265SDimitry Andric   Isolines = 25,
228*81ad6265SDimitry Andric   OutputVertices = 26,
229*81ad6265SDimitry Andric   OutputPoints = 27,
230*81ad6265SDimitry Andric   OutputLineStrip = 28,
231*81ad6265SDimitry Andric   OutputTriangleStrip = 29,
232*81ad6265SDimitry Andric   VecTypeHint = 30,
233*81ad6265SDimitry Andric   ContractionOff = 31,
234*81ad6265SDimitry Andric   Initializer = 33,
235*81ad6265SDimitry Andric   Finalizer = 34,
236*81ad6265SDimitry Andric   SubgroupSize = 35,
237*81ad6265SDimitry Andric   SubgroupsPerWorkgroup = 36,
238*81ad6265SDimitry Andric   SubgroupsPerWorkgroupId = 37,
239*81ad6265SDimitry Andric   LocalSizeId = 38,
240*81ad6265SDimitry Andric   LocalSizeHintId = 39,
241*81ad6265SDimitry Andric   PostDepthCoverage = 4446,
242*81ad6265SDimitry Andric   DenormPreserve = 4459,
243*81ad6265SDimitry Andric   DenormFlushToZero = 4460,
244*81ad6265SDimitry Andric   SignedZeroInfNanPreserve = 4461,
245*81ad6265SDimitry Andric   RoundingModeRTE = 4462,
246*81ad6265SDimitry Andric   RoundingModeRTZ = 4463,
247*81ad6265SDimitry Andric   StencilRefReplacingEXT = 5027,
248*81ad6265SDimitry Andric   OutputLinesNV = 5269,
249*81ad6265SDimitry Andric   DerivativeGroupQuadsNV = 5289,
250*81ad6265SDimitry Andric   DerivativeGroupLinearNV = 5290,
251*81ad6265SDimitry Andric   OutputTrianglesNV = 5298,
252*81ad6265SDimitry Andric };
253*81ad6265SDimitry Andric StringRef getExecutionModeName(ExecutionMode e);
254*81ad6265SDimitry Andric 
255*81ad6265SDimitry Andric enum class StorageClass : uint32_t {
256*81ad6265SDimitry Andric   UniformConstant = 0,
257*81ad6265SDimitry Andric   Input = 1,
258*81ad6265SDimitry Andric   Uniform = 2,
259*81ad6265SDimitry Andric   Output = 3,
260*81ad6265SDimitry Andric   Workgroup = 4,
261*81ad6265SDimitry Andric   CrossWorkgroup = 5,
262*81ad6265SDimitry Andric   Private = 6,
263*81ad6265SDimitry Andric   Function = 7,
264*81ad6265SDimitry Andric   Generic = 8,
265*81ad6265SDimitry Andric   PushConstant = 9,
266*81ad6265SDimitry Andric   AtomicCounter = 10,
267*81ad6265SDimitry Andric   Image = 11,
268*81ad6265SDimitry Andric   StorageBuffer = 12,
269*81ad6265SDimitry Andric   CallableDataNV = 5328,
270*81ad6265SDimitry Andric   IncomingCallableDataNV = 5329,
271*81ad6265SDimitry Andric   RayPayloadNV = 5338,
272*81ad6265SDimitry Andric   HitAttributeNV = 5339,
273*81ad6265SDimitry Andric   IncomingRayPayloadNV = 5342,
274*81ad6265SDimitry Andric   ShaderRecordBufferNV = 5343,
275*81ad6265SDimitry Andric   PhysicalStorageBufferEXT = 5349,
276*81ad6265SDimitry Andric };
277*81ad6265SDimitry Andric StringRef getStorageClassName(StorageClass e);
278*81ad6265SDimitry Andric 
279*81ad6265SDimitry Andric enum class Dim : uint32_t {
280*81ad6265SDimitry Andric   DIM_1D = 0,
281*81ad6265SDimitry Andric   DIM_2D = 1,
282*81ad6265SDimitry Andric   DIM_3D = 2,
283*81ad6265SDimitry Andric   DIM_Cube = 3,
284*81ad6265SDimitry Andric   DIM_Rect = 4,
285*81ad6265SDimitry Andric   DIM_Buffer = 5,
286*81ad6265SDimitry Andric   DIM_SubpassData = 6,
287*81ad6265SDimitry Andric };
288*81ad6265SDimitry Andric StringRef getDimName(Dim e);
289*81ad6265SDimitry Andric 
290*81ad6265SDimitry Andric enum class SamplerAddressingMode : uint32_t {
291*81ad6265SDimitry Andric   None = 0,
292*81ad6265SDimitry Andric   ClampToEdge = 1,
293*81ad6265SDimitry Andric   Clamp = 2,
294*81ad6265SDimitry Andric   Repeat = 3,
295*81ad6265SDimitry Andric   RepeatMirrored = 4,
296*81ad6265SDimitry Andric };
297*81ad6265SDimitry Andric StringRef getSamplerAddressingModeName(SamplerAddressingMode e);
298*81ad6265SDimitry Andric 
299*81ad6265SDimitry Andric enum class SamplerFilterMode : uint32_t {
300*81ad6265SDimitry Andric   Nearest = 0,
301*81ad6265SDimitry Andric   Linear = 1,
302*81ad6265SDimitry Andric };
303*81ad6265SDimitry Andric StringRef getSamplerFilterModeName(SamplerFilterMode e);
304*81ad6265SDimitry Andric 
305*81ad6265SDimitry Andric enum class ImageFormat : uint32_t {
306*81ad6265SDimitry Andric   Unknown = 0,
307*81ad6265SDimitry Andric   Rgba32f = 1,
308*81ad6265SDimitry Andric   Rgba16f = 2,
309*81ad6265SDimitry Andric   R32f = 3,
310*81ad6265SDimitry Andric   Rgba8 = 4,
311*81ad6265SDimitry Andric   Rgba8Snorm = 5,
312*81ad6265SDimitry Andric   Rg32f = 6,
313*81ad6265SDimitry Andric   Rg16f = 7,
314*81ad6265SDimitry Andric   R11fG11fB10f = 8,
315*81ad6265SDimitry Andric   R16f = 9,
316*81ad6265SDimitry Andric   Rgba16 = 10,
317*81ad6265SDimitry Andric   Rgb10A2 = 11,
318*81ad6265SDimitry Andric   Rg16 = 12,
319*81ad6265SDimitry Andric   Rg8 = 13,
320*81ad6265SDimitry Andric   R16 = 14,
321*81ad6265SDimitry Andric   R8 = 15,
322*81ad6265SDimitry Andric   Rgba16Snorm = 16,
323*81ad6265SDimitry Andric   Rg16Snorm = 17,
324*81ad6265SDimitry Andric   Rg8Snorm = 18,
325*81ad6265SDimitry Andric   R16Snorm = 19,
326*81ad6265SDimitry Andric   R8Snorm = 20,
327*81ad6265SDimitry Andric   Rgba32i = 21,
328*81ad6265SDimitry Andric   Rgba16i = 22,
329*81ad6265SDimitry Andric   Rgba8i = 23,
330*81ad6265SDimitry Andric   R32i = 24,
331*81ad6265SDimitry Andric   Rg32i = 25,
332*81ad6265SDimitry Andric   Rg16i = 26,
333*81ad6265SDimitry Andric   Rg8i = 27,
334*81ad6265SDimitry Andric   R16i = 28,
335*81ad6265SDimitry Andric   R8i = 29,
336*81ad6265SDimitry Andric   Rgba32ui = 30,
337*81ad6265SDimitry Andric   Rgba16ui = 31,
338*81ad6265SDimitry Andric   Rgba8ui = 32,
339*81ad6265SDimitry Andric   R32ui = 33,
340*81ad6265SDimitry Andric   Rgb10a2ui = 34,
341*81ad6265SDimitry Andric   Rg32ui = 35,
342*81ad6265SDimitry Andric   Rg16ui = 36,
343*81ad6265SDimitry Andric   Rg8ui = 37,
344*81ad6265SDimitry Andric   R16ui = 38,
345*81ad6265SDimitry Andric   R8ui = 39,
346*81ad6265SDimitry Andric };
347*81ad6265SDimitry Andric StringRef getImageFormatName(ImageFormat e);
348*81ad6265SDimitry Andric 
349*81ad6265SDimitry Andric enum class ImageChannelOrder : uint32_t {
350*81ad6265SDimitry Andric   R = 0,
351*81ad6265SDimitry Andric   A = 1,
352*81ad6265SDimitry Andric   RG = 2,
353*81ad6265SDimitry Andric   RA = 3,
354*81ad6265SDimitry Andric   RGB = 4,
355*81ad6265SDimitry Andric   RGBA = 5,
356*81ad6265SDimitry Andric   BGRA = 6,
357*81ad6265SDimitry Andric   ARGB = 7,
358*81ad6265SDimitry Andric   Intensity = 8,
359*81ad6265SDimitry Andric   Luminance = 9,
360*81ad6265SDimitry Andric   Rx = 10,
361*81ad6265SDimitry Andric   RGx = 11,
362*81ad6265SDimitry Andric   RGBx = 12,
363*81ad6265SDimitry Andric   Depth = 13,
364*81ad6265SDimitry Andric   DepthStencil = 14,
365*81ad6265SDimitry Andric   sRGB = 15,
366*81ad6265SDimitry Andric   sRGBx = 16,
367*81ad6265SDimitry Andric   sRGBA = 17,
368*81ad6265SDimitry Andric   sBGRA = 18,
369*81ad6265SDimitry Andric   ABGR = 19,
370*81ad6265SDimitry Andric };
371*81ad6265SDimitry Andric StringRef getImageChannelOrderName(ImageChannelOrder e);
372*81ad6265SDimitry Andric 
373*81ad6265SDimitry Andric enum class ImageChannelDataType : uint32_t {
374*81ad6265SDimitry Andric   SnormInt8 = 0,
375*81ad6265SDimitry Andric   SnormInt16 = 1,
376*81ad6265SDimitry Andric   UnormInt8 = 2,
377*81ad6265SDimitry Andric   UnormInt16 = 3,
378*81ad6265SDimitry Andric   UnormShort565 = 4,
379*81ad6265SDimitry Andric   UnormShort555 = 5,
380*81ad6265SDimitry Andric   UnormInt101010 = 6,
381*81ad6265SDimitry Andric   SignedInt8 = 7,
382*81ad6265SDimitry Andric   SignedInt16 = 8,
383*81ad6265SDimitry Andric   SignedInt32 = 9,
384*81ad6265SDimitry Andric   UnsignedInt8 = 10,
385*81ad6265SDimitry Andric   UnsignedInt16 = 11,
386*81ad6265SDimitry Andric   UnsigendInt32 = 12,
387*81ad6265SDimitry Andric   HalfFloat = 13,
388*81ad6265SDimitry Andric   Float = 14,
389*81ad6265SDimitry Andric   UnormInt24 = 15,
390*81ad6265SDimitry Andric   UnormInt101010_2 = 16,
391*81ad6265SDimitry Andric };
392*81ad6265SDimitry Andric StringRef getImageChannelDataTypeName(ImageChannelDataType e);
393*81ad6265SDimitry Andric 
394*81ad6265SDimitry Andric enum class ImageOperand : uint32_t {
395*81ad6265SDimitry Andric   None = 0x0,
396*81ad6265SDimitry Andric   Bias = 0x1,
397*81ad6265SDimitry Andric   Lod = 0x2,
398*81ad6265SDimitry Andric   Grad = 0x4,
399*81ad6265SDimitry Andric   ConstOffset = 0x8,
400*81ad6265SDimitry Andric   Offset = 0x10,
401*81ad6265SDimitry Andric   ConstOffsets = 0x20,
402*81ad6265SDimitry Andric   Sample = 0x40,
403*81ad6265SDimitry Andric   MinLod = 0x80,
404*81ad6265SDimitry Andric   MakeTexelAvailableKHR = 0x100,
405*81ad6265SDimitry Andric   MakeTexelVisibleKHR = 0x200,
406*81ad6265SDimitry Andric   NonPrivateTexelKHR = 0x400,
407*81ad6265SDimitry Andric   VolatileTexelKHR = 0x800,
408*81ad6265SDimitry Andric   SignExtend = 0x1000,
409*81ad6265SDimitry Andric   ZeroExtend = 0x2000,
410*81ad6265SDimitry Andric };
411*81ad6265SDimitry Andric std::string getImageOperandName(uint32_t e);
412*81ad6265SDimitry Andric 
413*81ad6265SDimitry Andric enum class FPFastMathMode : uint32_t {
414*81ad6265SDimitry Andric   None = 0x0,
415*81ad6265SDimitry Andric   NotNaN = 0x1,
416*81ad6265SDimitry Andric   NotInf = 0x2,
417*81ad6265SDimitry Andric   NSZ = 0x4,
418*81ad6265SDimitry Andric   AllowRecip = 0x8,
419*81ad6265SDimitry Andric   Fast = 0x10,
420*81ad6265SDimitry Andric };
421*81ad6265SDimitry Andric std::string getFPFastMathModeName(uint32_t e);
422*81ad6265SDimitry Andric 
423*81ad6265SDimitry Andric enum class FPRoundingMode : uint32_t {
424*81ad6265SDimitry Andric   RTE = 0,
425*81ad6265SDimitry Andric   RTZ = 1,
426*81ad6265SDimitry Andric   RTP = 2,
427*81ad6265SDimitry Andric   RTN = 3,
428*81ad6265SDimitry Andric };
429*81ad6265SDimitry Andric StringRef getFPRoundingModeName(FPRoundingMode e);
430*81ad6265SDimitry Andric 
431*81ad6265SDimitry Andric enum class LinkageType : uint32_t {
432*81ad6265SDimitry Andric   Export = 0,
433*81ad6265SDimitry Andric   Import = 1,
434*81ad6265SDimitry Andric };
435*81ad6265SDimitry Andric StringRef getLinkageTypeName(LinkageType e);
436*81ad6265SDimitry Andric 
437*81ad6265SDimitry Andric enum class AccessQualifier : uint32_t {
438*81ad6265SDimitry Andric   ReadOnly = 0,
439*81ad6265SDimitry Andric   WriteOnly = 1,
440*81ad6265SDimitry Andric   ReadWrite = 2,
441*81ad6265SDimitry Andric };
442*81ad6265SDimitry Andric StringRef getAccessQualifierName(AccessQualifier e);
443*81ad6265SDimitry Andric 
444*81ad6265SDimitry Andric enum class FunctionParameterAttribute : uint32_t {
445*81ad6265SDimitry Andric   Zext = 0,
446*81ad6265SDimitry Andric   Sext = 1,
447*81ad6265SDimitry Andric   ByVal = 2,
448*81ad6265SDimitry Andric   Sret = 3,
449*81ad6265SDimitry Andric   NoAlias = 4,
450*81ad6265SDimitry Andric   NoCapture = 5,
451*81ad6265SDimitry Andric   NoWrite = 6,
452*81ad6265SDimitry Andric   NoReadWrite = 7,
453*81ad6265SDimitry Andric };
454*81ad6265SDimitry Andric StringRef getFunctionParameterAttributeName(FunctionParameterAttribute e);
455*81ad6265SDimitry Andric 
456*81ad6265SDimitry Andric enum class Decoration : uint32_t {
457*81ad6265SDimitry Andric   RelaxedPrecision = 0,
458*81ad6265SDimitry Andric   SpecId = 1,
459*81ad6265SDimitry Andric   Block = 2,
460*81ad6265SDimitry Andric   BufferBlock = 3,
461*81ad6265SDimitry Andric   RowMajor = 4,
462*81ad6265SDimitry Andric   ColMajor = 5,
463*81ad6265SDimitry Andric   ArrayStride = 6,
464*81ad6265SDimitry Andric   MatrixStride = 7,
465*81ad6265SDimitry Andric   GLSLShared = 8,
466*81ad6265SDimitry Andric   GLSLPacked = 9,
467*81ad6265SDimitry Andric   CPacked = 10,
468*81ad6265SDimitry Andric   BuiltIn = 11,
469*81ad6265SDimitry Andric   NoPerspective = 13,
470*81ad6265SDimitry Andric   Flat = 14,
471*81ad6265SDimitry Andric   Patch = 15,
472*81ad6265SDimitry Andric   Centroid = 16,
473*81ad6265SDimitry Andric   Sample = 17,
474*81ad6265SDimitry Andric   Invariant = 18,
475*81ad6265SDimitry Andric   Restrict = 19,
476*81ad6265SDimitry Andric   Aliased = 20,
477*81ad6265SDimitry Andric   Volatile = 21,
478*81ad6265SDimitry Andric   Constant = 22,
479*81ad6265SDimitry Andric   Coherent = 23,
480*81ad6265SDimitry Andric   NonWritable = 24,
481*81ad6265SDimitry Andric   NonReadable = 25,
482*81ad6265SDimitry Andric   Uniform = 26,
483*81ad6265SDimitry Andric   UniformId = 27,
484*81ad6265SDimitry Andric   SaturatedConversion = 28,
485*81ad6265SDimitry Andric   Stream = 29,
486*81ad6265SDimitry Andric   Location = 30,
487*81ad6265SDimitry Andric   Component = 31,
488*81ad6265SDimitry Andric   Index = 32,
489*81ad6265SDimitry Andric   Binding = 33,
490*81ad6265SDimitry Andric   DescriptorSet = 34,
491*81ad6265SDimitry Andric   Offset = 35,
492*81ad6265SDimitry Andric   XfbBuffer = 36,
493*81ad6265SDimitry Andric   XfbStride = 37,
494*81ad6265SDimitry Andric   FuncParamAttr = 38,
495*81ad6265SDimitry Andric   FPRoundingMode = 39,
496*81ad6265SDimitry Andric   FPFastMathMode = 40,
497*81ad6265SDimitry Andric   LinkageAttributes = 41,
498*81ad6265SDimitry Andric   NoContraction = 42,
499*81ad6265SDimitry Andric   InputAttachmentIndex = 43,
500*81ad6265SDimitry Andric   Alignment = 44,
501*81ad6265SDimitry Andric   MaxByteOffset = 45,
502*81ad6265SDimitry Andric   AlignmentId = 46,
503*81ad6265SDimitry Andric   MaxByteOffsetId = 47,
504*81ad6265SDimitry Andric   NoSignedWrap = 4469,
505*81ad6265SDimitry Andric   NoUnsignedWrap = 4470,
506*81ad6265SDimitry Andric   ExplicitInterpAMD = 4999,
507*81ad6265SDimitry Andric   OverrideCoverageNV = 5248,
508*81ad6265SDimitry Andric   PassthroughNV = 5250,
509*81ad6265SDimitry Andric   ViewportRelativeNV = 5252,
510*81ad6265SDimitry Andric   SecondaryViewportRelativeNV = 5256,
511*81ad6265SDimitry Andric   PerPrimitiveNV = 5271,
512*81ad6265SDimitry Andric   PerViewNV = 5272,
513*81ad6265SDimitry Andric   PerVertexNV = 5273,
514*81ad6265SDimitry Andric   NonUniformEXT = 5300,
515*81ad6265SDimitry Andric   CountBuffer = 5634,
516*81ad6265SDimitry Andric   UserSemantic = 5635,
517*81ad6265SDimitry Andric   RestrictPointerEXT = 5355,
518*81ad6265SDimitry Andric   AliasedPointerEXT = 5356,
519*81ad6265SDimitry Andric };
520*81ad6265SDimitry Andric StringRef getDecorationName(Decoration e);
521*81ad6265SDimitry Andric 
522*81ad6265SDimitry Andric enum class BuiltIn : uint32_t {
523*81ad6265SDimitry Andric   Position = 0,
524*81ad6265SDimitry Andric   PointSize = 1,
525*81ad6265SDimitry Andric   ClipDistance = 3,
526*81ad6265SDimitry Andric   CullDistance = 4,
527*81ad6265SDimitry Andric   VertexId = 5,
528*81ad6265SDimitry Andric   InstanceId = 6,
529*81ad6265SDimitry Andric   PrimitiveId = 7,
530*81ad6265SDimitry Andric   InvocationId = 8,
531*81ad6265SDimitry Andric   Layer = 9,
532*81ad6265SDimitry Andric   ViewportIndex = 10,
533*81ad6265SDimitry Andric   TessLevelOuter = 11,
534*81ad6265SDimitry Andric   TessLevelInner = 12,
535*81ad6265SDimitry Andric   TessCoord = 13,
536*81ad6265SDimitry Andric   PatchVertices = 14,
537*81ad6265SDimitry Andric   FragCoord = 15,
538*81ad6265SDimitry Andric   PointCoord = 16,
539*81ad6265SDimitry Andric   FrontFacing = 17,
540*81ad6265SDimitry Andric   SampleId = 18,
541*81ad6265SDimitry Andric   SamplePosition = 19,
542*81ad6265SDimitry Andric   SampleMask = 20,
543*81ad6265SDimitry Andric   FragDepth = 22,
544*81ad6265SDimitry Andric   HelperInvocation = 23,
545*81ad6265SDimitry Andric   NumWorkgroups = 24,
546*81ad6265SDimitry Andric   WorkgroupSize = 25,
547*81ad6265SDimitry Andric   WorkgroupId = 26,
548*81ad6265SDimitry Andric   LocalInvocationId = 27,
549*81ad6265SDimitry Andric   GlobalInvocationId = 28,
550*81ad6265SDimitry Andric   LocalInvocationIndex = 29,
551*81ad6265SDimitry Andric   WorkDim = 30,
552*81ad6265SDimitry Andric   GlobalSize = 31,
553*81ad6265SDimitry Andric   EnqueuedWorkgroupSize = 32,
554*81ad6265SDimitry Andric   GlobalOffset = 33,
555*81ad6265SDimitry Andric   GlobalLinearId = 34,
556*81ad6265SDimitry Andric   SubgroupSize = 36,
557*81ad6265SDimitry Andric   SubgroupMaxSize = 37,
558*81ad6265SDimitry Andric   NumSubgroups = 38,
559*81ad6265SDimitry Andric   NumEnqueuedSubgroups = 39,
560*81ad6265SDimitry Andric   SubgroupId = 40,
561*81ad6265SDimitry Andric   SubgroupLocalInvocationId = 41,
562*81ad6265SDimitry Andric   VertexIndex = 42,
563*81ad6265SDimitry Andric   InstanceIndex = 43,
564*81ad6265SDimitry Andric   SubgroupEqMask = 4416,
565*81ad6265SDimitry Andric   SubgroupGeMask = 4417,
566*81ad6265SDimitry Andric   SubgroupGtMask = 4418,
567*81ad6265SDimitry Andric   SubgroupLeMask = 4419,
568*81ad6265SDimitry Andric   SubgroupLtMask = 4420,
569*81ad6265SDimitry Andric   BaseVertex = 4424,
570*81ad6265SDimitry Andric   BaseInstance = 4425,
571*81ad6265SDimitry Andric   DrawIndex = 4426,
572*81ad6265SDimitry Andric   DeviceIndex = 4438,
573*81ad6265SDimitry Andric   ViewIndex = 4440,
574*81ad6265SDimitry Andric   BaryCoordNoPerspAMD = 4492,
575*81ad6265SDimitry Andric   BaryCoordNoPerspCentroidAMD = 4493,
576*81ad6265SDimitry Andric   BaryCoordNoPerspSampleAMD = 4494,
577*81ad6265SDimitry Andric   BaryCoordSmoothAMD = 4495,
578*81ad6265SDimitry Andric   BaryCoordSmoothCentroid = 4496,
579*81ad6265SDimitry Andric   BaryCoordSmoothSample = 4497,
580*81ad6265SDimitry Andric   BaryCoordPullModel = 4498,
581*81ad6265SDimitry Andric   FragStencilRefEXT = 5014,
582*81ad6265SDimitry Andric   ViewportMaskNV = 5253,
583*81ad6265SDimitry Andric   SecondaryPositionNV = 5257,
584*81ad6265SDimitry Andric   SecondaryViewportMaskNV = 5258,
585*81ad6265SDimitry Andric   PositionPerViewNV = 5261,
586*81ad6265SDimitry Andric   ViewportMaskPerViewNV = 5262,
587*81ad6265SDimitry Andric   FullyCoveredEXT = 5264,
588*81ad6265SDimitry Andric   TaskCountNV = 5274,
589*81ad6265SDimitry Andric   PrimitiveCountNV = 5275,
590*81ad6265SDimitry Andric   PrimitiveIndicesNV = 5276,
591*81ad6265SDimitry Andric   ClipDistancePerViewNV = 5277,
592*81ad6265SDimitry Andric   CullDistancePerViewNV = 5278,
593*81ad6265SDimitry Andric   LayerPerViewNV = 5279,
594*81ad6265SDimitry Andric   MeshViewCountNV = 5280,
595*81ad6265SDimitry Andric   MeshViewIndices = 5281,
596*81ad6265SDimitry Andric   BaryCoordNV = 5286,
597*81ad6265SDimitry Andric   BaryCoordNoPerspNV = 5287,
598*81ad6265SDimitry Andric   FragSizeEXT = 5292,
599*81ad6265SDimitry Andric   FragInvocationCountEXT = 5293,
600*81ad6265SDimitry Andric   LaunchIdNV = 5319,
601*81ad6265SDimitry Andric   LaunchSizeNV = 5320,
602*81ad6265SDimitry Andric   WorldRayOriginNV = 5321,
603*81ad6265SDimitry Andric   WorldRayDirectionNV = 5322,
604*81ad6265SDimitry Andric   ObjectRayOriginNV = 5323,
605*81ad6265SDimitry Andric   ObjectRayDirectionNV = 5324,
606*81ad6265SDimitry Andric   RayTminNV = 5325,
607*81ad6265SDimitry Andric   RayTmaxNV = 5326,
608*81ad6265SDimitry Andric   InstanceCustomIndexNV = 5327,
609*81ad6265SDimitry Andric   ObjectToWorldNV = 5330,
610*81ad6265SDimitry Andric   WorldToObjectNV = 5331,
611*81ad6265SDimitry Andric   HitTNV = 5332,
612*81ad6265SDimitry Andric   HitKindNV = 5333,
613*81ad6265SDimitry Andric   IncomingRayFlagsNV = 5351,
614*81ad6265SDimitry Andric };
615*81ad6265SDimitry Andric StringRef getBuiltInName(BuiltIn e);
616*81ad6265SDimitry Andric 
617*81ad6265SDimitry Andric enum class SelectionControl : uint32_t {
618*81ad6265SDimitry Andric   None = 0x0,
619*81ad6265SDimitry Andric   Flatten = 0x1,
620*81ad6265SDimitry Andric   DontFlatten = 0x2,
621*81ad6265SDimitry Andric };
622*81ad6265SDimitry Andric std::string getSelectionControlName(uint32_t e);
623*81ad6265SDimitry Andric 
624*81ad6265SDimitry Andric enum class LoopControl : uint32_t {
625*81ad6265SDimitry Andric   None = 0x0,
626*81ad6265SDimitry Andric   Unroll = 0x1,
627*81ad6265SDimitry Andric   DontUnroll = 0x2,
628*81ad6265SDimitry Andric   DependencyInfinite = 0x4,
629*81ad6265SDimitry Andric   DependencyLength = 0x8,
630*81ad6265SDimitry Andric   MinIterations = 0x10,
631*81ad6265SDimitry Andric   MaxIterations = 0x20,
632*81ad6265SDimitry Andric   IterationMultiple = 0x40,
633*81ad6265SDimitry Andric   PeelCount = 0x80,
634*81ad6265SDimitry Andric   PartialCount = 0x100,
635*81ad6265SDimitry Andric };
636*81ad6265SDimitry Andric std::string getLoopControlName(uint32_t e);
637*81ad6265SDimitry Andric 
638*81ad6265SDimitry Andric enum class FunctionControl : uint32_t {
639*81ad6265SDimitry Andric   None = 0x0,
640*81ad6265SDimitry Andric   Inline = 0x1,
641*81ad6265SDimitry Andric   DontInline = 0x2,
642*81ad6265SDimitry Andric   Pure = 0x4,
643*81ad6265SDimitry Andric   Const = 0x8,
644*81ad6265SDimitry Andric };
645*81ad6265SDimitry Andric std::string getFunctionControlName(uint32_t e);
646*81ad6265SDimitry Andric 
647*81ad6265SDimitry Andric enum class MemorySemantics : uint32_t {
648*81ad6265SDimitry Andric   None = 0x0,
649*81ad6265SDimitry Andric   Acquire = 0x2,
650*81ad6265SDimitry Andric   Release = 0x4,
651*81ad6265SDimitry Andric   AcquireRelease = 0x8,
652*81ad6265SDimitry Andric   SequentiallyConsistent = 0x10,
653*81ad6265SDimitry Andric   UniformMemory = 0x40,
654*81ad6265SDimitry Andric   SubgroupMemory = 0x80,
655*81ad6265SDimitry Andric   WorkgroupMemory = 0x100,
656*81ad6265SDimitry Andric   CrossWorkgroupMemory = 0x200,
657*81ad6265SDimitry Andric   AtomicCounterMemory = 0x400,
658*81ad6265SDimitry Andric   ImageMemory = 0x800,
659*81ad6265SDimitry Andric   OutputMemoryKHR = 0x1000,
660*81ad6265SDimitry Andric   MakeAvailableKHR = 0x2000,
661*81ad6265SDimitry Andric   MakeVisibleKHR = 0x4000,
662*81ad6265SDimitry Andric };
663*81ad6265SDimitry Andric std::string getMemorySemanticsName(uint32_t e);
664*81ad6265SDimitry Andric 
665*81ad6265SDimitry Andric enum class MemoryOperand : uint32_t {
666*81ad6265SDimitry Andric   None = 0x0,
667*81ad6265SDimitry Andric   Volatile = 0x1,
668*81ad6265SDimitry Andric   Aligned = 0x2,
669*81ad6265SDimitry Andric   Nontemporal = 0x4,
670*81ad6265SDimitry Andric   MakePointerAvailableKHR = 0x8,
671*81ad6265SDimitry Andric   MakePointerVisibleKHR = 0x10,
672*81ad6265SDimitry Andric   NonPrivatePointerKHR = 0x20,
673*81ad6265SDimitry Andric };
674*81ad6265SDimitry Andric std::string getMemoryOperandName(uint32_t e);
675*81ad6265SDimitry Andric 
676*81ad6265SDimitry Andric enum class Scope : uint32_t {
677*81ad6265SDimitry Andric   CrossDevice = 0,
678*81ad6265SDimitry Andric   Device = 1,
679*81ad6265SDimitry Andric   Workgroup = 2,
680*81ad6265SDimitry Andric   Subgroup = 3,
681*81ad6265SDimitry Andric   Invocation = 4,
682*81ad6265SDimitry Andric   QueueFamilyKHR = 5,
683*81ad6265SDimitry Andric };
684*81ad6265SDimitry Andric StringRef getScopeName(Scope e);
685*81ad6265SDimitry Andric 
686*81ad6265SDimitry Andric enum class GroupOperation : uint32_t {
687*81ad6265SDimitry Andric   Reduce = 0,
688*81ad6265SDimitry Andric   InclusiveScan = 1,
689*81ad6265SDimitry Andric   ExclusiveScan = 2,
690*81ad6265SDimitry Andric   ClusteredReduce = 3,
691*81ad6265SDimitry Andric   PartitionedReduceNV = 6,
692*81ad6265SDimitry Andric   PartitionedInclusiveScanNV = 7,
693*81ad6265SDimitry Andric   PartitionedExclusiveScanNV = 8,
694*81ad6265SDimitry Andric };
695*81ad6265SDimitry Andric StringRef getGroupOperationName(GroupOperation e);
696*81ad6265SDimitry Andric 
697*81ad6265SDimitry Andric enum class KernelEnqueueFlags : uint32_t {
698*81ad6265SDimitry Andric   NoWait = 0,
699*81ad6265SDimitry Andric   WaitKernel = 1,
700*81ad6265SDimitry Andric   WaitWorkGroup = 2,
701*81ad6265SDimitry Andric };
702*81ad6265SDimitry Andric StringRef getKernelEnqueueFlagsName(KernelEnqueueFlags e);
703*81ad6265SDimitry Andric 
704*81ad6265SDimitry Andric enum class KernelProfilingInfo : uint32_t {
705*81ad6265SDimitry Andric   None = 0x0,
706*81ad6265SDimitry Andric   CmdExecTime = 0x1,
707*81ad6265SDimitry Andric };
708*81ad6265SDimitry Andric StringRef getKernelProfilingInfoName(KernelProfilingInfo e);
709*81ad6265SDimitry Andric } // namespace SPIRV
710*81ad6265SDimitry Andric } // namespace llvm
711*81ad6265SDimitry Andric 
712*81ad6265SDimitry Andric // Return a string representation of the operands from startIndex onwards.
713*81ad6265SDimitry Andric // Templated to allow both MachineInstr and MCInst to use the same logic.
714*81ad6265SDimitry Andric template <class InstType>
715*81ad6265SDimitry Andric std::string getSPIRVStringOperand(const InstType &MI, unsigned StartIndex) {
716*81ad6265SDimitry Andric   std::string s; // Iteratively append to this string.
717*81ad6265SDimitry Andric 
718*81ad6265SDimitry Andric   const unsigned NumOps = MI.getNumOperands();
719*81ad6265SDimitry Andric   bool IsFinished = false;
720*81ad6265SDimitry Andric   for (unsigned i = StartIndex; i < NumOps && !IsFinished; ++i) {
721*81ad6265SDimitry Andric     const auto &Op = MI.getOperand(i);
722*81ad6265SDimitry Andric     if (!Op.isImm()) // Stop if we hit a register operand.
723*81ad6265SDimitry Andric       break;
724*81ad6265SDimitry Andric     assert((Op.getImm() >> 32) == 0 && "Imm operand should be i32 word");
725*81ad6265SDimitry Andric     const uint32_t Imm = Op.getImm(); // Each i32 word is up to 4 characters.
726*81ad6265SDimitry Andric     for (unsigned ShiftAmount = 0; ShiftAmount < 32; ShiftAmount += 8) {
727*81ad6265SDimitry Andric       char c = (Imm >> ShiftAmount) & 0xff;
728*81ad6265SDimitry Andric       if (c == 0) { // Stop if we hit a null-terminator character.
729*81ad6265SDimitry Andric         IsFinished = true;
730*81ad6265SDimitry Andric         break;
731*81ad6265SDimitry Andric       } else {
732*81ad6265SDimitry Andric         s += c; // Otherwise, append the character to the result string.
733*81ad6265SDimitry Andric       }
734*81ad6265SDimitry Andric     }
735*81ad6265SDimitry Andric   }
736*81ad6265SDimitry Andric   return s;
737*81ad6265SDimitry Andric }
738*81ad6265SDimitry Andric 
739*81ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_MCTARGETDESC_SPIRVBASEINFO_H
740