// GENERATED FILE - DO NOT EDIT.
// Generated by gen_builtin_symbols.py using data from builtin_function_declarations.txt.
//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Operator_autogen.h:
//   Operators used by the high-level (parse tree) representation.

#ifndef COMPILER_TRANSLATOR_OPERATOR_AUTOGEN_H_
#define COMPILER_TRANSLATOR_OPERATOR_AUTOGEN_H_

#include <stdint.h>

namespace sh
{

enum TOperator : uint16_t
{
    EOpNull,  // if in a node, should only mean a node is still being built

    // Call a function defined in the AST. This might be a user-defined function or a function
    // inserted by an AST transformation.
    EOpCallFunctionInAST,

    // Call an internal helper function with a raw implementation - the implementation can't be
    // subject to AST transformations. Raw functions have a few constraints to keep them compatible
    // with AST traversers:
    // * They should not return arrays.
    // * They should not have out parameters.
    // TODO: remove this.  http://anglebug.com/6059
    EOpCallInternalRawFunction,

    //
    // Branch (TIntermBranch)
    //

    EOpKill,  // Fragment only
    EOpReturn,
    EOpBreak,
    EOpContinue,

    //
    // Constructor (TIntermAggregate)
    //

    EOpConstruct,

    //
    // Unary operators with special GLSL syntax (TIntermUnary).
    //

    EOpNegative,
    EOpPositive,
    EOpLogicalNot,
    EOpBitwiseNot,

    EOpPostIncrement,
    EOpPostDecrement,
    EOpPreIncrement,
    EOpPreDecrement,

    EOpArrayLength,

    //
    // Binary operators with special GLSL syntax (TIntermBinary).
    //

    EOpAdd,
    EOpSub,
    EOpMul,
    EOpDiv,
    EOpIMod,

    EOpEqual,
    EOpNotEqual,
    EOpLessThan,
    EOpGreaterThan,
    EOpLessThanEqual,
    EOpGreaterThanEqual,

    EOpComma,

    EOpVectorTimesScalar,
    EOpVectorTimesMatrix,
    EOpMatrixTimesVector,
    EOpMatrixTimesScalar,
    EOpMatrixTimesMatrix,

    EOpLogicalOr,
    EOpLogicalXor,
    EOpLogicalAnd,

    EOpBitShiftLeft,
    EOpBitShiftRight,

    EOpBitwiseAnd,
    EOpBitwiseXor,
    EOpBitwiseOr,

    EOpIndexDirect,
    EOpIndexIndirect,
    EOpIndexDirectStruct,
    EOpIndexDirectInterfaceBlock,

    //
    // Moves (TIntermBinary)
    //

    EOpAssign,
    EOpInitialize,
    EOpAddAssign,
    EOpSubAssign,

    EOpMulAssign,
    EOpVectorTimesMatrixAssign,
    EOpVectorTimesScalarAssign,
    EOpMatrixTimesScalarAssign,
    EOpMatrixTimesMatrixAssign,

    EOpDivAssign,
    EOpIModAssign,
    EOpBitShiftLeftAssign,
    EOpBitShiftRightAssign,
    EOpBitwiseAndAssign,
    EOpBitwiseXorAssign,
    EOpBitwiseOrAssign,

    // Not an op, but a marker for the start of built-in ops.
    EOpLastNonBuiltIn = EOpBitwiseOrAssign,

    //
    // Built-in functions mapped to operators (either unary (TIntermUnary) or with multiple
    // parameters (TIntermAggregate))
    //

    // Group Math

    // Group MathTrigonometric
    EOpRadians,  // Unary
    EOpDegrees,  // Unary
    EOpSin,      // Unary
    EOpCos,      // Unary
    EOpTan,      // Unary
    EOpAsin,     // Unary
    EOpAcos,     // Unary
    EOpAtan,
    EOpSinh,   // Unary
    EOpCosh,   // Unary
    EOpTanh,   // Unary
    EOpAsinh,  // Unary
    EOpAcosh,  // Unary
    EOpAtanh,  // Unary

