Rename semantic::Intrinsic to semantic::IntrinsicType

This allows us to create a semantic::Intrinsic class that holds more information about the particular intrinsic overload.

Change-Id: I180ddb507ebc92172badfdd3a59af346f96e1f02
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/40500
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
Ben Clayton
2021-02-08 19:53:42 +00:00
committed by Commit Bot service account
parent 2ddb1783c5
commit 052ab89a1e
14 changed files with 997 additions and 1066 deletions

View File

@@ -40,16 +40,16 @@ class IntrinsicCall : public Castable<IntrinsicCall, Call> {
/// Constructor
/// @param return_type the return type of the call
/// @param intrinsic the call target intrinsic
IntrinsicCall(type::Type* return_type, Intrinsic intrinsic);
IntrinsicCall(type::Type* return_type, IntrinsicType intrinsic);
/// Destructor
~IntrinsicCall() override;
/// @returns the target intrinsic for the call
Intrinsic intrinsic() const { return intrinsic_; }
IntrinsicType intrinsic() const { return intrinsic_; }
private:
Intrinsic const intrinsic_;
IntrinsicType const intrinsic_;
};
/// TextureIntrinsicCall holds semantic information for ast::CallExpression
@@ -105,7 +105,7 @@ class TextureIntrinsicCall
/// @param intrinsic the call target intrinsic
/// @param params the overload parameter info
TextureIntrinsicCall(type::Type* return_type,
Intrinsic intrinsic,
IntrinsicType intrinsic,
const Parameters& params);
/// Destructor

View File

