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