    // Group MathExponential
    EOpPow,
    EOpExp,          // Unary
    EOpLog,          // Unary
    EOpExp2,         // Unary
    EOpLog2,         // Unary
    EOpSqrt,         // Unary
    EOpInversesqrt,  // Unary

    // Group MathCommon
    EOpAbs,        // Unary
    EOpSign,       // Unary
    EOpFloor,      // Unary
    EOpTrunc,      // Unary
    EOpRound,      // Unary
    EOpRoundEven,  // Unary
    EOpCeil,       // Unary
    EOpFract,      // Unary
    EOpMod,
    EOpMin,
    EOpMax,
    EOpClamp,
    EOpMix,
    EOpStep,
    EOpSmoothstep,
    EOpModf,
    EOpIsnan,            // Unary
    EOpIsinf,            // Unary
    EOpFloatBitsToInt,   // Unary
    EOpFloatBitsToUint,  // Unary
    EOpIntBitsToFloat,   // Unary
    EOpUintBitsToFloat,  // Unary
    EOpFma,
    EOpFrexp,
    EOpLdexp,
    EOpPackSnorm2x16,     // Unary
    EOpPackHalf2x16,      // Unary
    EOpUnpackSnorm2x16,   // Unary
    EOpUnpackHalf2x16,    // Unary
    EOpPackUnorm2x16,     // Unary
    EOpUnpackUnorm2x16,   // Unary
    EOpPackUnorm4x8,      // Unary
    EOpPackSnorm4x8,      // Unary
    EOpUnpackUnorm4x8,    // Unary
    EOpUnpackSnorm4x8,    // Unary
    EOpPackDouble2x32,    // Unary
    EOpUnpackDouble2x32,  // Unary

    // Group MathGeometric
    EOpLength,  // Unary
    EOpDistance,
    EOpDot,
    EOpCross,
    EOpNormalize,  // Unary
    EOpFaceforward,
    EOpReflect,
    EOpRefract,

    // Group MathGeometricVS
    EOpFtransform,

    // Group MathMatrix
    EOpMatrixCompMult,
    EOpOuterProduct,
    EOpTranspose,    // Unary
    EOpDeterminant,  // Unary
    EOpInverse,      // Unary

    // Group MathVector
    EOpLessThanComponentWise,
    EOpLessThanEqualComponentWise,
    EOpGreaterThanComponentWise,
    EOpGreaterThanEqualComponentWise,
    EOpEqualComponentWise,
    EOpNotEqualComponentWise,
    EOpAny,               // Unary
    EOpAll,               // Unary
    EOpNotComponentWise,  // Unary

    // Group MathInteger
    EOpBitfieldExtract,
    EOpBitfieldInsert,
    EOpBitfieldReverse,  // Unary
    EOpBitCount,         // Unary
    EOpFindLSB,          // Unary
    EOpFindMSB,          // Unary
    EOpUaddCarry,
    EOpUsubBorrow,
    EOpUmulExtended,
    EOpImulExtended,

    // Group Texture

    // Group TextureFirstVersions
    EOpTexture2D,
    EOpTexture2DProj,
    EOpTextureCube,
    EOpTexture1D,
    EOpTexture1DProj,
    EOpTexture3D,
    EOpTexture3DProj,
    EOpShadow1D,
    EOpShadow1DProj,
    EOpShadow2D,
    EOpShadow2DProj,
    EOpShadow2DEXT,
    EOpShadow2DProjEXT,
    EOpTexture2DRect,
    EOpTexture2DRectProj,
    EOpTexture2DGradEXT,
    EOpTexture2DProjGradEXT,
    EOpTextureCubeGradEXT,
    EOpTextureVideoWEBGL,

    // Group TextureFirstVersionsBias
    EOpTexture2DBias,
    EOpTexture2DProjBias,
    EOpTextureCubeBias,
    EOpTexture3DBias,
    EOpTexture3DProjBias,
    EOpTexture1DBias,
    EOpTexture1DProjBias,
    EOpShadow1DBias,
    EOpShadow1DProjBias,
    EOpShadow2DBias,
    EOpShadow2DProjBias,

