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 | |
9 | const 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 | |
375 | bool 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 | |
404 | bool 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 |