@@ -17,218 +17,221 @@
namespace tint {
namespace semantic {
std::ostream& operator<<(std::ostream& out, Intrinsic i) {
std::ostream& operator<<(std::ostream& out, IntrinsicType i) {
out << intrinsic::str(i);
return out;
}
namespace intrinsic {
const char* str(Intrinsic i) {
const char* str(IntrinsicType i) {
/// The emitted name matches the spelling in the WGSL spec.
/// including case.
switch (i) {
case Intrinsic::kNone:
case IntrinsicType::kNone:
return "<not-an-intrinsic>";
case Intrinsic::kAbs:
case IntrinsicType::kAbs:
return "abs";
case Intrinsic::kAcos:
case IntrinsicType::kAcos:
return "acos";
case Intrinsic::kAll:
case IntrinsicType::kAll:
return "all";
case Intrinsic::kAny:
case IntrinsicType::kAny:
return "any";
case Intrinsic::kArrayLength:
case IntrinsicType::kArrayLength:
return "arrayLength";
case Intrinsic::kAsin:
case IntrinsicType::kAsin:
return "asin";
case Intrinsic::kAtan:
case IntrinsicType::kAtan:
return "atan";
case Intrinsic::kAtan2:
case IntrinsicType::kAtan2:
return "atan2";
case Intrinsic::kCeil:
case IntrinsicType::kCeil:
return "ceil";
case Intrinsic::kClamp:
case IntrinsicType::kClamp:
return "clamp";
case Intrinsic::kCos:
case IntrinsicType::kCos:
return "cos";
case Intrinsic::kCosh:
case IntrinsicType::kCosh:
return "cosh";
case Intrinsic::kCountOneBits:
case IntrinsicType::kCountOneBits:
return "countOneBits";
case Intrinsic::kCross:
case IntrinsicType::kCross:
return "cross";
case Intrinsic::kDeterminant:
case IntrinsicType::kDeterminant:
return "determinant";
case Intrinsic::kDistance:
case IntrinsicType::kDistance:
return "distance";
case Intrinsic::kDot:
case IntrinsicType::kDot:
return "dot";
case Intrinsic::kDpdx:
case IntrinsicType::kDpdx:
return "dpdx";
case Intrinsic::kDpdxCoarse:
case IntrinsicType::kDpdxCoarse:
return "dpdxCoarse";
case Intrinsic::kDpdxFine:
case IntrinsicType::kDpdxFine:
return "dpdxFine";
case Intrinsic::kDpdy:
case IntrinsicType::kDpdy:
return "dpdy";
case Intrinsic::kDpdyCoarse:
case IntrinsicType::kDpdyCoarse:
return "dpdyCoarse";
case Intrinsic::kDpdyFine:
case IntrinsicType::kDpdyFine:
return "dpdyFine";
case Intrinsic::kExp:
case IntrinsicType::kExp:
return "exp";
case Intrinsic::kExp2:
case IntrinsicType::kExp2:
return "exp2";
case Intrinsic::kFaceForward:
case IntrinsicType::kFaceForward:
return "faceForward";
case Intrinsic::kFloor:
case IntrinsicType::kFloor:
return "floor";
case Intrinsic::kFma:
case IntrinsicType::kFma:
return "fma";
case Intrinsic::kFract:
case IntrinsicType::kFract:
return "fract";
case Intrinsic::kFrexp:
case IntrinsicType::kFrexp:
return "frexp";
case Intrinsic::kFwidth:
case IntrinsicType::kFwidth:
return "fwidth";
case Intrinsic::kFwidthCoarse:
case IntrinsicType::kFwidthCoarse:
return "fwidthCoarse";
case Intrinsic::kFwidthFine:
case IntrinsicType::kFwidthFine:
return "fwidthFine";
case Intrinsic::kInverseSqrt:
case IntrinsicType::kInverseSqrt:
return "inverseSqrt";
case Intrinsic::kIsFinite:
case IntrinsicType::kIsFinite:
return "isFinite";
case Intrinsic::kIsInf:
case IntrinsicType::kIsInf:
return "isInf";
case Intrinsic::kIsNan:
case IntrinsicType::kIsNan:
return "isNan";
case Intrinsic::kIsNormal:
case IntrinsicType::kIsNormal:
return "isNormal";
case Intrinsic::kLdexp:
case IntrinsicType::kLdexp:
return "ldexp";
case Intrinsic::kLength:
case IntrinsicType::kLength:
return "length";
case Intrinsic::kLog:
case IntrinsicType::kLog:
return "log";
case Intrinsic::kLog2:
case IntrinsicType::kLog2:
return "log2";
case Intrinsic::kMax:
case IntrinsicType::kMax:
return "max";
case Intrinsic::kMin:
case IntrinsicType::kMin:
return "min";
case Intrinsic::kMix:
case IntrinsicType::kMix:
return "mix";
case Intrinsic::kModf:
case IntrinsicType::kModf:
return "modf";
case Intrinsic::kNormalize:
case IntrinsicType::kNormalize:
return "normalize";
case Intrinsic::kPack4x8Snorm:
case IntrinsicType::kPack4x8Snorm:
return "pack4x8snorm";
case Intrinsic::kPack4x8Unorm:
case IntrinsicType::kPack4x8Unorm:
return "pack4x8unorm";
case Intrinsic::kPack2x16Snorm:
case IntrinsicType::kPack2x16Snorm:
return "pack2x16snorm";
case Intrinsic::kPack2x16Unorm:
case IntrinsicType::kPack2x16Unorm:
return "pack2x16unorm";
case Intrinsic::kPack2x16Float:
case IntrinsicType::kPack2x16Float:
return "pack2x16float";
case Intrinsic::kPow:
case IntrinsicType::kPow:
return "pow";
case Intrinsic::kReflect:
case IntrinsicType::kReflect:
return "reflect";
case Intrinsic::kReverseBits:
case IntrinsicType::kReverseBits:
return "reverseBits";
case Intrinsic::kRound:
case IntrinsicType::kRound:
return "round";
case Intrinsic::kSelect:
case IntrinsicType::kSelect:
return "select";
case Intrinsic::kSign:
case IntrinsicType::kSign:
return "sign";
case Intrinsic::kSin:
case IntrinsicType::kSin:
return "sin";
case Intrinsic::kSinh:
case IntrinsicType::kSinh:
return "sinh";
case Intrinsic::kSmoothStep:
case IntrinsicType::kSmoothStep:
return "smoothStep";
case Intrinsic::kSqrt:
case IntrinsicType::kSqrt:
return "sqrt";
case Intrinsic::kStep:
case IntrinsicType::kStep:
return "step";
case Intrinsic::kTan:
case IntrinsicType::kTan:
return "tan";
case Intrinsic::kTanh:
case IntrinsicType::kTanh:
return "tanh";
case Intrinsic::kTextureDimensions:
case IntrinsicType::kTextureDimensions:
return "textureDimensions";
case Intrinsic::kTextureLoad:
case IntrinsicType::kTextureLoad:
return "textureLoad";
case Intrinsic::kTextureNumLayers:
case IntrinsicType::kTextureNumLayers:
return "textureNumLayers";
case Intrinsic::kTextureNumLevels:
case IntrinsicType::kTextureNumLevels:
return "textureNumLevels";
case Intrinsic::kTextureNumSamples:
case IntrinsicType::kTextureNumSamples:
return "textureNumSamples";
case Intrinsic::kTextureSample:
case IntrinsicType::kTextureSample:
return "textureSample";
case Intrinsic::kTextureSampleBias:
case IntrinsicType::kTextureSampleBias:
return "textureSampleBias";
case Intrinsic::kTextureSampleCompare:
case IntrinsicType::kTextureSampleCompare:
return "textureSampleCompare";
case Intrinsic::kTextureSampleGrad:
case IntrinsicType::kTextureSampleGrad:
return "textureSampleGrad";
case Intrinsic::kTextureSampleLevel:
case IntrinsicType::kTextureSampleLevel:
return "textureSampleLevel";
case Intrinsic::kTextureStore:
case IntrinsicType::kTextureStore:
return "textureStore";
case Intrinsic::kTrunc:
case IntrinsicType::kTrunc:
return "trunc";
}
return "<unknown>";
}
bool IsCoarseDerivative(Intrinsic i) {
return i == Intrinsic::kDpdxCoarse || i == Intrinsic::kDpdyCoarse ||
i == Intrinsic::kFwidthCoarse;
bool IsCoarseDerivative(IntrinsicType i) {
return i == IntrinsicType::kDpdxCoarse || i == IntrinsicType::kDpdyCoarse ||
i == IntrinsicType::kFwidthCoarse;
}
bool IsFineDerivative(Intrinsic i) {
return i == Intrinsic::kDpdxFine || i == Intrinsic::kDpdyFine ||
i == Intrinsic::kFwidthFine;
bool IsFineDerivative(IntrinsicType i) {
return i == IntrinsicType::kDpdxFine || i == IntrinsicType::kDpdyFine ||
i == IntrinsicType::kFwidthFine;
}
bool IsDerivative(Intrinsic i) {
return i == Intrinsic::kDpdx || i == Intrinsic::kDpdy ||
i == Intrinsic::kFwidth || IsCoarseDerivative(i) ||
bool IsDerivative(IntrinsicType i) {
return i == IntrinsicType::kDpdx || i == IntrinsicType::kDpdy ||
i == IntrinsicType::kFwidth || IsCoarseDerivative(i) ||
IsFineDerivative(i);
}
bool IsFloatClassificationIntrinsic(Intrinsic i) {
return i == Intrinsic::kIsFinite || i == Intrinsic::kIsInf ||
i == Intrinsic::kIsNan || i == Intrinsic::kIsNormal;
bool IsFloatClassificationIntrinsic(IntrinsicType i) {
return i == IntrinsicType::kIsFinite || i == IntrinsicType::kIsInf ||
i == IntrinsicType::kIsNan || i == IntrinsicType::kIsNormal;
}
bool IsTextureIntrinsic(Intrinsic i) {
return IsImageQueryIntrinsic(i) || i == Intrinsic::kTextureLoad ||
i == Intrinsic::kTextureSample ||
i == Intrinsic::kTextureSampleLevel ||
i == Intrinsic::kTextureSampleBias ||
i == Intrinsic::kTextureSampleCompare ||
i == Intrinsic::kTextureSampleGrad || i == Intrinsic::kTextureStore;
bool IsTextureIntrinsic(IntrinsicType i) {
return IsImageQueryIntrinsic(i) || i == IntrinsicType::kTextureLoad ||
i == IntrinsicType::kTextureSample ||
i == IntrinsicType::kTextureSampleLevel ||
i == IntrinsicType::kTextureSampleBias ||
i == IntrinsicType::kTextureSampleCompare ||
i == IntrinsicType::kTextureSampleGrad ||
i == IntrinsicType::kTextureStore;
}
bool IsImageQueryIntrinsic(Intrinsic i) {
return i == semantic::Intrinsic::kTextureDimensions ||
i == Intrinsic::kTextureNumLayers ||
i == Intrinsic::kTextureNumLevels ||
i == Intrinsic::kTextureNumSamples;
bool IsImageQueryIntrinsic(IntrinsicType i) {
return i == semantic::IntrinsicType::kTextureDimensions ||
i == IntrinsicType::kTextureNumLayers ||
i == IntrinsicType::kTextureNumLevels ||
i == IntrinsicType::kTextureNumSamples;
}
bool IsDataPackingIntrinsic(Intrinsic i) {
return i == Intrinsic::kPack4x8Snorm || i == Intrinsic::kPack4x8Unorm ||
i == Intrinsic::kPack2x16Snorm || i == Intrinsic::kPack2x16Unorm ||
i == Intrinsic::kPack2x16Float;
bool IsDataPackingIntrinsic(IntrinsicType i) {
return i == IntrinsicType::kPack4x8Snorm ||
i == IntrinsicType::kPack4x8Unorm ||
i == IntrinsicType::kPack2x16Snorm ||
i == IntrinsicType::kPack2x16Unorm ||
i == IntrinsicType::kPack2x16Float;
}
} // namespace intrinsic

View File

@@ -20,7 +20,7 @@
namespace tint {
namespace semantic {
enum class Intrinsic {
enum class IntrinsicType {
kNone = -1,
kAbs,
@@ -104,48 +104,48 @@ enum class Intrinsic {
/// Emits the name of the intrinsic function. The spelling,
/// including case, matches the name in the WGSL spec.
std::ostream& operator<<(std::ostream& out, Intrinsic i);
std::ostream& operator<<(std::ostream& out, IntrinsicType i);
namespace intrinsic {
/// Determines if the given `i` is a coarse derivative
/// @param i the intrinsic
/// @returns true if the given derivative is coarse.
bool IsCoarseDerivative(Intrinsic i);
bool IsCoarseDerivative(IntrinsicType i);
/// Determines if the given `i` is a fine derivative
/// @param i the intrinsic
/// @returns true if the given derivative is fine.
bool IsFineDerivative(Intrinsic i);
bool IsFineDerivative(IntrinsicType i);
/// Determine if the given `i` is a derivative intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a derivative intrinsic
bool IsDerivative(Intrinsic i);
bool IsDerivative(IntrinsicType i);
/// Determines if the given `i` is a float classification intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a float intrinsic
bool IsFloatClassificationIntrinsic(Intrinsic i);
bool IsFloatClassificationIntrinsic(IntrinsicType i);
/// Determines if the given `i` is a texture operation intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a texture operation intrinsic
bool IsTextureIntrinsic(Intrinsic i);
bool IsTextureIntrinsic(IntrinsicType i);
/// Determines if the given `i` is a image query intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a image query intrinsic
bool IsImageQueryIntrinsic(Intrinsic i);
bool IsImageQueryIntrinsic(IntrinsicType i);
/// Determines if the given `i` is a data packing intrinsic
/// @param i the intrinsic
/// @returns true if the given `i` is a data packing intrinsic
bool IsDataPackingIntrinsic(Intrinsic i);
bool IsDataPackingIntrinsic(IntrinsicType i);
/// @returns the name of the intrinsic function. The spelling, including case,
/// matches the name in the WGSL spec.
const char* str(Intrinsic i);
const char* str(IntrinsicType i);
} // namespace intrinsic
} // namespace semantic

View File

@@ -25,13 +25,13 @@ Call::Call(type::Type* return_type) : Base(return_type) {}
Call::~Call() = default;
IntrinsicCall::IntrinsicCall(type::Type* return_type, Intrinsic intrinsic)
IntrinsicCall::IntrinsicCall(type::Type* return_type, IntrinsicType intrinsic)
: Base(return_type), intrinsic_(intrinsic) {}
IntrinsicCall::~IntrinsicCall() = default;
TextureIntrinsicCall::TextureIntrinsicCall(type::Type* return_type,
Intrinsic intrinsic,
IntrinsicType intrinsic,
const Parameters& params)
: Base(return_type, intrinsic), params_(params) {}