    // Group TextureFirstVersionsLod
    EOpTexture2DLod,
    EOpTexture2DProjLod,
    EOpTextureCubeLod,
    EOpTexture1DLod,
    EOpTexture1DProjLod,
    EOpShadow1DLod,
    EOpShadow1DProjLod,
    EOpShadow2DLod,
    EOpShadow2DProjLod,
    EOpTexture3DLod,
    EOpTexture3DProjLod,

    // Group TextureFirstVersionsLodVS
    EOpTexture2DLodVS,
    EOpTexture2DProjLodVS,
    EOpTextureCubeLodVS,
    EOpTexture1DLodVS,
    EOpTexture1DProjLodVS,
    EOpShadow1DLodVS,
    EOpShadow1DProjLodVS,
    EOpShadow2DLodVS,
    EOpShadow2DProjLodVS,

    // Group TextureFirstVersionsLodFS
    EOpTexture2DLodEXTFS,
    EOpTexture2DProjLodEXTFS,
    EOpTextureCubeLodEXTFS,

    // Group TextureNoBias
    EOpTexture,
    EOpTextureProj,
    EOpTextureLod,
    EOpTextureSize,
    EOpTextureProjLod,
    EOpTexelFetch,
    EOpTextureGrad,
    EOpTextureProjGrad,
    EOpTextureQueryLevels,
    EOpTextureSamples,

    // Group TextureBias
    EOpTextureBias,
    EOpTextureProjBias,

    // Group TextureQueryLod
    EOpTextureQueryLod,

    // Group TextureOffsetNoBias
    EOpTextureOffset,
    EOpTextureProjOffset,
    EOpTextureLodOffset,
    EOpTextureProjLodOffset,
    EOpTexelFetchOffset,
    EOpTextureGradOffset,
    EOpTextureProjGradOffset,

    // Group TextureOffsetBias
    EOpTextureOffsetBias,
    EOpTextureProjOffsetBias,

    // Group TextureGather
    EOpTextureGather,

    // Group TextureGatherOffset

    // Group TextureGatherOffsetNoComp
    EOpTextureGatherOffset,

    // Group TextureGatherOffsetComp
    EOpTextureGatherOffsetComp,

    // Group TextureGatherOffsets

    // Group TextureGatherOffsetsNoComp
    EOpTextureGatherOffsets,

    // Group TextureGatherOffsetsComp
    EOpTextureGatherOffsetsComp,

    // Group EXT_YUV_target
    EOpRgb_2_yuv,
    EOpYuv_2_rgb,

    // Group DerivativesFS
    EOpDFdx,
    EOpDFdy,
    EOpFwidth,
    EOpDFdxFine,
    EOpDFdyFine,
    EOpDFdxCoarse,
    EOpDFdyCoarse,
    EOpFwidthFine,
    EOpFwidthCoarse,

    // Group InterpolationFS
    EOpInterpolateAtCentroid,
    EOpInterpolateAtSample,
    EOpInterpolateAtOffset,

    // Group AtomicCounter
    EOpAtomicCounter,
    EOpAtomicCounterIncrement,
    EOpAtomicCounterDecrement,
    EOpAtomicCounterAdd,
    EOpAtomicCounterSubtract,
    EOpAtomicCounterMin,
    EOpAtomicCounterMax,
    EOpAtomicCounterAnd,
    EOpAtomicCounterOr,
    EOpAtomicCounterXor,
    EOpAtomicCounterExchange,
    EOpAtomicCounterCompSwap,

    // Group AtomicMemory
    EOpAtomicAdd,
    EOpAtomicMin,
    EOpAtomicMax,
    EOpAtomicAnd,
    EOpAtomicOr,
    EOpAtomicXor,
    EOpAtomicExchange,
    EOpAtomicCompSwap,

    // Group Image
    EOpImageSize,
    EOpImageSamples,

    // Group ImageStore
    EOpImageStore,

    // Group ImageLoad
    EOpImageLoad,

    // Group ImageAtomic
    EOpImageAtomicAdd,
    EOpImageAtomicMin,
    EOpImageAtomicMax,
    EOpImageAtomicAnd,
    EOpImageAtomicOr,
    EOpImageAtomicXor,
    EOpImageAtomicExchange,
    EOpImageAtomicCompSwap,

