1 //
2 // Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 #ifndef COMPILER_TRANSLATOR_OPERATOR_H_
8 #define COMPILER_TRANSLATOR_OPERATOR_H_
9 
10 //
11 // Operators used by the high-level (parse tree) representation.
12 //
13 enum TOperator
14 {
15     EOpNull,  // if in a node, should only mean a node is still being built
16 
17     // Call a function defined in the AST. This might be a user-defined function or a function
18     // inserted by an AST transformation.
19     EOpCallFunctionInAST,
20 
21     // Call an internal helper function with a raw implementation - the implementation can't be
22     // subject to AST transformations. Raw functions have a few constraints to keep them compatible
23     // with AST traversers:
24     // * They should not return arrays.
25     // * They should not have out parameters.
26     EOpCallInternalRawFunction,
27 
28     // Call a built-in function like a texture or image function.
29     EOpCallBuiltInFunction,
30 
31     //
32     // Unary operators
33     //
34 
35     EOpNegative,
36     EOpPositive,
37     EOpLogicalNot,
38     EOpBitwiseNot,
39 
40     EOpPostIncrement,
41     EOpPostDecrement,
42     EOpPreIncrement,
43     EOpPreDecrement,
44 
45     EOpArrayLength,
46 
47     //
48     // binary operations (ones with special GLSL syntax are used in TIntermBinary nodes, others in
49     // TIntermAggregate nodes)
50     //
51 
52     EOpAdd,
53     EOpSub,
54     EOpMul,
55     EOpDiv,
56     EOpIMod,
57 
58     EOpEqual,
59     EOpNotEqual,
60     EOpLessThan,
61     EOpGreaterThan,
62     EOpLessThanEqual,
63     EOpGreaterThanEqual,
64 
65     EOpEqualComponentWise,
66     EOpNotEqualComponentWise,
67     EOpLessThanComponentWise,
68     EOpLessThanEqualComponentWise,
69     EOpGreaterThanComponentWise,
70     EOpGreaterThanEqualComponentWise,
71 
72     EOpComma,
73 
74     EOpVectorTimesScalar,
75     EOpVectorTimesMatrix,
76     EOpMatrixTimesVector,
77     EOpMatrixTimesScalar,
78     EOpMatrixTimesMatrix,
79 
80     EOpLogicalOr,
81     EOpLogicalXor,
82     EOpLogicalAnd,
83 
84     EOpBitShiftLeft,
85     EOpBitShiftRight,
86 
87     EOpBitwiseAnd,
88     EOpBitwiseXor,
89     EOpBitwiseOr,
90 
91     EOpIndexDirect,
92     EOpIndexIndirect,
93     EOpIndexDirectStruct,
94     EOpIndexDirectInterfaceBlock,
95 
96     //
97     // Built-in functions mapped to operators (either unary or with multiple parameters)
98     //
99 
100     EOpRadians,
101     EOpDegrees,
102     EOpSin,
103     EOpCos,
104     EOpTan,
105     EOpAsin,
106     EOpAcos,
107     EOpAtan,
108 
109     EOpSinh,
110     EOpCosh,
111     EOpTanh,
112     EOpAsinh,
113     EOpAcosh,
114     EOpAtanh,
115 
116     EOpPow,
117     EOpExp,
118     EOpLog,
119     EOpExp2,
120     EOpLog2,
121     EOpSqrt,
122     EOpInverseSqrt,
123 
124     EOpAbs,
125     EOpSign,
126     EOpFloor,
127     EOpTrunc,
128     EOpRound,
129     EOpRoundEven,
130     EOpCeil,
131     EOpFract,
132     EOpMod,
133     EOpModf,
134     EOpMin,
135     EOpMax,
136     EOpClamp,
137     EOpMix,
138     EOpStep,
139     EOpSmoothStep,
140     EOpIsNan,
141     EOpIsInf,
142 
143     EOpFloatBitsToInt,
144     EOpFloatBitsToUint,
145     EOpIntBitsToFloat,
146     EOpUintBitsToFloat,
147 
148     EOpFrexp,
149     EOpLdexp,
150 
151     EOpPackSnorm2x16,
152     EOpPackUnorm2x16,
153     EOpPackHalf2x16,
154     EOpUnpackSnorm2x16,
155     EOpUnpackUnorm2x16,
156     EOpUnpackHalf2x16,
157 
158     EOpPackUnorm4x8,
159     EOpPackSnorm4x8,
160     EOpUnpackUnorm4x8,
161     EOpUnpackSnorm4x8,
162 
163     EOpLength,
164     EOpDistance,
165     EOpDot,
166     EOpCross,
167     EOpNormalize,
168     EOpFaceforward,
169     EOpReflect,
170     EOpRefract,
171 
172     EOpDFdx,    // Fragment only, OES_standard_derivatives extension
173     EOpDFdy,    // Fragment only, OES_standard_derivatives extension
174     EOpFwidth,  // Fragment only, OES_standard_derivatives extension
175 
176     EOpMulMatrixComponentWise,
177     EOpOuterProduct,
178     EOpTranspose,
179     EOpDeterminant,
180     EOpInverse,
181 
182     EOpAny,
183     EOpAll,
184     EOpLogicalNotComponentWise,
185 
186     EOpBitfieldExtract,
187     EOpBitfieldInsert,
188     EOpBitfieldReverse,
189     EOpBitCount,
190     EOpFindLSB,
191     EOpFindMSB,
192     EOpUaddCarry,
193     EOpUsubBorrow,
194     EOpUmulExtended,
195     EOpImulExtended,
196 
197     //
198     // Branch
199     //
200 
201     EOpKill,  // Fragment only
202     EOpReturn,
203     EOpBreak,
204     EOpContinue,
205 
206     //
207     // Constructor
208     //
209 
210     EOpConstruct,
211 
212     //
213     // moves
214     //
215 
216     EOpAssign,
217     EOpInitialize,
218     EOpAddAssign,
219     EOpSubAssign,
220 
221     EOpMulAssign,
222     EOpVectorTimesMatrixAssign,
223     EOpVectorTimesScalarAssign,
224     EOpMatrixTimesScalarAssign,
225     EOpMatrixTimesMatrixAssign,
226 
227     EOpDivAssign,
228     EOpIModAssign,
229     EOpBitShiftLeftAssign,
230     EOpBitShiftRightAssign,
231     EOpBitwiseAndAssign,
232     EOpBitwiseXorAssign,
233     EOpBitwiseOrAssign,
234 
235     //  barriers
236     EOpBarrier,
237     EOpMemoryBarrier,
238     EOpMemoryBarrierAtomicCounter,
239     EOpMemoryBarrierBuffer,
240     EOpMemoryBarrierImage,
241     EOpMemoryBarrierShared,
242     EOpGroupMemoryBarrier,
243 
244     //  Geometry only
245     EOpEmitVertex,
246     EOpEndPrimitive
247 };
248 
249 // Returns the string corresponding to the operator in GLSL
250 const char *GetOperatorString(TOperator op);
251 
252 // Say whether or not a binary or unary operation changes the value of a variable.
253 bool IsAssignment(TOperator op);
254 
255 #endif  // COMPILER_TRANSLATOR_OPERATOR_H_
256