• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- SPIRVOpCode.h - Class to represent SPIR-V Operation Codes -*- C++ -*-==//
2 //
3 //                     The LLVM/SPIRV Translator
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 // Copyright (c) 2014 Advanced Micro Devices, Inc. All rights reserved.
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal with the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
16 //
17 // Redistributions of source code must retain the above copyright notice,
18 // this list of conditions and the following disclaimers.
19 // Redistributions in binary form must reproduce the above copyright notice,
20 // this list of conditions and the following disclaimers in the documentation
21 // and/or other materials provided with the distribution.
22 // Neither the names of Advanced Micro Devices, Inc., nor the names of its
23 // contributors may be used to endorse or promote products derived from this
24 // Software without specific prior written permission.
25 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28 // CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH
31 // THE SOFTWARE.
32 //
33 //===----------------------------------------------------------------------===//
34 /// \file
35 ///
36 /// This file defines Operation Code class for SPIR-V.
37 ///
38 //===----------------------------------------------------------------------===//
39 
40 #ifndef SPIRVOPCODE_HPP_
41 #define SPIRVOPCODE_HPP_
42 
43 #include "SPIRVUtil.h"
44 #include "spirv.hpp"
45 #include <string>
46 
47 using namespace spv;
48 namespace SPIRV{
49 
50 template<> inline void
init()51 SPIRVMap<Op, std::string>::init() {
52 #define _SPIRV_OP(x, ...) add(Op##x, #x);
53 #include "SPIRVOpCodeEnum.h"
54 #undef _SPIRV_OP
55 }
SPIRV_DEF_NAMEMAP(Op,OpCodeNameMap)56 SPIRV_DEF_NAMEMAP(Op, OpCodeNameMap)
57 
58 inline bool isAtomicOpCode(Op OpCode) {
59   assert(OpAtomicLoad < OpAtomicXor);
60   return ((unsigned)OpCode >= OpAtomicLoad
61       && (unsigned)OpCode <= OpAtomicXor)
62       || OpCode == OpAtomicFlagTestAndSet
63       || OpCode == OpAtomicFlagClear;
64 }
isBinaryOpCode(Op OpCode)65 inline bool isBinaryOpCode(Op OpCode) {
66   return ((unsigned)OpCode >= OpIAdd &&
67       (unsigned)OpCode <= OpFMod) ||
68       OpCode == OpDot;
69 }
70 
isShiftOpCode(Op OpCode)71 inline bool isShiftOpCode(Op OpCode) {
72   return (unsigned)OpCode >= OpShiftRightLogical &&
73       (unsigned)OpCode <= OpShiftLeftLogical;
74 }
75 
isLogicalOpCode(Op OpCode)76 inline bool isLogicalOpCode(Op OpCode) {
77   return (unsigned)OpCode >= OpLogicalEqual &&
78       (unsigned)OpCode <= OpLogicalNot;
79 }
80 
isBitwiseOpCode(Op OpCode)81 inline bool isBitwiseOpCode(Op OpCode) {
82   return (unsigned)OpCode >= OpBitwiseOr &&
83       (unsigned)OpCode <= OpBitwiseAnd;
84 }
85 
isBinaryShiftLogicalBitwiseOpCode(Op OpCode)86 inline bool isBinaryShiftLogicalBitwiseOpCode(Op OpCode) {
87   return (((unsigned)OpCode >= OpShiftRightLogical &&
88       (unsigned)OpCode <= OpBitwiseAnd) ||
89       isBinaryOpCode(OpCode));
90 }
91 
isCmpOpCode(Op OpCode)92 inline bool isCmpOpCode(Op OpCode) {
93   return ((unsigned)OpCode >= OpIEqual &&
94       (unsigned)OpCode <= OpFUnordGreaterThanEqual) ||
95       (OpCode >= OpLessOrGreater && OpCode <= OpLogicalNotEqual);
96 }
97 
isCvtOpCode(Op OpCode)98 inline bool isCvtOpCode(Op OpCode) {
99   return ((unsigned)OpCode >= OpConvertFToU &&
100       (unsigned)OpCode <= OpBitcast) ||
101       OpCode == OpSatConvertSToU ||
102       OpCode == OpSatConvertUToS;
103 }
104 
isCvtToUnsignedOpCode(Op OpCode)105 inline bool isCvtToUnsignedOpCode(Op OpCode) {
106   return OpCode == OpConvertFToU ||
107       OpCode == OpUConvert ||
108       OpCode == OpSatConvertSToU;
109 }
110 
isCvtFromUnsignedOpCode(Op OpCode)111 inline bool isCvtFromUnsignedOpCode(Op OpCode) {
112   return OpCode == OpConvertUToF ||
113       OpCode == OpUConvert ||
114       OpCode == OpSatConvertUToS;
115 }
116 
isOpaqueGenericTypeOpCode(Op OpCode)117 inline bool isOpaqueGenericTypeOpCode(Op OpCode) {
118   return (unsigned)OpCode >= OpTypeEvent &&
119       (unsigned)OpCode <= OpTypeQueue;
120 }
121 
isGenericNegateOpCode(Op OpCode)122 inline bool isGenericNegateOpCode(Op OpCode) {
123   return (unsigned)OpCode == OpSNegate ||
124       (unsigned)OpCode == OpFNegate ||
125       (unsigned)OpCode == OpNot;
126 }
127 
isAccessChainOpCode(Op OpCode)128 inline bool isAccessChainOpCode(Op OpCode) {
129   return OpCode == OpAccessChain ||
130       OpCode == OpInBoundsAccessChain;
131 }
132 
hasExecScope(Op OpCode)133 inline bool hasExecScope(Op OpCode) {
134   unsigned OC = OpCode;
135   return (OpGroupWaitEvents <= OC &&
136             OC <= OpGroupSMax) ||
137       (OpGroupReserveReadPipePackets <= OC &&
138           OC <= OpGroupCommitWritePipe);
139 }
140 
hasGroupOperation(Op OpCode)141 inline bool hasGroupOperation(Op OpCode) {
142   unsigned OC = OpCode;
143   return OpGroupIAdd <= OC && OC <= OpGroupSMax;
144 }
145 
isGroupOpCode(Op OpCode)146 inline bool isGroupOpCode(Op OpCode) {
147   unsigned OC = OpCode;
148   return OpGroupAll <= OC && OC <= OpGroupSMax;
149 }
150 
isPipeOpCode(Op OpCode)151 inline bool isPipeOpCode(Op OpCode) {
152   unsigned OC = OpCode;
153   return OpReadPipe <= OC && OC <= OpGroupCommitWritePipe;
154 }
isTypeOpCode(Op OpCode)155 inline bool isTypeOpCode(Op OpCode) {
156   unsigned OC = OpCode;
157   return (OpTypeVoid <= OC && OC <= OpTypePipe) || OC == OpTypePipeStorage;
158 }
159 
isConstantOpCode(Op OpCode)160 inline bool isConstantOpCode(Op OpCode) {
161   unsigned OC = OpCode;
162   return (OpConstantTrue <= OC
163       && OC <= OpSpecConstantOp)
164       || OC == OpUndef || OC == OpConstantPipeStorage;
165 }
166 
isModuleScopeAllowedOpCode(Op OpCode)167 inline bool isModuleScopeAllowedOpCode(Op OpCode) {
168   return OpCode == OpVariable ||
169       isConstantOpCode(OpCode);
170 }
171 
172 }
173 
174 #endif /* SPIRVOPCODE_HPP_ */
175