    // Group Noise
    EOpNoise1,
    EOpNoise2,
    EOpNoise3,
    EOpNoise4,

    // Group Barrier
    EOpMemoryBarrier,
    EOpMemoryBarrierAtomicCounter,
    EOpMemoryBarrierBuffer,
    EOpMemoryBarrierImage,

    // Group ESSL310CS
    EOpBarrier,
    EOpMemoryBarrierShared,
    EOpGroupMemoryBarrier,

    // Group ESSL310TCS
    EOpBarrierTCS,

    // Group GS
    EOpEmitVertex,
    EOpEndPrimitive,
    EOpEmitStreamVertex,
    EOpEndStreamPrimitive,

    // Group SubpassInput
    EOpSubpassLoad,

    // Group ShaderInvocationGroup
    EOpAnyInvocation,
    EOpAllInvocations,
    EOpAllInvocationsEqual,
};

// Returns the string corresponding to the operator in GLSL.  For built-in functions use the
// function name directly.
const char *GetOperatorString(TOperator op);

// Say whether or not a binary or unary operation changes the value of a variable.
bool IsAssignment(TOperator op);

namespace BuiltInGroup
{
static inline bool IsBuiltIn(TOperator op)
{
    return op > EOpLastNonBuiltIn;
}
static inline bool IsMath(TOperator op)
{
    return op >= EOpRadians && op <= EOpImulExtended;
}
static inline bool IsTextureOffsetNoBias(TOperator op)
{
    return op >= EOpTextureOffset && op <= EOpTextureProjGradOffset;
}
static inline bool IsTextureOffsetBias(TOperator op)
{
    return op >= EOpTextureOffsetBias && op <= EOpTextureProjOffsetBias;
}
static inline bool IsTextureGatherOffsetNoComp(TOperator op)
{
    return op >= EOpTextureGatherOffset && op <= EOpTextureGatherOffset;
}
static inline bool IsTextureGatherOffsetComp(TOperator op)
{
    return op >= EOpTextureGatherOffsetComp && op <= EOpTextureGatherOffsetComp;
}
static inline bool IsTextureGatherOffset(TOperator op)
{
    return op >= EOpTextureGatherOffset && op <= EOpTextureGatherOffsetComp;
}
static inline bool IsTextureGatherOffsetsNoComp(TOperator op)
{
    return op >= EOpTextureGatherOffsets && op <= EOpTextureGatherOffsets;
}
static inline bool IsTextureGatherOffsetsComp(TOperator op)
{
    return op >= EOpTextureGatherOffsetsComp && op <= EOpTextureGatherOffsetsComp;
}
static inline bool IsTextureGatherOffsets(TOperator op)
{
    return op >= EOpTextureGatherOffsets && op <= EOpTextureGatherOffsetsComp;
}
static inline bool IsTextureGather(TOperator op)
{
    return op >= EOpTextureGather && op <= EOpTextureGatherOffsetsComp;
}
static inline bool IsTexture(TOperator op)
{
    return op >= EOpTexture2D && op <= EOpTextureGatherOffsetsComp;
}
static inline bool IsInterpolationFS(TOperator op)
{
    return op >= EOpInterpolateAtCentroid && op <= EOpInterpolateAtOffset;
}
static inline bool IsAtomicMemory(TOperator op)
{
    return op >= EOpAtomicAdd && op <= EOpAtomicCompSwap;
}
static inline bool IsImageStore(TOperator op)
{
    return op >= EOpImageStore && op <= EOpImageStore;
}
static inline bool IsImageLoad(TOperator op)
{
    return op >= EOpImageLoad && op <= EOpImageLoad;
}
static inline bool IsImageAtomic(TOperator op)
{
    return op >= EOpImageAtomicAdd && op <= EOpImageAtomicCompSwap;
}
static inline bool IsImage(TOperator op)
{
    return op >= EOpImageSize && op <= EOpImageAtomicCompSwap;
}
}  // namespace BuiltInGroup

}  // namespace sh

#endif  // COMPILER_TRANSLATOR_OPERATOR_AUTOGEN_H_
