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#include "compiler/translator/Operator.h"
8
9const char *GetOperatorString(TOperator op)
10{
11 switch (op)
12 {
13 // Note: EOpNull and EOpCall* can't be handled here.
14
15 case EOpNegative:
16 return "-";
17 case EOpPositive:
18 return "+";
19 case EOpLogicalNot:
20 return "!";
21 case EOpBitwiseNot:
22 return "~";
23
24 case EOpPostIncrement:
25 return "++";
26 case EOpPostDecrement:
27 return "--";
28 case EOpPreIncrement:
29 return "++";
30 case EOpPreDecrement:
31 return "--";
32
33 case EOpArrayLength:
34 return ".length()";
35
36 case EOpAdd:
37 return "+";
38 case EOpSub:
39 return "-";
40 case EOpMul:
41 return "*";
42 case EOpDiv:
43 return "/";
44 case EOpIMod:
45 return "%";
46
47 case EOpEqual:
48 return "==";
49 case EOpNotEqual:
50 return "!=";
51 case EOpLessThan:
52 return "<";
53 case EOpGreaterThan:
54 return ">";
55 case EOpLessThanEqual:
56 return "<=";
57 case EOpGreaterThanEqual:
58 return ">=";
59
60 case EOpEqualComponentWise:
61 return "equal";
62 case EOpNotEqualComponentWise:
63 return "notEqual";
64 case EOpLessThanComponentWise:
65 return "lessThan";
66 case EOpGreaterThanComponentWise:
67 return "greaterThan";
68 case EOpLessThanEqualComponentWise:
69 return "lessThanEqual";
70 case EOpGreaterThanEqualComponentWise:
71 return "greaterThanEqual";
72
73 case EOpComma:
74 return ",";
75
76 // Fall-through.
77 case EOpVectorTimesScalar:
78 case EOpVectorTimesMatrix:
79 case EOpMatrixTimesVector:
80 case EOpMatrixTimesScalar:
81 case EOpMatrixTimesMatrix:
82 return "*";
83
84 case EOpLogicalOr:
85 return "||";
86 case EOpLogicalXor:
87 return "^^";
88 case EOpLogicalAnd:
89 return "&&";
90
91 case EOpBitShiftLeft:
92 return "<<";
93 case EOpBitShiftRight:
94 return ">>";
95
96 case EOpBitwiseAnd:
97 return "&";
98 case EOpBitwiseXor:
99 return "^";
100 case EOpBitwiseOr:
101 return "|";
102
103 // Fall-through.
104 case EOpIndexDirect:
105 case EOpIndexIndirect:
106 return "[]";
107
108 case EOpIndexDirectStruct:
109 case EOpIndexDirectInterfaceBlock:
110 return ".";
111
112 case EOpRadians:
113 return "radians";
114 case EOpDegrees:
115 return "degrees";
116 case EOpSin:
117 return "sin";
118 case EOpCos:
119 return "cos";
120 case EOpTan:
121 return "tan";
122 case EOpAsin:
123 return "asin";
124 case EOpAcos:
125 return "acos";
126 case EOpAtan:
127 return "atan";
128
129 case EOpSinh:
130 return "sinh";
131 case EOpCosh:
132 return "cosh";
133 case EOpTanh:
134 return "tanh";
135 case EOpAsinh:
136 return "asinh";
137 case EOpAcosh:
138 return "acosh";
139 case EOpAtanh:
140 return "atanh";
141
142 case EOpPow:
143 return "pow";
144 case EOpExp:
145 return "exp";
146 case EOpLog:
147 return "log";
148 case EOpExp2:
149 return "exp2";
150 case EOpLog2:
151 return "log2";
152 case EOpSqrt:
153 return "sqrt";
154 case EOpInversesqrt:
155 return "inversesqrt";
156
157 case EOpAbs:
158 return "abs";
159 case EOpSign:
160 return "sign";
161 case EOpFloor:
162 return "floor";
163 case EOpTrunc:
164 return "trunc";
165 case EOpRound:
166 return "round";
167 case EOpRoundEven:
168 return "roundEven";
169 case EOpCeil:
170 return "ceil";
171 case EOpFract:
172 return "fract";
173 case EOpMod:
174 return "mod";
175 case EOpModf:
176 return "modf";
177 case EOpMin:
178 return "min";
179 case EOpMax:
180 return "max";
181 case EOpClamp:
182 return "clamp";
183 case EOpMix:
184 return "mix";
185 case EOpStep:
186 return "step";
187 case EOpSmoothstep:
188 return "smoothstep";
189 case EOpIsnan:
190 return "isnan";
191 case EOpIsinf:
192 return "isinf";
193
194 case EOpFloatBitsToInt:
195 return "floatBitsToInt";
196 case EOpFloatBitsToUint:
197 return "floatBitsToUint";
198 case EOpIntBitsToFloat:
199 return "intBitsToFloat";
200 case EOpUintBitsToFloat:
201 return "uintBitsToFloat";
202
203 case EOpFrexp:
204 return "frexp";
205 case EOpLdexp:
206 return "ldexp";
207
208 case EOpPackSnorm2x16:
209 return "packSnorm2x16";
210 case EOpPackUnorm2x16:
211 return "packUnorm2x16";
212 case EOpPackHalf2x16:
213 return "packHalf2x16";
214 case EOpUnpackSnorm2x16:
215 return "unpackSnorm2x16";
216 case EOpUnpackUnorm2x16:
217 return "unpackUnorm2x16";
218 case EOpUnpackHalf2x16:
219 return "unpackHalf2x16";
220
221 case EOpPackUnorm4x8:
222 return "packUnorm4x8";
223 case EOpPackSnorm4x8:
224 return "packSnorm4x8";
225 case EOpUnpackUnorm4x8:
226 return "unpackUnorm4x8";
227 case EOpUnpackSnorm4x8:
228 return "unpackSnorm4x8";
229
230 case EOpLength:
231 return "length";
232 case EOpDistance:
233 return "distance";
234 case EOpDot:
235 return "dot";
236 case EOpCross:
237 return "cross";
238 case EOpNormalize:
239 return "normalize";
240 case EOpFaceforward:
241 return "faceforward";
242 case EOpReflect:
243 return "reflect";
244 case EOpRefract:
245 return "refract";
246
247 case EOpDFdx:
248 return "dFdx";
249 case EOpDFdy:
250 return "dFdy";
251 case EOpFwidth:
252 return "fwidth";
253
254 case EOpMulMatrixComponentWise:
255 return "matrixCompMult";
256 case EOpOuterProduct:
257 return "outerProduct";
258 case EOpTranspose:
259 return "transpose";
260 case EOpDeterminant:
261 return "determinant";
262 case EOpInverse:
263 return "inverse";
264
265 case EOpAny:
266 return "any";
267 case EOpAll:
268 return "all";
269 case EOpLogicalNotComponentWise:
270 return "not";
271
272 case EOpBitfieldExtract:
273 return "bitfieldExtract";
274 case EOpBitfieldInsert:
275 return "bitfieldInsert";
276 case EOpBitfieldReverse:
277 return "bitfieldReverse";
278 case EOpBitCount:
279 return "bitCount";
280 case EOpFindLSB:
281 return "findLSB";
282 case EOpFindMSB:
283 return "findMSB";
284 case EOpUaddCarry:
285 return "uaddCarry";
286 case EOpUsubBorrow:
287 return "usubBorrow";
288 case EOpUmulExtended:
289 return "umulExtended";
290 case EOpImulExtended:
291 return "imulExtended";
292
293 case EOpKill:
294 return "kill";
295 case EOpReturn:
296 return "return";
297 case EOpBreak:
298 return "break";
299 case EOpContinue:
300 return "continue";
301
302 case EOpAssign:
303 return "=";
304 case EOpInitialize:
305 return "=";
306 case EOpAddAssign:
307 return "+=";
308 case EOpSubAssign:
309 return "-=";
310
311 // Fall-through.
312 case EOpMulAssign:
313 case EOpVectorTimesMatrixAssign:
314 case EOpVectorTimesScalarAssign:
315 case EOpMatrixTimesScalarAssign:
316 case EOpMatrixTimesMatrixAssign:
317 return "*=";
318
319 case EOpDivAssign:
320 return "/=";
321 case EOpIModAssign:
322 return "%=";
323 case EOpBitShiftLeftAssign:
324 return "<<=";
325 case EOpBitShiftRightAssign:
326 return ">>=";
327 case EOpBitwiseAndAssign:
328 return "&=";
329 case EOpBitwiseXorAssign:
330 return "^=";
331 case EOpBitwiseOrAssign:
332 return "|=";
333 case EOpBarrier:
334 return "barrier";
335 case EOpMemoryBarrier:
336 return "memoryBarrier";
337 case EOpMemoryBarrierAtomicCounter:
338 return "memoryBarrierAtomicCounter";
339 case EOpMemoryBarrierBuffer:
340 return "memoryBarrierBuffer";
341 case EOpMemoryBarrierImage:
342 return "memoryBarrierImage";
343 case EOpMemoryBarrierShared:
344 return "memoryBarrierShared";
345 case EOpGroupMemoryBarrier:
346 return "groupMemoryBarrier";
347
348 case EOpAtomicAdd:
349 return "atomicAdd";
350 case EOpAtomicMin:
351 return "atomicMin";
352 case EOpAtomicMax:
353 return "atomicMax";
354 case EOpAtomicAnd:
355 return "atomicAnd";
356 case EOpAtomicOr:
357 return "atomicOr";
358 case EOpAtomicXor:
359 return "atomicXor";
360 case EOpAtomicExchange:
361 return "atomicExchange";
362 case EOpAtomicCompSwap:
363 return "atomicCompSwap";
364
365 case EOpEmitVertex:
366 return "EmitVertex";
367 case EOpEndPrimitive:
368 return "EndPrimitive";
369 default:
370 break;
371 }
372 return "";
373}
374
375bool IsAssignment(TOperator op)
376{
377 switch (op)
378 {
379 case EOpPostIncrement:
380 case EOpPostDecrement:
381 case EOpPreIncrement:
382 case EOpPreDecrement:
383 case EOpAssign:
384 case EOpAddAssign:
385 case EOpSubAssign:
386 case EOpMulAssign:
387 case EOpVectorTimesMatrixAssign:
388 case EOpVectorTimesScalarAssign:
389 case EOpMatrixTimesScalarAssign:
390 case EOpMatrixTimesMatrixAssign:
391 case EOpDivAssign:
392 case EOpIModAssign:
393 case EOpBitShiftLeftAssign:
394 case EOpBitShiftRightAssign:
395 case EOpBitwiseAndAssign:
396 case EOpBitwiseXorAssign:
397 case EOpBitwiseOrAssign:
398 return true;
399 default:
400 return false;
401 }
402}
403
404bool IsAtomicFunction(TOperator op)
405{
406 switch (op)
407 {
408 case EOpAtomicAdd:
409 case EOpAtomicMin:
410 case EOpAtomicMax:
411 case EOpAtomicAnd:
412 case EOpAtomicOr:
413 case EOpAtomicXor:
414 case EOpAtomicExchange:
415 case EOpAtomicCompSwap:
416 return true;
417 default:
418 return false;
419 }
420}
421