| 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 |