semantic: Clean up intrinsics
Declare enum <-> string mapping once.
Don't use `default:` so the compiler moans when the enum is not catching cases.
Change-Id: I4c8903ef75c76b1881971b66ec3b49667dcc2218
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/45340
Auto-Submit: Ben Clayton <bclayton@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/semantic/intrinsic.h b/src/semantic/intrinsic.h
index e8ec3a2..9b58135 100644
--- a/src/semantic/intrinsic.h
+++ b/src/semantic/intrinsic.h
@@ -72,11 +72,11 @@
kMix,
kModf,
kNormalize,
- kPack4x8Snorm,
- kPack4x8Unorm,
+ kPack2x16Float,
kPack2x16Snorm,
kPack2x16Unorm,
- kPack2x16Float,
+ kPack4x8Snorm,
+ kPack4x8Unorm,
kPow,
kReflect,
kReverseBits,
@@ -102,11 +102,11 @@
kTextureSampleLevel,
kTextureStore,
kTrunc,
- kUnpack4x8Snorm,
- kUnpack4x8Unorm,
+ kUnpack2x16Float,
kUnpack2x16Snorm,
kUnpack2x16Unorm,
- kUnpack2x16Float,
+ kUnpack4x8Snorm,
+ kUnpack4x8Unorm,
};
/// Matches the IntrisicType by name
diff --git a/src/semantic/sem_intrinsic.cc b/src/semantic/sem_intrinsic.cc
index e1e8bf7..4d9fc63 100644
--- a/src/semantic/sem_intrinsic.cc
+++ b/src/semantic/sem_intrinsic.cc
@@ -28,346 +28,108 @@
return semantic::str(type_);
}
+/// Name matches the spelling in the WGSL spec including case.
+#define INTRINSIC_LIST() \
+ INTRINSIC(IntrinsicType::kNone, "<not-an-intrinsic>") \
+ INTRINSIC(IntrinsicType::kAbs, "abs") \
+ INTRINSIC(IntrinsicType::kAcos, "acos") \
+ INTRINSIC(IntrinsicType::kAll, "all") \
+ INTRINSIC(IntrinsicType::kAny, "any") \
+ INTRINSIC(IntrinsicType::kArrayLength, "arrayLength") \
+ INTRINSIC(IntrinsicType::kAsin, "asin") \
+ INTRINSIC(IntrinsicType::kAtan, "atan") \
+ INTRINSIC(IntrinsicType::kAtan2, "atan2") \
+ INTRINSIC(IntrinsicType::kCeil, "ceil") \
+ INTRINSIC(IntrinsicType::kClamp, "clamp") \
+ INTRINSIC(IntrinsicType::kCos, "cos") \
+ INTRINSIC(IntrinsicType::kCosh, "cosh") \
+ INTRINSIC(IntrinsicType::kCountOneBits, "countOneBits") \
+ INTRINSIC(IntrinsicType::kCross, "cross") \
+ INTRINSIC(IntrinsicType::kDeterminant, "determinant") \
+ INTRINSIC(IntrinsicType::kDistance, "distance") \
+ INTRINSIC(IntrinsicType::kDot, "dot") \
+ INTRINSIC(IntrinsicType::kDpdx, "dpdx") \
+ INTRINSIC(IntrinsicType::kDpdxCoarse, "dpdxCoarse") \
+ INTRINSIC(IntrinsicType::kDpdxFine, "dpdxFine") \
+ INTRINSIC(IntrinsicType::kDpdy, "dpdy") \
+ INTRINSIC(IntrinsicType::kDpdyCoarse, "dpdyCoarse") \
+ INTRINSIC(IntrinsicType::kDpdyFine, "dpdyFine") \
+ INTRINSIC(IntrinsicType::kExp, "exp") \
+ INTRINSIC(IntrinsicType::kExp2, "exp2") \
+ INTRINSIC(IntrinsicType::kFaceForward, "faceForward") \
+ INTRINSIC(IntrinsicType::kFloor, "floor") \
+ INTRINSIC(IntrinsicType::kFma, "fma") \
+ INTRINSIC(IntrinsicType::kFract, "fract") \
+ INTRINSIC(IntrinsicType::kFrexp, "frexp") \
+ INTRINSIC(IntrinsicType::kFwidth, "fwidth") \
+ INTRINSIC(IntrinsicType::kFwidthCoarse, "fwidthCoarse") \
+ INTRINSIC(IntrinsicType::kFwidthFine, "fwidthFine") \
+ INTRINSIC(IntrinsicType::kInverseSqrt, "inverseSqrt") \
+ INTRINSIC(IntrinsicType::kIsFinite, "isFinite") \
+ INTRINSIC(IntrinsicType::kIsInf, "isInf") \
+ INTRINSIC(IntrinsicType::kIsNan, "isNan") \
+ INTRINSIC(IntrinsicType::kIsNormal, "isNormal") \
+ INTRINSIC(IntrinsicType::kLdexp, "ldexp") \
+ INTRINSIC(IntrinsicType::kLength, "length") \
+ INTRINSIC(IntrinsicType::kLog, "log") \
+ INTRINSIC(IntrinsicType::kLog2, "log2") \
+ INTRINSIC(IntrinsicType::kMax, "max") \
+ INTRINSIC(IntrinsicType::kMin, "min") \
+ INTRINSIC(IntrinsicType::kMix, "mix") \
+ INTRINSIC(IntrinsicType::kModf, "modf") \
+ INTRINSIC(IntrinsicType::kNormalize, "normalize") \
+ INTRINSIC(IntrinsicType::kPack4x8Snorm, "pack4x8snorm") \
+ INTRINSIC(IntrinsicType::kPack4x8Unorm, "pack4x8unorm") \
+ INTRINSIC(IntrinsicType::kPack2x16Snorm, "pack2x16snorm") \
+ INTRINSIC(IntrinsicType::kPack2x16Unorm, "pack2x16unorm") \
+ INTRINSIC(IntrinsicType::kPack2x16Float, "pack2x16float") \
+ INTRINSIC(IntrinsicType::kPow, "pow") \
+ INTRINSIC(IntrinsicType::kReflect, "reflect") \
+ INTRINSIC(IntrinsicType::kReverseBits, "reverseBits") \
+ INTRINSIC(IntrinsicType::kRound, "round") \
+ INTRINSIC(IntrinsicType::kSelect, "select") \
+ INTRINSIC(IntrinsicType::kSign, "sign") \
+ INTRINSIC(IntrinsicType::kSin, "sin") \
+ INTRINSIC(IntrinsicType::kSinh, "sinh") \
+ INTRINSIC(IntrinsicType::kSmoothStep, "smoothStep") \
+ INTRINSIC(IntrinsicType::kSqrt, "sqrt") \
+ INTRINSIC(IntrinsicType::kStep, "step") \
+ INTRINSIC(IntrinsicType::kTan, "tan") \
+ INTRINSIC(IntrinsicType::kTanh, "tanh") \
+ INTRINSIC(IntrinsicType::kTextureDimensions, "textureDimensions") \
+ INTRINSIC(IntrinsicType::kTextureLoad, "textureLoad") \
+ INTRINSIC(IntrinsicType::kTextureNumLayers, "textureNumLayers") \
+ INTRINSIC(IntrinsicType::kTextureNumLevels, "textureNumLevels") \
+ INTRINSIC(IntrinsicType::kTextureNumSamples, "textureNumSamples") \
+ INTRINSIC(IntrinsicType::kTextureSample, "textureSample") \
+ INTRINSIC(IntrinsicType::kTextureSampleBias, "textureSampleBias") \
+ INTRINSIC(IntrinsicType::kTextureSampleCompare, "textureSampleCompare") \
+ INTRINSIC(IntrinsicType::kTextureSampleGrad, "textureSampleGrad") \
+ INTRINSIC(IntrinsicType::kTextureSampleLevel, "textureSampleLevel") \
+ INTRINSIC(IntrinsicType::kTextureStore, "textureStore") \
+ INTRINSIC(IntrinsicType::kTrunc, "trunc") \
+ INTRINSIC(IntrinsicType::kUnpack2x16Float, "unpack2x16float") \
+ INTRINSIC(IntrinsicType::kUnpack2x16Snorm, "unpack2x16snorm") \
+ INTRINSIC(IntrinsicType::kUnpack2x16Unorm, "unpack2x16unorm") \
+ INTRINSIC(IntrinsicType::kUnpack4x8Snorm, "unpack4x8snorm") \
+ INTRINSIC(IntrinsicType::kUnpack4x8Unorm, "unpack4x8unorm")
+
IntrinsicType ParseIntrinsicType(const std::string& name) {
- if (name == "abs") {
- return IntrinsicType::kAbs;
- } else if (name == "acos") {
- return IntrinsicType::kAcos;
- } else if (name == "all") {
- return IntrinsicType::kAll;
- } else if (name == "any") {
- return IntrinsicType::kAny;
- } else if (name == "arrayLength") {
- return IntrinsicType::kArrayLength;
- } else if (name == "asin") {
- return IntrinsicType::kAsin;
- } else if (name == "atan") {
- return IntrinsicType::kAtan;
- } else if (name == "atan2") {
- return IntrinsicType::kAtan2;
- } else if (name == "ceil") {
- return IntrinsicType::kCeil;
- } else if (name == "clamp") {
- return IntrinsicType::kClamp;
- } else if (name == "cos") {
- return IntrinsicType::kCos;
- } else if (name == "cosh") {
- return IntrinsicType::kCosh;
- } else if (name == "countOneBits") {
- return IntrinsicType::kCountOneBits;
- } else if (name == "cross") {
- return IntrinsicType::kCross;
- } else if (name == "determinant") {
- return IntrinsicType::kDeterminant;
- } else if (name == "distance") {
- return IntrinsicType::kDistance;
- } else if (name == "dot") {
- return IntrinsicType::kDot;
- } else if (name == "dpdx") {
- return IntrinsicType::kDpdx;
- } else if (name == "dpdxCoarse") {
- return IntrinsicType::kDpdxCoarse;
- } else if (name == "dpdxFine") {
- return IntrinsicType::kDpdxFine;
- } else if (name == "dpdy") {
- return IntrinsicType::kDpdy;
- } else if (name == "dpdyCoarse") {
- return IntrinsicType::kDpdyCoarse;
- } else if (name == "dpdyFine") {
- return IntrinsicType::kDpdyFine;
- } else if (name == "exp") {
- return IntrinsicType::kExp;
- } else if (name == "exp2") {
- return IntrinsicType::kExp2;
- } else if (name == "faceForward") {
- return IntrinsicType::kFaceForward;
- } else if (name == "floor") {
- return IntrinsicType::kFloor;
- } else if (name == "fma") {
- return IntrinsicType::kFma;
- } else if (name == "fract") {
- return IntrinsicType::kFract;
- } else if (name == "frexp") {
- return IntrinsicType::kFrexp;
- } else if (name == "fwidth") {
- return IntrinsicType::kFwidth;
- } else if (name == "fwidthCoarse") {
- return IntrinsicType::kFwidthCoarse;
- } else if (name == "fwidthFine") {
- return IntrinsicType::kFwidthFine;
- } else if (name == "inverseSqrt") {
- return IntrinsicType::kInverseSqrt;
- } else if (name == "isFinite") {
- return IntrinsicType::kIsFinite;
- } else if (name == "isInf") {
- return IntrinsicType::kIsInf;
- } else if (name == "isNan") {
- return IntrinsicType::kIsNan;
- } else if (name == "isNormal") {
- return IntrinsicType::kIsNormal;
- } else if (name == "ldexp") {
- return IntrinsicType::kLdexp;
- } else if (name == "length") {
- return IntrinsicType::kLength;
- } else if (name == "log") {
- return IntrinsicType::kLog;
- } else if (name == "log2") {
- return IntrinsicType::kLog2;
- } else if (name == "max") {
- return IntrinsicType::kMax;
- } else if (name == "min") {
- return IntrinsicType::kMin;
- } else if (name == "mix") {
- return IntrinsicType::kMix;
- } else if (name == "modf") {
- return IntrinsicType::kModf;
- } else if (name == "normalize") {
- return IntrinsicType::kNormalize;
- } else if (name == "pack4x8snorm") {
- return IntrinsicType::kPack4x8Snorm;
- } else if (name == "pack4x8unorm") {
- return IntrinsicType::kPack4x8Unorm;
- } else if (name == "pack2x16snorm") {
- return IntrinsicType::kPack2x16Snorm;
- } else if (name == "pack2x16unorm") {
- return IntrinsicType::kPack2x16Unorm;
- } else if (name == "pack2x16float") {
- return IntrinsicType::kPack2x16Float;
- } else if (name == "pow") {
- return IntrinsicType::kPow;
- } else if (name == "reflect") {
- return IntrinsicType::kReflect;
- } else if (name == "reverseBits") {
- return IntrinsicType::kReverseBits;
- } else if (name == "round") {
- return IntrinsicType::kRound;
- } else if (name == "select") {
- return IntrinsicType::kSelect;
- } else if (name == "sign") {
- return IntrinsicType::kSign;
- } else if (name == "sin") {
- return IntrinsicType::kSin;
- } else if (name == "sinh") {
- return IntrinsicType::kSinh;
- } else if (name == "smoothStep") {
- return IntrinsicType::kSmoothStep;
- } else if (name == "sqrt") {
- return IntrinsicType::kSqrt;
- } else if (name == "step") {
- return IntrinsicType::kStep;
- } else if (name == "tan") {
- return IntrinsicType::kTan;
- } else if (name == "tanh") {
- return IntrinsicType::kTanh;
- } else if (name == "textureDimensions") {
- return IntrinsicType::kTextureDimensions;
- } else if (name == "textureNumLayers") {
- return IntrinsicType::kTextureNumLayers;
- } else if (name == "textureNumLevels") {
- return IntrinsicType::kTextureNumLevels;
- } else if (name == "textureNumSamples") {
- return IntrinsicType::kTextureNumSamples;
- } else if (name == "textureLoad") {
- return IntrinsicType::kTextureLoad;
- } else if (name == "textureStore") {
- return IntrinsicType::kTextureStore;
- } else if (name == "textureSample") {
- return IntrinsicType::kTextureSample;
- } else if (name == "textureSampleBias") {
- return IntrinsicType::kTextureSampleBias;
- } else if (name == "textureSampleCompare") {
- return IntrinsicType::kTextureSampleCompare;
- } else if (name == "textureSampleGrad") {
- return IntrinsicType::kTextureSampleGrad;
- } else if (name == "textureSampleLevel") {
- return IntrinsicType::kTextureSampleLevel;
- } else if (name == "trunc") {
- return IntrinsicType::kTrunc;
- } else if (name == "unpack4x8snorm") {
- return IntrinsicType::kUnpack4x8Snorm;
- } else if (name == "unpack4x8unorm") {
- return IntrinsicType::kUnpack4x8Unorm;
- } else if (name == "unpack2x16snorm") {
- return IntrinsicType::kUnpack2x16Snorm;
- } else if (name == "unpack2x16unorm") {
- return IntrinsicType::kUnpack2x16Unorm;
- } else if (name == "unpack2x16float") {
- return IntrinsicType::kUnpack2x16Float;
+#define INTRINSIC(ENUM, NAME) \
+ if (name == NAME) { \
+ return ENUM; \
}
+ INTRINSIC_LIST()
+#undef INTRINSIC
return IntrinsicType::kNone;
}
const char* str(IntrinsicType i) {
- /// The emitted name matches the spelling in the WGSL spec.
- /// including case.
- switch (i) {
- case IntrinsicType::kNone:
- return "<not-an-intrinsic>";
- case IntrinsicType::kAbs:
- return "abs";
- case IntrinsicType::kAcos:
- return "acos";
- case IntrinsicType::kAll:
- return "all";
- case IntrinsicType::kAny:
- return "any";
- case IntrinsicType::kArrayLength:
- return "arrayLength";
- case IntrinsicType::kAsin:
- return "asin";
- case IntrinsicType::kAtan:
- return "atan";
- case IntrinsicType::kAtan2:
- return "atan2";
- case IntrinsicType::kCeil:
- return "ceil";
- case IntrinsicType::kClamp:
- return "clamp";
- case IntrinsicType::kCos:
- return "cos";
- case IntrinsicType::kCosh:
- return "cosh";
- case IntrinsicType::kCountOneBits:
- return "countOneBits";
- case IntrinsicType::kCross:
- return "cross";
- case IntrinsicType::kDeterminant:
- return "determinant";
- case IntrinsicType::kDistance:
- return "distance";
- case IntrinsicType::kDot:
- return "dot";
- case IntrinsicType::kDpdx:
- return "dpdx";
- case IntrinsicType::kDpdxCoarse:
- return "dpdxCoarse";
- case IntrinsicType::kDpdxFine:
- return "dpdxFine";
- case IntrinsicType::kDpdy:
- return "dpdy";
- case IntrinsicType::kDpdyCoarse:
- return "dpdyCoarse";
- case IntrinsicType::kDpdyFine:
- return "dpdyFine";
- case IntrinsicType::kExp:
- return "exp";
- case IntrinsicType::kExp2:
- return "exp2";
- case IntrinsicType::kFaceForward:
- return "faceForward";
- case IntrinsicType::kFloor:
- return "floor";
- case IntrinsicType::kFma:
- return "fma";
- case IntrinsicType::kFract:
- return "fract";
- case IntrinsicType::kFrexp:
- return "frexp";
- case IntrinsicType::kFwidth:
- return "fwidth";
- case IntrinsicType::kFwidthCoarse:
- return "fwidthCoarse";
- case IntrinsicType::kFwidthFine:
- return "fwidthFine";
- case IntrinsicType::kInverseSqrt:
- return "inverseSqrt";
- case IntrinsicType::kIsFinite:
- return "isFinite";
- case IntrinsicType::kIsInf:
- return "isInf";
- case IntrinsicType::kIsNan:
- return "isNan";
- case IntrinsicType::kIsNormal:
- return "isNormal";
- case IntrinsicType::kLdexp:
- return "ldexp";
- case IntrinsicType::kLength:
- return "length";
- case IntrinsicType::kLog:
- return "log";
- case IntrinsicType::kLog2:
- return "log2";
- case IntrinsicType::kMax:
- return "max";
- case IntrinsicType::kMin:
- return "min";
- case IntrinsicType::kMix:
- return "mix";
- case IntrinsicType::kModf:
- return "modf";
- case IntrinsicType::kNormalize:
- return "normalize";
- case IntrinsicType::kPack4x8Snorm:
- return "pack4x8snorm";
- case IntrinsicType::kPack4x8Unorm:
- return "pack4x8unorm";
- case IntrinsicType::kPack2x16Snorm:
- return "pack2x16snorm";
- case IntrinsicType::kPack2x16Unorm:
- return "pack2x16unorm";
- case IntrinsicType::kPack2x16Float:
- return "pack2x16float";
- case IntrinsicType::kPow:
- return "pow";
- case IntrinsicType::kReflect:
- return "reflect";
- case IntrinsicType::kReverseBits:
- return "reverseBits";
- case IntrinsicType::kRound:
- return "round";
- case IntrinsicType::kSelect:
- return "select";
- case IntrinsicType::kSign:
- return "sign";
- case IntrinsicType::kSin:
- return "sin";
- case IntrinsicType::kSinh:
- return "sinh";
- case IntrinsicType::kSmoothStep:
- return "smoothStep";
- case IntrinsicType::kSqrt:
- return "sqrt";
- case IntrinsicType::kStep:
- return "step";
- case IntrinsicType::kTan:
- return "tan";
- case IntrinsicType::kTanh:
- return "tanh";
- case IntrinsicType::kTextureDimensions:
- return "textureDimensions";
- case IntrinsicType::kTextureLoad:
- return "textureLoad";
- case IntrinsicType::kTextureNumLayers:
- return "textureNumLayers";
- case IntrinsicType::kTextureNumLevels:
- return "textureNumLevels";
- case IntrinsicType::kTextureNumSamples:
- return "textureNumSamples";
- case IntrinsicType::kTextureSample:
- return "textureSample";
- case IntrinsicType::kTextureSampleBias:
- return "textureSampleBias";
- case IntrinsicType::kTextureSampleCompare:
- return "textureSampleCompare";
- case IntrinsicType::kTextureSampleGrad:
- return "textureSampleGrad";
- case IntrinsicType::kTextureSampleLevel:
- return "textureSampleLevel";
- case IntrinsicType::kTextureStore:
- return "textureStore";
- case IntrinsicType::kTrunc:
- return "trunc";
- case IntrinsicType::kUnpack4x8Snorm:
- return "unpack4x8snorm";
- case IntrinsicType::kUnpack4x8Unorm:
- return "unpack4x8unorm";
- case IntrinsicType::kUnpack2x16Snorm:
- return "unpack2x16snorm";
- case IntrinsicType::kUnpack2x16Unorm:
- return "unpack2x16unorm";
- case IntrinsicType::kUnpack2x16Float:
- return "unpack2x16float";
- }
+#define INTRINSIC(ENUM, NAME) \
+ case ENUM: \
+ return NAME;
+ switch (i) { INTRINSIC_LIST() }
+#undef INTRINSIC
return "<unknown>";
}
diff --git a/src/semantic/sem_intrinsic_test.cc b/src/semantic/sem_intrinsic_test.cc
index bba98b3..698fcd3 100644
--- a/src/semantic/sem_intrinsic_test.cc
+++ b/src/semantic/sem_intrinsic_test.cc
@@ -112,7 +112,12 @@
IntrinsicType::kTextureSampleCompare},
IntrinsicData{"textureSampleGrad", IntrinsicType::kTextureSampleGrad},
IntrinsicData{"textureSampleLevel", IntrinsicType::kTextureSampleLevel},
- IntrinsicData{"trunc", IntrinsicType::kTrunc}));
+ IntrinsicData{"trunc", IntrinsicType::kTrunc},
+ IntrinsicData{"unpack2x16float", IntrinsicType::kUnpack2x16Float},
+ IntrinsicData{"unpack2x16snorm", IntrinsicType::kUnpack2x16Snorm},
+ IntrinsicData{"unpack2x16unorm", IntrinsicType::kUnpack2x16Unorm},
+ IntrinsicData{"unpack4x8snorm", IntrinsicType::kUnpack4x8Snorm},
+ IntrinsicData{"unpack4x8unorm", IntrinsicType::kUnpack4x8Unorm}));
TEST_F(IntrinsicTypeTest, ParseNoMatch) {
EXPECT_EQ(ParseIntrinsicType("not_intrinsic"), IntrinsicType::kNone);