intrinsics: Add new struct form of modf(), frexp()

Implement these for all the writers.
SPIR-V reader not implemented (the old overloads weren't implemented either).

Deprecate the old overloads.

Fixed: tint:54
Change-Id: If66d26dbac3389ff604734f31b426abe47868b91
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/59302
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/intrinsic_table.cc b/src/intrinsic_table.cc
index 82c1deb..4f02b6d 100644
--- a/src/intrinsic_table.cc
+++ b/src/intrinsic_table.cc
@@ -29,6 +29,7 @@
 #include "src/sem/storage_texture_type.h"
 #include "src/utils/get_or_create.h"
 #include "src/utils/hash.h"
+#include "src/utils/math.h"
 #include "src/utils/scoped_assignment.h"
 
 namespace tint {
@@ -637,6 +638,91 @@
   return state.builder.create<sem::ExternalTexture>();
 }
 
+// Builtin types starting with a _ prefix cannot be declared in WGSL, so they
+// can only be used as return types. Because of this, they must only match Any,
+// which is used as the return type matcher.
+bool match_modf_result(const sem::Type* ty) {
+  return ty->Is<Any>();
+}
+bool match_modf_result_vec(const sem::Type* ty, Number& N) {
+  if (!ty->Is<Any>()) {
+    return false;
+  }
+  N = Number::any;
+  return true;
+}
+bool match_frexp_result(const sem::Type* ty) {
+  return ty->Is<Any>();
+}
+bool match_frexp_result_vec(const sem::Type* ty, Number& N) {
+  if (!ty->Is<Any>()) {
+    return false;
+  }
+  N = Number::any;
+  return true;
+}
+
+struct NameAndType {
+  std::string name;
+  sem::Type* type;
+};
+const sem::Struct* build_struct(
+    MatchState& state,
+    std::string name,
+    std::initializer_list<NameAndType> member_names_and_types) {
+  uint32_t offset = 0;
+  uint32_t max_align = 0;
+  sem::StructMemberList members;
+  for (auto& m : member_names_and_types) {
+    uint32_t align = m.type->Align();
+    uint32_t size = m.type->Size();
+    offset = utils::RoundUp(align, offset);
+    max_align = std::max(max_align, align);
+    members.emplace_back(state.builder.create<sem::StructMember>(
+        /* declaration */ nullptr,
+        /* name */ state.builder.Sym(m.name),
+        /* type */ m.type,
+        /* index */ static_cast<uint32_t>(members.size()),
+        /* offset */ offset,
+        /* align */ align,
+        /* size */ size));
+    offset += size;
+  }
+  uint32_t size_without_padding = offset;
+  uint32_t size_with_padding = utils::RoundUp(max_align, offset);
+  return state.builder.create<sem::Struct>(
+      /* declaration */ nullptr,
+      /* name */ state.builder.Sym(name),
+      /* members */ members,
+      /* align */ max_align,
+      /* size */ size_with_padding,
+      /* size_no_padding */ size_without_padding);
+}
+
+const sem::Struct* build_modf_result(MatchState& state) {
+  auto* f32 = state.builder.create<sem::F32>();
+  return build_struct(state, "_modf_result", {{"fract", f32}, {"whole", f32}});
+}
+const sem::Struct* build_modf_result_vec(MatchState& state, Number& n) {
+  auto* vec_f32 = state.builder.create<sem::Vector>(
+      state.builder.create<sem::F32>(), n.Value());
+  return build_struct(state, "_modf_result_vec" + std::to_string(n.Value()),
+                      {{"fract", vec_f32}, {"whole", vec_f32}});
+}
+const sem::Struct* build_frexp_result(MatchState& state) {
+  auto* f32 = state.builder.create<sem::F32>();
+  auto* i32 = state.builder.create<sem::I32>();
+  return build_struct(state, "_frexp_result", {{"sig", f32}, {"exp", i32}});
+}
+const sem::Struct* build_frexp_result_vec(MatchState& state, Number& n) {
+  auto* vec_f32 = state.builder.create<sem::Vector>(
+      state.builder.create<sem::F32>(), n.Value());
+  auto* vec_i32 = state.builder.create<sem::Vector>(
+      state.builder.create<sem::I32>(), n.Value());
+  return build_struct(state, "_frexp_result_vec" + std::to_string(n.Value()),
+                      {{"sig", vec_f32}, {"exp", vec_i32}});
+}
+
 /// ParameterInfo describes a parameter
 struct ParameterInfo {
   /// The parameter usage (parameter name in definition file)
diff --git a/src/intrinsic_table.inl b/src/intrinsic_table.inl
index d0bd476..343e156 100644
--- a/src/intrinsic_table.inl
+++ b/src/intrinsic_table.inl
@@ -1006,8 +1006,132 @@
   return "texture_external";
 }
 
+/// TypeMatcher for 'type _modf_result'
+/// @see src/intrinsics.def:99:6
+class ModfResult : public TypeMatcher {
+ public:
+  /// Checks whether the given type matches the matcher rules.
+  /// Match may close open types and numbers in state.
+  /// @param state the MatchState
+  /// @param type the type to match
+  /// @returns the canonicalized type on match, otherwise nullptr
+  const sem::Type* Match(MatchState& state,
+                         const sem::Type* type) const override;
+  /// @param state the MatchState
+  /// @return a string representation of the matcher.
+  std::string String(MatchState& state) const override;
+};
+
+const sem::Type* ModfResult::Match(MatchState& state, const sem::Type* ty) const {
+  if (!match_modf_result(ty)) {
+    return nullptr;
+  }
+  return build_modf_result(state);
+}
+
+std::string ModfResult::String(MatchState&) const {
+  return "_modf_result";
+}
+
+/// TypeMatcher for 'type _modf_result_vec'
+/// @see src/intrinsics.def:100:41
+class ModfResultVec : public TypeMatcher {
+ public:
+  /// Checks whether the given type matches the matcher rules.
+  /// Match may close open types and numbers in state.
+  /// @param state the MatchState
+  /// @param type the type to match
+  /// @returns the canonicalized type on match, otherwise nullptr
+  const sem::Type* Match(MatchState& state,
+                         const sem::Type* type) const override;
+  /// @param state the MatchState
+  /// @return a string representation of the matcher.
+  std::string String(MatchState& state) const override;
+};
+
+const sem::Type* ModfResultVec::Match(MatchState& state, const sem::Type* ty) const {
+  Number N = Number::invalid;
+  if (!match_modf_result_vec(ty, N)) {
+    return nullptr;
+  }
+  N = state.Num(N);
+  if (!N.IsValid()) {
+    return nullptr;
+  }
+  return build_modf_result_vec(state, N);
+}
+
+std::string ModfResultVec::String(MatchState& state) const {
+  const std::string N = state.NumName();
+  std::stringstream ss;
+  ss << "_modf_result_vec" << N;
+  return ss.str();
+}
+
+/// TypeMatcher for 'type _frexp_result'
+/// @see src/intrinsics.def:101:6
+class FrexpResult : public TypeMatcher {
+ public:
+  /// Checks whether the given type matches the matcher rules.
+  /// Match may close open types and numbers in state.
+  /// @param state the MatchState
+  /// @param type the type to match
+  /// @returns the canonicalized type on match, otherwise nullptr
+  const sem::Type* Match(MatchState& state,
+                         const sem::Type* type) const override;
+  /// @param state the MatchState
+  /// @return a string representation of the matcher.
+  std::string String(MatchState& state) const override;
+};
+
+const sem::Type* FrexpResult::Match(MatchState& state, const sem::Type* ty) const {
+  if (!match_frexp_result(ty)) {
+    return nullptr;
+  }
+  return build_frexp_result(state);
+}
+
+std::string FrexpResult::String(MatchState&) const {
+  return "_frexp_result";
+}
+
+/// TypeMatcher for 'type _frexp_result_vec'
+/// @see src/intrinsics.def:102:42
+class FrexpResultVec : public TypeMatcher {
+ public:
+  /// Checks whether the given type matches the matcher rules.
+  /// Match may close open types and numbers in state.
+  /// @param state the MatchState
+  /// @param type the type to match
+  /// @returns the canonicalized type on match, otherwise nullptr
+  const sem::Type* Match(MatchState& state,
+                         const sem::Type* type) const override;
+  /// @param state the MatchState
+  /// @return a string representation of the matcher.
+  std::string String(MatchState& state) const override;
+};
+
+const sem::Type* FrexpResultVec::Match(MatchState& state, const sem::Type* ty) const {
+  Number N = Number::invalid;
+  if (!match_frexp_result_vec(ty, N)) {
+    return nullptr;
+  }
+  N = state.Num(N);
+  if (!N.IsValid()) {
+    return nullptr;
+  }
+  return build_frexp_result_vec(state, N);
+}
+
+std::string FrexpResultVec::String(MatchState& state) const {
+  const std::string N = state.NumName();
+  std::stringstream ss;
+  ss << "_frexp_result_vec" << N;
+  return ss.str();
+}
+
 /// TypeMatcher for 'match fiu32'
-/// @see src/intrinsics.def:105:7
+/// @see src/intrinsics.def:110:7
 class Fiu32 : public TypeMatcher {
  public:
   /// Checks whether the given type matches the matcher rules, and returns the
@@ -1041,7 +1165,7 @@
 }
 
 /// TypeMatcher for 'match iu32'
-/// @see src/intrinsics.def:106:7
+/// @see src/intrinsics.def:111:7
 class Iu32 : public TypeMatcher {
  public:
   /// Checks whether the given type matches the matcher rules, and returns the
@@ -1072,7 +1196,7 @@
 }
 
 /// TypeMatcher for 'match scalar'
-/// @see src/intrinsics.def:107:7
+/// @see src/intrinsics.def:112:7
 class Scalar : public TypeMatcher {
  public:
   /// Checks whether the given type matches the matcher rules, and returns the
@@ -1109,7 +1233,7 @@
 }
 
 /// EnumMatcher for 'match f32_texel_format'
-/// @see src/intrinsics.def:118:7
+/// @see src/intrinsics.def:123:7
 class F32TexelFormat : public NumberMatcher {
  public:
   /// Checks whether the given number matches the enum matcher rules.
@@ -1142,7 +1266,7 @@
 }
 
 /// EnumMatcher for 'match i32_texel_format'
-/// @see src/intrinsics.def:120:7
+/// @see src/intrinsics.def:125:7
 class I32TexelFormat : public NumberMatcher {
  public:
   /// Checks whether the given number matches the enum matcher rules.
@@ -1174,7 +1298,7 @@
 }
 
 /// EnumMatcher for 'match u32_texel_format'
-/// @see src/intrinsics.def:122:7
+/// @see src/intrinsics.def:127:7
 class U32TexelFormat : public NumberMatcher {
  public:
   /// Checks whether the given number matches the enum matcher rules.
@@ -1206,7 +1330,7 @@
 }
 
 /// EnumMatcher for 'match read_or_write'
-/// @see src/intrinsics.def:125:7
+/// @see src/intrinsics.def:130:7
 class ReadOrWrite : public NumberMatcher {
  public:
   /// Checks whether the given number matches the enum matcher rules.
@@ -1235,7 +1359,7 @@
 }
 
 /// EnumMatcher for 'match function_private_workgroup'
-/// @see src/intrinsics.def:127:7
+/// @see src/intrinsics.def:132:7
 class FunctionPrivateWorkgroup : public NumberMatcher {
  public:
   /// Checks whether the given number matches the enum matcher rules.
@@ -1265,7 +1389,7 @@
 }
 
 /// EnumMatcher for 'match workgroup_or_storage'
-/// @see src/intrinsics.def:128:7
+/// @see src/intrinsics.def:133:7
 class WorkgroupOrStorage : public NumberMatcher {
  public:
   /// Checks whether the given number matches the enum matcher rules.
@@ -1430,6 +1554,10 @@
   TextureStorage2DArray TextureStorage2DArray_;
   TextureStorage3D TextureStorage3D_;
   TextureExternal TextureExternal_;
+  ModfResult ModfResult_;
+  ModfResultVec ModfResultVec_;
+  FrexpResult FrexpResult_;
+  FrexpResultVec FrexpResultVec_;
   Fiu32 Fiu32_;
   Iu32 Iu32_;
   Scalar Scalar_;
@@ -1451,7 +1579,7 @@
   ~Matchers();
 
   /// The open-types, types, and type matchers
-  TypeMatcher const* const type[34] = {
+  TypeMatcher const* const type[38] = {
     /* [0] */ &open_type_0_,
     /* [1] */ &Bool_,
     /* [2] */ &F32_,
@@ -1483,9 +1611,13 @@
     /* [28] */ &TextureStorage2DArray_,
     /* [29] */ &TextureStorage3D_,
     /* [30] */ &TextureExternal_,
-    /* [31] */ &Fiu32_,
-    /* [32] */ &Iu32_,
-    /* [33] */ &Scalar_,
+    /* [31] */ &ModfResult_,
+    /* [32] */ &ModfResultVec_,
+    /* [33] */ &FrexpResult_,
+    /* [34] */ &FrexpResultVec_,
+    /* [35] */ &Fiu32_,
+    /* [36] */ &Iu32_,
+    /* [37] */ &Scalar_,
   };
 
   /// The open-numbers, and number matchers
@@ -1510,19 +1642,19 @@
 Matchers::~Matchers() = default;
 
 constexpr MatcherIndex kMatcherIndices[] = {
-  /* [0] */ 29,
-  /* [1] */ 5,
+  /* [0] */ 27,
+  /* [1] */ 3,
   /* [2] */ 10,
   /* [3] */ 1,
   /* [4] */ 8,
   /* [5] */ 0,
-  /* [6] */ 3,
+  /* [6] */ 2,
   /* [7] */ 2,
   /* [8] */ 10,
   /* [9] */ 1,
   /* [10] */ 8,
   /* [11] */ 0,
-  /* [12] */ 2,
+  /* [12] */ 3,
   /* [13] */ 2,
   /* [14] */ 10,
   /* [15] */ 0,
@@ -1536,54 +1668,54 @@
   /* [23] */ 0,
   /* [24] */ 9,
   /* [25] */ 0,
-  /* [26] */ 1,
+  /* [26] */ 0,
   /* [27] */ 2,
-  /* [28] */ 9,
+  /* [28] */ 10,
   /* [29] */ 0,
-  /* [30] */ 0,
-  /* [31] */ 2,
+  /* [30] */ 3,
+  /* [31] */ 1,
   /* [32] */ 10,
   /* [33] */ 0,
-  /* [34] */ 3,
+  /* [34] */ 2,
   /* [35] */ 1,
-  /* [36] */ 10,
+  /* [36] */ 9,
   /* [37] */ 0,
-  /* [38] */ 2,
-  /* [39] */ 1,
+  /* [38] */ 1,
+  /* [39] */ 2,
   /* [40] */ 9,
   /* [41] */ 1,
   /* [42] */ 0,
   /* [43] */ 2,
-  /* [44] */ 8,
+  /* [44] */ 28,
   /* [45] */ 0,
-  /* [46] */ 0,
-  /* [47] */ 28,
+  /* [46] */ 1,
+  /* [47] */ 29,
   /* [48] */ 0,
   /* [49] */ 1,
-  /* [50] */ 29,
+  /* [50] */ 27,
   /* [51] */ 0,
   /* [52] */ 1,
-  /* [53] */ 27,
-  /* [54] */ 0,
-  /* [55] */ 1,
-  /* [56] */ 29,
-  /* [57] */ 5,
-  /* [58] */ 11,
-  /* [59] */ 26,
-  /* [60] */ 0,
-  /* [61] */ 1,
-  /* [62] */ 28,
-  /* [63] */ 5,
-  /* [64] */ 11,
-  /* [65] */ 8,
-  /* [66] */ 0,
-  /* [67] */ 1,
-  /* [68] */ 27,
+  /* [53] */ 29,
+  /* [54] */ 5,
+  /* [55] */ 11,
+  /* [56] */ 26,
+  /* [57] */ 0,
+  /* [58] */ 1,
+  /* [59] */ 28,
+  /* [60] */ 5,
+  /* [61] */ 11,
+  /* [62] */ 8,
+  /* [63] */ 0,
+  /* [64] */ 0,
+  /* [65] */ 27,
+  /* [66] */ 5,
+  /* [67] */ 11,
+  /* [68] */ 26,
   /* [69] */ 5,
   /* [70] */ 11,
-  /* [71] */ 26,
-  /* [72] */ 5,
-  /* [73] */ 11,
+  /* [71] */ 8,
+  /* [72] */ 0,
+  /* [73] */ 1,
   /* [74] */ 29,
   /* [75] */ 4,
   /* [76] */ 11,
@@ -1608,90 +1740,96 @@
   /* [95] */ 26,
   /* [96] */ 3,
   /* [97] */ 11,
-  /* [98] */ 28,
-  /* [99] */ 5,
+  /* [98] */ 29,
+  /* [99] */ 3,
   /* [100] */ 10,
-  /* [101] */ 27,
+  /* [101] */ 29,
   /* [102] */ 5,
   /* [103] */ 10,
-  /* [104] */ 26,
+  /* [104] */ 28,
   /* [105] */ 5,
   /* [106] */ 10,
-  /* [107] */ 29,
-  /* [108] */ 4,
+  /* [107] */ 27,
+  /* [108] */ 5,
   /* [109] */ 10,
-  /* [110] */ 28,
-  /* [111] */ 4,
+  /* [110] */ 26,
+  /* [111] */ 5,
   /* [112] */ 10,
-  /* [113] */ 27,
+  /* [113] */ 29,
   /* [114] */ 4,
   /* [115] */ 10,
-  /* [116] */ 26,
+  /* [116] */ 28,
   /* [117] */ 4,
   /* [118] */ 10,
-  /* [119] */ 29,
-  /* [120] */ 3,
+  /* [119] */ 27,
+  /* [120] */ 4,
   /* [121] */ 10,
   /* [122] */ 26,
-  /* [123] */ 3,
+  /* [123] */ 4,
   /* [124] */ 10,
-  /* [125] */ 27,
+  /* [125] */ 26,
   /* [126] */ 3,
   /* [127] */ 10,
   /* [128] */ 28,
   /* [129] */ 3,
   /* [130] */ 10,
-  /* [131] */ 16,
-  /* [132] */ 2,
+  /* [131] */ 5,
+  /* [132] */ 3,
   /* [133] */ 7,
   /* [134] */ 2,
   /* [135] */ 5,
-  /* [136] */ 3,
+  /* [136] */ 2,
   /* [137] */ 6,
   /* [138] */ 3,
   /* [139] */ 7,
   /* [140] */ 3,
-  /* [141] */ 5,
+  /* [141] */ 6,
   /* [142] */ 2,
-  /* [143] */ 7,
-  /* [144] */ 4,
-  /* [145] */ 6,
-  /* [146] */ 2,
-  /* [147] */ 15,
-  /* [148] */ 0,
-  /* [149] */ 7,
+  /* [143] */ 32,
+  /* [144] */ 0,
+  /* [145] */ 7,
+  /* [146] */ 4,
+  /* [147] */ 20,
+  /* [148] */ 2,
+  /* [149] */ 15,
   /* [150] */ 0,
-  /* [151] */ 16,
+  /* [151] */ 7,
   /* [152] */ 0,
-  /* [153] */ 20,
-  /* [154] */ 2,
-  /* [155] */ 17,
+  /* [153] */ 34,
+  /* [154] */ 0,
+  /* [155] */ 16,
   /* [156] */ 0,
-  /* [157] */ 19,
-  /* [158] */ 2,
+  /* [157] */ 17,
+  /* [158] */ 0,
   /* [159] */ 18,
-  /* [160] */ 0,
+  /* [160] */ 2,
   /* [161] */ 18,
-  /* [162] */ 2,
+  /* [162] */ 0,
   /* [163] */ 21,
   /* [164] */ 0,
   /* [165] */ 17,
   /* [166] */ 2,
-  /* [167] */ 19,
-  /* [168] */ 0,
-  /* [169] */ 20,
-  /* [170] */ 0,
-  /* [171] */ 15,
-  /* [172] */ 2,
-  /* [173] */ 5,
+  /* [167] */ 16,
+  /* [168] */ 2,
+  /* [169] */ 19,
+  /* [170] */ 2,
+  /* [171] */ 19,
+  /* [172] */ 0,
+  /* [173] */ 20,
   /* [174] */ 0,
-  /* [175] */ 13,
-  /* [176] */ 25,
-  /* [177] */ 24,
-  /* [178] */ 23,
-  /* [179] */ 22,
-  /* [180] */ 14,
-  /* [181] */ 30,
+  /* [175] */ 15,
+  /* [176] */ 2,
+  /* [177] */ 5,
+  /* [178] */ 0,
+  /* [179] */ 13,
+  /* [180] */ 25,
+  /* [181] */ 24,
+  /* [182] */ 23,
+  /* [183] */ 22,
+  /* [184] */ 14,
+  /* [185] */ 30,
+  /* [186] */ 31,
+  /* [187] */ 33,
 };
 
 // Assert that the MatcherIndex is big enough to index all the matchers, plus
@@ -1709,42 +1847,42 @@
   {
     /* [1] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [2] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [3] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [4] */
     /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [5] */
     /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [6] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [7] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[165],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [8] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [9] */
@@ -1753,78 +1891,78 @@
   },
   {
     /* [10] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kDdx,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [11] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kDdy,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [12] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[137],
   },
   {
     /* [13] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [14] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [15] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [16] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [17] */
     /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [18] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [19] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [20] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [21] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [22] */
-    /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [23] */
-    /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kDepthRef,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [24] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[137],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [25] */
@@ -1834,37 +1972,37 @@
   {
     /* [26] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [27] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [28] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [29] */
     /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [30] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [31] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[147],
   },
   {
     /* [32] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [33] */
@@ -1874,77 +2012,77 @@
   {
     /* [34] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [35] */
-    /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kDdx,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [36] */
-    /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kDdy,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [37] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [38] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [39] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [40] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [41] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [42] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [43] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[153],
+    /* matcher indices */ &kMatcherIndices[165],
   },
   {
     /* [44] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [45] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [46] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [47] */
     /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [48] */
     /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [49] */
@@ -1954,67 +2092,67 @@
   {
     /* [50] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [51] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [52] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [53] */
-    /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [54] */
-    /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* usage */ ParameterUsage::kOffset,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [55] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [56] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [57] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [58] */
     /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [59] */
     /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [60] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [61] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [62] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [63] */
@@ -2023,63 +2161,63 @@
   },
   {
     /* [64] */
-    /* usage */ ParameterUsage::kArrayIndex,
+    /* usage */ ParameterUsage::kLevel,
     /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [65] */
-    /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kOffset,
+    /* matcher indices */ &kMatcherIndices[137],
   },
   {
     /* [66] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [67] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [68] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [69] */
     /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [70] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [71] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [72] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [73] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [74] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [75] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [76] */
@@ -2089,42 +2227,42 @@
   {
     /* [77] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [78] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [79] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [80] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [81] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [82] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [83] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [84] */
     /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [85] */
@@ -2134,162 +2272,162 @@
   {
     /* [86] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[153],
+    /* matcher indices */ &kMatcherIndices[147],
   },
   {
     /* [87] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [88] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [89] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [90] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [91] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[153],
+    /* matcher indices */ &kMatcherIndices[147],
   },
   {
     /* [92] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [93] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [94] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [95] */
     /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [96] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[157],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [97] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [98] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [99] */
-    /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [100] */
-    /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kOffset,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [101] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [102] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [103] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [104] */
     /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [105] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [106] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [107] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [108] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [109] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [110] */
-    /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[137],
+    /* usage */ ParameterUsage::kDepthRef,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [111] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[165],
   },
   {
     /* [112] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [113] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [114] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [115] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [116] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[180],
   },
   {
     /* [117] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [118] */
@@ -2298,48 +2436,48 @@
   },
   {
     /* [119] */
-    /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [120] */
-    /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* usage */ ParameterUsage::kDepthRef,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [121] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
+    /* matcher indices */ &kMatcherIndices[180],
   },
   {
     /* [122] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [123] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [124] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [125] */
     /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [126] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[165],
+    /* matcher indices */ &kMatcherIndices[169],
   },
   {
     /* [127] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [128] */
@@ -2348,283 +2486,283 @@
   },
   {
     /* [129] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kDdx,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [130] */
-    /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kDdy,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [131] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [132] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [133] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [134] */
     /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [135] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [136] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [137] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [138] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [139] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [140] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [141] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
+    /* matcher indices */ &kMatcherIndices[180],
   },
   {
     /* [142] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [143] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [144] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [145] */
-    /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [146] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[165],
   },
   {
     /* [147] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [148] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [149] */
-    /* usage */ ParameterUsage::kDdx,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [150] */
-    /* usage */ ParameterUsage::kDdy,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kBias,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [151] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [152] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [153] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [154] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kDdx,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [155] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kDdy,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [156] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [157] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [158] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [159] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kDdx,
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [160] */
-    /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kDdy,
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [161] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[165],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [162] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [163] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [164] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [165] */
-    /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kDepthRef,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [166] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [167] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [168] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [169] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [170] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [171] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[157],
   },
   {
     /* [172] */
-    /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [173] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [174] */
-    /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [175] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[177],
+    /* matcher indices */ &kMatcherIndices[181],
   },
   {
     /* [176] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [177] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [178] */
-    /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [179] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[177],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [180] */
-    /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [181] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [182] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [183] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[181],
   },
   {
     /* [184] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [185] */
@@ -2634,102 +2772,102 @@
   {
     /* [186] */
     /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [187] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[98],
+    /* matcher indices */ &kMatcherIndices[104],
   },
   {
     /* [188] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [189] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [190] */
     /* usage */ ParameterUsage::kValue,
-    /* matcher indices */ &kMatcherIndices[143],
+    /* matcher indices */ &kMatcherIndices[145],
   },
   {
     /* [191] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [192] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [193] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [194] */
     /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [195] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[177],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [196] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[180],
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [197] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [198] */
     /* usage */ ParameterUsage::kDepthRef,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [199] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[157],
+    /* matcher indices */ &kMatcherIndices[169],
   },
   {
     /* [200] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [201] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [202] */
     /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [203] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[110],
+    /* matcher indices */ &kMatcherIndices[116],
   },
   {
     /* [204] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [205] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [206] */
@@ -2739,82 +2877,82 @@
   {
     /* [207] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [208] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [209] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [210] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [211] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[157],
+    /* matcher indices */ &kMatcherIndices[169],
   },
   {
     /* [212] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [213] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [214] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [215] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[155],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [216] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kSampler,
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [217] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [218] */
-    /* usage */ ParameterUsage::kLevel,
+    /* usage */ ParameterUsage::kBias,
     /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [219] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [220] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [221] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [222] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [223] */
@@ -2824,12 +2962,12 @@
   {
     /* [224] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [225] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [226] */
@@ -2839,122 +2977,122 @@
   {
     /* [227] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [228] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [229] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [230] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [231] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [232] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [233] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [234] */
     /* usage */ ParameterUsage::kBias,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [235] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
+    /* matcher indices */ &kMatcherIndices[180],
   },
   {
     /* [236] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [237] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [238] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [239] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
     /* [240] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [241] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [242] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [243] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [244] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [245] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [246] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [247] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[153],
+    /* matcher indices */ &kMatcherIndices[147],
   },
   {
     /* [248] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [249] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [250] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [251] */
@@ -2964,72 +3102,72 @@
   {
     /* [252] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [253] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [254] */
     /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [255] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [256] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [257] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [258] */
     /* usage */ ParameterUsage::kOffset,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [259] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[181],
   },
   {
     /* [260] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kSampler,
+    /* matcher indices */ &kMatcherIndices[184],
   },
   {
     /* [261] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [262] */
-    /* usage */ ParameterUsage::kLevel,
+    /* usage */ ParameterUsage::kDepthRef,
     /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [263] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [264] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [265] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [266] */
@@ -3038,58 +3176,58 @@
   },
   {
     /* [267] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [268] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [269] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [270] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[171],
+    /* matcher indices */ &kMatcherIndices[113],
   },
   {
     /* [271] */
-    /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[137],
   },
   {
     /* [272] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kValue,
+    /* matcher indices */ &kMatcherIndices[139],
   },
   {
     /* [273] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[181],
+    /* matcher indices */ &kMatcherIndices[185],
   },
   {
     /* [274] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [275] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [276] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[122],
+    /* matcher indices */ &kMatcherIndices[125],
   },
   {
     /* [277] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [278] */
@@ -3099,42 +3237,42 @@
   {
     /* [279] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [280] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [281] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [282] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [283] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [284] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [285] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[125],
+    /* matcher indices */ &kMatcherIndices[0],
   },
   {
     /* [286] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [287] */
@@ -3144,22 +3282,22 @@
   {
     /* [288] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [289] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [290] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [291] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[119],
+    /* matcher indices */ &kMatcherIndices[98],
   },
   {
     /* [292] */
@@ -3174,12 +3312,12 @@
   {
     /* [294] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[116],
+    /* matcher indices */ &kMatcherIndices[122],
   },
   {
     /* [295] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [296] */
@@ -3189,12 +3327,12 @@
   {
     /* [297] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[113],
+    /* matcher indices */ &kMatcherIndices[119],
   },
   {
     /* [298] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [299] */
@@ -3204,37 +3342,37 @@
   {
     /* [300] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[107],
+    /* matcher indices */ &kMatcherIndices[110],
   },
   {
     /* [301] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[137],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [302] */
     /* usage */ ParameterUsage::kValue,
-    /* matcher indices */ &kMatcherIndices[139],
+    /* matcher indices */ &kMatcherIndices[145],
   },
   {
     /* [303] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[101],
+    /* matcher indices */ &kMatcherIndices[107],
   },
   {
     /* [304] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [305] */
     /* usage */ ParameterUsage::kValue,
-    /* matcher indices */ &kMatcherIndices[143],
+    /* matcher indices */ &kMatcherIndices[145],
   },
   {
     /* [306] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[0],
+    /* matcher indices */ &kMatcherIndices[101],
   },
   {
     /* [307] */
@@ -3244,252 +3382,252 @@
   {
     /* [308] */
     /* usage */ ParameterUsage::kValue,
-    /* matcher indices */ &kMatcherIndices[143],
+    /* matcher indices */ &kMatcherIndices[145],
   },
   {
     /* [309] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[104],
+    /* matcher indices */ &kMatcherIndices[149],
   },
   {
     /* [310] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [311] */
-    /* usage */ ParameterUsage::kValue,
-    /* matcher indices */ &kMatcherIndices[143],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [312] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[131],
+    /* matcher indices */ &kMatcherIndices[155],
   },
   {
     /* [313] */
-    /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [314] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [315] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[151],
+    /* matcher indices */ &kMatcherIndices[175],
   },
   {
     /* [316] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kSampler,
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [317] */
-    /* usage */ ParameterUsage::kLevel,
+    /* usage */ ParameterUsage::kCoords,
     /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [318] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[159],
+    /* matcher indices */ &kMatcherIndices[167],
   },
   {
     /* [319] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[137],
+    /* usage */ ParameterUsage::kSampler,
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [320] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [321] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[163],
+    /* matcher indices */ &kMatcherIndices[161],
   },
   {
     /* [322] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[137],
   },
   {
     /* [323] */
-    /* usage */ ParameterUsage::kSampleIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [324] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[163],
   },
   {
     /* [325] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [326] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kSampleIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [327] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[147],
+    /* matcher indices */ &kMatcherIndices[159],
   },
   {
     /* [328] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kSampler,
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [329] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [330] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[161],
+    /* matcher indices */ &kMatcherIndices[169],
   },
   {
     /* [331] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [332] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [333] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[157],
+    /* matcher indices */ &kMatcherIndices[181],
   },
   {
     /* [334] */
     /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* matcher indices */ &kMatcherIndices[179],
   },
   {
     /* [335] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [336] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[177],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [337] */
-    /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [338] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [339] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[62],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [340] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [341] */
-    /* usage */ ParameterUsage::kArrayIndex,
+    /* usage */ ParameterUsage::kNone,
     /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [342] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[59],
   },
   {
     /* [343] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [344] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [345] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [346] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [347] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[71],
   },
   {
     /* [348] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [349] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [350] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[3],
   },
   {
     /* [351] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [352] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [353] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [354] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [355] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [356] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [357] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[14],
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [358] */
@@ -3499,172 +3637,172 @@
   {
     /* [359] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[3],
   },
   {
     /* [360] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[77],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [361] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [362] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [363] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[14],
   },
   {
     /* [364] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [365] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[65],
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [366] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [367] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [368] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [369] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [370] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [371] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[3],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [372] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[77],
   },
   {
     /* [373] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [374] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[3],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [375] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[89],
   },
   {
     /* [376] */
-    /* usage */ ParameterUsage::kSampler,
-    /* matcher indices */ &kMatcherIndices[175],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [377] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* usage */ ParameterUsage::kArrayIndex,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [378] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[89],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
     /* [379] */
+    /* usage */ ParameterUsage::kSampler,
+    /* matcher indices */ &kMatcherIndices[179],
+  },
+  {
+    /* [380] */
     /* usage */ ParameterUsage::kCoords,
     /* matcher indices */ &kMatcherIndices[135],
   },
   {
-    /* [380] */
-    /* usage */ ParameterUsage::kArrayIndex,
-    /* matcher indices */ &kMatcherIndices[6],
-  },
-  {
     /* [381] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[95],
-  },
-  {
-    /* [382] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[6],
-  },
-  {
-    /* [383] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
-  },
-  {
-    /* [384] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
-  },
-  {
-    /* [385] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
-  },
-  {
-    /* [386] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
-  },
-  {
-    /* [387] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[86],
-  },
-  {
-    /* [388] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[137],
-  },
-  {
-    /* [389] */
-    /* usage */ ParameterUsage::kTexture,
     /* matcher indices */ &kMatcherIndices[83],
   },
   {
-    /* [390] */
+    /* [382] */
     /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[1],
+  },
+  {
+    /* [383] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[80],
+  },
+  {
+    /* [384] */
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
+  },
+  {
+    /* [385] */
+    /* usage */ ParameterUsage::kNone,
     /* matcher indices */ &kMatcherIndices[6],
   },
   {
-    /* [391] */
+    /* [386] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
+  },
+  {
+    /* [387] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
+  },
+  {
+    /* [388] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
+  },
+  {
+    /* [389] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
+  },
+  {
+    /* [390] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
+  },
+  {
+    /* [391] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[86],
   },
   {
     /* [392] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[137],
   },
   {
     /* [393] */
@@ -3674,207 +3812,207 @@
   {
     /* [394] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [395] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [396] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[145],
+    /* matcher indices */ &kMatcherIndices[141],
   },
   {
     /* [397] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [398] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[2],
   },
   {
     /* [399] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
-  },
-  {
-    /* [400] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
-  },
-  {
-    /* [401] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
-  },
-  {
-    /* [402] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[8],
-  },
-  {
-    /* [403] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
-  },
-  {
-    /* [404] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[36],
-  },
-  {
-    /* [405] */
     /* usage */ ParameterUsage::kTexture,
     /* matcher indices */ &kMatcherIndices[74],
   },
   {
-    /* [406] */
+    /* [400] */
     /* usage */ ParameterUsage::kCoords,
     /* matcher indices */ &kMatcherIndices[137],
   },
   {
+    /* [401] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[6],
+  },
+  {
+    /* [402] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[32],
+  },
+  {
+    /* [403] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[62],
+  },
+  {
+    /* [404] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[62],
+  },
+  {
+    /* [405] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[5],
+  },
+  {
+    /* [406] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[5],
+  },
+  {
     /* [407] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[71],
+    /* matcher indices */ &kMatcherIndices[68],
   },
   {
     /* [408] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [409] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[171],
   },
   {
     /* [410] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [411] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[80],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [412] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [413] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [414] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [415] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[65],
   },
   {
     /* [416] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [417] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [418] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [419] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [420] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [421] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [422] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [423] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[14],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [424] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [425] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[68],
+    /* matcher indices */ &kMatcherIndices[53],
   },
   {
     /* [426] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[137],
   },
   {
     /* [427] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [428] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [429] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [430] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [431] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[56],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[14],
   },
   {
     /* [432] */
-    /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[137],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [433] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[181],
+    /* matcher indices */ &kMatcherIndices[185],
   },
   {
     /* [434] */
     /* usage */ ParameterUsage::kCoords,
-    /* matcher indices */ &kMatcherIndices[135],
+    /* matcher indices */ &kMatcherIndices[131],
   },
   {
     /* [435] */
@@ -3888,13 +4026,13 @@
   },
   {
     /* [437] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[151],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[14],
   },
   {
     /* [438] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [439] */
@@ -3909,12 +4047,12 @@
   {
     /* [441] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [442] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [443] */
@@ -3929,12 +4067,12 @@
   {
     /* [445] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [446] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[8],
   },
   {
     /* [447] */
@@ -3968,18 +4106,18 @@
   },
   {
     /* [453] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[147],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [454] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [455] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[14],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [456] */
@@ -3988,273 +4126,273 @@
   },
   {
     /* [457] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[173],
   },
   {
     /* [458] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [459] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* matcher indices */ &kMatcherIndices[180],
   },
   {
     /* [460] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [461] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[155],
+    /* matcher indices */ &kMatcherIndices[149],
   },
   {
     /* [462] */
     /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
     /* [463] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
-  },
-  {
-    /* [464] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
-  },
-  {
-    /* [465] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[159],
-  },
-  {
-    /* [466] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
-  },
-  {
-    /* [467] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
-  },
-  {
-    /* [468] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[32],
-  },
-  {
-    /* [469] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[167],
-  },
-  {
-    /* [470] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
-  },
-  {
-    /* [471] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
-  },
-  {
-    /* [472] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
-  },
-  {
-    /* [473] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[169],
-  },
-  {
-    /* [474] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
-  },
-  {
-    /* [475] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[177],
-  },
-  {
-    /* [476] */
-    /* usage */ ParameterUsage::kLevel,
-    /* matcher indices */ &kMatcherIndices[6],
-  },
-  {
-    /* [477] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
-  },
-  {
-    /* [478] */
-    /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[2],
-  },
-  {
-    /* [479] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[159],
-  },
-  {
-    /* [480] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
-  },
-  {
-    /* [481] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
-  },
-  {
-    /* [482] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[177],
-  },
-  {
-    /* [483] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[163],
-  },
-  {
-    /* [484] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
-  },
-  {
-    /* [485] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[169],
-  },
-  {
-    /* [486] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[59],
-  },
-  {
-    /* [487] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[53],
-  },
-  {
-    /* [488] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[47],
-  },
-  {
-    /* [489] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[50],
-  },
-  {
-    /* [490] */
     /* usage */ ParameterUsage::kTexture,
     /* matcher indices */ &kMatcherIndices[181],
   },
   {
-    /* [491] */
+    /* [464] */
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
+  },
+  {
+    /* [465] */
     /* usage */ ParameterUsage::kTexture,
     /* matcher indices */ &kMatcherIndices[155],
   },
   {
-    /* [492] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[169],
+    /* [466] */
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
-    /* [493] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* [467] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
-    /* [494] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
+    /* [468] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[28],
   },
   {
-    /* [495] */
+    /* [469] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[47],
+    /* matcher indices */ &kMatcherIndices[157],
   },
   {
-    /* [496] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[147],
+    /* [470] */
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
-    /* [497] */
+    /* [471] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[151],
+    /* matcher indices */ &kMatcherIndices[182],
   },
   {
-    /* [498] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[155],
+    /* [472] */
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
-    /* [499] */
+    /* [473] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[159],
+    /* matcher indices */ &kMatcherIndices[161],
   },
   {
-    /* [500] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[167],
+    /* [474] */
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
-    /* [501] */
+    /* [475] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[169],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
-    /* [502] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[179],
+    /* [476] */
+    /* usage */ ParameterUsage::kLevel,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
-    /* [503] */
+    /* [477] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[178],
+    /* matcher indices */ &kMatcherIndices[95],
   },
   {
-    /* [504] */
-    /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[177],
+    /* [478] */
+    /* usage */ ParameterUsage::kCoords,
+    /* matcher indices */ &kMatcherIndices[1],
   },
   {
-    /* [505] */
+    /* [479] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[176],
+    /* matcher indices */ &kMatcherIndices[157],
   },
   {
-    /* [506] */
+    /* [480] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[173],
+  },
+  {
+    /* [481] */
     /* usage */ ParameterUsage::kTexture,
     /* matcher indices */ &kMatcherIndices[163],
   },
   {
-    /* [507] */
+    /* [482] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[167],
+    /* matcher indices */ &kMatcherIndices[183],
   },
   {
-    /* [508] */
+    /* [483] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[171],
+  },
+  {
+    /* [484] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[182],
+  },
+  {
+    /* [485] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[161],
+  },
+  {
+    /* [486] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[181],
+  },
+  {
+    /* [487] */
     /* usage */ ParameterUsage::kTexture,
     /* matcher indices */ &kMatcherIndices[155],
   },
   {
+    /* [488] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[180],
+  },
+  {
+    /* [489] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[149],
+  },
+  {
+    /* [490] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[56],
+  },
+  {
+    /* [491] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[50],
+  },
+  {
+    /* [492] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[44],
+  },
+  {
+    /* [493] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[47],
+  },
+  {
+    /* [494] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[185],
+  },
+  {
+    /* [495] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[157],
+  },
+  {
+    /* [496] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[173],
+  },
+  {
+    /* [497] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[182],
+  },
+  {
+    /* [498] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[180],
+  },
+  {
+    /* [499] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[44],
+  },
+  {
+    /* [500] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[149],
+  },
+  {
+    /* [501] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[155],
+  },
+  {
+    /* [502] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[157],
+  },
+  {
+    /* [503] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[161],
+  },
+  {
+    /* [504] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[171],
+  },
+  {
+    /* [505] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[173],
+  },
+  {
+    /* [506] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[183],
+  },
+  {
+    /* [507] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[182],
+  },
+  {
+    /* [508] */
+    /* usage */ ParameterUsage::kTexture,
+    /* matcher indices */ &kMatcherIndices[181],
+  },
+  {
     /* [509] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[151],
+    /* matcher indices */ &kMatcherIndices[180],
   },
   {
     /* [510] */
     /* usage */ ParameterUsage::kTexture,
-    /* matcher indices */ &kMatcherIndices[147],
+    /* matcher indices */ &kMatcherIndices[163],
   },
   {
     /* [511] */
@@ -4284,92 +4422,92 @@
   {
     /* [516] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [517] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [518] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[24],
+    /* matcher indices */ &kMatcherIndices[36],
   },
   {
     /* [519] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [520] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [521] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [522] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [523] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [524] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [525] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [526] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [527] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [528] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [529] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [530] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [531] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [532] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [533] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [534] */
@@ -4389,341 +4527,361 @@
   {
     /* [537] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [538] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [539] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[141],
+    /* matcher indices */ &kMatcherIndices[135],
   },
   {
     /* [540] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [541] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [542] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [543] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [544] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [545] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [546] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [547] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [548] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [549] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [550] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [551] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [552] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [553] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [554] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [555] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [556] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [557] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [558] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [559] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [560] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [561] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [562] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [563] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [564] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [565] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [566] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [567] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [568] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [569] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [570] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [571] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [572] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [573] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [574] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [575] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [576] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [577] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [578] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [579] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [580] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [581] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [582] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [583] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [584] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[28],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [585] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [586] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[5],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [587] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [588] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[24],
   },
   {
     /* [589] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[62],
   },
   {
     /* [590] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[5],
   },
   {
     /* [591] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [592] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [593] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [594] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [595] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [596] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [597] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[14],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [598] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[19],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [599] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[65],
+    /* matcher indices */ &kMatcherIndices[4],
   },
   {
     /* [600] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[65],
+    /* matcher indices */ &kMatcherIndices[6],
   },
   {
     /* [601] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[10],
+    /* matcher indices */ &kMatcherIndices[14],
   },
   {
     /* [602] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[7],
+    /* matcher indices */ &kMatcherIndices[19],
   },
   {
     /* [603] */
     /* usage */ ParameterUsage::kNone,
-    /* matcher indices */ &kMatcherIndices[44],
+    /* matcher indices */ &kMatcherIndices[71],
   },
   {
     /* [604] */
     /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[71],
+  },
+  {
+    /* [605] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[4],
+  },
+  {
+    /* [606] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[6],
+  },
+  {
+    /* [607] */
+    /* usage */ ParameterUsage::kNone,
+    /* matcher indices */ &kMatcherIndices[62],
+  },
+  {
+    /* [608] */
+    /* usage */ ParameterUsage::kNone,
     /* matcher indices */ &kMatcherIndices[5],
   },
 };
@@ -4737,17 +4895,17 @@
   {
     /* [1] */
     /* name */ "T",
-    /* matcher index */ 31,
+    /* matcher index */ 35,
   },
   {
     /* [2] */
     /* name */ "T",
-    /* matcher index */ 32,
+    /* matcher index */ 36,
   },
   {
     /* [3] */
     /* name */ "T",
-    /* matcher index */ 33,
+    /* matcher index */ 37,
   },
 };
 
@@ -4797,8 +4955,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[510],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[489],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4809,8 +4967,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[453],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[461],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4821,8 +4979,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[509],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[487],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4833,8 +4991,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[437],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[465],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4845,8 +5003,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[508],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[479],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4857,8 +5015,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[461],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[469],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4869,7 +5027,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[479],
+    /* parameters */ &kParameters[485],
     /* return matcher indices */ &kMatcherIndices[137],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -4881,7 +5039,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[465],
+    /* parameters */ &kParameters[473],
     /* return matcher indices */ &kMatcherIndices[137],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -4893,8 +5051,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[507],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[483],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4905,8 +5063,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[469],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[409],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4917,8 +5075,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[485],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[480],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4929,8 +5087,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[473],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[457],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4941,8 +5099,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[483],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[481],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4953,8 +5111,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[481],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[482],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4965,8 +5123,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[459],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[475],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4977,8 +5135,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[480],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[484],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -4989,8 +5147,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[409],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[471],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5001,8 +5159,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[482],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[486],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5013,8 +5171,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[475],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[463],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5025,8 +5183,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[484],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[488],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5037,8 +5195,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[471],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[459],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5049,8 +5207,8 @@
     /* num open numbers */ 2,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[4],
-    /* parameters */ &kParameters[486],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[490],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5061,8 +5219,8 @@
     /* num open numbers */ 2,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[4],
-    /* parameters */ &kParameters[487],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[491],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5073,8 +5231,8 @@
     /* num open numbers */ 2,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[4],
-    /* parameters */ &kParameters[488],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[492],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5085,7 +5243,7 @@
     /* num open numbers */ 2,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[4],
-    /* parameters */ &kParameters[489],
+    /* parameters */ &kParameters[493],
     /* return matcher indices */ &kMatcherIndices[137],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5097,8 +5255,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[490],
-    /* return matcher indices */ &kMatcherIndices[135],
+    /* parameters */ &kParameters[494],
+    /* return matcher indices */ &kMatcherIndices[131],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5109,8 +5267,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[327],
-    /* return matcher indices */ &kMatcherIndices[149],
+    /* parameters */ &kParameters[309],
+    /* return matcher indices */ &kMatcherIndices[151],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5121,8 +5279,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[315],
-    /* return matcher indices */ &kMatcherIndices[149],
+    /* parameters */ &kParameters[312],
+    /* return matcher indices */ &kMatcherIndices[151],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5133,8 +5291,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[215],
-    /* return matcher indices */ &kMatcherIndices[149],
+    /* parameters */ &kParameters[171],
+    /* return matcher indices */ &kMatcherIndices[151],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5145,8 +5303,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[318],
-    /* return matcher indices */ &kMatcherIndices[149],
+    /* parameters */ &kParameters[321],
+    /* return matcher indices */ &kMatcherIndices[151],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5157,8 +5315,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[321],
-    /* return matcher indices */ &kMatcherIndices[149],
+    /* parameters */ &kParameters[324],
+    /* return matcher indices */ &kMatcherIndices[151],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5169,8 +5327,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[324],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[267],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5181,8 +5339,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[259],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[179],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5193,7 +5351,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[381],
+    /* parameters */ &kParameters[477],
     /* return matcher indices */ &kMatcherIndices[133],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5217,7 +5375,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[378],
+    /* parameters */ &kParameters[375],
     /* return matcher indices */ &kMatcherIndices[133],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5229,7 +5387,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[387],
+    /* parameters */ &kParameters[391],
     /* return matcher indices */ &kMatcherIndices[133],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5241,7 +5399,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[389],
+    /* parameters */ &kParameters[381],
     /* return matcher indices */ &kMatcherIndices[139],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5253,7 +5411,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[411],
+    /* parameters */ &kParameters[383],
     /* return matcher indices */ &kMatcherIndices[139],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5265,7 +5423,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[360],
+    /* parameters */ &kParameters[372],
     /* return matcher indices */ &kMatcherIndices[139],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5277,7 +5435,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[405],
+    /* parameters */ &kParameters[399],
     /* return matcher indices */ &kMatcherIndices[139],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5290,7 +5448,7 @@
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[407],
-    /* return matcher indices */ &kMatcherIndices[143],
+    /* return matcher indices */ &kMatcherIndices[145],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5301,8 +5459,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[425],
-    /* return matcher indices */ &kMatcherIndices[143],
+    /* parameters */ &kParameters[415],
+    /* return matcher indices */ &kMatcherIndices[145],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5313,8 +5471,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[339],
-    /* return matcher indices */ &kMatcherIndices[143],
+    /* parameters */ &kParameters[342],
+    /* return matcher indices */ &kMatcherIndices[145],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5325,8 +5483,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[431],
-    /* return matcher indices */ &kMatcherIndices[143],
+    /* parameters */ &kParameters[425],
+    /* return matcher indices */ &kMatcherIndices[145],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5344,186 +5502,6 @@
   },
   {
     /* [46] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[270],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [47] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[312],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [48] */
-    /* num parameters */ 4,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[255],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [49] */
-    /* num parameters */ 4,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[251],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [50] */
-    /* num parameters */ 5,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[126],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [51] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[330],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [52] */
-    /* num parameters */ 4,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[263],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [53] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[333],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [54] */
-    /* num parameters */ 4,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[247],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [55] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[375],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [56] */
-    /* num parameters */ 4,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[219],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [57] */
-    /* num parameters */ 4,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[239],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [58] */
-    /* num parameters */ 5,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[71],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [59] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[336],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [60] */
-    /* num parameters */ 4,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[235],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [61] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -5535,7 +5513,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [62] */
+    /* [47] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -5547,7 +5525,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [63] */
+    /* [48] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -5559,19 +5537,19 @@
     /* is_deprecated */ false,
   },
   {
-    /* [64] */
+    /* [49] */
     /* num parameters */ 6,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[7],
+    /* parameters */ &kParameters[49],
     /* return matcher indices */ &kMatcherIndices[133],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [65] */
+    /* [50] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -5583,19 +5561,19 @@
     /* is_deprecated */ false,
   },
   {
-    /* [66] */
+    /* [51] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[106],
+    /* parameters */ &kParameters[61],
     /* return matcher indices */ &kMatcherIndices[133],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [67] */
+    /* [52] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -5607,7 +5585,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [68] */
+    /* [53] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -5619,79 +5597,79 @@
     /* is_deprecated */ false,
   },
   {
-    /* [69] */
+    /* [54] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[243],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [70] */
+    /* [55] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[111],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[96],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [71] */
+    /* [56] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[136],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [72] */
+    /* [57] */
     /* num parameters */ 6,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[37],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [73] */
+    /* [58] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[179],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[175],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [74] */
+    /* [59] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[151],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[141],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [75] */
+    /* [60] */
     /* num parameters */ 3,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -5703,6 +5681,186 @@
     /* is_deprecated */ false,
   },
   {
+    /* [61] */
+    /* num parameters */ 3,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[315],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [62] */
+    /* num parameters */ 3,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[318],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [63] */
+    /* num parameters */ 4,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[255],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [64] */
+    /* num parameters */ 4,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[251],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [65] */
+    /* num parameters */ 5,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[111],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [66] */
+    /* num parameters */ 3,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[327],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [67] */
+    /* num parameters */ 4,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[263],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [68] */
+    /* num parameters */ 3,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[330],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [69] */
+    /* num parameters */ 4,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[247],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [70] */
+    /* num parameters */ 3,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[378],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [71] */
+    /* num parameters */ 4,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[219],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [72] */
+    /* num parameters */ 4,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[239],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [73] */
+    /* num parameters */ 5,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[71],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [74] */
+    /* num parameters */ 3,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[333],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [75] */
+    /* num parameters */ 4,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[235],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* is_deprecated */ false,
+  },
+  {
     /* [76] */
     /* num parameters */ 3,
     /* num open types */ 0,
@@ -5793,7 +5951,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[300],
+    /* parameters */ &kParameters[270],
     /* return matcher indices */ nullptr,
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5805,7 +5963,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[309],
+    /* parameters */ &kParameters[300],
     /* return matcher indices */ nullptr,
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -5853,8 +6011,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[496],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[500],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5865,8 +6023,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[497],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[501],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5877,8 +6035,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[498],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[502],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5889,8 +6047,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[499],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[503],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5901,8 +6059,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[500],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[504],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5913,8 +6071,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[501],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[505],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5925,8 +6083,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[502],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[506],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5937,8 +6095,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[503],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[507],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5949,8 +6107,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[504],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[508],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -5961,109 +6119,13 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[505],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[509],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [98] */
-    /* num parameters */ 5,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[116],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [99] */
-    /* num parameters */ 6,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[55],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [100] */
-    /* num parameters */ 6,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[49],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [101] */
-    /* num parameters */ 7,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[0],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [102] */
-    /* num parameters */ 5,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[146],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [103] */
-    /* num parameters */ 6,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[19],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [104] */
-    /* num parameters */ 5,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[96],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [105] */
-    /* num parameters */ 6,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[43],
-    /* return matcher indices */ &kMatcherIndices[133],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [106] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -6075,7 +6137,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [107] */
+    /* [99] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -6087,19 +6149,19 @@
     /* is_deprecated */ false,
   },
   {
-    /* [108] */
+    /* [100] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[161],
+    /* parameters */ &kParameters[146],
     /* return matcher indices */ &kMatcherIndices[133],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
-    /* [109] */
+    /* [101] */
     /* num parameters */ 6,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -6111,19 +6173,19 @@
     /* is_deprecated */ false,
   },
   {
-    /* [110] */
+    /* [102] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[171],
+    /* parameters */ &kParameters[215],
     /* return matcher indices */ &kMatcherIndices[133],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
-    /* [111] */
+    /* [103] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -6135,7 +6197,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [112] */
+    /* [104] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -6147,7 +6209,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [113] */
+    /* [105] */
     /* num parameters */ 5,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -6159,14 +6221,110 @@
     /* is_deprecated */ false,
   },
   {
+    /* [106] */
+    /* num parameters */ 5,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[156],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [107] */
+    /* num parameters */ 6,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[55],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [108] */
+    /* num parameters */ 6,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[43],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [109] */
+    /* num parameters */ 7,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[0],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [110] */
+    /* num parameters */ 5,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[151],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [111] */
+    /* num parameters */ 6,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[7],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [112] */
+    /* num parameters */ 5,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[126],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [113] */
+    /* num parameters */ 6,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[31],
+    /* return matcher indices */ &kMatcherIndices[133],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
     /* [114] */
     /* num parameters */ 4,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[183],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[191],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6178,7 +6336,7 @@
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[131],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6189,8 +6347,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[156],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[161],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6202,7 +6360,7 @@
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[13],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6213,8 +6371,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[195],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[183],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6225,8 +6383,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[141],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[116],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6237,8 +6395,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[191],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[195],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6250,7 +6408,7 @@
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[101],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6261,8 +6419,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[61],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[106],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6273,8 +6431,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[31],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[19],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6285,8 +6443,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[175],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[259],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6298,7 +6456,7 @@
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[121],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6309,8 +6467,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[491],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[495],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6321,8 +6479,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[492],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[496],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6333,8 +6491,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[493],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[497],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6345,8 +6503,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[494],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[498],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6357,56 +6515,56 @@
     /* num open numbers */ 2,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[4],
-    /* parameters */ &kParameters[495],
-    /* return matcher indices */ &kMatcherIndices[6],
+    /* parameters */ &kParameters[499],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [131] */
-    /* num parameters */ 3,
-    /* num open types */ 1,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[3],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[372],
-    /* return matcher indices */ &kMatcherIndices[5],
+    /* num parameters */ 2,
+    /* num open types */ 0,
+    /* num open numbers */ 2,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[2],
+    /* parameters */ &kParameters[401],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
+    /* is_deprecated */ true,
   },
   {
     /* [132] */
-    /* num parameters */ 3,
-    /* num open types */ 1,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[3],
+    /* num parameters */ 2,
+    /* num open types */ 0,
+    /* num open numbers */ 3,
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[369],
-    /* return matcher indices */ &kMatcherIndices[44],
+    /* parameters */ &kParameters[397],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
+    /* is_deprecated */ true,
   },
   {
     /* [133] */
-    /* num parameters */ 3,
-    /* num open types */ 1,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[3],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[363],
-    /* return matcher indices */ &kMatcherIndices[44],
+    /* num parameters */ 1,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[542],
+    /* return matcher indices */ &kMatcherIndices[186],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [134] */
-    /* num parameters */ 2,
+    /* num parameters */ 1,
     /* num open types */ 0,
-    /* num open numbers */ 0,
+    /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[417],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[541],
+    /* return matcher indices */ &kMatcherIndices[143],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6414,156 +6572,156 @@
     /* [135] */
     /* num parameters */ 2,
     /* num open types */ 0,
-    /* num open numbers */ 1,
+    /* num open numbers */ 2,
     /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[415],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* open numbers */ &kOpenNumbers[2],
+    /* parameters */ &kParameters[467],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
+    /* is_deprecated */ true,
   },
   {
     /* [136] */
-    /* num parameters */ 1,
-    /* num open types */ 1,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[2],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[586],
-    /* return matcher indices */ &kMatcherIndices[5],
+    /* num parameters */ 2,
+    /* num open types */ 0,
+    /* num open numbers */ 3,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[445],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
+    /* is_deprecated */ true,
   },
   {
     /* [137] */
     /* num parameters */ 1,
-    /* num open types */ 1,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[2],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[585],
-    /* return matcher indices */ &kMatcherIndices[44],
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[567],
+    /* return matcher indices */ &kMatcherIndices[187],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [138] */
-    /* num parameters */ 3,
+    /* num parameters */ 1,
     /* num open types */ 0,
-    /* num open numbers */ 0,
+    /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[366],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[566],
+    /* return matcher indices */ &kMatcherIndices[153],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [139] */
     /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[342],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* num open types */ 1,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[3],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[357],
+    /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [140] */
-    /* num parameters */ 2,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[399],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* num parameters */ 3,
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[3],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[348],
+    /* return matcher indices */ &kMatcherIndices[62],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [141] */
-    /* num parameters */ 2,
-    /* num open types */ 0,
+    /* num parameters */ 3,
+    /* num open types */ 1,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[3],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[445],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[345],
+    /* return matcher indices */ &kMatcherIndices[62],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [142] */
-    /* num parameters */ 1,
+    /* num parameters */ 2,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[588],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[413],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [143] */
-    /* num parameters */ 1,
+    /* num parameters */ 2,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[587],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[411],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [144] */
-    /* num parameters */ 1,
+    /* num parameters */ 2,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[583],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[421],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [145] */
-    /* num parameters */ 1,
+    /* num parameters */ 2,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[582],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[423],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [146] */
-    /* num parameters */ 1,
+    /* num parameters */ 3,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[581],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[339],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [147] */
-    /* num parameters */ 1,
+    /* num parameters */ 3,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[580],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[336],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
@@ -6573,8 +6731,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[579],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[587],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6585,8 +6743,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[578],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[586],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6597,8 +6755,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[577],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[585],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6609,8 +6767,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[576],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[584],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6621,8 +6779,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[575],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[583],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6633,8 +6791,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[574],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[582],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6645,8 +6803,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[573],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[581],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6657,8 +6815,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[572],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[580],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6669,9 +6827,9 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[571],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[579],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
@@ -6681,9 +6839,9 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[570],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[578],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
@@ -6693,9 +6851,9 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[569],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[577],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
@@ -6705,9 +6863,9 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[568],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[576],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
@@ -6717,8 +6875,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[590],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[575],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6729,8 +6887,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[589],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[574],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6741,8 +6899,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[567],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[573],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6753,32 +6911,32 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[566],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[572],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [164] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
+    /* num parameters */ 1,
+    /* num open types */ 1,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[282],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[590],
+    /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [165] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
+    /* num parameters */ 1,
+    /* num open types */ 1,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[279],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[589],
+    /* return matcher indices */ &kMatcherIndices[62],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6789,8 +6947,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[565],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[571],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6801,32 +6959,32 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[564],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[570],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [168] */
-    /* num parameters */ 2,
+    /* num parameters */ 3,
     /* num open types */ 0,
-    /* num open numbers */ 2,
+    /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[2],
-    /* parameters */ &kParameters[467],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[282],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [169] */
-    /* num parameters */ 2,
+    /* num parameters */ 3,
     /* num open types */ 0,
-    /* num open numbers */ 3,
+    /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[477],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[279],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6837,9 +6995,9 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[563],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[569],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
@@ -6849,9 +7007,9 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[562],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[568],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
@@ -6861,9 +7019,9 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[561],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[592],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
@@ -6873,9 +7031,9 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[560],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
+    /* parameters */ &kParameters[591],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
@@ -6885,8 +7043,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[559],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[565],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
@@ -6897,33 +7055,33 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[558],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[564],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
     /* [176] */
-    /* num parameters */ 3,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[351],
-    /* return matcher indices */ &kMatcherIndices[5],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[563],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
     /* [177] */
-    /* num parameters */ 3,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[354],
-    /* return matcher indices */ &kMatcherIndices[44],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[562],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
@@ -6933,9 +7091,9 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[556],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[561],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
@@ -6945,9 +7103,9 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[555],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* parameters */ &kParameters[560],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment),
     /* is_deprecated */ false,
   },
   {
@@ -6957,8 +7115,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[554],
-    /* return matcher indices */ &kMatcherIndices[3],
+    /* parameters */ &kParameters[594],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6969,8 +7127,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[553],
-    /* return matcher indices */ &kMatcherIndices[65],
+    /* parameters */ &kParameters[593],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6981,8 +7139,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[552],
-    /* return matcher indices */ &kMatcherIndices[3],
+    /* parameters */ &kParameters[558],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -6993,8 +7151,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[551],
-    /* return matcher indices */ &kMatcherIndices[65],
+    /* parameters */ &kParameters[557],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7005,7 +7163,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[550],
+    /* parameters */ &kParameters[556],
     /* return matcher indices */ &kMatcherIndices[3],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -7017,8 +7175,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[549],
-    /* return matcher indices */ &kMatcherIndices[65],
+    /* parameters */ &kParameters[555],
+    /* return matcher indices */ &kMatcherIndices[71],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7029,7 +7187,7 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[548],
+    /* parameters */ &kParameters[554],
     /* return matcher indices */ &kMatcherIndices[3],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -7041,32 +7199,32 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[547],
-    /* return matcher indices */ &kMatcherIndices[65],
+    /* parameters */ &kParameters[553],
+    /* return matcher indices */ &kMatcherIndices[71],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [188] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[2],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[463],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[552],
+    /* return matcher indices */ &kMatcherIndices[3],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [189] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[2],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[397],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[551],
+    /* return matcher indices */ &kMatcherIndices[71],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7077,8 +7235,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[546],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[550],
+    /* return matcher indices */ &kMatcherIndices[3],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7089,32 +7247,32 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[545],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[549],
+    /* return matcher indices */ &kMatcherIndices[71],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [192] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
+    /* num parameters */ 2,
+    /* num open types */ 1,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[544],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[455],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [193] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
+    /* num parameters */ 2,
+    /* num open types */ 1,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[543],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[453],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7125,8 +7283,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[542],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[548],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7137,152 +7295,152 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[541],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[547],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [196] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[441],
-    /* return matcher indices */ &kMatcherIndices[5],
+    /* parameters */ &kParameters[546],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [197] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[429],
-    /* return matcher indices */ &kMatcherIndices[44],
+    /* parameters */ &kParameters[545],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [198] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[427],
-    /* return matcher indices */ &kMatcherIndices[5],
+    /* parameters */ &kParameters[544],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [199] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
+    /* num parameters */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[413],
-    /* return matcher indices */ &kMatcherIndices[44],
+    /* parameters */ &kParameters[543],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [200] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
+    /* num parameters */ 2,
+    /* num open types */ 1,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[345],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[419],
+    /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [201] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
+    /* num parameters */ 2,
+    /* num open types */ 1,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[348],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[417],
+    /* return matcher indices */ &kMatcherIndices[62],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [202] */
     /* num parameters */ 2,
-    /* num open types */ 0,
-    /* num open numbers */ 2,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[2],
-    /* parameters */ &kParameters[403],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* num open types */ 1,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[1],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[405],
+    /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [203] */
     /* num parameters */ 2,
-    /* num open types */ 0,
-    /* num open numbers */ 3,
-    /* open types */ &kOpenTypes[4],
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[401],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[403],
+    /* return matcher indices */ &kMatcherIndices[62],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [204] */
-    /* num parameters */ 1,
+    /* num parameters */ 3,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[524],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[351],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [205] */
-    /* num parameters */ 1,
+    /* num parameters */ 3,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[523],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[354],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [206] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
+    /* num parameters */ 3,
+    /* num open types */ 1,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[592],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[360],
+    /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [207] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
+    /* num parameters */ 3,
+    /* num open types */ 1,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[1],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[591],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[369],
+    /* return matcher indices */ &kMatcherIndices[62],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7293,8 +7451,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[526],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[524],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7305,8 +7463,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[525],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[523],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7317,8 +7475,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[594],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[596],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7329,8 +7487,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[593],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[595],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7341,8 +7499,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[517],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[526],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7353,8 +7511,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[516],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[525],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7365,8 +7523,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[520],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[598],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7377,32 +7535,32 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[519],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[597],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [216] */
-    /* num parameters */ 2,
+    /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[391],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[517],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [217] */
-    /* num parameters */ 2,
+    /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[385],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[516],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7413,8 +7571,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[596],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[520],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7425,8 +7583,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[595],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[519],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7437,8 +7595,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[419],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[385],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7449,14 +7607,62 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[421],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[387],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [222] */
     /* num parameters */ 1,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[600],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [223] */
+    /* num parameters */ 1,
+    /* num open types */ 0,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[599],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [224] */
+    /* num parameters */ 2,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[427],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [225] */
+    /* num parameters */ 2,
+    /* num open types */ 0,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[429],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [226] */
+    /* num parameters */ 1,
     /* num open types */ 1,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[2],
@@ -7467,62 +7673,14 @@
     /* is_deprecated */ false,
   },
   {
-    /* [223] */
+    /* [227] */
     /* num parameters */ 1,
     /* num open types */ 1,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[1],
     /* parameters */ &kParameters[533],
-    /* return matcher indices */ &kMatcherIndices[44],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [224] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[532],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [225] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[531],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [226] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[602],
-    /* return matcher indices */ &kMatcherIndices[7],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [227] */
-    /* num parameters */ 1,
-    /* num open types */ 0,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[601],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* return matcher indices */ &kMatcherIndices[62],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7533,8 +7691,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[530],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[532],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7545,8 +7703,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[529],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[531],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7557,8 +7715,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[528],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[606],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7569,8 +7727,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[527],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[605],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7581,8 +7739,8 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[522],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* parameters */ &kParameters[530],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7593,32 +7751,32 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[521],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[529],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [234] */
     /* num parameters */ 1,
-    /* num open types */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[604],
-    /* return matcher indices */ &kMatcherIndices[5],
+    /* parameters */ &kParameters[528],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [235] */
     /* num parameters */ 1,
-    /* num open types */ 1,
+    /* num open types */ 0,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[1],
+    /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[603],
-    /* return matcher indices */ &kMatcherIndices[44],
+    /* parameters */ &kParameters[527],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7629,49 +7787,97 @@
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[522],
+    /* return matcher indices */ &kMatcherIndices[6],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [237] */
+    /* num parameters */ 1,
+    /* num open types */ 0,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[521],
+    /* return matcher indices */ &kMatcherIndices[4],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [238] */
+    /* num parameters */ 1,
+    /* num open types */ 1,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[1],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[608],
+    /* return matcher indices */ &kMatcherIndices[5],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [239] */
+    /* num parameters */ 1,
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[1],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[607],
+    /* return matcher indices */ &kMatcherIndices[62],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [240] */
+    /* num parameters */ 1,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[538],
     /* return matcher indices */ &kMatcherIndices[75],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [237] */
+    /* [241] */
     /* num parameters */ 3,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[267],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[366],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [238] */
+    /* [242] */
     /* num parameters */ 0,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[605],
+    /* parameters */ &kParameters[609],
     /* return matcher indices */ nullptr,
     /* supported_stages */ PipelineStageSet(PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [239] */
+    /* [243] */
     /* num parameters */ 2,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[383],
-    /* return matcher indices */ &kMatcherIndices[10],
+    /* parameters */ &kParameters[389],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [240] */
+    /* [244] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -7683,7 +7889,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [241] */
+    /* [245] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 2,
@@ -7695,7 +7901,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [242] */
+    /* [246] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -7707,43 +7913,43 @@
     /* is_deprecated */ false,
   },
   {
-    /* [243] */
+    /* [247] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[515],
-    /* return matcher indices */ &kMatcherIndices[141],
+    /* return matcher indices */ &kMatcherIndices[135],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [244] */
+    /* [248] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[514],
-    /* return matcher indices */ &kMatcherIndices[141],
+    /* return matcher indices */ &kMatcherIndices[135],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [245] */
+    /* [249] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
     /* parameters */ &kParameters[513],
-    /* return matcher indices */ &kMatcherIndices[141],
+    /* return matcher indices */ &kMatcherIndices[135],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [246] */
+    /* [250] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -7755,7 +7961,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [247] */
+    /* [251] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -7767,19 +7973,19 @@
     /* is_deprecated */ false,
   },
   {
-    /* [248] */
+    /* [252] */
     /* num parameters */ 0,
     /* num open types */ 0,
     /* num open numbers */ 0,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[605],
+    /* parameters */ &kParameters[609],
     /* return matcher indices */ nullptr,
     /* supported_stages */ PipelineStageSet(PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
-    /* [249] */
+    /* [253] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -7791,7 +7997,7 @@
     /* is_deprecated */ false,
   },
   {
-    /* [250] */
+    /* [254] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 0,
@@ -7803,110 +8009,62 @@
     /* is_deprecated */ false,
   },
   {
-    /* [251] */
+    /* [255] */
     /* num parameters */ 1,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
     /* parameters */ &kParameters[540],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [252] */
-    /* num parameters */ 1,
-    /* num open types */ 1,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[1],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[506],
-    /* return matcher indices */ &kMatcherIndices[6],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [253] */
-    /* num parameters */ 1,
-    /* num open types */ 1,
-    /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[0],
-    /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[557],
-    /* return matcher indices */ nullptr,
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [254] */
-    /* num parameters */ 3,
-    /* num open types */ 0,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[288],
-    /* return matcher indices */ &kMatcherIndices[10],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [255] */
-    /* num parameters */ 2,
-    /* num open types */ 0,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[457],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [256] */
     /* num parameters */ 1,
-    /* num open types */ 0,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[4],
-    /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[584],
-    /* return matcher indices */ &kMatcherIndices[7],
+    /* num open types */ 1,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[1],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[510],
+    /* return matcher indices */ &kMatcherIndices[1],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [257] */
-    /* num parameters */ 2,
-    /* num open types */ 0,
+    /* num parameters */ 1,
+    /* num open types */ 1,
     /* num open numbers */ 0,
-    /* open types */ &kOpenTypes[4],
+    /* open types */ &kOpenTypes[0],
     /* open numbers */ &kOpenNumbers[7],
-    /* parameters */ &kParameters[395],
-    /* return matcher indices */ &kMatcherIndices[145],
+    /* parameters */ &kParameters[559],
+    /* return matcher indices */ nullptr,
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [258] */
-    /* num parameters */ 1,
-    /* num open types */ 1,
+    /* num parameters */ 3,
+    /* num open types */ 0,
     /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[0],
-    /* open numbers */ &kOpenNumbers[3],
-    /* parameters */ &kParameters[598],
-    /* return matcher indices */ &kMatcherIndices[75],
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[288],
+    /* return matcher indices */ &kMatcherIndices[4],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [259] */
-    /* num parameters */ 1,
+    /* num parameters */ 2,
     /* num open types */ 0,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[599],
-    /* return matcher indices */ &kMatcherIndices[3],
+    /* parameters */ &kParameters[441],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -7917,67 +8075,67 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[4],
     /* open numbers */ &kOpenNumbers[1],
-    /* parameters */ &kParameters[600],
-    /* return matcher indices */ &kMatcherIndices[3],
+    /* parameters */ &kParameters[588],
+    /* return matcher indices */ &kMatcherIndices[6],
     /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [261] */
+    /* num parameters */ 2,
+    /* num open types */ 0,
+    /* num open numbers */ 0,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[7],
+    /* parameters */ &kParameters[395],
+    /* return matcher indices */ &kMatcherIndices[141],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [262] */
+    /* num parameters */ 1,
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[0],
+    /* open numbers */ &kOpenNumbers[3],
+    /* parameters */ &kParameters[602],
+    /* return matcher indices */ &kMatcherIndices[75],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [263] */
+    /* num parameters */ 1,
+    /* num open types */ 0,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[603],
+    /* return matcher indices */ &kMatcherIndices[3],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [264] */
+    /* num parameters */ 1,
+    /* num open types */ 0,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[4],
+    /* open numbers */ &kOpenNumbers[1],
+    /* parameters */ &kParameters[604],
+    /* return matcher indices */ &kMatcherIndices[3],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kVertex, PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [265] */
     /* num parameters */ 1,
     /* num open types */ 1,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[597],
-    /* return matcher indices */ &kMatcherIndices[5],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [262] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[2],
-    /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[435],
-    /* return matcher indices */ nullptr,
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [263] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[2],
-    /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[439],
-    /* return matcher indices */ &kMatcherIndices[5],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [264] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[2],
-    /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[443],
-    /* return matcher indices */ &kMatcherIndices[5],
-    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
-    /* is_deprecated */ false,
-  },
-  {
-    /* [265] */
-    /* num parameters */ 2,
-    /* num open types */ 1,
-    /* num open numbers */ 1,
-    /* open types */ &kOpenTypes[2],
-    /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[447],
+    /* parameters */ &kParameters[601],
     /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -7989,8 +8147,8 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[451],
-    /* return matcher indices */ &kMatcherIndices[5],
+    /* parameters */ &kParameters[435],
+    /* return matcher indices */ nullptr,
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -8001,7 +8159,7 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[455],
+    /* parameters */ &kParameters[439],
     /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -8013,7 +8171,7 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[449],
+    /* parameters */ &kParameters[443],
     /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
@@ -8025,20 +8183,68 @@
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[423],
+    /* parameters */ &kParameters[447],
     /* return matcher indices */ &kMatcherIndices[5],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
   {
     /* [270] */
+    /* num parameters */ 2,
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[2],
+    /* open numbers */ &kOpenNumbers[6],
+    /* parameters */ &kParameters[449],
+    /* return matcher indices */ &kMatcherIndices[5],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [271] */
+    /* num parameters */ 2,
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[2],
+    /* open numbers */ &kOpenNumbers[6],
+    /* parameters */ &kParameters[451],
+    /* return matcher indices */ &kMatcherIndices[5],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [272] */
+    /* num parameters */ 2,
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[2],
+    /* open numbers */ &kOpenNumbers[6],
+    /* parameters */ &kParameters[437],
+    /* return matcher indices */ &kMatcherIndices[5],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [273] */
+    /* num parameters */ 2,
+    /* num open types */ 1,
+    /* num open numbers */ 1,
+    /* open types */ &kOpenTypes[2],
+    /* open numbers */ &kOpenNumbers[6],
+    /* parameters */ &kParameters[431],
+    /* return matcher indices */ &kMatcherIndices[5],
+    /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
+    /* is_deprecated */ false,
+  },
+  {
+    /* [274] */
     /* num parameters */ 3,
     /* num open types */ 1,
     /* num open numbers */ 1,
     /* open types */ &kOpenTypes[2],
     /* open numbers */ &kOpenNumbers[6],
-    /* parameters */ &kParameters[357],
-    /* return matcher indices */ &kMatcherIndices[173],
+    /* parameters */ &kParameters[363],
+    /* return matcher indices */ &kMatcherIndices[177],
     /* supported_stages */ PipelineStageSet(PipelineStage::kFragment, PipelineStage::kCompute),
     /* is_deprecated */ false,
   },
@@ -8050,390 +8256,394 @@
     /* fn abs<T : fiu32>(T) -> T */
     /* fn abs<N : num, T : fiu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[234],
+    /* overloads */ &kOverloads[238],
   },
   {
     /* [1] */
     /* fn acos(f32) -> f32 */
     /* fn acos<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[226],
+    /* overloads */ &kOverloads[230],
   },
   {
     /* [2] */
     /* fn all<N : num>(vec<N, bool>) -> bool */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[260],
+    /* overloads */ &kOverloads[264],
   },
   {
     /* [3] */
     /* fn any<N : num>(vec<N, bool>) -> bool */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[259],
+    /* overloads */ &kOverloads[263],
   },
   {
     /* [4] */
     /* fn arrayLength<T, A : access>(ptr<storage, array<T>, A>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[258],
+    /* overloads */ &kOverloads[262],
   },
   {
     /* [5] */
     /* fn asin(f32) -> f32 */
     /* fn asin<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[218],
+    /* overloads */ &kOverloads[222],
   },
   {
     /* [6] */
     /* fn atan(f32) -> f32 */
     /* fn atan<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[210],
+    /* overloads */ &kOverloads[214],
   },
   {
     /* [7] */
     /* fn atan2(f32, f32) -> f32 */
     /* fn atan2<N : num>(vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[134],
+    /* overloads */ &kOverloads[142],
   },
   {
     /* [8] */
     /* fn ceil(f32) -> f32 */
     /* fn ceil<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[206],
+    /* overloads */ &kOverloads[210],
   },
   {
     /* [9] */
     /* fn clamp<T : fiu32>(T, T, T) -> T */
     /* fn clamp<N : num, T : fiu32>(vec<N, T>, vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[176],
+    /* overloads */ &kOverloads[206],
   },
   {
     /* [10] */
     /* fn cos(f32) -> f32 */
     /* fn cos<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[160],
+    /* overloads */ &kOverloads[180],
   },
   {
     /* [11] */
     /* fn cosh(f32) -> f32 */
     /* fn cosh<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[142],
+    /* overloads */ &kOverloads[172],
   },
   {
     /* [12] */
     /* fn countOneBits<T : iu32>(T) -> T */
     /* fn countOneBits<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[136],
+    /* overloads */ &kOverloads[164],
   },
   {
     /* [13] */
     /* fn cross(vec3<f32>, vec3<f32>) -> vec3<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[257],
+    /* overloads */ &kOverloads[261],
   },
   {
     /* [14] */
     /* fn determinant<N : num>(mat<N, N, f32>) -> f32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[256],
+    /* overloads */ &kOverloads[260],
   },
   {
     /* [15] */
     /* fn distance(f32, f32) -> f32 */
     /* fn distance<N : num>(vec<N, f32>, vec<N, f32>) -> f32 */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[140],
+    /* overloads */ &kOverloads[144],
   },
   {
     /* [16] */
     /* fn dot<N : num>(vec<N, f32>, vec<N, f32>) -> f32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[255],
+    /* overloads */ &kOverloads[259],
   },
   {
     /* [17] */
     /* fn dpdx(f32) -> f32 */
     /* fn dpdx<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[144],
+    /* overloads */ &kOverloads[148],
   },
   {
     /* [18] */
     /* fn dpdxCoarse(f32) -> f32 */
     /* fn dpdxCoarse<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[146],
+    /* overloads */ &kOverloads[150],
   },
   {
     /* [19] */
     /* fn dpdxFine(f32) -> f32 */
     /* fn dpdxFine<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[148],
+    /* overloads */ &kOverloads[152],
   },
   {
     /* [20] */
     /* fn dpdy(f32) -> f32 */
     /* fn dpdy<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[150],
+    /* overloads */ &kOverloads[154],
   },
   {
     /* [21] */
     /* fn dpdyCoarse(f32) -> f32 */
     /* fn dpdyCoarse<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[152],
+    /* overloads */ &kOverloads[156],
   },
   {
     /* [22] */
     /* fn dpdyFine(f32) -> f32 */
     /* fn dpdyFine<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[154],
+    /* overloads */ &kOverloads[158],
   },
   {
     /* [23] */
     /* fn exp(f32) -> f32 */
     /* fn exp<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[156],
+    /* overloads */ &kOverloads[160],
   },
   {
     /* [24] */
     /* fn exp2(f32) -> f32 */
     /* fn exp2<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[158],
+    /* overloads */ &kOverloads[162],
   },
   {
     /* [25] */
     /* fn faceForward<N : num>(vec<N, f32>, vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[254],
+    /* overloads */ &kOverloads[258],
   },
   {
     /* [26] */
     /* fn floor(f32) -> f32 */
     /* fn floor<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[162],
+    /* overloads */ &kOverloads[166],
   },
   {
     /* [27] */
     /* fn fma(f32, f32, f32) -> f32 */
     /* fn fma<N : num>(vec<N, f32>, vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[164],
+    /* overloads */ &kOverloads[168],
   },
   {
     /* [28] */
     /* fn fract(f32) -> f32 */
     /* fn fract<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[166],
+    /* overloads */ &kOverloads[170],
   },
   {
     /* [29] */
     /* fn frexp<S : function_private_workgroup, A : access>(f32, ptr<S, i32, A>) -> f32 */
     /* fn frexp<N : num, S : function_private_workgroup, A : access>(vec<N, f32>, ptr<S, vec<N, i32>, A>) -> vec<N, f32> */
-    /* num overloads */ 2,
-    /* overloads */ &kOverloads[168],
+    /* fn frexp(f32) -> _frexp_result */
+    /* fn frexp<N : num>(vec<N, f32>) -> _frexp_result_vec<N> */
+    /* num overloads */ 4,
+    /* overloads */ &kOverloads[135],
   },
   {
     /* [30] */
     /* fn fwidth(f32) -> f32 */
     /* fn fwidth<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[170],
+    /* overloads */ &kOverloads[174],
   },
   {
     /* [31] */
     /* fn fwidthCoarse(f32) -> f32 */
     /* fn fwidthCoarse<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[172],
+    /* overloads */ &kOverloads[176],
   },
   {
     /* [32] */
     /* fn fwidthFine(f32) -> f32 */
     /* fn fwidthFine<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[174],
+    /* overloads */ &kOverloads[178],
   },
   {
     /* [33] */
     /* fn ignore<T>(T) */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[253],
+    /* overloads */ &kOverloads[257],
   },
   {
     /* [34] */
     /* fn inverseSqrt(f32) -> f32 */
     /* fn inverseSqrt<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[178],
+    /* overloads */ &kOverloads[182],
   },
   {
     /* [35] */
     /* fn isFinite(f32) -> bool */
     /* fn isFinite<N : num>(vec<N, f32>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[180],
+    /* overloads */ &kOverloads[184],
   },
   {
     /* [36] */
     /* fn isInf(f32) -> bool */
     /* fn isInf<N : num>(vec<N, f32>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[182],
+    /* overloads */ &kOverloads[186],
   },
   {
     /* [37] */
     /* fn isNan(f32) -> bool */
     /* fn isNan<N : num>(vec<N, f32>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[184],
+    /* overloads */ &kOverloads[188],
   },
   {
     /* [38] */
     /* fn isNormal(f32) -> bool */
     /* fn isNormal<N : num>(vec<N, f32>) -> vec<N, bool> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[186],
+    /* overloads */ &kOverloads[190],
   },
   {
     /* [39] */
     /* fn ldexp<T : iu32>(f32, T) -> f32 */
     /* fn ldexp<N : num, T : iu32>(vec<N, f32>, vec<N, T>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[188],
+    /* overloads */ &kOverloads[192],
   },
   {
     /* [40] */
     /* fn length(f32) -> f32 */
     /* fn length<N : num>(vec<N, f32>) -> f32 */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[190],
+    /* overloads */ &kOverloads[194],
   },
   {
     /* [41] */
     /* fn log(f32) -> f32 */
     /* fn log<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[192],
+    /* overloads */ &kOverloads[196],
   },
   {
     /* [42] */
     /* fn log2(f32) -> f32 */
     /* fn log2<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[194],
+    /* overloads */ &kOverloads[198],
   },
   {
     /* [43] */
     /* fn max<T : fiu32>(T, T) -> T */
     /* fn max<N : num, T : fiu32>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[196],
+    /* overloads */ &kOverloads[200],
   },
   {
     /* [44] */
     /* fn min<T : fiu32>(T, T) -> T */
     /* fn min<N : num, T : fiu32>(vec<N, T>, vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[198],
+    /* overloads */ &kOverloads[202],
   },
   {
     /* [45] */
     /* fn mix(f32, f32, f32) -> f32 */
     /* fn mix<N : num>(vec<N, f32>, vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[200],
+    /* overloads */ &kOverloads[204],
   },
   {
     /* [46] */
     /* fn modf<S : function_private_workgroup, A : access>(f32, ptr<S, f32, A>) -> f32 */
     /* fn modf<N : num, S : function_private_workgroup, A : access>(vec<N, f32>, ptr<S, vec<N, f32>, A>) -> vec<N, f32> */
-    /* num overloads */ 2,
-    /* overloads */ &kOverloads[202],
+    /* fn modf(f32) -> _modf_result */
+    /* fn modf<N : num>(vec<N, f32>) -> _modf_result_vec<N> */
+    /* num overloads */ 4,
+    /* overloads */ &kOverloads[131],
   },
   {
     /* [47] */
     /* fn normalize<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[251],
+    /* overloads */ &kOverloads[255],
   },
   {
     /* [48] */
     /* fn pack2x16float(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[250],
+    /* overloads */ &kOverloads[254],
   },
   {
     /* [49] */
     /* fn pack2x16snorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[236],
+    /* overloads */ &kOverloads[240],
   },
   {
     /* [50] */
     /* fn pack2x16unorm(vec2<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[249],
+    /* overloads */ &kOverloads[253],
   },
   {
     /* [51] */
     /* fn pack4x8snorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[242],
+    /* overloads */ &kOverloads[246],
   },
   {
     /* [52] */
     /* fn pack4x8unorm(vec4<f32>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[240],
+    /* overloads */ &kOverloads[244],
   },
   {
     /* [53] */
     /* fn pow(f32, f32) -> f32 */
     /* fn pow<N : num>(vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[216],
+    /* overloads */ &kOverloads[220],
   },
   {
     /* [54] */
     /* fn reflect<N : num>(vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[239],
+    /* overloads */ &kOverloads[243],
   },
   {
     /* [55] */
     /* fn refract<N : num>(vec<N, f32>, vec<N, f32>, f32) -> vec<N, f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[237],
+    /* overloads */ &kOverloads[241],
   },
   {
     /* [56] */
     /* fn reverseBits<T : iu32>(T) -> T */
     /* fn reverseBits<N : num, T : iu32>(vec<N, T>) -> vec<N, T> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[222],
+    /* overloads */ &kOverloads[226],
   },
   {
     /* [57] */
     /* fn round(f32) -> f32 */
     /* fn round<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[224],
+    /* overloads */ &kOverloads[228],
   },
   {
     /* [58] */
@@ -8441,118 +8651,118 @@
     /* fn select<T : scalar, N : num>(vec<N, T>, vec<N, T>, bool) -> vec<N, T> */
     /* fn select<N : num, T : scalar>(vec<N, T>, vec<N, T>, vec<N, bool>) -> vec<N, T> */
     /* num overloads */ 3,
-    /* overloads */ &kOverloads[131],
+    /* overloads */ &kOverloads[139],
   },
   {
     /* [59] */
     /* fn sign(f32) -> f32 */
     /* fn sign<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[228],
+    /* overloads */ &kOverloads[232],
   },
   {
     /* [60] */
     /* fn sin(f32) -> f32 */
     /* fn sin<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[230],
+    /* overloads */ &kOverloads[234],
   },
   {
     /* [61] */
     /* fn sinh(f32) -> f32 */
     /* fn sinh<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[208],
+    /* overloads */ &kOverloads[212],
   },
   {
     /* [62] */
     /* fn smoothStep(f32, f32, f32) -> f32 */
     /* fn smoothStep<N : num>(vec<N, f32>, vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[138],
+    /* overloads */ &kOverloads[146],
   },
   {
     /* [63] */
     /* fn sqrt(f32) -> f32 */
     /* fn sqrt<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[204],
+    /* overloads */ &kOverloads[208],
   },
   {
     /* [64] */
     /* fn step(f32, f32) -> f32 */
     /* fn step<N : num>(vec<N, f32>, vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[220],
+    /* overloads */ &kOverloads[224],
   },
   {
     /* [65] */
     /* fn storageBarrier() */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[238],
+    /* overloads */ &kOverloads[242],
   },
   {
     /* [66] */
     /* fn tan(f32) -> f32 */
     /* fn tan<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[232],
+    /* overloads */ &kOverloads[236],
   },
   {
     /* [67] */
     /* fn tanh(f32) -> f32 */
     /* fn tanh<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[214],
+    /* overloads */ &kOverloads[218],
   },
   {
     /* [68] */
     /* fn transpose<M : num, N : num>(mat<M, N, f32>) -> mat<N, M, f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[241],
+    /* overloads */ &kOverloads[245],
   },
   {
     /* [69] */
     /* fn trunc(f32) -> f32 */
     /* fn trunc<N : num>(vec<N, f32>) -> vec<N, f32> */
     /* num overloads */ 2,
-    /* overloads */ &kOverloads[212],
+    /* overloads */ &kOverloads[216],
   },
   {
     /* [70] */
     /* fn unpack2x16float(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[243],
+    /* overloads */ &kOverloads[247],
   },
   {
     /* [71] */
     /* fn unpack2x16snorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[244],
+    /* overloads */ &kOverloads[248],
   },
   {
     /* [72] */
     /* fn unpack2x16unorm(u32) -> vec2<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[245],
+    /* overloads */ &kOverloads[249],
   },
   {
     /* [73] */
     /* fn unpack4x8snorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[246],
+    /* overloads */ &kOverloads[250],
   },
   {
     /* [74] */
     /* fn unpack4x8unorm(u32) -> vec4<f32> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[247],
+    /* overloads */ &kOverloads[251],
   },
   {
     /* [75] */
     /* fn workgroupBarrier() */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[248],
+    /* overloads */ &kOverloads[252],
   },
   {
     /* [76] */
@@ -8614,7 +8824,7 @@
     /* [79] */
     /* fn textureNumSamples<T : fiu32>(texture: texture_multisampled_2d<T>) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[252],
+    /* overloads */ &kOverloads[256],
   },
   {
     /* [80] */
@@ -8634,7 +8844,7 @@
     /* fn textureSample(texture: texture_depth_cube, sampler: sampler, coords: vec3<f32>) -> f32 */
     /* fn textureSample(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32) -> f32 */
     /* num overloads */ 15,
-    /* overloads */ &kOverloads[46],
+    /* overloads */ &kOverloads[61],
   },
   {
     /* [81] */
@@ -8647,7 +8857,7 @@
     /* fn textureSampleBias(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, bias: f32) -> vec4<f32> */
     /* fn textureSampleBias(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, bias: f32) -> vec4<f32> */
     /* num overloads */ 8,
-    /* overloads */ &kOverloads[106],
+    /* overloads */ &kOverloads[98],
   },
   {
     /* [82] */
@@ -8682,7 +8892,7 @@
     /* fn textureSampleGrad(texture: texture_cube<f32>, sampler: sampler, coords: vec3<f32>, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32> */
     /* fn textureSampleGrad(texture: texture_cube_array<f32>, sampler: sampler, coords: vec3<f32>, array_index: i32, ddx: vec3<f32>, ddy: vec3<f32>) -> vec4<f32> */
     /* num overloads */ 8,
-    /* overloads */ &kOverloads[98],
+    /* overloads */ &kOverloads[106],
   },
   {
     /* [85] */
@@ -8702,7 +8912,7 @@
     /* fn textureSampleLevel(texture: texture_depth_cube_array, sampler: sampler, coords: vec3<f32>, array_index: i32, level: i32) -> f32 */
     /* fn textureSampleLevel(texture: texture_external, sampler: sampler, coords: vec2<f32>) -> vec4<f32> */
     /* num overloads */ 15,
-    /* overloads */ &kOverloads[61],
+    /* overloads */ &kOverloads[46],
   },
   {
     /* [86] */
@@ -8750,61 +8960,61 @@
     /* [88] */
     /* fn atomicLoad<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[261],
+    /* overloads */ &kOverloads[265],
   },
   {
     /* [89] */
     /* fn atomicStore<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[262],
+    /* overloads */ &kOverloads[266],
   },
   {
     /* [90] */
     /* fn atomicAdd<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[263],
+    /* overloads */ &kOverloads[267],
   },
   {
     /* [91] */
     /* fn atomicMax<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[264],
+    /* overloads */ &kOverloads[268],
   },
   {
     /* [92] */
     /* fn atomicMin<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[265],
+    /* overloads */ &kOverloads[269],
   },
   {
     /* [93] */
     /* fn atomicAnd<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[266],
+    /* overloads */ &kOverloads[270],
   },
   {
     /* [94] */
     /* fn atomicOr<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[267],
+    /* overloads */ &kOverloads[271],
   },
   {
     /* [95] */
     /* fn atomicXor<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[268],
+    /* overloads */ &kOverloads[272],
   },
   {
     /* [96] */
     /* fn atomicExchange<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[269],
+    /* overloads */ &kOverloads[273],
   },
   {
     /* [97] */
     /* fn atomicCompareExchangeWeak<T : iu32, S : workgroup_or_storage>(ptr<S, atomic<T>, read_write>, T, T) -> vec2<T> */
     /* num overloads */ 1,
-    /* overloads */ &kOverloads[270],
+    /* overloads */ &kOverloads[274],
   },
 };
 
diff --git a/src/intrinsic_table.inl.tmpl b/src/intrinsic_table.inl.tmpl
index f45de8d..c64bf7d 100644
--- a/src/intrinsic_table.inl.tmpl
+++ b/src/intrinsic_table.inl.tmpl
@@ -148,7 +148,7 @@
 {{- range .TemplateParams }}
 {{-   template "DeclareLocalTemplateParam" . }}
 {{- end  }}
-  if (!match_{{.Name}}(ty{{range .TemplateParams}}, {{.GetName}}{{end}})) {
+  if (!match_{{TrimPrefix .Name "_"}}(ty{{range .TemplateParams}}, {{.GetName}}{{end}})) {
     return nullptr;
   }
 {{- range .TemplateParams }}
@@ -157,7 +157,7 @@
     return nullptr;
   }
 {{- end  }}
-  return build_{{.Name}}(state{{range .TemplateParams}}, {{.GetName}}{{end}});
+  return build_{{TrimPrefix .Name "_"}}(state{{range .TemplateParams}}, {{.GetName}}{{end}});
 }
 
 std::string {{$class}}::String(MatchState&{{if .TemplateParams}} state{{end}}) const {
diff --git a/src/intrinsics.def b/src/intrinsics.def
index 8d9a1d4..ef8d332 100644
--- a/src/intrinsics.def
+++ b/src/intrinsics.def
@@ -96,6 +96,11 @@
 type texture_storage_3d<F: texel_format, A: access>
 type texture_external
 
+type _modf_result
+[[display("_modf_result_vec{N}")]] type _modf_result_vec<N: num>
+type _frexp_result
+[[display("_frexp_result_vec{N}")]] type _frexp_result_vec<N: num>
+
 ////////////////////////////////////////////////////////////////////////////////
 // Type matchers                                                              //
 //                                                                            //
@@ -308,8 +313,10 @@
 fn fma<N: num>(vec<N, f32>, vec<N, f32>, vec<N, f32>) -> vec<N, f32>
 fn fract(f32) -> f32
 fn fract<N: num>(vec<N, f32>) -> vec<N, f32>
-fn frexp<S: function_private_workgroup, A: access>(f32, ptr<S, i32, A>) -> f32
-fn frexp<N: num, S: function_private_workgroup, A: access>(vec<N, f32>, ptr<S, vec<N, i32>, A>) -> vec<N, f32>
+[[deprecated]] fn frexp<S: function_private_workgroup, A: access>(f32, ptr<S, i32, A>) -> f32
+[[deprecated]] fn frexp<N: num, S: function_private_workgroup, A: access>(vec<N, f32>, ptr<S, vec<N, i32>, A>) -> vec<N, f32>
+fn frexp(f32) -> _frexp_result
+fn frexp<N: num>(vec<N, f32>) -> _frexp_result_vec<N>
 [[stage("fragment")]] fn fwidth(f32) -> f32
 [[stage("fragment")]] fn fwidth<N: num>(vec<N, f32>) -> vec<N, f32>
 [[stage("fragment")]] fn fwidthCoarse(f32) -> f32
@@ -341,8 +348,10 @@
 fn min<N: num, T: fiu32>(vec<N, T>, vec<N, T>) -> vec<N, T>
 fn mix(f32, f32, f32) -> f32
 fn mix<N: num>(vec<N, f32>, vec<N, f32>, vec<N, f32>) -> vec<N, f32>
-fn modf<S: function_private_workgroup, A: access>(f32, ptr<S, f32, A>) -> f32
-fn modf<N: num, S: function_private_workgroup, A: access>(vec<N, f32>, ptr<S, vec<N, f32>, A>) -> vec<N, f32>
+[[deprecated]] fn modf<S: function_private_workgroup, A: access>(f32, ptr<S, f32, A>) -> f32
+[[deprecated]] fn modf<N: num, S: function_private_workgroup, A: access>(vec<N, f32>, ptr<S, vec<N, f32>, A>) -> vec<N, f32>
+fn modf(f32) -> _modf_result
+fn modf<N: num>(vec<N, f32>) -> _modf_result_vec<N>
 fn normalize<N: num>(vec<N, f32>) -> vec<N, f32>
 fn pack2x16float(vec2<f32>) -> u32
 fn pack2x16snorm(vec2<f32>) -> u32
diff --git a/src/resolver/inferred_type_test.cc b/src/resolver/inferred_type_test.cc
index 5bd957b..c625b64 100644
--- a/src/resolver/inferred_type_test.cc
+++ b/src/resolver/inferred_type_test.cc
@@ -156,11 +156,11 @@
   auto* member = Member("x", ty.i32());
   auto* str = Structure("S", {member}, {create<ast::StructBlockDecoration>()});
 
-  auto* expected_type =
-      create<sem::Struct>(str,
-                          sem::StructMemberList{create<sem::StructMember>(
-                              member, create<sem::I32>(), 0, 0, 0, 4)},
-                          0, 4, 4);
+  auto* expected_type = create<sem::Struct>(
+      str, str->name(),
+      sem::StructMemberList{create<sem::StructMember>(
+          member, member->symbol(), create<sem::I32>(), 0, 0, 0, 4)},
+      0, 4, 4);
 
   auto* ctor_expr = Construct(ty.Of(str));
 
diff --git a/src/resolver/intrinsic_test.cc b/src/resolver/intrinsic_test.cc
index 95c0813..00fedfc 100644
--- a/src/resolver/intrinsic_test.cc
+++ b/src/resolver/intrinsic_test.cc
@@ -828,7 +828,7 @@
 )");
 }
 
-TEST_F(ResolverIntrinsicDataTest, FrexpScalar) {
+TEST_F(ResolverIntrinsicDataTest, DEPRECATED_FrexpScalar) {
   Global("exp", ty.i32(), ast::StorageClass::kWorkgroup);
   auto* call = Call("frexp", 1.0f, AddressOf("exp"));
   WrapInFunction(call);
@@ -839,7 +839,7 @@
   EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
 }
 
-TEST_F(ResolverIntrinsicDataTest, FrexpVector) {
+TEST_F(ResolverIntrinsicDataTest, DEPRECATED_FrexpVector) {
   Global("exp", ty.vec3<i32>(), ast::StorageClass::kWorkgroup);
   auto* call = Call("frexp", vec3<f32>(1.0f, 2.0f, 3.0f), AddressOf("exp"));
   WrapInFunction(call);
@@ -851,6 +851,68 @@
   EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
 }
 
+TEST_F(ResolverIntrinsicDataTest, FrexpScalar) {
+  auto* call = Call("frexp", 1.0f);
+  WrapInFunction(call);
+
+  EXPECT_TRUE(r()->Resolve()) << r()->error();
+
+  ASSERT_NE(TypeOf(call), nullptr);
+  auto* ty = TypeOf(call)->As<sem::Struct>();
+  ASSERT_NE(ty, nullptr);
+  ASSERT_EQ(ty->Members().size(), 2u);
+
+  auto* sig = ty->Members()[0];
+  EXPECT_TRUE(sig->Type()->Is<sem::F32>());
+  EXPECT_EQ(sig->Offset(), 0u);
+  EXPECT_EQ(sig->Size(), 4u);
+  EXPECT_EQ(sig->Align(), 4u);
+  EXPECT_EQ(sig->Name(), Sym("sig"));
+
+  auto* exp = ty->Members()[1];
+  EXPECT_TRUE(exp->Type()->Is<sem::I32>());
+  EXPECT_EQ(exp->Offset(), 4u);
+  EXPECT_EQ(exp->Size(), 4u);
+  EXPECT_EQ(exp->Align(), 4u);
+  EXPECT_EQ(exp->Name(), Sym("exp"));
+
+  EXPECT_EQ(ty->Size(), 8u);
+  EXPECT_EQ(ty->SizeNoPadding(), 8u);
+}
+
+TEST_F(ResolverIntrinsicDataTest, FrexpVector) {
+  auto* call = Call("frexp", vec3<f32>());
+  WrapInFunction(call);
+
+  EXPECT_TRUE(r()->Resolve()) << r()->error();
+
+  ASSERT_NE(TypeOf(call), nullptr);
+  auto* ty = TypeOf(call)->As<sem::Struct>();
+  ASSERT_NE(ty, nullptr);
+  ASSERT_EQ(ty->Members().size(), 2u);
+
+  auto* sig = ty->Members()[0];
+  ASSERT_TRUE(sig->Type()->Is<sem::Vector>());
+  EXPECT_EQ(sig->Type()->As<sem::Vector>()->Width(), 3u);
+  EXPECT_TRUE(sig->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+  EXPECT_EQ(sig->Offset(), 0u);
+  EXPECT_EQ(sig->Size(), 12u);
+  EXPECT_EQ(sig->Align(), 16u);
+  EXPECT_EQ(sig->Name(), Sym("sig"));
+
+  auto* exp = ty->Members()[1];
+  ASSERT_TRUE(exp->Type()->Is<sem::Vector>());
+  EXPECT_EQ(exp->Type()->As<sem::Vector>()->Width(), 3u);
+  EXPECT_TRUE(exp->Type()->As<sem::Vector>()->type()->Is<sem::I32>());
+  EXPECT_EQ(exp->Offset(), 16u);
+  EXPECT_EQ(exp->Size(), 12u);
+  EXPECT_EQ(exp->Align(), 16u);
+  EXPECT_EQ(exp->Name(), Sym("exp"));
+
+  EXPECT_EQ(ty->Size(), 32u);
+  EXPECT_EQ(ty->SizeNoPadding(), 28u);
+}
+
 TEST_F(ResolverIntrinsicDataTest, Frexp_Error_FirstParamInt) {
   Global("exp", ty.i32(), ast::StorageClass::kWorkgroup);
   auto* call = Call("frexp", 1, AddressOf("exp"));
@@ -862,9 +924,11 @@
       r()->error(),
       R"(error: no matching call to frexp(i32, ptr<workgroup, i32, read_write>)
 
-2 candidate functions:
+4 candidate functions:
   frexp(f32, ptr<S, i32, A>) -> f32  where: S is function, private or workgroup
   frexp(vecN<f32>, ptr<S, vecN<i32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  frexp(f32) -> _frexp_result
+  frexp(vecN<f32>) -> _frexp_result_vecN
 )");
 }
 
@@ -879,9 +943,11 @@
       r()->error(),
       R"(error: no matching call to frexp(f32, ptr<workgroup, f32, read_write>)
 
-2 candidate functions:
+4 candidate functions:
   frexp(f32, ptr<S, i32, A>) -> f32  where: S is function, private or workgroup
+  frexp(f32) -> _frexp_result
   frexp(vecN<f32>, ptr<S, vecN<i32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  frexp(vecN<f32>) -> _frexp_result_vecN
 )");
 }
 
@@ -893,9 +959,11 @@
 
   EXPECT_EQ(r()->error(), R"(error: no matching call to frexp(f32, i32)
 
-2 candidate functions:
+4 candidate functions:
   frexp(f32, ptr<S, i32, A>) -> f32  where: S is function, private or workgroup
+  frexp(f32) -> _frexp_result
   frexp(vecN<f32>, ptr<S, vecN<i32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  frexp(vecN<f32>) -> _frexp_result_vecN
 )");
 }
 
@@ -910,13 +978,15 @@
       r()->error(),
       R"(error: no matching call to frexp(vec2<f32>, ptr<workgroup, vec4<i32>, read_write>)
 
-2 candidate functions:
+4 candidate functions:
   frexp(vecN<f32>, ptr<S, vecN<i32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  frexp(vecN<f32>) -> _frexp_result_vecN
   frexp(f32, ptr<S, i32, A>) -> f32  where: S is function, private or workgroup
+  frexp(f32) -> _frexp_result
 )");
 }
 
-TEST_F(ResolverIntrinsicDataTest, ModfScalar) {
+TEST_F(ResolverIntrinsicDataTest, DEPRECATED_ModfScalar) {
   Global("whole", ty.f32(), ast::StorageClass::kWorkgroup);
   auto* call = Call("modf", 1.0f, AddressOf("whole"));
   WrapInFunction(call);
@@ -927,7 +997,7 @@
   EXPECT_TRUE(TypeOf(call)->Is<sem::F32>());
 }
 
-TEST_F(ResolverIntrinsicDataTest, ModfVector) {
+TEST_F(ResolverIntrinsicDataTest, DEPRECATED_ModfVector) {
   Global("whole", ty.vec3<f32>(), ast::StorageClass::kWorkgroup);
   auto* call = Call("modf", vec3<f32>(1.0f, 2.0f, 3.0f), AddressOf("whole"));
   WrapInFunction(call);
@@ -939,6 +1009,68 @@
   EXPECT_TRUE(TypeOf(call)->As<sem::Vector>()->type()->Is<sem::F32>());
 }
 
+TEST_F(ResolverIntrinsicDataTest, ModfScalar) {
+  auto* call = Call("modf", 1.0f);
+  WrapInFunction(call);
+
+  EXPECT_TRUE(r()->Resolve()) << r()->error();
+
+  ASSERT_NE(TypeOf(call), nullptr);
+  auto* ty = TypeOf(call)->As<sem::Struct>();
+  ASSERT_NE(ty, nullptr);
+  ASSERT_EQ(ty->Members().size(), 2u);
+
+  auto* fract = ty->Members()[0];
+  EXPECT_TRUE(fract->Type()->Is<sem::F32>());
+  EXPECT_EQ(fract->Offset(), 0u);
+  EXPECT_EQ(fract->Size(), 4u);
+  EXPECT_EQ(fract->Align(), 4u);
+  EXPECT_EQ(fract->Name(), Sym("fract"));
+
+  auto* whole = ty->Members()[1];
+  EXPECT_TRUE(whole->Type()->Is<sem::F32>());
+  EXPECT_EQ(whole->Offset(), 4u);
+  EXPECT_EQ(whole->Size(), 4u);
+  EXPECT_EQ(whole->Align(), 4u);
+  EXPECT_EQ(whole->Name(), Sym("whole"));
+
+  EXPECT_EQ(ty->Size(), 8u);
+  EXPECT_EQ(ty->SizeNoPadding(), 8u);
+}
+
+TEST_F(ResolverIntrinsicDataTest, ModfVector) {
+  auto* call = Call("modf", vec3<f32>());
+  WrapInFunction(call);
+
+  EXPECT_TRUE(r()->Resolve()) << r()->error();
+
+  ASSERT_NE(TypeOf(call), nullptr);
+  auto* ty = TypeOf(call)->As<sem::Struct>();
+  ASSERT_NE(ty, nullptr);
+  ASSERT_EQ(ty->Members().size(), 2u);
+
+  auto* fract = ty->Members()[0];
+  ASSERT_TRUE(fract->Type()->Is<sem::Vector>());
+  EXPECT_EQ(fract->Type()->As<sem::Vector>()->Width(), 3u);
+  EXPECT_TRUE(fract->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+  EXPECT_EQ(fract->Offset(), 0u);
+  EXPECT_EQ(fract->Size(), 12u);
+  EXPECT_EQ(fract->Align(), 16u);
+  EXPECT_EQ(fract->Name(), Sym("fract"));
+
+  auto* whole = ty->Members()[1];
+  ASSERT_TRUE(whole->Type()->Is<sem::Vector>());
+  EXPECT_EQ(whole->Type()->As<sem::Vector>()->Width(), 3u);
+  EXPECT_TRUE(whole->Type()->As<sem::Vector>()->type()->Is<sem::F32>());
+  EXPECT_EQ(whole->Offset(), 16u);
+  EXPECT_EQ(whole->Size(), 12u);
+  EXPECT_EQ(whole->Align(), 16u);
+  EXPECT_EQ(whole->Name(), Sym("whole"));
+
+  EXPECT_EQ(ty->Size(), 32u);
+  EXPECT_EQ(ty->SizeNoPadding(), 28u);
+}
+
 TEST_F(ResolverIntrinsicDataTest, Modf_Error_FirstParamInt) {
   Global("whole", ty.f32(), ast::StorageClass::kWorkgroup);
   auto* call = Call("modf", 1, AddressOf("whole"));
@@ -950,9 +1082,11 @@
       r()->error(),
       R"(error: no matching call to modf(i32, ptr<workgroup, f32, read_write>)
 
-2 candidate functions:
+4 candidate functions:
   modf(f32, ptr<S, f32, A>) -> f32  where: S is function, private or workgroup
   modf(vecN<f32>, ptr<S, vecN<f32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  modf(f32) -> _modf_result
+  modf(vecN<f32>) -> _modf_result_vecN
 )");
 }
 
@@ -967,9 +1101,11 @@
       r()->error(),
       R"(error: no matching call to modf(f32, ptr<workgroup, i32, read_write>)
 
-2 candidate functions:
+4 candidate functions:
   modf(f32, ptr<S, f32, A>) -> f32  where: S is function, private or workgroup
+  modf(f32) -> _modf_result
   modf(vecN<f32>, ptr<S, vecN<f32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  modf(vecN<f32>) -> _modf_result_vecN
 )");
 }
 
@@ -981,9 +1117,11 @@
 
   EXPECT_EQ(r()->error(), R"(error: no matching call to modf(f32, f32)
 
-2 candidate functions:
+4 candidate functions:
   modf(f32, ptr<S, f32, A>) -> f32  where: S is function, private or workgroup
+  modf(f32) -> _modf_result
   modf(vecN<f32>, ptr<S, vecN<f32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  modf(vecN<f32>) -> _modf_result_vecN
 )");
 }
 
@@ -998,9 +1136,11 @@
       r()->error(),
       R"(error: no matching call to modf(vec2<f32>, ptr<workgroup, vec4<f32>, read_write>)
 
-2 candidate functions:
+4 candidate functions:
   modf(vecN<f32>, ptr<S, vecN<f32>, A>) -> vecN<f32>  where: S is function, private or workgroup
+  modf(vecN<f32>) -> _modf_result_vecN
   modf(f32, ptr<S, f32, A>) -> f32  where: S is function, private or workgroup
+  modf(f32) -> _modf_result
 )");
 }
 
diff --git a/src/resolver/resolver.cc b/src/resolver/resolver.cc
index 2656568..a180646 100644
--- a/src/resolver/resolver.cc
+++ b/src/resolver/resolver.cc
@@ -2998,7 +2998,7 @@
 
     const sem::StructMember* member = nullptr;
     for (auto* m : str->Members()) {
-      if (m->Declaration()->symbol() == symbol) {
+      if (m->Name() == symbol) {
         ret = m->Type();
         member = m;
         break;
@@ -4088,7 +4088,7 @@
     offset = utils::RoundUp(align, offset);
 
     auto* sem_member = builder_->create<sem::StructMember>(
-        member, const_cast<sem::Type*>(type),
+        member, member->symbol(), const_cast<sem::Type*>(type),
         static_cast<uint32_t>(sem_members.size()), offset, align, size);
     builder_->Sem().Add(member, sem_member);
     sem_members.emplace_back(sem_member);
@@ -4100,8 +4100,9 @@
   auto size_no_padding = struct_size;
   struct_size = utils::RoundUp(struct_align, struct_size);
 
-  auto* out = builder_->create<sem::Struct>(str, sem_members, struct_align,
-                                            struct_size, size_no_padding);
+  auto* out =
+      builder_->create<sem::Struct>(str, str->name(), sem_members, struct_align,
+                                    struct_size, size_no_padding);
 
   // Keep track of atomic members for validation after all usages have been
   // determined.
diff --git a/src/sem/sem_struct_test.cc b/src/sem/sem_struct_test.cc
index b974ee7..ed0eba3 100644
--- a/src/sem/sem_struct_test.cc
+++ b/src/sem/sem_struct_test.cc
@@ -27,8 +27,9 @@
   auto* impl =
       create<ast::Struct>(name, ast::StructMemberList{}, ast::DecorationList{});
   auto* ptr = impl;
-  auto* s = create<sem::Struct>(impl, StructMemberList{}, 4 /* align */,
-                                8 /* size */, 16 /* size_no_padding */);
+  auto* s =
+      create<sem::Struct>(impl, impl->name(), StructMemberList{}, 4 /* align */,
+                          8 /* size */, 16 /* size_no_padding */);
   EXPECT_EQ(s->Declaration(), ptr);
   EXPECT_EQ(s->Align(), 4u);
   EXPECT_EQ(s->Size(), 8u);
@@ -39,8 +40,9 @@
   auto name = Sym("my_struct");
   auto* impl =
       create<ast::Struct>(name, ast::StructMemberList{}, ast::DecorationList{});
-  auto* s = create<sem::Struct>(impl, StructMemberList{}, 4 /* align */,
-                                4 /* size */, 4 /* size_no_padding */);
+  auto* s =
+      create<sem::Struct>(impl, impl->name(), StructMemberList{}, 4 /* align */,
+                          4 /* size */, 4 /* size_no_padding */);
   EXPECT_EQ(s->type_name(), "__struct_$1");
 }
 
@@ -48,8 +50,9 @@
   auto name = Sym("my_struct");
   auto* impl =
       create<ast::Struct>(name, ast::StructMemberList{}, ast::DecorationList{});
-  auto* s = create<sem::Struct>(impl, StructMemberList{}, 4 /* align */,
-                                4 /* size */, 4 /* size_no_padding */);
+  auto* s =
+      create<sem::Struct>(impl, impl->name(), StructMemberList{}, 4 /* align */,
+                          4 /* size */, 4 /* size_no_padding */);
   EXPECT_EQ(s->FriendlyName(Symbols()), "my_struct");
 }
 
diff --git a/src/sem/struct.cc b/src/sem/struct.cc
index 210a70e..dea2fd1 100644
--- a/src/sem/struct.cc
+++ b/src/sem/struct.cc
@@ -27,11 +27,13 @@
 namespace sem {
 
 Struct::Struct(const ast::Struct* declaration,
+               Symbol name,
                StructMemberList members,
                uint32_t align,
                uint32_t size,
                uint32_t size_no_padding)
     : declaration_(declaration),
+      name_(name),
       members_(std::move(members)),
       align_(align),
       size_(size),
@@ -57,7 +59,7 @@
 }
 
 std::string Struct::type_name() const {
-  return declaration_->type_name();
+  return "__struct_" + name_.to_str();
 }
 
 uint32_t Struct::Align() const {
@@ -69,7 +71,7 @@
 }
 
 std::string Struct::FriendlyName(const SymbolTable& symbols) const {
-  return symbols.NameFor(declaration_->name());
+  return symbols.NameFor(name_);
 }
 
 bool Struct::IsConstructible() const {
@@ -77,12 +79,14 @@
 }
 
 StructMember::StructMember(ast::StructMember* declaration,
+                           Symbol name,
                            sem::Type* type,
                            uint32_t index,
                            uint32_t offset,
                            uint32_t align,
                            uint32_t size)
     : declaration_(declaration),
+      name_(name),
       type_(type),
       index_(index),
       offset_(offset),
diff --git a/src/sem/struct.h b/src/sem/struct.h
index b5357cb..f6014aa 100644
--- a/src/sem/struct.h
+++ b/src/sem/struct.h
@@ -58,12 +58,14 @@
  public:
   /// Constructor
   /// @param declaration the AST structure declaration
+  /// @param name the name of the structure
   /// @param members the structure members
   /// @param align the byte alignment of the structure
   /// @param size the byte size of the structure
   /// @param size_no_padding size of the members without the end of structure
   /// alignment padding
   Struct(const ast::Struct* declaration,
+         Symbol name,
          StructMemberList members,
          uint32_t align,
          uint32_t size,
@@ -75,6 +77,9 @@
   /// @returns the struct
   const ast::Struct* Declaration() const { return declaration_; }
 
+  /// @returns the name of the structure
+  Symbol Name() const { return name_; }
+
   /// @returns the members of the structure
   const StructMemberList& Members() const { return members_; }
 
@@ -156,6 +161,7 @@
   uint64_t LargestMemberBaseAlignment(MemoryLayout mem_layout) const;
 
   ast::Struct const* const declaration_;
+  Symbol const name_;
   StructMemberList const members_;
   uint32_t const align_;
   uint32_t const size_;
@@ -170,12 +176,14 @@
  public:
   /// Constructor
   /// @param declaration the AST declaration node
+  /// @param name the name of the structure
   /// @param type the type of the member
   /// @param index the index of the member in the structure
   /// @param offset the byte offset from the base of the structure
   /// @param align the byte alignment of the member
   /// @param size the byte size of the member
   StructMember(ast::StructMember* declaration,
+               Symbol name,
                sem::Type* type,
                uint32_t index,
                uint32_t offset,
@@ -188,6 +196,9 @@
   /// @returns the AST declaration node
   ast::StructMember* Declaration() const { return declaration_; }
 
+  /// @returns the name of the structure
+  Symbol Name() const { return name_; }
+
   /// @returns the type of the member
   sem::Type* Type() const { return type_; }
 
@@ -205,6 +216,7 @@
 
  private:
   ast::StructMember* const declaration_;
+  Symbol const name_;
   sem::Type* const type_;
   uint32_t const index_;
   uint32_t const offset_;
diff --git a/src/transform/transform_test.cc b/src/transform/transform_test.cc
index 887c410..87b6ab2 100644
--- a/src/transform/transform_test.cc
+++ b/src/transform/transform_test.cc
@@ -106,8 +106,9 @@
 TEST_F(CreateASTTypeForTest, Struct) {
   auto* str = create([](ProgramBuilder& b) {
     auto* decl = b.Structure("S", {}, {});
-    return b.create<sem::Struct>(decl, sem::StructMemberList{}, 4 /* align */,
-                                 4 /* size */, 4 /* size_no_padding */);
+    return b.create<sem::Struct>(decl, decl->name(), sem::StructMemberList{},
+                                 4 /* align */, 4 /* size */,
+                                 4 /* size_no_padding */);
   });
   ASSERT_TRUE(str->Is<ast::TypeName>());
   EXPECT_EQ(
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index e3ed808..5ba656a 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -147,7 +147,7 @@
         return false;
       }
     } else if (auto* str = decl->As<ast::Struct>()) {
-      if (!EmitStructType(builder_.Sem().Get(str))) {
+      if (!EmitStructType(current_buffer_, builder_.Sem().Get(str))) {
         return false;
       }
     } else if (auto* func = decl->As<ast::Function>()) {
@@ -521,6 +521,8 @@
       return EmitTextureCall(out, expr, intrinsic);
     } else if (intrinsic->Type() == sem::IntrinsicType::kSelect) {
       return EmitSelectCall(out, expr);
+    } else if (intrinsic->Type() == sem::IntrinsicType::kModf) {
+      return EmitModfCall(out, expr, intrinsic);
     } else if (intrinsic->Type() == sem::IntrinsicType::kFrexp) {
       return EmitFrexpCall(out, expr, intrinsic);
     } else if (intrinsic->Type() == sem::IntrinsicType::kIsNormal) {
@@ -1270,9 +1272,93 @@
   return true;
 }
 
+bool GeneratorImpl::EmitModfCall(std::ostream& out,
+                                 ast::CallExpression* expr,
+                                 const sem::Intrinsic* intrinsic) {
+  if (expr->params().size() == 1) {
+    return CallIntrinsicHelper(
+        out, expr, intrinsic,
+        [&](TextBuffer* b, const std::vector<std::string>& params) {
+          auto* ty = intrinsic->Parameters()[0]->Type();
+          auto in = params[0];
+
+          std::string width;
+          if (auto* vec = ty->As<sem::Vector>()) {
+            width = std::to_string(vec->Width());
+          }
+
+          // Emit the builtin return type unique to this overload. This does not
+          // exist in the AST, so it will not be generated in Generate().
+          if (!EmitStructType(&helpers_,
+                              intrinsic->ReturnType()->As<sem::Struct>())) {
+            return false;
+          }
+
+          line(b) << "float" << width << " whole;";
+          line(b) << "float" << width << " fract = modf(" << in << ", whole);";
+          {
+            auto l = line(b);
+            if (!EmitType(l, intrinsic->ReturnType(), ast::StorageClass::kNone,
+                          ast::Access::kUndefined, "")) {
+              return false;
+            }
+            l << " result = {fract, whole};";
+          }
+          line(b) << "return result;";
+          return true;
+        });
+  }
+
+  // DEPRECATED
+  out << "modf";
+  ScopedParen sp(out);
+  if (!EmitExpression(out, expr->params()[0])) {
+    return false;
+  }
+  out << ", ";
+  if (!EmitExpression(out, expr->params()[1])) {
+    return false;
+  }
+  return true;
+}
+
 bool GeneratorImpl::EmitFrexpCall(std::ostream& out,
                                   ast::CallExpression* expr,
                                   const sem::Intrinsic* intrinsic) {
+  if (expr->params().size() == 1) {
+    return CallIntrinsicHelper(
+        out, expr, intrinsic,
+        [&](TextBuffer* b, const std::vector<std::string>& params) {
+          auto* ty = intrinsic->Parameters()[0]->Type();
+          auto in = params[0];
+
+          std::string width;
+          if (auto* vec = ty->As<sem::Vector>()) {
+            width = std::to_string(vec->Width());
+          }
+
+          // Emit the builtin return type unique to this overload. This does not
+          // exist in the AST, so it will not be generated in Generate().
+          if (!EmitStructType(&helpers_,
+                              intrinsic->ReturnType()->As<sem::Struct>())) {
+            return false;
+          }
+
+          line(b) << "float" << width << " exp;";
+          line(b) << "float" << width << " sig = frexp(" << in << ", exp);";
+          {
+            auto l = line(b);
+            if (!EmitType(l, intrinsic->ReturnType(), ast::StorageClass::kNone,
+                          ast::Access::kUndefined, "")) {
+              return false;
+            }
+            l << " result = {sig, int" << width << "(exp)};";
+          }
+          line(b) << "return result;";
+          return true;
+        });
+  }
+  // DEPRECATED
   // Exponent is an integer in WGSL, but HLSL wants a float.
   // We need to make the call with a temporary float, and then cast.
   return CallIntrinsicHelper(
@@ -2906,7 +2992,7 @@
     }
     out << "State";
   } else if (auto* str = type->As<sem::Struct>()) {
-    out << builder_.Symbols().NameFor(str->Declaration()->name());
+    out << StructName(str);
   } else if (auto* tex = type->As<sem::Texture>()) {
     auto* storage = tex->As<sem::StorageTexture>();
     auto* multism = tex->As<sem::MultisampledTexture>();
@@ -3015,7 +3101,7 @@
   return true;
 }
 
-bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
+bool GeneratorImpl::EmitStructType(TextBuffer* b, const sem::Struct* str) {
   auto storage_class_uses = str->StorageClassUsage();
   if (storage_class_uses.size() ==
       (storage_class_uses.count(ast::StorageClass::kStorage) +
@@ -3029,71 +3115,74 @@
     return true;
   }
 
-  auto struct_name = builder_.Symbols().NameFor(str->Declaration()->name());
-  line() << "struct " << struct_name << " {";
+  line(b) << "struct " << StructName(str) << " {";
   {
-    ScopedIndent si(this);
+    ScopedIndent si(b);
     for (auto* mem : str->Members()) {
-      auto name = builder_.Symbols().NameFor(mem->Declaration()->symbol());
+      auto name = builder_.Symbols().NameFor(mem->Name());
 
       auto* ty = mem->Type();
 
-      auto out = line();
+      auto out = line(b);
 
       std::string pre, post;
 
-      for (auto* deco : mem->Declaration()->decorations()) {
-        if (auto* location = deco->As<ast::LocationDecoration>()) {
-          auto& pipeline_stage_uses = str->PipelineStageUses();
-          if (pipeline_stage_uses.size() != 1) {
-            TINT_ICE(Writer, diagnostics_)
-                << "invalid entry point IO struct uses";
-          }
+      if (auto* decl = mem->Declaration()) {
+        for (auto* deco : decl->decorations()) {
+          if (auto* location = deco->As<ast::LocationDecoration>()) {
+            auto& pipeline_stage_uses = str->PipelineStageUses();
+            if (pipeline_stage_uses.size() != 1) {
+              TINT_ICE(Writer, diagnostics_)
+                  << "invalid entry point IO struct uses";
+            }
 
-          if (pipeline_stage_uses.count(
-                  sem::PipelineStageUsage::kVertexInput)) {
-            post += " : TEXCOORD" + std::to_string(location->value());
-          } else if (pipeline_stage_uses.count(
-                         sem::PipelineStageUsage::kVertexOutput)) {
-            post += " : TEXCOORD" + std::to_string(location->value());
-          } else if (pipeline_stage_uses.count(
-                         sem::PipelineStageUsage::kFragmentInput)) {
-            post += " : TEXCOORD" + std::to_string(location->value());
-          } else if (pipeline_stage_uses.count(
-                         sem::PipelineStageUsage::kFragmentOutput)) {
-            post += " : SV_Target" + std::to_string(location->value());
-          } else {
+            if (pipeline_stage_uses.count(
+                    sem::PipelineStageUsage::kVertexInput)) {
+              post += " : TEXCOORD" + std::to_string(location->value());
+            } else if (pipeline_stage_uses.count(
+                           sem::PipelineStageUsage::kVertexOutput)) {
+              post += " : TEXCOORD" + std::to_string(location->value());
+            } else if (pipeline_stage_uses.count(
+                           sem::PipelineStageUsage::kFragmentInput)) {
+              post += " : TEXCOORD" + std::to_string(location->value());
+            } else if (pipeline_stage_uses.count(
+                           sem::PipelineStageUsage::kFragmentOutput)) {
+              post += " : SV_Target" + std::to_string(location->value());
+            } else {
+              TINT_ICE(Writer, diagnostics_)
+                  << "invalid use of location decoration";
+            }
+          } else if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
+            auto attr = builtin_to_attribute(builtin->value());
+            if (attr.empty()) {
+              diagnostics_.add_error(diag::System::Writer,
+                                     "unsupported builtin");
+              return false;
+            }
+            post += " : " + attr;
+          } else if (auto* interpolate =
+                         deco->As<ast::InterpolateDecoration>()) {
+            auto mod = interpolation_to_modifiers(interpolate->type(),
+                                                  interpolate->sampling());
+            if (mod.empty()) {
+              diagnostics_.add_error(diag::System::Writer,
+                                     "unsupported interpolation");
+              return false;
+            }
+            pre += mod;
+
+          } else if (deco->Is<ast::InvariantDecoration>()) {
+            // Note: `precise` is not exactly the same as `invariant`, but is
+            // stricter and therefore provides the necessary guarantees.
+            // See discussion here: https://github.com/gpuweb/gpuweb/issues/893
+            pre += "precise ";
+          } else if (!deco->IsAnyOf<ast::StructMemberAlignDecoration,
+                                    ast::StructMemberOffsetDecoration,
+                                    ast::StructMemberSizeDecoration>()) {
             TINT_ICE(Writer, diagnostics_)
-                << "invalid use of location decoration";
-          }
-        } else if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
-          auto attr = builtin_to_attribute(builtin->value());
-          if (attr.empty()) {
-            diagnostics_.add_error(diag::System::Writer, "unsupported builtin");
+                << "unhandled struct member attribute: " << deco->name();
             return false;
           }
-          post += " : " + attr;
-        } else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
-          auto mod = interpolation_to_modifiers(interpolate->type(),
-                                                interpolate->sampling());
-          if (mod.empty()) {
-            diagnostics_.add_error(diag::System::Writer,
-                                   "unsupported interpolation");
-            return false;
-          }
-          pre += mod;
-
-        } else if (deco->Is<ast::InvariantDecoration>()) {
-          // Note: `precise` is not exactly the same as `invariant`, but is
-          // stricter and therefore provides the necessary guarantees.
-          // See discussion here: https://github.com/gpuweb/gpuweb/issues/893
-          pre += "precise ";
-        } else if (!deco->IsAnyOf<ast::StructMemberAlignDecoration,
-                                  ast::StructMemberOffsetDecoration,
-                                  ast::StructMemberSizeDecoration>()) {
-          TINT_ICE(Writer, diagnostics_)
-              << "unhandled struct member attribute: " << deco->name();
-          return false;
         }
       }
 
@@ -3106,7 +3195,7 @@
     }
   }
 
-  line() << "};";
+  line(b) << "};";
 
   return true;
 }
@@ -3239,11 +3328,14 @@
                                         F&& build) {
   // Generate the helper function if it hasn't been created already
   auto fn = utils::GetOrCreate(intrinsics_, intrinsic, [&]() -> std::string {
+    TextBuffer b;
+    TINT_DEFER(helpers_.Append(b));
+
     auto fn_name =
         UniqueIdentifier(std::string("tint_") + sem::str(intrinsic->Type()));
     std::vector<std::string> parameter_names;
     {
-      auto decl = line(&helpers_);
+      auto decl = line(&b);
       if (!EmitTypeAndName(decl, intrinsic->ReturnType(),
                            ast::StorageClass::kNone, ast::Access::kUndefined,
                            fn_name)) {
@@ -3271,13 +3363,13 @@
       decl << " {";
     }
     {
-      ScopedIndent si(&helpers_);
-      if (!build(&helpers_, parameter_names)) {
+      ScopedIndent si(&b);
+      if (!build(&b, parameter_names)) {
         return "";
       }
     }
-    line(&helpers_) << "}";
-    line(&helpers_);
+    line(&b) << "}";
+    line(&b);
     return fn_name;
   });
 
diff --git a/src/writer/hlsl/generator_impl.h b/src/writer/hlsl/generator_impl.h
index 1fdd404..8874b2d 100644
--- a/src/writer/hlsl/generator_impl.h
+++ b/src/writer/hlsl/generator_impl.h
@@ -155,6 +155,14 @@
   /// @param expr the call expression
   /// @returns true if the call expression is emitted
   bool EmitSelectCall(std::ostream& out, ast::CallExpression* expr);
+  /// Handles generating a call to the `modf()` intrinsic
+  /// @param out the output of the expression stream
+  /// @param expr the call expression
+  /// @param intrinsic the semantic information for the intrinsic
+  /// @returns true if the call expression is emitted
+  bool EmitModfCall(std::ostream& out,
+                    ast::CallExpression* expr,
+                    const sem::Intrinsic* intrinsic);
   /// Handles generating a call to the `frexp()` intrinsic
   /// @param out the output of the expression stream
   /// @param expr the call expression
@@ -320,7 +328,7 @@
   /// @param type the type to generate
   /// @param storage_class the storage class of the variable
   /// @param access the access control type of the variable
-  /// @param name the name of the variable, used for array emission.
+  /// @param name the name to emit
   /// @returns true if the type is emitted
   bool EmitTypeAndName(std::ostream& out,
                        const sem::Type* type,
@@ -328,9 +336,10 @@
                        ast::Access access,
                        const std::string& name);
   /// Handles generating a structure declaration
+  /// @param buffer the text buffer that the type declaration will be written to
   /// @param ty the struct to generate
   /// @returns true if the struct is emitted
-  bool EmitStructType(const sem::Struct* ty);
+  bool EmitStructType(TextBuffer* buffer, const sem::Struct* ty);
   /// Handles a unary op expression
   /// @param out the output of the expression stream
   /// @param expr the expression to emit
@@ -413,7 +422,6 @@
   ///          `buffer` is the body of the generated function
   ///          `params` is the name of all the generated function parameters
   /// @returns true if the call expression is emitted
-
   template <typename F>
   bool CallIntrinsicHelper(std::ostream& out,
                            ast::CallExpression* call,
diff --git a/src/writer/hlsl/generator_impl_type_test.cc b/src/writer/hlsl/generator_impl_type_test.cc
index 3417ec1..56baf78 100644
--- a/src/writer/hlsl/generator_impl_type_test.cc
+++ b/src/writer/hlsl/generator_impl_type_test.cc
@@ -173,9 +173,10 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
-  EXPECT_EQ(gen.result(), R"(struct S {
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
+  EXPECT_EQ(buf.String(), R"(struct S {
   int a;
   float b;
 };
@@ -197,9 +198,10 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
-  EXPECT_EQ(gen.result(), "");
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
+  EXPECT_EQ(buf.String(), "");
 }
 
 TEST_F(HlslGeneratorImplTest_Type, EmitType_Struct) {
@@ -247,9 +249,10 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
-  EXPECT_EQ(gen.result(), R"(struct S {
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
+  EXPECT_EQ(buf.String(), R"(struct S {
   int a;
   float b;
 };
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index eee283b..f4efca4 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -150,7 +150,7 @@
 
 bool GeneratorImpl::EmitTypeDecl(const sem::Type* ty) {
   if (auto* str = ty->As<sem::Struct>()) {
-    if (!EmitStructType(str)) {
+    if (!EmitStructType(current_buffer_, str)) {
       return false;
     }
   } else {
@@ -392,6 +392,11 @@
   auto name = generate_builtin_name(intrinsic);
 
   switch (intrinsic->Type()) {
+    case sem::IntrinsicType::kModf:
+      return EmitModfCall(out, expr, intrinsic);
+    case sem::IntrinsicType::kFrexp:
+      return EmitFrexpCall(out, expr, intrinsic);
+
     case sem::IntrinsicType::kPack2x16float:
     case sem::IntrinsicType::kUnpack2x16float: {
       if (intrinsic->Type() == sem::IntrinsicType::kPack2x16float) {
@@ -423,28 +428,6 @@
       return true;
     }
 
-    case sem::IntrinsicType::kFrexp:
-    case sem::IntrinsicType::kModf: {
-      // TODO(bclayton): These intrinsics are likely to change signature.
-      // See: crbug.com/tint/54 and https://github.com/gpuweb/gpuweb/issues/1480
-      out << name;
-      ScopedParen sp(out);
-      if (!EmitExpression(out, expr->params()[0])) {
-        return false;
-      }
-      out << ", ";
-      {
-        // MSL has a reference for the second parameter, but WGSL has a pointer.
-        // Dereference the argument.
-        out << "*";
-        ScopedParen sp2(out);
-        if (!EmitExpression(out, expr->params()[1])) {
-          return false;
-        }
-      }
-      return true;
-    }
-
     case sem::IntrinsicType::kLength: {
       auto* sem = builder_.Sem().Get(expr->params()[0]);
       if (sem->Type()->UnwrapRef()->is_scalar()) {
@@ -869,6 +852,105 @@
   return true;
 }
 
+bool GeneratorImpl::EmitModfCall(std::ostream& out,
+                                 ast::CallExpression* expr,
+                                 const sem::Intrinsic* intrinsic) {
+  if (expr->params().size() == 1) {
+    return CallIntrinsicHelper(
+        out, expr, intrinsic,
+        [&](TextBuffer* b, const std::vector<std::string>& params) {
+          auto* ty = intrinsic->Parameters()[0]->Type();
+          auto in = params[0];
+
+          std::string width;
+          if (auto* vec = ty->As<sem::Vector>()) {
+            width = std::to_string(vec->Width());
+          }
+
+          // Emit the builtin return type unique to this overload. This does not
+          // exist in the AST, so it will not be generated in Generate().
+          if (!EmitStructType(&helpers_,
+                              intrinsic->ReturnType()->As<sem::Struct>())) {
+            return false;
+          }
+
+          line(b) << "float" << width << " whole;";
+          line(b) << "float" << width << " fract = modf(" << in << ", whole);";
+          line(b) << "return {fract, whole};";
+          return true;
+        });
+  }
+  // DEPRECATED
+  return CallIntrinsicHelper(
+      out, expr, intrinsic,
+      [&](TextBuffer* b, const std::vector<std::string>& params) {
+        auto* ty = intrinsic->Parameters()[0]->Type();
+        auto in = params[0];
+        auto out_whole = params[1];
+
+        std::string width;
+        if (auto* vec = ty->As<sem::Vector>()) {
+          width = std::to_string(vec->Width());
+        }
+
+        line(b) << "float" << width << " whole;";
+        line(b) << "float" << width << " fract = modf(" << in << ", whole);";
+        line(b) << "*" << out_whole << " = whole;";
+        line(b) << "return fract;";
+        return true;
+      });
+}
+
+bool GeneratorImpl::EmitFrexpCall(std::ostream& out,
+                                  ast::CallExpression* expr,
+                                  const sem::Intrinsic* intrinsic) {
+  if (expr->params().size() == 1) {
+    return CallIntrinsicHelper(
+        out, expr, intrinsic,
+        [&](TextBuffer* b, const std::vector<std::string>& params) {
+          auto* ty = intrinsic->Parameters()[0]->Type();
+          auto in = params[0];
+
+          std::string width;
+          if (auto* vec = ty->As<sem::Vector>()) {
+            width = std::to_string(vec->Width());
+          }
+
+          // Emit the builtin return type unique to this overload. This does not
+          // exist in the AST, so it will not be generated in Generate().
+          if (!EmitStructType(&helpers_,
+                              intrinsic->ReturnType()->As<sem::Struct>())) {
+            return false;
+          }
+
+          line(b) << "int" << width << " exp;";
+          line(b) << "float" << width << " sig = frexp(" << in << ", exp);";
+          line(b) << "return {sig, exp};";
+          return true;
+        });
+  }
+
+  // DEPRECATED
+  return CallIntrinsicHelper(
+      out, expr, intrinsic,
+      [&](TextBuffer* b, const std::vector<std::string>& params) {
+        auto* ty = intrinsic->Parameters()[0]->Type();
+        auto in = params[0];
+        auto out_exp = params[1];
+
+        std::string width;
+        if (auto* vec = ty->As<sem::Vector>()) {
+          width = std::to_string(vec->Width());
+        }
+
+        line(b) << "int" << width << " exp;";
+        line(b) << "float" << width << " sig = frexp(" << in << ", exp);";
+        line(b) << "*" << out_exp << " = exp;";
+        line(b) << "return sig;";
+        return true;
+      });
+}
+
 std::string GeneratorImpl::generate_builtin_name(
     const sem::Intrinsic* intrinsic) {
   std::string out = "";
@@ -1846,7 +1928,8 @@
 
 bool GeneratorImpl::EmitType(std::ostream& out,
                              const sem::Type* type,
-                             const std::string& name) {
+                             const std::string& name,
+                             bool* name_printed /* = nullptr */) {
   if (auto* atomic = type->As<sem::Atomic>()) {
     if (atomic->Type()->Is<sem::I32>()) {
       out << "atomic_int";
@@ -1877,6 +1960,9 @@
     }
     if (!name.empty()) {
       out << " " << name;
+      if (name_printed) {
+        *name_printed = true;
+      }
     }
     for (uint32_t size : sizes) {
       out << "[" << size << "]";
@@ -1914,6 +2000,9 @@
     out << " ";
     if (ptr->StoreType()->Is<sem::Array>()) {
       std::string inner = "(*" + name + ")";
+      if (name_printed) {
+        *name_printed = true;
+      }
       if (!EmitType(out, ptr->StoreType(), inner)) {
         return false;
       }
@@ -1922,6 +2011,9 @@
         return false;
       }
       out << "* " << name;
+      if (name_printed) {
+        *name_printed = true;
+      }
     }
     return true;
   }
@@ -1934,7 +2026,7 @@
   if (auto* str = type->As<sem::Struct>()) {
     // The struct type emits as just the name. The declaration would be emitted
     // as part of emitting the declared types.
-    out << program_->Symbols().NameFor(str->Declaration()->name());
+    out << StructName(str);
     return true;
   }
 
@@ -2031,6 +2123,19 @@
   return false;
 }
 
+bool GeneratorImpl::EmitTypeAndName(std::ostream& out,
+                                    const sem::Type* type,
+                                    const std::string& name) {
+  bool name_printed = false;
+  if (!EmitType(out, type, name, &name_printed)) {
+    return false;
+  }
+  if (!name_printed) {
+    out << " " << name;
+  }
+  return true;
+}
+
 bool GeneratorImpl::EmitStorageClass(std::ostream& out, ast::StorageClass sc) {
   switch (sc) {
     case ast::StorageClass::kFunction:
@@ -2069,9 +2174,8 @@
   return EmitType(out, type, name);
 }
 
-bool GeneratorImpl::EmitStructType(const sem::Struct* str) {
-  line() << "struct " << program_->Symbols().NameFor(str->Declaration()->name())
-         << " {";
+bool GeneratorImpl::EmitStructType(TextBuffer* b, const sem::Struct* str) {
+  line(b) << "struct " << StructName(str) << " {";
 
   bool is_host_shareable = str->IsHostShareable();
 
@@ -2089,16 +2193,17 @@
       name = UniqueIdentifier("tint_pad");
     } while (str->FindMember(program_->Symbols().Get(name)));
 
-    auto out = line();
+    auto out = line(b);
     add_byte_offset_comment(out, msl_offset);
     out << "int8_t " << name << "[" << size << "];";
   };
 
-  increment_indent();
+  b->IncrementIndent();
+
   uint32_t msl_offset = 0;
   for (auto* mem : str->Members()) {
-    auto out = line();
-    auto name = program_->Symbols().NameFor(mem->Declaration()->symbol());
+    auto out = line(b);
+    auto name = program_->Symbols().NameFor(mem->Name());
     auto wgsl_offset = mem->Offset();
 
     if (is_host_shareable) {
@@ -2135,53 +2240,56 @@
     }
 
     // Emit decorations
-    for (auto* deco : mem->Declaration()->decorations()) {
-      if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
-        auto attr = builtin_to_attribute(builtin->value());
-        if (attr.empty()) {
-          diagnostics_.add_error(diag::System::Writer, "unknown builtin");
-          return false;
-        }
-        out << " [[" << attr << "]]";
-      } else if (auto* loc = deco->As<ast::LocationDecoration>()) {
-        auto& pipeline_stage_uses = str->PipelineStageUses();
-        if (pipeline_stage_uses.size() != 1) {
-          TINT_ICE(Writer, diagnostics_)
-              << "invalid entry point IO struct uses";
-        }
+    if (auto* decl = mem->Declaration()) {
+      for (auto* deco : decl->decorations()) {
+        if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
+          auto attr = builtin_to_attribute(builtin->value());
+          if (attr.empty()) {
+            diagnostics_.add_error(diag::System::Writer, "unknown builtin");
+            return false;
+          }
+          out << " [[" << attr << "]]";
+        } else if (auto* loc = deco->As<ast::LocationDecoration>()) {
+          auto& pipeline_stage_uses = str->PipelineStageUses();
+          if (pipeline_stage_uses.size() != 1) {
+            TINT_ICE(Writer, diagnostics_)
+                << "invalid entry point IO struct uses";
+          }
 
-        if (pipeline_stage_uses.count(sem::PipelineStageUsage::kVertexInput)) {
-          out << " [[attribute(" + std::to_string(loc->value()) + ")]]";
-        } else if (pipeline_stage_uses.count(
-                       sem::PipelineStageUsage::kVertexOutput)) {
-          out << " [[user(locn" + std::to_string(loc->value()) + ")]]";
-        } else if (pipeline_stage_uses.count(
-                       sem::PipelineStageUsage::kFragmentInput)) {
-          out << " [[user(locn" + std::to_string(loc->value()) + ")]]";
-        } else if (pipeline_stage_uses.count(
-                       sem::PipelineStageUsage::kFragmentOutput)) {
-          out << " [[color(" + std::to_string(loc->value()) + ")]]";
-        } else {
+          if (pipeline_stage_uses.count(
+                  sem::PipelineStageUsage::kVertexInput)) {
+            out << " [[attribute(" + std::to_string(loc->value()) + ")]]";
+          } else if (pipeline_stage_uses.count(
+                         sem::PipelineStageUsage::kVertexOutput)) {
+            out << " [[user(locn" + std::to_string(loc->value()) + ")]]";
+          } else if (pipeline_stage_uses.count(
+                         sem::PipelineStageUsage::kFragmentInput)) {
+            out << " [[user(locn" + std::to_string(loc->value()) + ")]]";
+          } else if (pipeline_stage_uses.count(
+                         sem::PipelineStageUsage::kFragmentOutput)) {
+            out << " [[color(" + std::to_string(loc->value()) + ")]]";
+          } else {
+            TINT_ICE(Writer, diagnostics_)
+                << "invalid use of location decoration";
+          }
+        } else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
+          auto attr = interpolation_to_attribute(interpolate->type(),
+                                                 interpolate->sampling());
+          if (attr.empty()) {
+            diagnostics_.add_error(diag::System::Writer,
+                                   "unknown interpolation attribute");
+            return false;
+          }
+          out << " [[" << attr << "]]";
+        } else if (deco->Is<ast::InvariantDecoration>()) {
+          out << " [[invariant]]";
+          has_invariant_ = true;
+        } else if (!deco->IsAnyOf<ast::StructMemberOffsetDecoration,
+                                  ast::StructMemberAlignDecoration,
+                                  ast::StructMemberSizeDecoration>()) {
           TINT_ICE(Writer, diagnostics_)
-              << "invalid use of location decoration";
+              << "unhandled struct member attribute: " << deco->name();
         }
-      } else if (auto* interpolate = deco->As<ast::InterpolateDecoration>()) {
-        auto attr = interpolation_to_attribute(interpolate->type(),
-                                               interpolate->sampling());
-        if (attr.empty()) {
-          diagnostics_.add_error(diag::System::Writer,
-                                 "unknown interpolation attribute");
-          return false;
-        }
-        out << " [[" << attr << "]]";
-      } else if (deco->Is<ast::InvariantDecoration>()) {
-        out << " [[invariant]]";
-        has_invariant_ = true;
-      } else if (!deco->IsAnyOf<ast::StructMemberOffsetDecoration,
-                                ast::StructMemberAlignDecoration,
-                                ast::StructMemberSizeDecoration>()) {
-        TINT_ICE(Writer, diagnostics_)
-            << "unhandled struct member attribute: " << deco->name();
       }
     }
 
@@ -2204,9 +2312,9 @@
     add_padding(str->Size() - msl_offset, msl_offset);
   }
 
-  decrement_indent();
+  b->DecrementIndent();
 
-  line() << "};";
+  line(b) << "};";
   return true;
 }
 
@@ -2406,6 +2514,72 @@
   return {};
 }
 
+template <typename F>
+bool GeneratorImpl::CallIntrinsicHelper(std::ostream& out,
+                                        ast::CallExpression* call,
+                                        const sem::Intrinsic* intrinsic,
+                                        F&& build) {
+  // Generate the helper function if it hasn't been created already
+  auto fn = utils::GetOrCreate(intrinsics_, intrinsic, [&]() -> std::string {
+    TextBuffer b;
+    TINT_DEFER(helpers_.Append(b));
+
+    auto fn_name =
+        UniqueIdentifier(std::string("tint_") + sem::str(intrinsic->Type()));
+    std::vector<std::string> parameter_names;
+    {
+      auto decl = line(&b);
+      if (!EmitTypeAndName(decl, intrinsic->ReturnType(), fn_name)) {
+        return "";
+      }
+      {
+        ScopedParen sp(decl);
+        for (auto* param : intrinsic->Parameters()) {
+          if (!parameter_names.empty()) {
+            decl << ", ";
+          }
+          auto param_name = "param_" + std::to_string(parameter_names.size());
+          if (!EmitTypeAndName(decl, param->Type(), param_name)) {
+            return "";
+          }
+          parameter_names.emplace_back(std::move(param_name));
+        }
+      }
+      decl << " {";
+    }
+    {
+      ScopedIndent si(&b);
+      if (!build(&b, parameter_names)) {
+        return "";
+      }
+    }
+    line(&b) << "}";
+    line(&b);
+    return fn_name;
+  });
+
+  if (fn.empty()) {
+    return false;
+  }
+
+  // Call the helper
+  out << fn;
+  {
+    ScopedParen sp(out);
+    bool first = true;
+    for (auto* arg : call->params()) {
+      if (!first) {
+        out << ", ";
+      }
+      first = false;
+      if (!EmitExpression(out, arg)) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
 }  // namespace msl
 }  // namespace writer
 }  // namespace tint
diff --git a/src/writer/msl/generator_impl.h b/src/writer/msl/generator_impl.h
index fde3c9a..899025b 100644
--- a/src/writer/msl/generator_impl.h
+++ b/src/writer/msl/generator_impl.h
@@ -126,6 +126,22 @@
   bool EmitTextureCall(std::ostream& out,
                        ast::CallExpression* expr,
                        const sem::Intrinsic* intrinsic);
+  /// Handles generating a call to the `modf()` intrinsic
+  /// @param out the output of the expression stream
+  /// @param expr the call expression
+  /// @param intrinsic the semantic information for the intrinsic
+  /// @returns true if the call expression is emitted
+  bool EmitModfCall(std::ostream& out,
+                    ast::CallExpression* expr,
+                    const sem::Intrinsic* intrinsic);
+  /// Handles generating a call to the `frexp()` intrinsic
+  /// @param out the output of the expression stream
+  /// @param expr the call expression
+  /// @param intrinsic the semantic information for the intrinsic
+  /// @returns true if the call expression is emitted
+  bool EmitFrexpCall(std::ostream& out,
+                     ast::CallExpression* expr,
+                     const sem::Intrinsic* intrinsic);
   /// Handles a case statement
   /// @param stmt the statement
   /// @returns true if the statement was emitted successfully
@@ -218,10 +234,20 @@
   /// @param out the output of the type stream
   /// @param type the type to generate
   /// @param name the name of the variable, only used for array emission
+  /// @param name_printed (optional) if not nullptr and an array was printed
   /// @returns true if the type is emitted
   bool EmitType(std::ostream& out,
                 const sem::Type* type,
-                const std::string& name);
+                const std::string& name,
+                bool* name_printed = nullptr);
+  /// Handles generating type and name
+  /// @param out the output stream
+  /// @param type the type to generate
+  /// @param name the name to emit
+  /// @returns true if the type is emitted
+  bool EmitTypeAndName(std::ostream& out,
+                       const sem::Type* type,
+                       const std::string& name);
   /// Handles generating a storage class
   /// @param out the output of the type stream
   /// @param sc the storage class to generate
@@ -238,9 +264,10 @@
                       const sem::Type* type,
                       const std::string& name);
   /// Handles generating a struct declaration
+  /// @param buffer the text buffer that the type declaration will be written to
   /// @param str the struct to generate
   /// @returns true if the struct is emitted
-  bool EmitStructType(const sem::Struct* str);
+  bool EmitStructType(TextBuffer* buffer, const sem::Struct* str);
   /// Handles emitting a type constructor
   /// @param out the output of the expression stream
   /// @param expr the type constructor expression
@@ -291,6 +318,25 @@
     uint32_t align;
   };
 
+  /// CallIntrinsicHelper will call the intrinsic helper function, creating it
+  /// if it hasn't been built already. If the intrinsic needs to be built then
+  /// CallIntrinsicHelper will generate the function signature and will call
+  /// `build` to emit the body of the function.
+  /// @param out the output of the expression stream
+  /// @param call the call expression
+  /// @param intrinsic the semantic information for the intrinsic
+  /// @param build a function with the signature:
+  ///        `bool(TextBuffer* buffer, const std::vector<std::string>& params)`
+  ///        Where:
+  ///          `buffer` is the body of the generated function
+  ///          `params` is the name of all the generated function parameters
+  /// @returns true if the call expression is emitted
+  template <typename F>
+  bool CallIntrinsicHelper(std::ostream& out,
+                           ast::CallExpression* call,
+                           const sem::Intrinsic* intrinsic,
+                           F&& build);
+
   TextBuffer helpers_;  // Helper functions emitted at the top of the output
 
   /// @returns the MSL packed type size and alignment in bytes for the given
@@ -308,6 +354,8 @@
 
   /// True if an invariant attribute has been generated.
   bool has_invariant_ = false;
+
+  std::unordered_map<const sem::Intrinsic*, std::string> intrinsics_;
 };
 
 }  // namespace msl
diff --git a/src/writer/msl/generator_impl_type_test.cc b/src/writer/msl/generator_impl_type_test.cc
index 646ae7a..09e3bc8 100644
--- a/src/writer/msl/generator_impl_type_test.cc
+++ b/src/writer/msl/generator_impl_type_test.cc
@@ -219,9 +219,10 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
-  EXPECT_EQ(gen.result(), R"(struct S {
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
+  EXPECT_EQ(buf.String(), R"(struct S {
   int a;
   float b;
 };
@@ -269,8 +270,9 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
 
   // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
   // for each field of the structure s.
@@ -320,7 +322,7 @@
   "  /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
   auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
 #undef FIELD
-  EXPECT_EQ(gen.result(), expect);
+  EXPECT_EQ(buf.String(), expect);
 
   // 1.4 Metal and C++14
   // The Metal programming language is a C++14-based Specification with
@@ -378,8 +380,9 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
 
   // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
   // for each field of the structure s.
@@ -397,7 +400,7 @@
   "  /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
   auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
 #undef FIELD
-  EXPECT_EQ(gen.result(), expect);
+  EXPECT_EQ(buf.String(), expect);
 
   // 1.4 Metal and C++14
   // The Metal programming language is a C++14-based Specification with
@@ -472,8 +475,9 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
 
   // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
   // for each field of the structure s.
@@ -492,7 +496,7 @@
   "  /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
   auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
 #undef FIELD
-  EXPECT_EQ(gen.result(), expect);
+  EXPECT_EQ(buf.String(), expect);
 
   // 1.4 Metal and C++14
   // The Metal programming language is a C++14-based Specification with
@@ -557,8 +561,9 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
 
   // ALL_FIELDS() calls the macro FIELD(ADDR, TYPE, NAME, SUFFIX)
   // for each field of the structure s.
@@ -574,7 +579,7 @@
   "  /* " #ADDR " */ " #TYPE " " #NAME #SUFFIX ";\n"
   auto* expect = "struct S {\n" ALL_FIELDS() "};\n";
 #undef FIELD
-  EXPECT_EQ(gen.result(), expect);
+  EXPECT_EQ(buf.String(), expect);
 }
 
 TEST_F(MslGeneratorImplTest, AttemptTintPadSymbolCollision) {
@@ -619,9 +624,10 @@
 
   GeneratorImpl& gen = Build();
 
+  TextGenerator::TextBuffer buf;
   auto* sem_s = program->TypeOf(s)->As<sem::Struct>();
-  ASSERT_TRUE(gen.EmitStructType(sem_s)) << gen.error();
-  EXPECT_EQ(gen.result(), R"(struct S {
+  ASSERT_TRUE(gen.EmitStructType(&buf, sem_s)) << gen.error();
+  EXPECT_EQ(buf.String(), R"(struct S {
   /* 0x0000 */ int tint_pad_2;
   /* 0x0004 */ int8_t tint_pad_10[124];
   /* 0x0080 */ float tint_pad_20;
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index d228564..0791c0a 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -162,7 +162,8 @@
     case IntrinsicType::kFract:
       return GLSLstd450Fract;
     case IntrinsicType::kFrexp:
-      return GLSLstd450Frexp;
+      return (intrinsic->Parameters().size() == 1) ? GLSLstd450FrexpStruct
+                                                   : GLSLstd450Frexp;
     case IntrinsicType::kInverseSqrt:
       return GLSLstd450InverseSqrt;
     case IntrinsicType::kLdexp:
@@ -192,7 +193,8 @@
     case IntrinsicType::kMix:
       return GLSLstd450FMix;
     case IntrinsicType::kModf:
-      return GLSLstd450Modf;
+      return (intrinsic->Parameters().size() == 1) ? GLSLstd450ModfStruct
+                                                   : GLSLstd450Modf;
     case IntrinsicType::kNormalize:
       return GLSLstd450Normalize;
     case IntrinsicType::kPack4x8snorm:
@@ -3932,25 +3934,25 @@
 bool Builder::GenerateStructType(const sem::Struct* struct_type,
                                  const Operand& result) {
   auto struct_id = result.to_i();
-  auto* impl = struct_type->Declaration();
 
-  if (impl->name().IsValid()) {
-    push_debug(spv::Op::OpName,
-               {Operand::Int(struct_id),
-                Operand::String(builder_.Symbols().NameFor(impl->name()))});
+  if (struct_type->Name().IsValid()) {
+    push_debug(
+        spv::Op::OpName,
+        {Operand::Int(struct_id),
+         Operand::String(builder_.Symbols().NameFor(struct_type->Name()))});
   }
 
   OperandList ops;
   ops.push_back(result);
 
-  if (impl->IsBlockDecorated()) {
+  auto* decl = struct_type->Declaration();
+  if (decl && decl->IsBlockDecorated()) {
     push_annot(spv::Op::OpDecorate,
                {Operand::Int(struct_id), Operand::Int(SpvDecorationBlock)});
   }
 
-  auto& members = impl->members();
-  for (uint32_t i = 0; i < members.size(); ++i) {
-    auto mem_id = GenerateStructMember(struct_id, i, members[i]);
+  for (uint32_t i = 0; i < struct_type->Members().size(); ++i) {
+    auto mem_id = GenerateStructMember(struct_id, i, struct_type->Members()[i]);
     if (mem_id == 0) {
       return false;
     }
@@ -3964,10 +3966,10 @@
 
 uint32_t Builder::GenerateStructMember(uint32_t struct_id,
                                        uint32_t idx,
-                                       ast::StructMember* member) {
+                                       const sem::StructMember* member) {
   push_debug(spv::Op::OpMemberName,
              {Operand::Int(struct_id), Operand::Int(idx),
-              Operand::String(builder_.Symbols().NameFor(member->symbol()))});
+              Operand::String(builder_.Symbols().NameFor(member->Name()))});
 
   // Note: This will generate layout annotations for *all* structs, whether or
   // not they are used in host-shareable variables. This is officially ok in
@@ -3975,19 +3977,13 @@
   // to only generate the layout info for structs used for certain storage
   // classes.
 
-  auto* sem_member = builder_.Sem().Get(member);
-  if (!sem_member) {
-    error_ = "Struct member has no semantic information";
-    return 0;
-  }
-
   push_annot(
       spv::Op::OpMemberDecorate,
       {Operand::Int(struct_id), Operand::Int(idx),
-       Operand::Int(SpvDecorationOffset), Operand::Int(sem_member->Offset())});
+       Operand::Int(SpvDecorationOffset), Operand::Int(member->Offset())});
 
   // Infer and emit matrix layout.
-  auto* matrix_type = GetNestedMatrixType(sem_member->Type());
+  auto* matrix_type = GetNestedMatrixType(member->Type());
   if (matrix_type) {
     push_annot(spv::Op::OpMemberDecorate,
                {Operand::Int(struct_id), Operand::Int(idx),
@@ -4004,7 +4000,7 @@
                 Operand::Int(effective_row_count * scalar_elem_size)});
   }
 
-  return GenerateTypeIfNeeded(sem_member->Type());
+  return GenerateTypeIfNeeded(member->Type());
 }
 
 bool Builder::GenerateVectorType(const sem::Vector* vec,
diff --git a/src/writer/spirv/builder.h b/src/writer/spirv/builder.h
index c33db7c..aed54be 100644
--- a/src/writer/spirv/builder.h
+++ b/src/writer/spirv/builder.h
@@ -486,7 +486,7 @@
   /// @returns the id of the struct member or 0 on error.
   uint32_t GenerateStructMember(uint32_t struct_id,
                                 uint32_t idx,
-                                ast::StructMember* member);
+                                const sem::StructMember* member);
   /// Generates a variable declaration statement
   /// @param stmt the statement to generate
   /// @returns true on successfull generation
diff --git a/src/writer/text_generator.cc b/src/writer/text_generator.cc
index 811f0c5..d6c4f53 100644
--- a/src/writer/text_generator.cc
+++ b/src/writer/text_generator.cc
@@ -17,6 +17,8 @@
 #include <algorithm>
 #include <limits>
 
+#include "src/utils/get_or_create.h"
+
 namespace tint {
 namespace writer {
 
@@ -29,6 +31,15 @@
   return builder_.Symbols().NameFor(builder_.Symbols().New(prefix));
 }
 
+std::string TextGenerator::StructName(const sem::Struct* s) {
+  auto name = builder_.Symbols().NameFor(s->Name());
+  if (name.size() > 0 && name[0] == '_') {
+    name = utils::GetOrCreate(builtin_struct_names_, s,
+                              [&] { return UniqueIdentifier(name.substr(1)); });
+  }
+  return name;
+}
+
 std::string TextGenerator::TrimSuffix(std::string str,
                                       const std::string& suffix) {
   if (str.size() >= suffix.size()) {
diff --git a/src/writer/text_generator.h b/src/writer/text_generator.h
index 876efa6..8b8aeaf 100644
--- a/src/writer/text_generator.h
+++ b/src/writer/text_generator.h
@@ -17,6 +17,7 @@
 
 #include <sstream>
 #include <string>
+#include <unordered_map>
 #include <utility>
 #include <vector>
 
@@ -29,37 +30,6 @@
 /// Helper methods for generators which are creating text output
 class TextGenerator {
  public:
-  /// Constructor
-  /// @param program the program used by the generator
-  explicit TextGenerator(const Program* program);
-  ~TextGenerator();
-
-  /// Increment the emitter indent level
-  void increment_indent() { current_buffer_->IncrementIndent(); }
-  /// Decrement the emitter indent level
-  void decrement_indent() { current_buffer_->DecrementIndent(); }
-
-  /// @returns the result data
-  std::string result() const { return main_buffer_.String(); }
-
-  /// @returns the list of diagnostics raised by the generator.
-  const diag::List& Diagnostics() const { return diagnostics_; }
-
-  /// @returns the error
-  std::string error() const { return diagnostics_.str(); }
-
-  /// @return a new, unique identifier with the given prefix.
-  /// @param prefix optional prefix to apply to the generated identifier. If
-  /// empty "tint_symbol" will be used.
-  std::string UniqueIdentifier(const std::string& prefix = "");
-
-  /// @param str the string
-  /// @param suffix the suffix to remove
-  /// @return returns str without the provided trailing suffix string. If str
-  /// doesn't end with suffix, str is returned unchanged.
-  std::string TrimSuffix(std::string str, const std::string& suffix);
-
- protected:
   /// Line holds a single line of text
   struct Line {
     /// The indentation of the line in whitespaces
@@ -117,6 +87,44 @@
     std::vector<Line> lines;
   };
 
+  /// Constructor
+  /// @param program the program used by the generator
+  explicit TextGenerator(const Program* program);
+  ~TextGenerator();
+
+  /// Increment the emitter indent level
+  void increment_indent() { current_buffer_->IncrementIndent(); }
+  /// Decrement the emitter indent level
+  void decrement_indent() { current_buffer_->DecrementIndent(); }
+
+  /// @returns the result data
+  std::string result() const { return main_buffer_.String(); }
+
+  /// @returns the list of diagnostics raised by the generator.
+  const diag::List& Diagnostics() const { return diagnostics_; }
+
+  /// @returns the error
+  std::string error() const { return diagnostics_.str(); }
+
+  /// @return a new, unique identifier with the given prefix.
+  /// @param prefix optional prefix to apply to the generated identifier. If
+  /// empty "tint_symbol" will be used.
+  std::string UniqueIdentifier(const std::string& prefix = "");
+
+  /// @param s the semantic structure
+  /// @returns the name of the structure, taking special care of builtin
+  /// structures that start with a leading underscore. If the structure is a
+  /// builtin, then the returned name will be a unique name without the leading
+  /// underscore.
+  std::string StructName(const sem::Struct* s);
+
+  /// @param str the string
+  /// @param suffix the suffix to remove
+  /// @return returns str without the provided trailing suffix string. If str
+  /// doesn't end with suffix, str is returned unchanged.
+  std::string TrimSuffix(std::string str, const std::string& suffix);
+
+ protected:
   /// LineWriter is a helper that acts as a string buffer, who's content is
   /// emitted to the TextBuffer as a single line on destruction.
   struct LineWriter {
@@ -224,6 +232,8 @@
  private:
   /// The primary text buffer that the generator will emit
   TextBuffer main_buffer_;
+  /// Map of builtin structure to unique generated name
+  std::unordered_map<const sem::Struct*, std::string> builtin_struct_names_;
 };
 
 }  // namespace writer
diff --git a/test/intrinsics/frexp.wgsl b/test/intrinsics/frexp.wgsl
index 54217fe..fed55e5 100644
--- a/test/intrinsics/frexp.wgsl
+++ b/test/intrinsics/frexp.wgsl
@@ -1,5 +1,6 @@
 [[stage(compute), workgroup_size(1)]]
 fn main() {
-    var exponent : i32;
-    let significand : f32 = frexp(1.23, &exponent);
+    let res = frexp(1.23);
+    let exp : i32 = res.exp;
+    let sig : f32 = res.sig;
 }
diff --git a/test/intrinsics/frexp.wgsl.expected.hlsl b/test/intrinsics/frexp.wgsl.expected.hlsl
index e35149a..4429974 100644
--- a/test/intrinsics/frexp.wgsl.expected.hlsl
+++ b/test/intrinsics/frexp.wgsl.expected.hlsl
@@ -1,13 +1,18 @@
-float tint_frexp(float param_0, inout int param_1) {
-  float float_exp;
-  float significand = frexp(param_0, float_exp);
-  param_1 = int(float_exp);
-  return significand;
+struct frexp_result {
+  float sig;
+  int exp;
+};
+frexp_result tint_frexp(float param_0) {
+  float exp;
+  float sig = frexp(param_0, exp);
+  frexp_result result = {sig, int(exp)};
+  return result;
 }
 
 [numthreads(1, 1, 1)]
 void main() {
-  int exponent = 0;
-  const float significand = tint_frexp(1.230000019f, exponent);
+  const frexp_result res = tint_frexp(1.230000019f);
+  const int exp = res.exp;
+  const float sig = res.sig;
   return;
 }
diff --git a/test/intrinsics/frexp.wgsl.expected.msl b/test/intrinsics/frexp.wgsl.expected.msl
index cda2b1b..d850760 100644
--- a/test/intrinsics/frexp.wgsl.expected.msl
+++ b/test/intrinsics/frexp.wgsl.expected.msl
@@ -1,9 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+
+struct frexp_result {
+  float sig;
+  int exp;
+};
+frexp_result tint_frexp(float param_0) {
+  int exp;
+  float sig = frexp(param_0, exp);
+  return {sig, exp};
+}
+
 kernel void tint_symbol() {
-  int exponent = 0;
-  float const significand = frexp(1.230000019f, *(&(exponent)));
+  frexp_result const res = tint_frexp(1.230000019f);
+  int const exp = res.exp;
+  float const sig = res.sig;
   return;
 }
 
diff --git a/test/intrinsics/frexp.wgsl.expected.spvasm b/test/intrinsics/frexp.wgsl.expected.spvasm
index 7d6543e..f282195 100644
--- a/test/intrinsics/frexp.wgsl.expected.spvasm
+++ b/test/intrinsics/frexp.wgsl.expected.spvasm
@@ -1,25 +1,29 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 14
+; Bound: 13
 ; Schema: 0
                OpCapability Shader
-         %11 = OpExtInstImport "GLSL.std.450"
+          %9 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %exponent "exponent"
+               OpName %_frexp_result "_frexp_result"
+               OpMemberName %_frexp_result 0 "sig"
+               OpMemberName %_frexp_result 1 "exp"
+               OpMemberDecorate %_frexp_result 0 Offset 0
+               OpMemberDecorate %_frexp_result 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
-        %int = OpTypeInt 32 1
-%_ptr_Function_int = OpTypePointer Function %int
-          %8 = OpConstantNull %int
       %float = OpTypeFloat 32
+        %int = OpTypeInt 32 1
+%_frexp_result = OpTypeStruct %float %int
 %float_1_23000002 = OpConstant %float 1.23000002
        %main = OpFunction %void None %1
           %4 = OpLabel
-   %exponent = OpVariable %_ptr_Function_int Function %8
-          %9 = OpExtInst %float %11 Frexp %float_1_23000002 %exponent
+          %5 = OpExtInst %_frexp_result %9 FrexpStruct %float_1_23000002
+         %11 = OpCompositeExtract %int %5 1
+         %12 = OpCompositeExtract %float %5 0
                OpReturn
                OpFunctionEnd
diff --git a/test/intrinsics/frexp.wgsl.expected.wgsl b/test/intrinsics/frexp.wgsl.expected.wgsl
index d80f8f5..519ffb6 100644
--- a/test/intrinsics/frexp.wgsl.expected.wgsl
+++ b/test/intrinsics/frexp.wgsl.expected.wgsl
@@ -1,5 +1,6 @@
 [[stage(compute), workgroup_size(1)]]
 fn main() {
-  var exponent : i32;
-  let significand : f32 = frexp(1.230000019, &(exponent));
+  let res = frexp(1.230000019);
+  let exp : i32 = res.exp;
+  let sig : f32 = res.sig;
 }
diff --git a/test/intrinsics/gen/frexp/013caa.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/013caa.wgsl.expected.hlsl
index 9e077f5..8a964ed 100644
--- a/test/intrinsics/gen/frexp/013caa.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/013caa.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/013caa.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 float4 tint_frexp(float4 param_0, inout int4 param_1) {
   float4 float_exp;
   float4 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/013caa.wgsl.expected.msl b/test/intrinsics/gen/frexp/013caa.wgsl.expected.msl
index 1b4ab95..bd2fdbd 100644
--- a/test/intrinsics/gen/frexp/013caa.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/013caa.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/013caa.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_frexp(float4 param_0, thread int4* param_1) {
+  int4 exp;
+  float4 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_013caa() {
   int4 arg_1 = 0;
-  float4 res = frexp(float4(), *(&(arg_1)));
+  float4 res = tint_frexp(float4(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/013caa.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/013caa.wgsl.expected.spvasm
index 9f2dda9..d1e2268 100644
--- a/test/intrinsics/gen/frexp/013caa.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/013caa.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/013caa.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/013caa.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/013caa.wgsl.expected.wgsl
index 990ed6e..0fccee6 100644
--- a/test/intrinsics/gen/frexp/013caa.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/013caa.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/013caa.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_013caa() {
   var arg_1 : vec4<i32>;
   var res : vec4<f32> = frexp(vec4<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/0da285.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/0da285.wgsl.expected.hlsl
index 06c20aa..276869f 100644
--- a/test/intrinsics/gen/frexp/0da285.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/0da285.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/0da285.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 float tint_frexp(float param_0, inout int param_1) {
   float float_exp;
   float significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/0da285.wgsl.expected.msl b/test/intrinsics/gen/frexp/0da285.wgsl.expected.msl
index 7763244..b1cbd7b 100644
--- a/test/intrinsics/gen/frexp/0da285.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/0da285.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/frexp/0da285.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_frexp(float param_0, threadgroup int* param_1) {
+  int exp;
+  float sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 void frexp_0da285(threadgroup int* const tint_symbol_1) {
-  float res = frexp(1.0f, *(&(*(tint_symbol_1))));
+  float res = tint_frexp(1.0f, &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:15: error: no matching function for call to 'frexp'
-  float res = frexp(1.0f, *(&(*(tint_symbol_1))));
-              ^~~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4560:18: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup int'), parameter type must be 'int &'
-METAL_FUNC float frexp(float x, thread int &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3092:17: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup int'), parameter type must be 'int &'
-METAL_FUNC half frexp(half x, thread int &exp)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3336:18: note: candidate function not viable: no known conversion from 'threadgroup int' to 'metal::int2 &' (aka 'int2 &') for 2nd argument
-METAL_FUNC half2 frexp(half2 x, thread int2 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3580:18: note: candidate function not viable: no known conversion from 'threadgroup int' to 'metal::int3 &' (aka 'int3 &') for 2nd argument
-METAL_FUNC half3 frexp(half3 x, thread int3 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3824:18: note: candidate function not viable: no known conversion from 'threadgroup int' to 'metal::int4 &' (aka 'int4 &') for 2nd argument
-METAL_FUNC half4 frexp(half4 x, thread int4 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4804:19: note: candidate function not viable: no known conversion from 'threadgroup int' to 'metal::int2 &' (aka 'int2 &') for 2nd argument
-METAL_FUNC float2 frexp(float2 x, thread int2 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5048:19: note: candidate function not viable: no known conversion from 'threadgroup int' to 'metal::int3 &' (aka 'int3 &') for 2nd argument
-METAL_FUNC float3 frexp(float3 x, thread int3 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5292:19: note: candidate function not viable: no known conversion from 'threadgroup int' to 'metal::int4 &' (aka 'int4 &') for 2nd argument
-METAL_FUNC float4 frexp(float4 x, thread int4 &exp)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/frexp/0da285.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/0da285.wgsl.expected.spvasm
index 3ea3539..e6de8e1 100644
--- a/test/intrinsics/gen/frexp/0da285.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/0da285.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/0da285.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/0da285.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/0da285.wgsl.expected.wgsl
index a3bf648..d66ac56 100644
--- a/test/intrinsics/gen/frexp/0da285.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/0da285.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/0da285.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 var<workgroup> arg_1 : i32;
 
 fn frexp_0da285() {
diff --git a/test/intrinsics/gen/frexp/12f1da.wgsl b/test/intrinsics/gen/frexp/12f1da.wgsl
new file mode 100644
index 0000000..4db8bd9
--- /dev/null
+++ b/test/intrinsics/gen/frexp/12f1da.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(f32) -> _frexp_result
+fn frexp_12f1da() {
+  var res = frexp(1.0);
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_12f1da();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_12f1da();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_12f1da();
+}
diff --git a/test/intrinsics/gen/frexp/12f1da.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.hlsl
new file mode 100644
index 0000000..caf7961
--- /dev/null
+++ b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct frexp_result {
+  float sig;
+  int exp;
+};
+frexp_result tint_frexp(float param_0) {
+  float exp;
+  float sig = frexp(param_0, exp);
+  frexp_result result = {sig, int(exp)};
+  return result;
+}
+
+void frexp_12f1da() {
+  frexp_result res = tint_frexp(1.0f);
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  frexp_12f1da();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  frexp_12f1da();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  frexp_12f1da();
+  return;
+}
diff --git a/test/intrinsics/gen/frexp/12f1da.wgsl.expected.msl b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.msl
new file mode 100644
index 0000000..cf7b0cb
--- /dev/null
+++ b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct frexp_result {
+  float sig;
+  int exp;
+};
+frexp_result tint_frexp(float param_0) {
+  int exp;
+  float sig = frexp(param_0, exp);
+  return {sig, exp};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void frexp_12f1da() {
+  frexp_result res = tint_frexp(1.0f);
+}
+
+vertex tint_symbol vertex_main() {
+  frexp_12f1da();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  frexp_12f1da();
+  return;
+}
+
+kernel void compute_main() {
+  frexp_12f1da();
+  return;
+}
+
diff --git a/test/intrinsics/gen/frexp/12f1da.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.spvasm
new file mode 100644
index 0000000..1887cc1
--- /dev/null
+++ b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.spvasm
@@ -0,0 +1,75 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 35
+; Schema: 0
+               OpCapability Shader
+         %16 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %frexp_12f1da "frexp_12f1da"
+               OpName %_frexp_result "_frexp_result"
+               OpMemberName %_frexp_result 0 "sig"
+               OpMemberName %_frexp_result 1 "exp"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_frexp_result 0 Offset 0
+               OpMemberDecorate %_frexp_result 1 Offset 4
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+%_frexp_result = OpTypeStruct %float %int
+    %float_1 = OpConstant %float 1
+%_ptr_Function__frexp_result = OpTypePointer Function %_frexp_result
+         %20 = OpConstantNull %_frexp_result
+         %21 = OpTypeFunction %void %v4float
+%frexp_12f1da = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__frexp_result Function %20
+         %13 = OpExtInst %_frexp_result %16 FrexpStruct %float_1
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %v4float
+         %24 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %26 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %27 = OpFunctionCall %void %frexp_12f1da
+         %28 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %30 = OpLabel
+         %31 = OpFunctionCall %void %frexp_12f1da
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %33 = OpLabel
+         %34 = OpFunctionCall %void %frexp_12f1da
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/frexp/12f1da.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.wgsl
new file mode 100644
index 0000000..76b85c3
--- /dev/null
+++ b/test/intrinsics/gen/frexp/12f1da.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn frexp_12f1da() {
+  var res = frexp(1.0);
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_12f1da();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_12f1da();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_12f1da();
+}
diff --git a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.hlsl
index cd65967..446b4b9 100644
--- a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/15edf3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 float2 tint_frexp(float2 param_0, inout int2 param_1) {
   float2 float_exp;
   float2 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.msl b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.msl
index 35452ee..0a3ab3e 100644
--- a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/15edf3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_frexp(float2 param_0, thread int2* param_1) {
+  int2 exp;
+  float2 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_15edf3() {
   int2 arg_1 = 0;
-  float2 res = frexp(float2(), *(&(arg_1)));
+  float2 res = tint_frexp(float2(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.spvasm
index e624b76..702a52c 100644
--- a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/15edf3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.wgsl
index 7424945..66dc841 100644
--- a/test/intrinsics/gen/frexp/15edf3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/15edf3.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/15edf3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_15edf3() {
   var arg_1 : vec2<i32>;
   var res : vec2<f32> = frexp(vec2<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.hlsl
index e35f419..40eef60 100644
--- a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/19ab15.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 float4 tint_frexp(float4 param_0, inout int4 param_1) {
   float4 float_exp;
   float4 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.msl b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.msl
index 2759c91..b2c38fe 100644
--- a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/19ab15.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_frexp(float4 param_0, thread int4* param_1) {
+  int4 exp;
+  float4 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_19ab15() {
   int4 arg_1 = 0;
-  float4 res = frexp(float4(), *(&(arg_1)));
+  float4 res = tint_frexp(float4(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.spvasm
index e11b4a2..ed54aad 100644
--- a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/19ab15.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.wgsl
index 4bc6335..16cfe37 100644
--- a/test/intrinsics/gen/frexp/19ab15.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/19ab15.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/19ab15.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_19ab15() {
   var arg_1 : vec4<i32>;
   var res : vec4<f32> = frexp(vec4<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.hlsl
index bddd0e2..32b7550 100644
--- a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/2052e9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 float4 tint_frexp(float4 param_0, inout int4 param_1) {
   float4 float_exp;
   float4 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.msl b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.msl
index 5568b87..c3c1293 100644
--- a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/2052e9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_frexp(float4 param_0, thread int4* param_1) {
+  int4 exp;
+  float4 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_2052e9() {
   int4 arg_1 = 0;
-  float4 res = frexp(float4(), *(&(arg_1)));
+  float4 res = tint_frexp(float4(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.spvasm
index 9a2809d..6646081 100644
--- a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/2052e9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.wgsl
index 07203f9..48eb9c0 100644
--- a/test/intrinsics/gen/frexp/2052e9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/2052e9.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/2052e9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_2052e9() {
   var arg_1 : vec4<i32>;
   var res : vec4<f32> = frexp(vec4<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.hlsl
index c7452b4..90c074a 100644
--- a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/40fc9b.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 float3 tint_frexp(float3 param_0, inout int3 param_1) {
   float3 float_exp;
   float3 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.msl b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.msl
index cd1d5ea..fbab4cb 100644
--- a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/frexp/40fc9b.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_frexp(float3 param_0, threadgroup int3* param_1) {
+  int3 exp;
+  float3 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 void frexp_40fc9b(threadgroup int3* const tint_symbol_1) {
-  float3 res = frexp(float3(), *(&(*(tint_symbol_1))));
+  float3 res = tint_frexp(float3(), &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:16: error: no matching function for call to 'frexp'
-  float3 res = frexp(float3(), *(&(*(tint_symbol_1))));
-               ^~~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5048:19: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup int3' (vector of 3 'int' values)), parameter type must be 'metal::int3 &' (aka 'int3 &')
-METAL_FUNC float3 frexp(float3 x, thread int3 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3092:17: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'half' for 1st argument
-METAL_FUNC half frexp(half x, thread int &exp)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3336:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::half2' (aka 'half2') for 1st argument
-METAL_FUNC half2 frexp(half2 x, thread int2 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3580:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::half3' (aka 'half3') for 1st argument
-METAL_FUNC half3 frexp(half3 x, thread int3 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3824:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::half4' (aka 'half4') for 1st argument
-METAL_FUNC half4 frexp(half4 x, thread int4 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4560:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'float' for 1st argument
-METAL_FUNC float frexp(float x, thread int &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4804:19: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::float2' (aka 'float2') for 1st argument
-METAL_FUNC float2 frexp(float2 x, thread int2 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5292:19: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::float4' (aka 'float4') for 1st argument
-METAL_FUNC float4 frexp(float4 x, thread int4 &exp)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.spvasm
index 2facf1b..379017c 100644
--- a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/40fc9b.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.wgsl
index 7452296..05b42fd 100644
--- a/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/40fc9b.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/40fc9b.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 var<workgroup> arg_1 : vec3<i32>;
 
 fn frexp_40fc9b() {
diff --git a/test/intrinsics/gen/frexp/41e931.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/41e931.wgsl.expected.hlsl
index 080b770..da408a3 100644
--- a/test/intrinsics/gen/frexp/41e931.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/41e931.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/41e931.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 float tint_frexp(float param_0, inout int param_1) {
   float float_exp;
   float significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/41e931.wgsl.expected.msl b/test/intrinsics/gen/frexp/41e931.wgsl.expected.msl
index a562b55..9e60f17 100644
--- a/test/intrinsics/gen/frexp/41e931.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/41e931.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/41e931.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_frexp(float param_0, thread int* param_1) {
+  int exp;
+  float sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_41e931() {
   int arg_1 = 0;
-  float res = frexp(1.0f, *(&(arg_1)));
+  float res = tint_frexp(1.0f, &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/41e931.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/41e931.wgsl.expected.spvasm
index fb8b59b..b9cce46 100644
--- a/test/intrinsics/gen/frexp/41e931.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/41e931.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/41e931.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/41e931.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/41e931.wgsl.expected.wgsl
index 0c6e160..afe0e12 100644
--- a/test/intrinsics/gen/frexp/41e931.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/41e931.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/41e931.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 fn frexp_41e931() {
   var arg_1 : i32;
   var res : f32 = frexp(1.0, &(arg_1));
diff --git a/test/intrinsics/gen/frexp/481e59.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/481e59.wgsl.expected.hlsl
index 668bc6e..ef6c94e 100644
--- a/test/intrinsics/gen/frexp/481e59.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/481e59.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/481e59.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 float tint_frexp(float param_0, inout int param_1) {
   float float_exp;
   float significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/481e59.wgsl.expected.msl b/test/intrinsics/gen/frexp/481e59.wgsl.expected.msl
index 23f14ce..cb21d9b 100644
--- a/test/intrinsics/gen/frexp/481e59.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/481e59.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/481e59.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_frexp(float param_0, thread int* param_1) {
+  int exp;
+  float sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_481e59() {
   int arg_1 = 0;
-  float res = frexp(1.0f, *(&(arg_1)));
+  float res = tint_frexp(1.0f, &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/481e59.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/481e59.wgsl.expected.spvasm
index 9b2cd5a..703c948 100644
--- a/test/intrinsics/gen/frexp/481e59.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/481e59.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/481e59.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/481e59.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/481e59.wgsl.expected.wgsl
index ec1d927..e305a6d 100644
--- a/test/intrinsics/gen/frexp/481e59.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/481e59.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/481e59.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 fn frexp_481e59() {
   var arg_1 : i32;
   var res : f32 = frexp(1.0, &(arg_1));
diff --git a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.hlsl
index 53500da..84a57f9 100644
--- a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/5a141e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 float3 tint_frexp(float3 param_0, inout int3 param_1) {
   float3 float_exp;
   float3 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.msl b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.msl
index 0f1bc32..fc06cdb 100644
--- a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/5a141e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_frexp(float3 param_0, thread int3* param_1) {
+  int3 exp;
+  float3 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_5a141e() {
   int3 arg_1 = 0;
-  float3 res = frexp(float3(), *(&(arg_1)));
+  float3 res = tint_frexp(float3(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.spvasm
index 25145e1..46ccae0 100644
--- a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/5a141e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.wgsl
index 6ee87a8..697ee96 100644
--- a/test/intrinsics/gen/frexp/5a141e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/5a141e.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/5a141e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_5a141e() {
   var arg_1 : vec3<i32>;
   var res : vec3<f32> = frexp(vec3<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.hlsl
index 10803d1..eddcbc5 100644
--- a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/6d0058.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 float3 tint_frexp(float3 param_0, inout int3 param_1) {
   float3 float_exp;
   float3 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.msl b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.msl
index 4bb1c13..0c30348 100644
--- a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/6d0058.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_frexp(float3 param_0, thread int3* param_1) {
+  int3 exp;
+  float3 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_6d0058() {
   int3 arg_1 = 0;
-  float3 res = frexp(float3(), *(&(arg_1)));
+  float3 res = tint_frexp(float3(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.spvasm
index 51638f6..cbeae7b 100644
--- a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/6d0058.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.wgsl
index 172066b..336437e 100644
--- a/test/intrinsics/gen/frexp/6d0058.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/6d0058.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/6d0058.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_6d0058() {
   var arg_1 : vec3<i32>;
   var res : vec3<f32> = frexp(vec3<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.hlsl
index 7960528..d967d1c 100644
--- a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/6efa09.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 float3 tint_frexp(float3 param_0, inout int3 param_1) {
   float3 float_exp;
   float3 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.msl b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.msl
index 58fc2c7..3911450 100644
--- a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/frexp/6efa09.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_frexp(float3 param_0, thread int3* param_1) {
+  int3 exp;
+  float3 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_6efa09(thread int3* const tint_symbol_2) {
-  float3 res = frexp(float3(), *(&(*(tint_symbol_2))));
+  float3 res = tint_frexp(float3(), &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.spvasm
index 0991859..869f633 100644
--- a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/6efa09.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.wgsl
index 8d5c133..6605ee7 100644
--- a/test/intrinsics/gen/frexp/6efa09.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/6efa09.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/6efa09.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 var<private> arg_1 : vec3<i32>;
 
 fn frexp_6efa09() {
diff --git a/test/intrinsics/gen/frexp/a0eb3b.wgsl b/test/intrinsics/gen/frexp/a0eb3b.wgsl
new file mode 100644
index 0000000..beca50c
--- /dev/null
+++ b/test/intrinsics/gen/frexp/a0eb3b.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(vec<3, f32>) -> _frexp_result_vec<3>
+fn frexp_a0eb3b() {
+  var res = frexp(vec3<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_a0eb3b();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_a0eb3b();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_a0eb3b();
+}
diff --git a/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.hlsl
new file mode 100644
index 0000000..2ca0a68
--- /dev/null
+++ b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct frexp_result_vec3 {
+  float3 sig;
+  int3 exp;
+};
+frexp_result_vec3 tint_frexp(float3 param_0) {
+  float3 exp;
+  float3 sig = frexp(param_0, exp);
+  frexp_result_vec3 result = {sig, int3(exp)};
+  return result;
+}
+
+void frexp_a0eb3b() {
+  frexp_result_vec3 res = tint_frexp(float3(0.0f, 0.0f, 0.0f));
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  frexp_a0eb3b();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  frexp_a0eb3b();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  frexp_a0eb3b();
+  return;
+}
diff --git a/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.msl b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.msl
new file mode 100644
index 0000000..6ca1b90
--- /dev/null
+++ b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct frexp_result_vec3 {
+  float3 sig;
+  int3 exp;
+};
+frexp_result_vec3 tint_frexp(float3 param_0) {
+  int3 exp;
+  float3 sig = frexp(param_0, exp);
+  return {sig, exp};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void frexp_a0eb3b() {
+  frexp_result_vec3 res = tint_frexp(float3());
+}
+
+vertex tint_symbol vertex_main() {
+  frexp_a0eb3b();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  frexp_a0eb3b();
+  return;
+}
+
+kernel void compute_main() {
+  frexp_a0eb3b();
+  return;
+}
+
diff --git a/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.spvasm
new file mode 100644
index 0000000..3049fc1
--- /dev/null
+++ b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.spvasm
@@ -0,0 +1,78 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 38
+; Schema: 0
+               OpCapability Shader
+         %18 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %frexp_a0eb3b "frexp_a0eb3b"
+               OpName %_frexp_result_vec3 "_frexp_result_vec3"
+               OpMemberName %_frexp_result_vec3 0 "sig"
+               OpMemberName %_frexp_result_vec3 1 "exp"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_frexp_result_vec3 0 Offset 0
+               OpMemberDecorate %_frexp_result_vec3 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+        %int = OpTypeInt 32 1
+      %v3int = OpTypeVector %int 3
+%_frexp_result_vec3 = OpTypeStruct %v3float %v3int
+         %19 = OpConstantNull %v3float
+%_ptr_Function__frexp_result_vec3 = OpTypePointer Function %_frexp_result_vec3
+         %22 = OpConstantNull %_frexp_result_vec3
+         %23 = OpTypeFunction %void %v4float
+    %float_1 = OpConstant %float 1
+%frexp_a0eb3b = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__frexp_result_vec3 Function %22
+         %13 = OpExtInst %_frexp_result_vec3 %18 FrexpStruct %19
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %23
+%tint_symbol = OpFunctionParameter %v4float
+         %26 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %28 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %30 = OpFunctionCall %void %frexp_a0eb3b
+         %31 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %33 = OpLabel
+         %34 = OpFunctionCall %void %frexp_a0eb3b
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %frexp_a0eb3b
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.wgsl
new file mode 100644
index 0000000..fba88d3
--- /dev/null
+++ b/test/intrinsics/gen/frexp/a0eb3b.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn frexp_a0eb3b() {
+  var res = frexp(vec3<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_a0eb3b();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_a0eb3b();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_a0eb3b();
+}
diff --git a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.hlsl
index 68180a7..df13399 100644
--- a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a2a617.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 float tint_frexp(float param_0, inout int param_1) {
   float float_exp;
   float significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.msl b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.msl
index 802e9f0..5ab05d4 100644
--- a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/frexp/a2a617.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_frexp(float param_0, thread int* param_1) {
+  int exp;
+  float sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_a2a617(thread int* const tint_symbol_2) {
-  float res = frexp(1.0f, *(&(*(tint_symbol_2))));
+  float res = tint_frexp(1.0f, &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.spvasm
index 182842e..955c165 100644
--- a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a2a617.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.wgsl
index a563123..e5fdacd 100644
--- a/test/intrinsics/gen/frexp/a2a617.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/a2a617.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a2a617.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 var<private> arg_1 : i32;
 
 fn frexp_a2a617() {
diff --git a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.hlsl
index f540a08..0c05d53 100644
--- a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a3f940.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 float2 tint_frexp(float2 param_0, inout int2 param_1) {
   float2 float_exp;
   float2 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.msl b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.msl
index 7f841e0..b259049 100644
--- a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/frexp/a3f940.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_frexp(float2 param_0, threadgroup int2* param_1) {
+  int2 exp;
+  float2 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 void frexp_a3f940(threadgroup int2* const tint_symbol_1) {
-  float2 res = frexp(float2(), *(&(*(tint_symbol_1))));
+  float2 res = tint_frexp(float2(), &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:16: error: no matching function for call to 'frexp'
-  float2 res = frexp(float2(), *(&(*(tint_symbol_1))));
-               ^~~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4804:19: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup int2' (vector of 2 'int' values)), parameter type must be 'metal::int2 &' (aka 'int2 &')
-METAL_FUNC float2 frexp(float2 x, thread int2 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3092:17: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'half' for 1st argument
-METAL_FUNC half frexp(half x, thread int &exp)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3336:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::half2' (aka 'half2') for 1st argument
-METAL_FUNC half2 frexp(half2 x, thread int2 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3580:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::half3' (aka 'half3') for 1st argument
-METAL_FUNC half3 frexp(half3 x, thread int3 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3824:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::half4' (aka 'half4') for 1st argument
-METAL_FUNC half4 frexp(half4 x, thread int4 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4560:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'float' for 1st argument
-METAL_FUNC float frexp(float x, thread int &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5048:19: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::float3' (aka 'float3') for 1st argument
-METAL_FUNC float3 frexp(float3 x, thread int3 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5292:19: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::float4' (aka 'float4') for 1st argument
-METAL_FUNC float4 frexp(float4 x, thread int4 &exp)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.spvasm
index 11801b6..e0c3785 100644
--- a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a3f940.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.wgsl
index 745f7d5..b40075f 100644
--- a/test/intrinsics/gen/frexp/a3f940.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/a3f940.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a3f940.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 var<workgroup> arg_1 : vec2<i32>;
 
 fn frexp_a3f940() {
diff --git a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.hlsl
index f88516c..88c9565 100644
--- a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a951b5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 float2 tint_frexp(float2 param_0, inout int2 param_1) {
   float2 float_exp;
   float2 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.msl b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.msl
index 7f3a315..56dd076 100644
--- a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/a951b5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_frexp(float2 param_0, thread int2* param_1) {
+  int2 exp;
+  float2 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_a951b5() {
   int2 arg_1 = 0;
-  float2 res = frexp(float2(), *(&(arg_1)));
+  float2 res = tint_frexp(float2(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.spvasm
index 8f5353e..49ad292 100644
--- a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a951b5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.wgsl
index 44449dd..431a4a7 100644
--- a/test/intrinsics/gen/frexp/a951b5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/a951b5.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/a951b5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_a951b5() {
   var arg_1 : vec2<i32>;
   var res : vec2<f32> = frexp(vec2<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/b45525.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/b45525.wgsl.expected.hlsl
index f9e83b8..28ee0ea 100644
--- a/test/intrinsics/gen/frexp/b45525.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/b45525.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b45525.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 float4 tint_frexp(float4 param_0, inout int4 param_1) {
   float4 float_exp;
   float4 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/b45525.wgsl.expected.msl b/test/intrinsics/gen/frexp/b45525.wgsl.expected.msl
index d77f3a2..537576a 100644
--- a/test/intrinsics/gen/frexp/b45525.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/b45525.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/frexp/b45525.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_frexp(float4 param_0, thread int4* param_1) {
+  int4 exp;
+  float4 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_b45525(thread int4* const tint_symbol_2) {
-  float4 res = frexp(float4(), *(&(*(tint_symbol_2))));
+  float4 res = tint_frexp(float4(), &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/b45525.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/b45525.wgsl.expected.spvasm
index 8280479..f3c321a 100644
--- a/test/intrinsics/gen/frexp/b45525.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/b45525.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b45525.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/b45525.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/b45525.wgsl.expected.wgsl
index d9cff0a..b31806c 100644
--- a/test/intrinsics/gen/frexp/b45525.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/b45525.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b45525.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 var<private> arg_1 : vec4<i32>;
 
 fn frexp_b45525() {
diff --git a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.hlsl
index ddb2f5f..a39bf1e 100644
--- a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b87f4e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 float4 tint_frexp(float4 param_0, inout int4 param_1) {
   float4 float_exp;
   float4 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.msl b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.msl
index dbbfcb5..d3107ae 100644
--- a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/frexp/b87f4e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_frexp(float4 param_0, threadgroup int4* param_1) {
+  int4 exp;
+  float4 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 void frexp_b87f4e(threadgroup int4* const tint_symbol_1) {
-  float4 res = frexp(float4(), *(&(*(tint_symbol_1))));
+  float4 res = tint_frexp(float4(), &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:16: error: no matching function for call to 'frexp'
-  float4 res = frexp(float4(), *(&(*(tint_symbol_1))));
-               ^~~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5292:19: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup int4' (vector of 4 'int' values)), parameter type must be 'metal::int4 &' (aka 'int4 &')
-METAL_FUNC float4 frexp(float4 x, thread int4 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3092:17: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'half' for 1st argument
-METAL_FUNC half frexp(half x, thread int &exp)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3336:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::half2' (aka 'half2') for 1st argument
-METAL_FUNC half2 frexp(half2 x, thread int2 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3580:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::half3' (aka 'half3') for 1st argument
-METAL_FUNC half3 frexp(half3 x, thread int3 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3824:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::half4' (aka 'half4') for 1st argument
-METAL_FUNC half4 frexp(half4 x, thread int4 &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4560:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'float' for 1st argument
-METAL_FUNC float frexp(float x, thread int &exp)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4804:19: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::float2' (aka 'float2') for 1st argument
-METAL_FUNC float2 frexp(float2 x, thread int2 &exp)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5048:19: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::float3' (aka 'float3') for 1st argument
-METAL_FUNC float3 frexp(float3 x, thread int3 &exp)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.spvasm
index f8c3322..1d9d9af 100644
--- a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b87f4e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.wgsl
index b9ed9da..2d23758 100644
--- a/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/b87f4e.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b87f4e.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = frexp(vec4<f32>(), &arg_1);
+                       ^^^^^
+
 var<workgroup> arg_1 : vec4<i32>;
 
 fn frexp_b87f4e() {
diff --git a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.hlsl
index 1b06a32..527404b 100644
--- a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b9e4de.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 float3 tint_frexp(float3 param_0, inout int3 param_1) {
   float3 float_exp;
   float3 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.msl b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.msl
index 55c997b..937b87f 100644
--- a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/b9e4de.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_frexp(float3 param_0, thread int3* param_1) {
+  int3 exp;
+  float3 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_b9e4de() {
   int3 arg_1 = 0;
-  float3 res = frexp(float3(), *(&(arg_1)));
+  float3 res = tint_frexp(float3(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.spvasm
index 1d6285c..0687916 100644
--- a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b9e4de.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.wgsl
index 38c0091..7c137ca 100644
--- a/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/b9e4de.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/b9e4de.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = frexp(vec3<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_b9e4de() {
   var arg_1 : vec3<i32>;
   var res : vec3<f32> = frexp(vec3<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.hlsl
index 7db21c8..b264ed9 100644
--- a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/c084e3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 float2 tint_frexp(float2 param_0, inout int2 param_1) {
   float2 float_exp;
   float2 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.msl b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.msl
index b2c4648..3bd387e 100644
--- a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/frexp/c084e3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_frexp(float2 param_0, thread int2* param_1) {
+  int2 exp;
+  float2 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_c084e3(thread int2* const tint_symbol_2) {
-  float2 res = frexp(float2(), *(&(*(tint_symbol_2))));
+  float2 res = tint_frexp(float2(), &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.spvasm
index 5e2d7a9..ac5c4a0 100644
--- a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/c084e3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.wgsl
index 7a2d8c6..f924d31 100644
--- a/test/intrinsics/gen/frexp/c084e3.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/c084e3.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/c084e3.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 var<private> arg_1 : vec2<i32>;
 
 fn frexp_c084e3() {
diff --git a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.hlsl
index b806072..1efdb62 100644
--- a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/d06c2c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 float2 tint_frexp(float2 param_0, inout int2 param_1) {
   float2 float_exp;
   float2 significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.msl b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.msl
index 4b10b99..8f580e1 100644
--- a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/d06c2c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_frexp(float2 param_0, thread int2* param_1) {
+  int2 exp;
+  float2 sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_d06c2c() {
   int2 arg_1 = 0;
-  float2 res = frexp(float2(), *(&(arg_1)));
+  float2 res = tint_frexp(float2(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.spvasm
index 45cf3cc..2b15722 100644
--- a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/d06c2c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.wgsl
index 1dcaaf6..1680cd9 100644
--- a/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/d06c2c.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/d06c2c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = frexp(vec2<f32>(), &arg_1);
+                       ^^^^^
+
 fn frexp_d06c2c() {
   var arg_1 : vec2<i32>;
   var res : vec2<f32> = frexp(vec2<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/frexp/d80367.wgsl b/test/intrinsics/gen/frexp/d80367.wgsl
new file mode 100644
index 0000000..bd8112b
--- /dev/null
+++ b/test/intrinsics/gen/frexp/d80367.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(vec<4, f32>) -> _frexp_result_vec<4>
+fn frexp_d80367() {
+  var res = frexp(vec4<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_d80367();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_d80367();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_d80367();
+}
diff --git a/test/intrinsics/gen/frexp/d80367.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/d80367.wgsl.expected.hlsl
new file mode 100644
index 0000000..18b14d4
--- /dev/null
+++ b/test/intrinsics/gen/frexp/d80367.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct frexp_result_vec4 {
+  float4 sig;
+  int4 exp;
+};
+frexp_result_vec4 tint_frexp(float4 param_0) {
+  float4 exp;
+  float4 sig = frexp(param_0, exp);
+  frexp_result_vec4 result = {sig, int4(exp)};
+  return result;
+}
+
+void frexp_d80367() {
+  frexp_result_vec4 res = tint_frexp(float4(0.0f, 0.0f, 0.0f, 0.0f));
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  frexp_d80367();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  frexp_d80367();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  frexp_d80367();
+  return;
+}
diff --git a/test/intrinsics/gen/frexp/d80367.wgsl.expected.msl b/test/intrinsics/gen/frexp/d80367.wgsl.expected.msl
new file mode 100644
index 0000000..036089b
--- /dev/null
+++ b/test/intrinsics/gen/frexp/d80367.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct frexp_result_vec4 {
+  float4 sig;
+  int4 exp;
+};
+frexp_result_vec4 tint_frexp(float4 param_0) {
+  int4 exp;
+  float4 sig = frexp(param_0, exp);
+  return {sig, exp};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void frexp_d80367() {
+  frexp_result_vec4 res = tint_frexp(float4());
+}
+
+vertex tint_symbol vertex_main() {
+  frexp_d80367();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  frexp_d80367();
+  return;
+}
+
+kernel void compute_main() {
+  frexp_d80367();
+  return;
+}
+
diff --git a/test/intrinsics/gen/frexp/d80367.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/d80367.wgsl.expected.spvasm
new file mode 100644
index 0000000..03f674e
--- /dev/null
+++ b/test/intrinsics/gen/frexp/d80367.wgsl.expected.spvasm
@@ -0,0 +1,76 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+               OpCapability Shader
+         %17 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %frexp_d80367 "frexp_d80367"
+               OpName %_frexp_result_vec4 "_frexp_result_vec4"
+               OpMemberName %_frexp_result_vec4 0 "sig"
+               OpMemberName %_frexp_result_vec4 1 "exp"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_frexp_result_vec4 0 Offset 0
+               OpMemberDecorate %_frexp_result_vec4 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+        %int = OpTypeInt 32 1
+      %v4int = OpTypeVector %int 4
+%_frexp_result_vec4 = OpTypeStruct %v4float %v4int
+%_ptr_Function__frexp_result_vec4 = OpTypePointer Function %_frexp_result_vec4
+         %20 = OpConstantNull %_frexp_result_vec4
+         %21 = OpTypeFunction %void %v4float
+    %float_1 = OpConstant %float 1
+%frexp_d80367 = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__frexp_result_vec4 Function %20
+         %13 = OpExtInst %_frexp_result_vec4 %17 FrexpStruct %8
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %v4float
+         %24 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %26 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %28 = OpFunctionCall %void %frexp_d80367
+         %29 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %31 = OpLabel
+         %32 = OpFunctionCall %void %frexp_d80367
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %34 = OpLabel
+         %35 = OpFunctionCall %void %frexp_d80367
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/frexp/d80367.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/d80367.wgsl.expected.wgsl
new file mode 100644
index 0000000..0c60003
--- /dev/null
+++ b/test/intrinsics/gen/frexp/d80367.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn frexp_d80367() {
+  var res = frexp(vec4<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_d80367();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_d80367();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_d80367();
+}
diff --git a/test/intrinsics/gen/frexp/db0637.wgsl b/test/intrinsics/gen/frexp/db0637.wgsl
new file mode 100644
index 0000000..9afab3a
--- /dev/null
+++ b/test/intrinsics/gen/frexp/db0637.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn frexp(vec<2, f32>) -> _frexp_result_vec<2>
+fn frexp_db0637() {
+  var res = frexp(vec2<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_db0637();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_db0637();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_db0637();
+}
diff --git a/test/intrinsics/gen/frexp/db0637.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/db0637.wgsl.expected.hlsl
new file mode 100644
index 0000000..8ae0b21
--- /dev/null
+++ b/test/intrinsics/gen/frexp/db0637.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct frexp_result_vec2 {
+  float2 sig;
+  int2 exp;
+};
+frexp_result_vec2 tint_frexp(float2 param_0) {
+  float2 exp;
+  float2 sig = frexp(param_0, exp);
+  frexp_result_vec2 result = {sig, int2(exp)};
+  return result;
+}
+
+void frexp_db0637() {
+  frexp_result_vec2 res = tint_frexp(float2(0.0f, 0.0f));
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  frexp_db0637();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  frexp_db0637();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  frexp_db0637();
+  return;
+}
diff --git a/test/intrinsics/gen/frexp/db0637.wgsl.expected.msl b/test/intrinsics/gen/frexp/db0637.wgsl.expected.msl
new file mode 100644
index 0000000..26b3332
--- /dev/null
+++ b/test/intrinsics/gen/frexp/db0637.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct frexp_result_vec2 {
+  float2 sig;
+  int2 exp;
+};
+frexp_result_vec2 tint_frexp(float2 param_0) {
+  int2 exp;
+  float2 sig = frexp(param_0, exp);
+  return {sig, exp};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void frexp_db0637() {
+  frexp_result_vec2 res = tint_frexp(float2());
+}
+
+vertex tint_symbol vertex_main() {
+  frexp_db0637();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  frexp_db0637();
+  return;
+}
+
+kernel void compute_main() {
+  frexp_db0637();
+  return;
+}
+
diff --git a/test/intrinsics/gen/frexp/db0637.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/db0637.wgsl.expected.spvasm
new file mode 100644
index 0000000..df21833
--- /dev/null
+++ b/test/intrinsics/gen/frexp/db0637.wgsl.expected.spvasm
@@ -0,0 +1,78 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 38
+; Schema: 0
+               OpCapability Shader
+         %18 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %frexp_db0637 "frexp_db0637"
+               OpName %_frexp_result_vec2 "_frexp_result_vec2"
+               OpMemberName %_frexp_result_vec2 0 "sig"
+               OpMemberName %_frexp_result_vec2 1 "exp"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_frexp_result_vec2 0 Offset 0
+               OpMemberDecorate %_frexp_result_vec2 1 Offset 8
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+        %int = OpTypeInt 32 1
+      %v2int = OpTypeVector %int 2
+%_frexp_result_vec2 = OpTypeStruct %v2float %v2int
+         %19 = OpConstantNull %v2float
+%_ptr_Function__frexp_result_vec2 = OpTypePointer Function %_frexp_result_vec2
+         %22 = OpConstantNull %_frexp_result_vec2
+         %23 = OpTypeFunction %void %v4float
+    %float_1 = OpConstant %float 1
+%frexp_db0637 = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__frexp_result_vec2 Function %22
+         %13 = OpExtInst %_frexp_result_vec2 %18 FrexpStruct %19
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %23
+%tint_symbol = OpFunctionParameter %v4float
+         %26 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %28 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %30 = OpFunctionCall %void %frexp_db0637
+         %31 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %33 = OpLabel
+         %34 = OpFunctionCall %void %frexp_db0637
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %36 = OpLabel
+         %37 = OpFunctionCall %void %frexp_db0637
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/frexp/db0637.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/db0637.wgsl.expected.wgsl
new file mode 100644
index 0000000..c56e615
--- /dev/null
+++ b/test/intrinsics/gen/frexp/db0637.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn frexp_db0637() {
+  var res = frexp(vec2<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  frexp_db0637();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  frexp_db0637();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  frexp_db0637();
+}
diff --git a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.hlsl b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.hlsl
index 8aa4d20..3fd7e82 100644
--- a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/e061dd.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 float tint_frexp(float param_0, inout int param_1) {
   float float_exp;
   float significand = frexp(param_0, float_exp);
diff --git a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.msl b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.msl
index 5b7adae..a773306 100644
--- a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.msl
+++ b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/frexp/e061dd.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_frexp(float param_0, thread int* param_1) {
+  int exp;
+  float sig = frexp(param_0, exp);
+  *param_1 = exp;
+  return sig;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void frexp_e061dd() {
   int arg_1 = 0;
-  float res = frexp(1.0f, *(&(arg_1)));
+  float res = tint_frexp(1.0f, &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.spvasm b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.spvasm
index b580d60..1504a09 100644
--- a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/e061dd.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.wgsl b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.wgsl
index a69a43c..feb5bad 100644
--- a/test/intrinsics/gen/frexp/e061dd.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/frexp/e061dd.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/frexp/e061dd.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = frexp(1.0, &arg_1);
+                 ^^^^^
+
 fn frexp_e061dd() {
   var arg_1 : i32;
   var res : f32 = frexp(1.0, &(arg_1));
diff --git a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.hlsl b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.hlsl
index 5f0f807..2207d2e 100644
--- a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/1d59e5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 groupshared float4 arg_1;
 
 void modf_1d59e5() {
diff --git a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.msl b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.msl
index ae1675b..a078817 100644
--- a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/modf/1d59e5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_modf(float4 param_0, threadgroup float4* param_1) {
+  float4 whole;
+  float4 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 void modf_1d59e5(threadgroup float4* const tint_symbol_1) {
-  float4 res = modf(float4(), *(&(*(tint_symbol_1))));
+  float4 res = tint_modf(float4(), &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:16: error: no matching function for call to 'modf'
-  float4 res = modf(float4(), *(&(*(tint_symbol_1))));
-               ^~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5342:19: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup float4' (vector of 4 'float' values)), parameter type must be 'metal::float4 &' (aka 'float4 &')
-METAL_FUNC float4 modf(float4 x, thread float4 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3142:17: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'half' for 1st argument
-METAL_FUNC half modf(half x, thread half &intval)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3386:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::half2' (aka 'half2') for 1st argument
-METAL_FUNC half2 modf(half2 x, thread half2 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3630:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::half3' (aka 'half3') for 1st argument
-METAL_FUNC half3 modf(half3 x, thread half3 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3874:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::half4' (aka 'half4') for 1st argument
-METAL_FUNC half4 modf(half4 x, thread half4 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4610:18: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'float' for 1st argument
-METAL_FUNC float modf(float x, thread float &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4854:19: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::float2' (aka 'float2') for 1st argument
-METAL_FUNC float2 modf(float2 x, thread float2 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5098:19: note: candidate function not viable: no known conversion from 'float4' (vector of 4 'float' values) to 'metal::float3' (aka 'float3') for 1st argument
-METAL_FUNC float3 modf(float3 x, thread float3 &intval)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.spvasm b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.spvasm
index b999664..717b2e2 100644
--- a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/1d59e5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.wgsl b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.wgsl
index d94d6b1..3a82932 100644
--- a/test/intrinsics/gen/modf/1d59e5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/1d59e5.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/1d59e5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 var<workgroup> arg_1 : vec4<f32>;
 
 fn modf_1d59e5() {
diff --git a/test/intrinsics/gen/modf/2199f1.wgsl b/test/intrinsics/gen/modf/2199f1.wgsl
new file mode 100644
index 0000000..c9cecd6
--- /dev/null
+++ b/test/intrinsics/gen/modf/2199f1.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(vec<3, f32>) -> _modf_result_vec<3>
+fn modf_2199f1() {
+  var res = modf(vec3<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_2199f1();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_2199f1();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_2199f1();
+}
diff --git a/test/intrinsics/gen/modf/2199f1.wgsl.expected.hlsl b/test/intrinsics/gen/modf/2199f1.wgsl.expected.hlsl
new file mode 100644
index 0000000..9b4570e
--- /dev/null
+++ b/test/intrinsics/gen/modf/2199f1.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct modf_result_vec3 {
+  float3 fract;
+  float3 whole;
+};
+modf_result_vec3 tint_modf(float3 param_0) {
+  float3 whole;
+  float3 fract = modf(param_0, whole);
+  modf_result_vec3 result = {fract, whole};
+  return result;
+}
+
+void modf_2199f1() {
+  modf_result_vec3 res = tint_modf(float3(0.0f, 0.0f, 0.0f));
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  modf_2199f1();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  modf_2199f1();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  modf_2199f1();
+  return;
+}
diff --git a/test/intrinsics/gen/modf/2199f1.wgsl.expected.msl b/test/intrinsics/gen/modf/2199f1.wgsl.expected.msl
new file mode 100644
index 0000000..233b91c
--- /dev/null
+++ b/test/intrinsics/gen/modf/2199f1.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct modf_result_vec3 {
+  float3 fract;
+  float3 whole;
+};
+modf_result_vec3 tint_modf(float3 param_0) {
+  float3 whole;
+  float3 fract = modf(param_0, whole);
+  return {fract, whole};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void modf_2199f1() {
+  modf_result_vec3 res = tint_modf(float3());
+}
+
+vertex tint_symbol vertex_main() {
+  modf_2199f1();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  modf_2199f1();
+  return;
+}
+
+kernel void compute_main() {
+  modf_2199f1();
+  return;
+}
+
diff --git a/test/intrinsics/gen/modf/2199f1.wgsl.expected.spvasm b/test/intrinsics/gen/modf/2199f1.wgsl.expected.spvasm
new file mode 100644
index 0000000..998b149
--- /dev/null
+++ b/test/intrinsics/gen/modf/2199f1.wgsl.expected.spvasm
@@ -0,0 +1,76 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+               OpCapability Shader
+         %16 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %modf_2199f1 "modf_2199f1"
+               OpName %_modf_result_vec3 "_modf_result_vec3"
+               OpMemberName %_modf_result_vec3 0 "fract"
+               OpMemberName %_modf_result_vec3 1 "whole"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_modf_result_vec3 0 Offset 0
+               OpMemberDecorate %_modf_result_vec3 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+    %v3float = OpTypeVector %float 3
+%_modf_result_vec3 = OpTypeStruct %v3float %v3float
+         %17 = OpConstantNull %v3float
+%_ptr_Function__modf_result_vec3 = OpTypePointer Function %_modf_result_vec3
+         %20 = OpConstantNull %_modf_result_vec3
+         %21 = OpTypeFunction %void %v4float
+    %float_1 = OpConstant %float 1
+%modf_2199f1 = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__modf_result_vec3 Function %20
+         %13 = OpExtInst %_modf_result_vec3 %16 ModfStruct %17
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %v4float
+         %24 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %26 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %28 = OpFunctionCall %void %modf_2199f1
+         %29 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %31 = OpLabel
+         %32 = OpFunctionCall %void %modf_2199f1
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %34 = OpLabel
+         %35 = OpFunctionCall %void %modf_2199f1
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/modf/2199f1.wgsl.expected.wgsl b/test/intrinsics/gen/modf/2199f1.wgsl.expected.wgsl
new file mode 100644
index 0000000..8a55a22
--- /dev/null
+++ b/test/intrinsics/gen/modf/2199f1.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn modf_2199f1() {
+  var res = modf(vec3<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_2199f1();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_2199f1();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_2199f1();
+}
diff --git a/test/intrinsics/gen/modf/353f7d.wgsl.expected.hlsl b/test/intrinsics/gen/modf/353f7d.wgsl.expected.hlsl
index b677940..7661a49 100644
--- a/test/intrinsics/gen/modf/353f7d.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/353f7d.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/353f7d.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 void modf_353f7d() {
   float arg_1 = 0.0f;
   float res = modf(1.0f, arg_1);
diff --git a/test/intrinsics/gen/modf/353f7d.wgsl.expected.msl b/test/intrinsics/gen/modf/353f7d.wgsl.expected.msl
index 256dd45..67dafcf 100644
--- a/test/intrinsics/gen/modf/353f7d.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/353f7d.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/353f7d.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_modf(float param_0, thread float* param_1) {
+  float whole;
+  float fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_353f7d() {
   float arg_1 = 0.0f;
-  float res = modf(1.0f, *(&(arg_1)));
+  float res = tint_modf(1.0f, &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/353f7d.wgsl.expected.spvasm b/test/intrinsics/gen/modf/353f7d.wgsl.expected.spvasm
index 8252221..83763b8 100644
--- a/test/intrinsics/gen/modf/353f7d.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/353f7d.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/353f7d.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/353f7d.wgsl.expected.wgsl b/test/intrinsics/gen/modf/353f7d.wgsl.expected.wgsl
index 247d8c1..f57dfff 100644
--- a/test/intrinsics/gen/modf/353f7d.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/353f7d.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/353f7d.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 fn modf_353f7d() {
   var arg_1 : f32;
   var res : f32 = modf(1.0, &(arg_1));
diff --git a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.hlsl b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.hlsl
index 4f4e6fd..7d4c708 100644
--- a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/3b79d5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 void modf_3b79d5() {
   float3 arg_1 = float3(0.0f, 0.0f, 0.0f);
   float3 res = modf(float3(0.0f, 0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.msl b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.msl
index 31af906..2881b41 100644
--- a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/3b79d5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_modf(float3 param_0, thread float3* param_1) {
+  float3 whole;
+  float3 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_3b79d5() {
   float3 arg_1 = 0.0f;
-  float3 res = modf(float3(), *(&(arg_1)));
+  float3 res = tint_modf(float3(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.spvasm b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.spvasm
index 545e00f..9a2e520 100644
--- a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/3b79d5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.wgsl b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.wgsl
index 78f7646..616c2b8 100644
--- a/test/intrinsics/gen/modf/3b79d5.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/3b79d5.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/3b79d5.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_3b79d5() {
   var arg_1 : vec3<f32>;
   var res : vec3<f32> = modf(vec3<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.hlsl b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.hlsl
index 2020461..5f97ee4 100644
--- a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/3d00e2.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 static float4 arg_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
 
 void modf_3d00e2() {
diff --git a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.msl b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.msl
index d7ce378..10b1b38 100644
--- a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/modf/3d00e2.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_modf(float4 param_0, thread float4* param_1) {
+  float4 whole;
+  float4 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_3d00e2(thread float4* const tint_symbol_2) {
-  float4 res = modf(float4(), *(&(*(tint_symbol_2))));
+  float4 res = tint_modf(float4(), &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.spvasm b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.spvasm
index 2bc383b..35ccc6a 100644
--- a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/3d00e2.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.wgsl b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.wgsl
index 6175df8..8f08f94 100644
--- a/test/intrinsics/gen/modf/3d00e2.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/3d00e2.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/3d00e2.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 var<private> arg_1 : vec4<f32>;
 
 fn modf_3d00e2() {
diff --git a/test/intrinsics/gen/modf/4bb324.wgsl.expected.hlsl b/test/intrinsics/gen/modf/4bb324.wgsl.expected.hlsl
index 3401374..caf030c 100644
--- a/test/intrinsics/gen/modf/4bb324.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/4bb324.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/4bb324.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 void modf_4bb324() {
   float4 arg_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
   float4 res = modf(float4(0.0f, 0.0f, 0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/4bb324.wgsl.expected.msl b/test/intrinsics/gen/modf/4bb324.wgsl.expected.msl
index 50d7c15..e87e26c 100644
--- a/test/intrinsics/gen/modf/4bb324.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/4bb324.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/4bb324.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_modf(float4 param_0, thread float4* param_1) {
+  float4 whole;
+  float4 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_4bb324() {
   float4 arg_1 = 0.0f;
-  float4 res = modf(float4(), *(&(arg_1)));
+  float4 res = tint_modf(float4(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/4bb324.wgsl.expected.spvasm b/test/intrinsics/gen/modf/4bb324.wgsl.expected.spvasm
index 6c2baae..e654ee6 100644
--- a/test/intrinsics/gen/modf/4bb324.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/4bb324.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/4bb324.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/4bb324.wgsl.expected.wgsl b/test/intrinsics/gen/modf/4bb324.wgsl.expected.wgsl
index 4cc1f48..61a8ca8 100644
--- a/test/intrinsics/gen/modf/4bb324.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/4bb324.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/4bb324.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_4bb324() {
   var arg_1 : vec4<f32>;
   var res : vec4<f32> = modf(vec4<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.hlsl b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.hlsl
index dec22ac..2731d81 100644
--- a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/4fe3d9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 void modf_4fe3d9() {
   float3 arg_1 = float3(0.0f, 0.0f, 0.0f);
   float3 res = modf(float3(0.0f, 0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.msl b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.msl
index 49e45d3..66c8950 100644
--- a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/4fe3d9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_modf(float3 param_0, thread float3* param_1) {
+  float3 whole;
+  float3 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_4fe3d9() {
   float3 arg_1 = 0.0f;
-  float3 res = modf(float3(), *(&(arg_1)));
+  float3 res = tint_modf(float3(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.spvasm b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.spvasm
index 9bd4558..a5dbaa0 100644
--- a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/4fe3d9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.wgsl b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.wgsl
index 0f8e2a3..c145208 100644
--- a/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/4fe3d9.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/4fe3d9.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_4fe3d9() {
   var arg_1 : vec3<f32>;
   var res : vec3<f32> = modf(vec3<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.hlsl b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.hlsl
index 8b28ed7..0d22edf 100644
--- a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/51e4c6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 void modf_51e4c6() {
   float2 arg_1 = float2(0.0f, 0.0f);
   float2 res = modf(float2(0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.msl b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.msl
index 7cdaac4..ad760d5 100644
--- a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/51e4c6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_modf(float2 param_0, thread float2* param_1) {
+  float2 whole;
+  float2 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_51e4c6() {
   float2 arg_1 = 0.0f;
-  float2 res = modf(float2(), *(&(arg_1)));
+  float2 res = tint_modf(float2(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.spvasm b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.spvasm
index 8952ffa..515cd31 100644
--- a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/51e4c6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.wgsl b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.wgsl
index 209a9fb..700ffe5 100644
--- a/test/intrinsics/gen/modf/51e4c6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/51e4c6.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/51e4c6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_51e4c6() {
   var arg_1 : vec2<f32>;
   var res : vec2<f32> = modf(vec2<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/546e09.wgsl.expected.hlsl b/test/intrinsics/gen/modf/546e09.wgsl.expected.hlsl
index 2df7bdf..1fcd41c 100644
--- a/test/intrinsics/gen/modf/546e09.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/546e09.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/546e09.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 void modf_546e09() {
   float arg_1 = 0.0f;
   float res = modf(1.0f, arg_1);
diff --git a/test/intrinsics/gen/modf/546e09.wgsl.expected.msl b/test/intrinsics/gen/modf/546e09.wgsl.expected.msl
index 64e3475..a00cf02 100644
--- a/test/intrinsics/gen/modf/546e09.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/546e09.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/546e09.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_modf(float param_0, thread float* param_1) {
+  float whole;
+  float fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_546e09() {
   float arg_1 = 0.0f;
-  float res = modf(1.0f, *(&(arg_1)));
+  float res = tint_modf(1.0f, &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/546e09.wgsl.expected.spvasm b/test/intrinsics/gen/modf/546e09.wgsl.expected.spvasm
index 5a56fcf..8c70ec3 100644
--- a/test/intrinsics/gen/modf/546e09.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/546e09.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/546e09.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/546e09.wgsl.expected.wgsl b/test/intrinsics/gen/modf/546e09.wgsl.expected.wgsl
index 331c087..ab9908d 100644
--- a/test/intrinsics/gen/modf/546e09.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/546e09.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/546e09.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 fn modf_546e09() {
   var arg_1 : f32;
   var res : f32 = modf(1.0, &(arg_1));
diff --git a/test/intrinsics/gen/modf/5e8476.wgsl.expected.hlsl b/test/intrinsics/gen/modf/5e8476.wgsl.expected.hlsl
index 8fabfe2..dbe27e6 100644
--- a/test/intrinsics/gen/modf/5e8476.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/5e8476.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/5e8476.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 static float arg_1 = 0.0f;
 
 void modf_5e8476() {
diff --git a/test/intrinsics/gen/modf/5e8476.wgsl.expected.msl b/test/intrinsics/gen/modf/5e8476.wgsl.expected.msl
index 7b9a4e6..531930f 100644
--- a/test/intrinsics/gen/modf/5e8476.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/5e8476.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/modf/5e8476.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_modf(float param_0, thread float* param_1) {
+  float whole;
+  float fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_5e8476(thread float* const tint_symbol_2) {
-  float res = modf(1.0f, *(&(*(tint_symbol_2))));
+  float res = tint_modf(1.0f, &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/5e8476.wgsl.expected.spvasm b/test/intrinsics/gen/modf/5e8476.wgsl.expected.spvasm
index f3a8bdb..f9c55e2 100644
--- a/test/intrinsics/gen/modf/5e8476.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/5e8476.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/5e8476.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/5e8476.wgsl.expected.wgsl b/test/intrinsics/gen/modf/5e8476.wgsl.expected.wgsl
index 6d26235..5888c21 100644
--- a/test/intrinsics/gen/modf/5e8476.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/5e8476.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/5e8476.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 var<private> arg_1 : f32;
 
 fn modf_5e8476() {
diff --git a/test/intrinsics/gen/modf/684d46.wgsl b/test/intrinsics/gen/modf/684d46.wgsl
new file mode 100644
index 0000000..d983b72
--- /dev/null
+++ b/test/intrinsics/gen/modf/684d46.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(f32) -> _modf_result
+fn modf_684d46() {
+  var res = modf(1.0);
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_684d46();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_684d46();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_684d46();
+}
diff --git a/test/intrinsics/gen/modf/684d46.wgsl.expected.hlsl b/test/intrinsics/gen/modf/684d46.wgsl.expected.hlsl
new file mode 100644
index 0000000..77b05b7
--- /dev/null
+++ b/test/intrinsics/gen/modf/684d46.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct modf_result {
+  float fract;
+  float whole;
+};
+modf_result tint_modf(float param_0) {
+  float whole;
+  float fract = modf(param_0, whole);
+  modf_result result = {fract, whole};
+  return result;
+}
+
+void modf_684d46() {
+  modf_result res = tint_modf(1.0f);
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  modf_684d46();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  modf_684d46();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  modf_684d46();
+  return;
+}
diff --git a/test/intrinsics/gen/modf/684d46.wgsl.expected.msl b/test/intrinsics/gen/modf/684d46.wgsl.expected.msl
new file mode 100644
index 0000000..9944617
--- /dev/null
+++ b/test/intrinsics/gen/modf/684d46.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct modf_result {
+  float fract;
+  float whole;
+};
+modf_result tint_modf(float param_0) {
+  float whole;
+  float fract = modf(param_0, whole);
+  return {fract, whole};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void modf_684d46() {
+  modf_result res = tint_modf(1.0f);
+}
+
+vertex tint_symbol vertex_main() {
+  modf_684d46();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  modf_684d46();
+  return;
+}
+
+kernel void compute_main() {
+  modf_684d46();
+  return;
+}
+
diff --git a/test/intrinsics/gen/modf/684d46.wgsl.expected.spvasm b/test/intrinsics/gen/modf/684d46.wgsl.expected.spvasm
new file mode 100644
index 0000000..9a37b68
--- /dev/null
+++ b/test/intrinsics/gen/modf/684d46.wgsl.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+         %15 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %modf_684d46 "modf_684d46"
+               OpName %_modf_result "_modf_result"
+               OpMemberName %_modf_result 0 "fract"
+               OpMemberName %_modf_result 1 "whole"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_modf_result 0 Offset 0
+               OpMemberDecorate %_modf_result 1 Offset 4
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+%_modf_result = OpTypeStruct %float %float
+    %float_1 = OpConstant %float 1
+%_ptr_Function__modf_result = OpTypePointer Function %_modf_result
+         %19 = OpConstantNull %_modf_result
+         %20 = OpTypeFunction %void %v4float
+%modf_684d46 = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__modf_result Function %19
+         %13 = OpExtInst %_modf_result %15 ModfStruct %float_1
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %20
+%tint_symbol = OpFunctionParameter %v4float
+         %23 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %25 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %26 = OpFunctionCall %void %modf_684d46
+         %27 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %modf_684d46
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %32 = OpLabel
+         %33 = OpFunctionCall %void %modf_684d46
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/modf/684d46.wgsl.expected.wgsl b/test/intrinsics/gen/modf/684d46.wgsl.expected.wgsl
new file mode 100644
index 0000000..3686ead
--- /dev/null
+++ b/test/intrinsics/gen/modf/684d46.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn modf_684d46() {
+  var res = modf(1.0);
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_684d46();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_684d46();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_684d46();
+}
diff --git a/test/intrinsics/gen/modf/86441c.wgsl.expected.hlsl b/test/intrinsics/gen/modf/86441c.wgsl.expected.hlsl
index 21ca45c..8106372 100644
--- a/test/intrinsics/gen/modf/86441c.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/86441c.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/86441c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 void modf_86441c() {
   float2 arg_1 = float2(0.0f, 0.0f);
   float2 res = modf(float2(0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/86441c.wgsl.expected.msl b/test/intrinsics/gen/modf/86441c.wgsl.expected.msl
index 900085d..bd5a595 100644
--- a/test/intrinsics/gen/modf/86441c.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/86441c.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/86441c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_modf(float2 param_0, thread float2* param_1) {
+  float2 whole;
+  float2 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_86441c() {
   float2 arg_1 = 0.0f;
-  float2 res = modf(float2(), *(&(arg_1)));
+  float2 res = tint_modf(float2(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/86441c.wgsl.expected.spvasm b/test/intrinsics/gen/modf/86441c.wgsl.expected.spvasm
index 7a41b14..3567057 100644
--- a/test/intrinsics/gen/modf/86441c.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/86441c.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/86441c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/86441c.wgsl.expected.wgsl b/test/intrinsics/gen/modf/86441c.wgsl.expected.wgsl
index a9c1e38..f2940fe 100644
--- a/test/intrinsics/gen/modf/86441c.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/86441c.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/86441c.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_86441c() {
   var arg_1 : vec2<f32>;
   var res : vec2<f32> = modf(vec2<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/955651.wgsl.expected.hlsl b/test/intrinsics/gen/modf/955651.wgsl.expected.hlsl
index 02cf941..de9a0a0 100644
--- a/test/intrinsics/gen/modf/955651.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/955651.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/955651.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 void modf_955651() {
   float3 arg_1 = float3(0.0f, 0.0f, 0.0f);
   float3 res = modf(float3(0.0f, 0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/955651.wgsl.expected.msl b/test/intrinsics/gen/modf/955651.wgsl.expected.msl
index 25b521c..937fbe1 100644
--- a/test/intrinsics/gen/modf/955651.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/955651.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/955651.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_modf(float3 param_0, thread float3* param_1) {
+  float3 whole;
+  float3 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_955651() {
   float3 arg_1 = 0.0f;
-  float3 res = modf(float3(), *(&(arg_1)));
+  float3 res = tint_modf(float3(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/955651.wgsl.expected.spvasm b/test/intrinsics/gen/modf/955651.wgsl.expected.spvasm
index 192d324..01fe4be 100644
--- a/test/intrinsics/gen/modf/955651.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/955651.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/955651.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/955651.wgsl.expected.wgsl b/test/intrinsics/gen/modf/955651.wgsl.expected.wgsl
index bf94c38..aab1a1e 100644
--- a/test/intrinsics/gen/modf/955651.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/955651.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/955651.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_955651() {
   var arg_1 : vec3<f32>;
   var res : vec3<f32> = modf(vec3<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/9b44a9.wgsl b/test/intrinsics/gen/modf/9b44a9.wgsl
new file mode 100644
index 0000000..2556b01
--- /dev/null
+++ b/test/intrinsics/gen/modf/9b44a9.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(vec<4, f32>) -> _modf_result_vec<4>
+fn modf_9b44a9() {
+  var res = modf(vec4<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_9b44a9();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_9b44a9();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_9b44a9();
+}
diff --git a/test/intrinsics/gen/modf/9b44a9.wgsl.expected.hlsl b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.hlsl
new file mode 100644
index 0000000..56faa20
--- /dev/null
+++ b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct modf_result_vec4 {
+  float4 fract;
+  float4 whole;
+};
+modf_result_vec4 tint_modf(float4 param_0) {
+  float4 whole;
+  float4 fract = modf(param_0, whole);
+  modf_result_vec4 result = {fract, whole};
+  return result;
+}
+
+void modf_9b44a9() {
+  modf_result_vec4 res = tint_modf(float4(0.0f, 0.0f, 0.0f, 0.0f));
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  modf_9b44a9();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  modf_9b44a9();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  modf_9b44a9();
+  return;
+}
diff --git a/test/intrinsics/gen/modf/9b44a9.wgsl.expected.msl b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.msl
new file mode 100644
index 0000000..86541b3
--- /dev/null
+++ b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct modf_result_vec4 {
+  float4 fract;
+  float4 whole;
+};
+modf_result_vec4 tint_modf(float4 param_0) {
+  float4 whole;
+  float4 fract = modf(param_0, whole);
+  return {fract, whole};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void modf_9b44a9() {
+  modf_result_vec4 res = tint_modf(float4());
+}
+
+vertex tint_symbol vertex_main() {
+  modf_9b44a9();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  modf_9b44a9();
+  return;
+}
+
+kernel void compute_main() {
+  modf_9b44a9();
+  return;
+}
+
diff --git a/test/intrinsics/gen/modf/9b44a9.wgsl.expected.spvasm b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.spvasm
new file mode 100644
index 0000000..c15a37c
--- /dev/null
+++ b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.spvasm
@@ -0,0 +1,74 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 34
+; Schema: 0
+               OpCapability Shader
+         %15 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %modf_9b44a9 "modf_9b44a9"
+               OpName %_modf_result_vec4 "_modf_result_vec4"
+               OpMemberName %_modf_result_vec4 0 "fract"
+               OpMemberName %_modf_result_vec4 1 "whole"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_modf_result_vec4 0 Offset 0
+               OpMemberDecorate %_modf_result_vec4 1 Offset 16
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+%_modf_result_vec4 = OpTypeStruct %v4float %v4float
+%_ptr_Function__modf_result_vec4 = OpTypePointer Function %_modf_result_vec4
+         %18 = OpConstantNull %_modf_result_vec4
+         %19 = OpTypeFunction %void %v4float
+    %float_1 = OpConstant %float 1
+%modf_9b44a9 = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__modf_result_vec4 Function %18
+         %13 = OpExtInst %_modf_result_vec4 %15 ModfStruct %8
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %19
+%tint_symbol = OpFunctionParameter %v4float
+         %22 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %24 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %26 = OpFunctionCall %void %modf_9b44a9
+         %27 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %29 = OpLabel
+         %30 = OpFunctionCall %void %modf_9b44a9
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %32 = OpLabel
+         %33 = OpFunctionCall %void %modf_9b44a9
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/modf/9b44a9.wgsl.expected.wgsl b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.wgsl
new file mode 100644
index 0000000..2009bff
--- /dev/null
+++ b/test/intrinsics/gen/modf/9b44a9.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn modf_9b44a9() {
+  var res = modf(vec4<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_9b44a9();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_9b44a9();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_9b44a9();
+}
diff --git a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.hlsl b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.hlsl
index 26b8eaf..112167d 100644
--- a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/9c6a91.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 static float2 arg_1 = float2(0.0f, 0.0f);
 
 void modf_9c6a91() {
diff --git a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.msl b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.msl
index 475c8e0..b702b5c 100644
--- a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/modf/9c6a91.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_modf(float2 param_0, thread float2* param_1) {
+  float2 whole;
+  float2 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_9c6a91(thread float2* const tint_symbol_2) {
-  float2 res = modf(float2(), *(&(*(tint_symbol_2))));
+  float2 res = tint_modf(float2(), &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.spvasm b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.spvasm
index 73bad5d..5ebe38b 100644
--- a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/9c6a91.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.wgsl b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.wgsl
index 87aae4f..dff1475 100644
--- a/test/intrinsics/gen/modf/9c6a91.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/9c6a91.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/9c6a91.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 var<private> arg_1 : vec2<f32>;
 
 fn modf_9c6a91() {
diff --git a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.hlsl b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.hlsl
index 72befc3..1197885 100644
--- a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/9cecfc.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 static float3 arg_1 = float3(0.0f, 0.0f, 0.0f);
 
 void modf_9cecfc() {
diff --git a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.msl b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.msl
index 617d3c7..2a8186e 100644
--- a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.msl
@@ -1,12 +1,24 @@
+intrinsics/gen/modf/9cecfc.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_modf(float3 param_0, thread float3* param_1) {
+  float3 whole;
+  float3 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_9cecfc(thread float3* const tint_symbol_2) {
-  float3 res = modf(float3(), *(&(*(tint_symbol_2))));
+  float3 res = tint_modf(float3(), &(*(tint_symbol_2)));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.spvasm b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.spvasm
index 0700451..70dd5db 100644
--- a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/9cecfc.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.wgsl b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.wgsl
index 48ea3c8..7ad6c49 100644
--- a/test/intrinsics/gen/modf/9cecfc.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/9cecfc.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/9cecfc.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 var<private> arg_1 : vec3<f32>;
 
 fn modf_9cecfc() {
diff --git a/test/intrinsics/gen/modf/a128ab.wgsl.expected.hlsl b/test/intrinsics/gen/modf/a128ab.wgsl.expected.hlsl
index b900c7b..8bb5fd8 100644
--- a/test/intrinsics/gen/modf/a128ab.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/a128ab.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/a128ab.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 groupshared float2 arg_1;
 
 void modf_a128ab() {
diff --git a/test/intrinsics/gen/modf/a128ab.wgsl.expected.msl b/test/intrinsics/gen/modf/a128ab.wgsl.expected.msl
index bc45ed1..175efd8 100644
--- a/test/intrinsics/gen/modf/a128ab.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/a128ab.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/modf/a128ab.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_modf(float2 param_0, threadgroup float2* param_1) {
+  float2 whole;
+  float2 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 void modf_a128ab(threadgroup float2* const tint_symbol_1) {
-  float2 res = modf(float2(), *(&(*(tint_symbol_1))));
+  float2 res = tint_modf(float2(), &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:16: error: no matching function for call to 'modf'
-  float2 res = modf(float2(), *(&(*(tint_symbol_1))));
-               ^~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4854:19: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup float2' (vector of 2 'float' values)), parameter type must be 'metal::float2 &' (aka 'float2 &')
-METAL_FUNC float2 modf(float2 x, thread float2 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3142:17: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'half' for 1st argument
-METAL_FUNC half modf(half x, thread half &intval)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3386:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::half2' (aka 'half2') for 1st argument
-METAL_FUNC half2 modf(half2 x, thread half2 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3630:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::half3' (aka 'half3') for 1st argument
-METAL_FUNC half3 modf(half3 x, thread half3 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3874:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::half4' (aka 'half4') for 1st argument
-METAL_FUNC half4 modf(half4 x, thread half4 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4610:18: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'float' for 1st argument
-METAL_FUNC float modf(float x, thread float &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5098:19: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::float3' (aka 'float3') for 1st argument
-METAL_FUNC float3 modf(float3 x, thread float3 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5342:19: note: candidate function not viable: no known conversion from 'float2' (vector of 2 'float' values) to 'metal::float4' (aka 'float4') for 1st argument
-METAL_FUNC float4 modf(float4 x, thread float4 &intval)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/modf/a128ab.wgsl.expected.spvasm b/test/intrinsics/gen/modf/a128ab.wgsl.expected.spvasm
index ef64e6d..bb3dca7 100644
--- a/test/intrinsics/gen/modf/a128ab.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/a128ab.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/a128ab.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/a128ab.wgsl.expected.wgsl b/test/intrinsics/gen/modf/a128ab.wgsl.expected.wgsl
index fffc39b..89a4a28 100644
--- a/test/intrinsics/gen/modf/a128ab.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/a128ab.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/a128ab.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 var<workgroup> arg_1 : vec2<f32>;
 
 fn modf_a128ab() {
diff --git a/test/intrinsics/gen/modf/a54eca.wgsl.expected.hlsl b/test/intrinsics/gen/modf/a54eca.wgsl.expected.hlsl
index 59e0e3c..d3ed29a 100644
--- a/test/intrinsics/gen/modf/a54eca.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/a54eca.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/a54eca.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 void modf_a54eca() {
   float2 arg_1 = float2(0.0f, 0.0f);
   float2 res = modf(float2(0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/a54eca.wgsl.expected.msl b/test/intrinsics/gen/modf/a54eca.wgsl.expected.msl
index 6c583ed..94ea876 100644
--- a/test/intrinsics/gen/modf/a54eca.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/a54eca.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/a54eca.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float2 tint_modf(float2 param_0, thread float2* param_1) {
+  float2 whole;
+  float2 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_a54eca() {
   float2 arg_1 = 0.0f;
-  float2 res = modf(float2(), *(&(arg_1)));
+  float2 res = tint_modf(float2(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/a54eca.wgsl.expected.spvasm b/test/intrinsics/gen/modf/a54eca.wgsl.expected.spvasm
index c8d52c5..99928e1 100644
--- a/test/intrinsics/gen/modf/a54eca.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/a54eca.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/a54eca.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/a54eca.wgsl.expected.wgsl b/test/intrinsics/gen/modf/a54eca.wgsl.expected.wgsl
index 39c4a77..4e886cd 100644
--- a/test/intrinsics/gen/modf/a54eca.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/a54eca.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/a54eca.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec2<f32> = modf(vec2<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_a54eca() {
   var arg_1 : vec2<f32>;
   var res : vec2<f32> = modf(vec2<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/bb9088.wgsl.expected.hlsl b/test/intrinsics/gen/modf/bb9088.wgsl.expected.hlsl
index 22f570d..7a37367 100644
--- a/test/intrinsics/gen/modf/bb9088.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/bb9088.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/bb9088.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 groupshared float3 arg_1;
 
 void modf_bb9088() {
diff --git a/test/intrinsics/gen/modf/bb9088.wgsl.expected.msl b/test/intrinsics/gen/modf/bb9088.wgsl.expected.msl
index 44671b2..45dc355 100644
--- a/test/intrinsics/gen/modf/bb9088.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/bb9088.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/modf/bb9088.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float3 tint_modf(float3 param_0, threadgroup float3* param_1) {
+  float3 whole;
+  float3 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 void modf_bb9088(threadgroup float3* const tint_symbol_1) {
-  float3 res = modf(float3(), *(&(*(tint_symbol_1))));
+  float3 res = tint_modf(float3(), &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:16: error: no matching function for call to 'modf'
-  float3 res = modf(float3(), *(&(*(tint_symbol_1))));
-               ^~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5098:19: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup float3' (vector of 3 'float' values)), parameter type must be 'metal::float3 &' (aka 'float3 &')
-METAL_FUNC float3 modf(float3 x, thread float3 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3142:17: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'half' for 1st argument
-METAL_FUNC half modf(half x, thread half &intval)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3386:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::half2' (aka 'half2') for 1st argument
-METAL_FUNC half2 modf(half2 x, thread half2 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3630:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::half3' (aka 'half3') for 1st argument
-METAL_FUNC half3 modf(half3 x, thread half3 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3874:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::half4' (aka 'half4') for 1st argument
-METAL_FUNC half4 modf(half4 x, thread half4 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4610:18: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'float' for 1st argument
-METAL_FUNC float modf(float x, thread float &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4854:19: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::float2' (aka 'float2') for 1st argument
-METAL_FUNC float2 modf(float2 x, thread float2 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5342:19: note: candidate function not viable: no known conversion from 'float3' (vector of 3 'float' values) to 'metal::float4' (aka 'float4') for 1st argument
-METAL_FUNC float4 modf(float4 x, thread float4 &intval)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/modf/bb9088.wgsl.expected.spvasm b/test/intrinsics/gen/modf/bb9088.wgsl.expected.spvasm
index df3e8e6..51b1647 100644
--- a/test/intrinsics/gen/modf/bb9088.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/bb9088.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/bb9088.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/bb9088.wgsl.expected.wgsl b/test/intrinsics/gen/modf/bb9088.wgsl.expected.wgsl
index bd9e14c..50f629e 100644
--- a/test/intrinsics/gen/modf/bb9088.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/bb9088.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/bb9088.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec3<f32> = modf(vec3<f32>(), &arg_1);
+                       ^^^^
+
 var<workgroup> arg_1 : vec3<f32>;
 
 fn modf_bb9088() {
diff --git a/test/intrinsics/gen/modf/c87851.wgsl b/test/intrinsics/gen/modf/c87851.wgsl
new file mode 100644
index 0000000..55f7ea8
--- /dev/null
+++ b/test/intrinsics/gen/modf/c87851.wgsl
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+////////////////////////////////////////////////////////////////////////////////
+// File generated by tools/intrinsic-gen
+// using the template:
+//   test/intrinsics/intrinsics.wgsl.tmpl
+// and the intrinsic defintion file:
+//   src/intrinsics.def
+//
+// Do not modify this file directly
+////////////////////////////////////////////////////////////////////////////////
+
+
+// fn modf(vec<2, f32>) -> _modf_result_vec<2>
+fn modf_c87851() {
+  var res = modf(vec2<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_c87851();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_c87851();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_c87851();
+}
diff --git a/test/intrinsics/gen/modf/c87851.wgsl.expected.hlsl b/test/intrinsics/gen/modf/c87851.wgsl.expected.hlsl
new file mode 100644
index 0000000..bffd646
--- /dev/null
+++ b/test/intrinsics/gen/modf/c87851.wgsl.expected.hlsl
@@ -0,0 +1,35 @@
+struct modf_result_vec2 {
+  float2 fract;
+  float2 whole;
+};
+modf_result_vec2 tint_modf(float2 param_0) {
+  float2 whole;
+  float2 fract = modf(param_0, whole);
+  modf_result_vec2 result = {fract, whole};
+  return result;
+}
+
+void modf_c87851() {
+  modf_result_vec2 res = tint_modf(float2(0.0f, 0.0f));
+}
+
+struct tint_symbol {
+  float4 value : SV_Position;
+};
+
+tint_symbol vertex_main() {
+  modf_c87851();
+  const tint_symbol tint_symbol_1 = {float4(0.0f, 0.0f, 0.0f, 0.0f)};
+  return tint_symbol_1;
+}
+
+void fragment_main() {
+  modf_c87851();
+  return;
+}
+
+[numthreads(1, 1, 1)]
+void compute_main() {
+  modf_c87851();
+  return;
+}
diff --git a/test/intrinsics/gen/modf/c87851.wgsl.expected.msl b/test/intrinsics/gen/modf/c87851.wgsl.expected.msl
new file mode 100644
index 0000000..4bcc460
--- /dev/null
+++ b/test/intrinsics/gen/modf/c87851.wgsl.expected.msl
@@ -0,0 +1,38 @@
+#include <metal_stdlib>
+
+using namespace metal;
+
+struct modf_result_vec2 {
+  float2 fract;
+  float2 whole;
+};
+modf_result_vec2 tint_modf(float2 param_0) {
+  float2 whole;
+  float2 fract = modf(param_0, whole);
+  return {fract, whole};
+}
+
+struct tint_symbol {
+  float4 value [[position]];
+};
+
+void modf_c87851() {
+  modf_result_vec2 res = tint_modf(float2());
+}
+
+vertex tint_symbol vertex_main() {
+  modf_c87851();
+  tint_symbol const tint_symbol_1 = {.value=float4()};
+  return tint_symbol_1;
+}
+
+fragment void fragment_main() {
+  modf_c87851();
+  return;
+}
+
+kernel void compute_main() {
+  modf_c87851();
+  return;
+}
+
diff --git a/test/intrinsics/gen/modf/c87851.wgsl.expected.spvasm b/test/intrinsics/gen/modf/c87851.wgsl.expected.spvasm
new file mode 100644
index 0000000..d8cbd3d
--- /dev/null
+++ b/test/intrinsics/gen/modf/c87851.wgsl.expected.spvasm
@@ -0,0 +1,76 @@
+; SPIR-V
+; Version: 1.3
+; Generator: Google Tint Compiler; 0
+; Bound: 36
+; Schema: 0
+               OpCapability Shader
+         %16 = OpExtInstImport "GLSL.std.450"
+               OpMemoryModel Logical GLSL450
+               OpEntryPoint Vertex %vertex_main "vertex_main" %tint_pointsize %tint_symbol_1
+               OpEntryPoint Fragment %fragment_main "fragment_main"
+               OpEntryPoint GLCompute %compute_main "compute_main"
+               OpExecutionMode %fragment_main OriginUpperLeft
+               OpExecutionMode %compute_main LocalSize 1 1 1
+               OpName %tint_pointsize "tint_pointsize"
+               OpName %tint_symbol_1 "tint_symbol_1"
+               OpName %modf_c87851 "modf_c87851"
+               OpName %_modf_result_vec2 "_modf_result_vec2"
+               OpMemberName %_modf_result_vec2 0 "fract"
+               OpMemberName %_modf_result_vec2 1 "whole"
+               OpName %res "res"
+               OpName %tint_symbol_2 "tint_symbol_2"
+               OpName %tint_symbol "tint_symbol"
+               OpName %vertex_main "vertex_main"
+               OpName %fragment_main "fragment_main"
+               OpName %compute_main "compute_main"
+               OpDecorate %tint_pointsize BuiltIn PointSize
+               OpDecorate %tint_symbol_1 BuiltIn Position
+               OpMemberDecorate %_modf_result_vec2 0 Offset 0
+               OpMemberDecorate %_modf_result_vec2 1 Offset 8
+      %float = OpTypeFloat 32
+%_ptr_Output_float = OpTypePointer Output %float
+          %4 = OpConstantNull %float
+%tint_pointsize = OpVariable %_ptr_Output_float Output %4
+    %v4float = OpTypeVector %float 4
+%_ptr_Output_v4float = OpTypePointer Output %v4float
+          %8 = OpConstantNull %v4float
+%tint_symbol_1 = OpVariable %_ptr_Output_v4float Output %8
+       %void = OpTypeVoid
+          %9 = OpTypeFunction %void
+    %v2float = OpTypeVector %float 2
+%_modf_result_vec2 = OpTypeStruct %v2float %v2float
+         %17 = OpConstantNull %v2float
+%_ptr_Function__modf_result_vec2 = OpTypePointer Function %_modf_result_vec2
+         %20 = OpConstantNull %_modf_result_vec2
+         %21 = OpTypeFunction %void %v4float
+    %float_1 = OpConstant %float 1
+%modf_c87851 = OpFunction %void None %9
+         %12 = OpLabel
+        %res = OpVariable %_ptr_Function__modf_result_vec2 Function %20
+         %13 = OpExtInst %_modf_result_vec2 %16 ModfStruct %17
+               OpStore %res %13
+               OpReturn
+               OpFunctionEnd
+%tint_symbol_2 = OpFunction %void None %21
+%tint_symbol = OpFunctionParameter %v4float
+         %24 = OpLabel
+               OpStore %tint_symbol_1 %tint_symbol
+               OpReturn
+               OpFunctionEnd
+%vertex_main = OpFunction %void None %9
+         %26 = OpLabel
+               OpStore %tint_pointsize %float_1
+         %28 = OpFunctionCall %void %modf_c87851
+         %29 = OpFunctionCall %void %tint_symbol_2 %8
+               OpReturn
+               OpFunctionEnd
+%fragment_main = OpFunction %void None %9
+         %31 = OpLabel
+         %32 = OpFunctionCall %void %modf_c87851
+               OpReturn
+               OpFunctionEnd
+%compute_main = OpFunction %void None %9
+         %34 = OpLabel
+         %35 = OpFunctionCall %void %modf_c87851
+               OpReturn
+               OpFunctionEnd
diff --git a/test/intrinsics/gen/modf/c87851.wgsl.expected.wgsl b/test/intrinsics/gen/modf/c87851.wgsl.expected.wgsl
new file mode 100644
index 0000000..9edd1bf
--- /dev/null
+++ b/test/intrinsics/gen/modf/c87851.wgsl.expected.wgsl
@@ -0,0 +1,19 @@
+fn modf_c87851() {
+  var res = modf(vec2<f32>());
+}
+
+[[stage(vertex)]]
+fn vertex_main() -> [[builtin(position)]] vec4<f32> {
+  modf_c87851();
+  return vec4<f32>();
+}
+
+[[stage(fragment)]]
+fn fragment_main() {
+  modf_c87851();
+}
+
+[[stage(compute), workgroup_size(1)]]
+fn compute_main() {
+  modf_c87851();
+}
diff --git a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.hlsl b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.hlsl
index afd659d..f017b20 100644
--- a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/d1d6f6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 void modf_d1d6f6() {
   float4 arg_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
   float4 res = modf(float4(0.0f, 0.0f, 0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.msl b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.msl
index c2dd7d2..549d90e 100644
--- a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/d1d6f6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_modf(float4 param_0, thread float4* param_1) {
+  float4 whole;
+  float4 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_d1d6f6() {
   float4 arg_1 = 0.0f;
-  float4 res = modf(float4(), *(&(arg_1)));
+  float4 res = tint_modf(float4(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.spvasm b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.spvasm
index 1d40f64..aa8a3b8 100644
--- a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/d1d6f6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.wgsl b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.wgsl
index dd45517..113e0c1 100644
--- a/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/d1d6f6.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/d1d6f6.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_d1d6f6() {
   var arg_1 : vec4<f32>;
   var res : vec4<f32> = modf(vec4<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.hlsl b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.hlsl
index 726d9b5..7c29406 100644
--- a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/e38ae6.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 groupshared float arg_1;
 
 void modf_e38ae6() {
diff --git a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.msl b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.msl
index 51877e8..5ce4bb3 100644
--- a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.msl
@@ -1,10 +1,20 @@
-SKIP: FAILED
+intrinsics/gen/modf/e38ae6.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
 
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_modf(float param_0, threadgroup float* param_1) {
+  float whole;
+  float fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 void modf_e38ae6(threadgroup float* const tint_symbol_1) {
-  float res = modf(1.0f, *(&(*(tint_symbol_1))));
+  float res = tint_modf(1.0f, &(*(tint_symbol_1)));
 }
 
 kernel void compute_main(uint local_invocation_index [[thread_index_in_threadgroup]]) {
@@ -17,44 +27,3 @@
   return;
 }
 
-Compilation failed: 
-
-program_source:5:15: error: no matching function for call to 'modf'
-  float res = modf(1.0f, *(&(*(tint_symbol_1))));
-              ^~~~
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4610:18: note: candidate function not viable: address space mismatch in 2nd argument ('threadgroup float'), parameter type must be 'float &'
-METAL_FUNC float modf(float x, thread float &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3142:17: note: candidate function not viable: no known conversion from 'threadgroup float' to 'half &' for 2nd argument
-METAL_FUNC half modf(half x, thread half &intval)
-                ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3386:18: note: candidate function not viable: no known conversion from 'threadgroup float' to 'metal::half2 &' (aka 'half2 &') for 2nd argument
-METAL_FUNC half2 modf(half2 x, thread half2 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3630:18: note: candidate function not viable: no known conversion from 'threadgroup float' to 'metal::half3 &' (aka 'half3 &') for 2nd argument
-METAL_FUNC half3 modf(half3 x, thread half3 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:3874:18: note: candidate function not viable: no known conversion from 'threadgroup float' to 'metal::half4 &' (aka 'half4 &') for 2nd argument
-METAL_FUNC half4 modf(half4 x, thread half4 &intval)
-                 ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:4854:19: note: candidate function not viable: no known conversion from 'threadgroup float' to 'metal::float2 &' (aka 'float2 &') for 2nd argument
-METAL_FUNC float2 modf(float2 x, thread float2 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5098:19: note: candidate function not viable: no known conversion from 'threadgroup float' to 'metal::float3 &' (aka 'float3 &') for 2nd argument
-METAL_FUNC float3 modf(float3 x, thread float3 &intval)
-                  ^
-/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/31001/Libraries/lib/clang/31001.189/include/metal/metal_math:5342:19: note: candidate function not viable: no known conversion from 'threadgroup float' to 'metal::float4 &' (aka 'float4 &') for 2nd argument
-METAL_FUNC float4 modf(float4 x, thread float4 &intval)
-                  ^
-program_source:10:31: warning: equality comparison with extraneous parentheses
-  if ((local_invocation_index == 0u)) {
-       ~~~~~~~~~~~~~~~~~~~~~~~^~~~~
-program_source:10:31: note: remove extraneous parentheses around the comparison to silence this warning
-  if ((local_invocation_index == 0u)) {
-      ~                       ^    ~
-program_source:10:31: note: use '=' to turn this equality comparison into an assignment
-  if ((local_invocation_index == 0u)) {
-                              ^~
-                              =
-
-
diff --git a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.spvasm b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.spvasm
index 3dfafee..b5fd9e9 100644
--- a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/e38ae6.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.wgsl b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.wgsl
index 6f45f8f..af186d1 100644
--- a/test/intrinsics/gen/modf/e38ae6.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/e38ae6.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/e38ae6.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 var<workgroup> arg_1 : f32;
 
 fn modf_e38ae6() {
diff --git a/test/intrinsics/gen/modf/e83560.wgsl.expected.hlsl b/test/intrinsics/gen/modf/e83560.wgsl.expected.hlsl
index fbd15df..dbc6c6e 100644
--- a/test/intrinsics/gen/modf/e83560.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/e83560.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/e83560.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 void modf_e83560() {
   float4 arg_1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
   float4 res = modf(float4(0.0f, 0.0f, 0.0f, 0.0f), arg_1);
diff --git a/test/intrinsics/gen/modf/e83560.wgsl.expected.msl b/test/intrinsics/gen/modf/e83560.wgsl.expected.msl
index 922a972..28bee9f 100644
--- a/test/intrinsics/gen/modf/e83560.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/e83560.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/e83560.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float4 tint_modf(float4 param_0, thread float4* param_1) {
+  float4 whole;
+  float4 fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_e83560() {
   float4 arg_1 = 0.0f;
-  float4 res = modf(float4(), *(&(arg_1)));
+  float4 res = tint_modf(float4(), &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/e83560.wgsl.expected.spvasm b/test/intrinsics/gen/modf/e83560.wgsl.expected.spvasm
index 8e5622c..99f906d 100644
--- a/test/intrinsics/gen/modf/e83560.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/e83560.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/e83560.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/e83560.wgsl.expected.wgsl b/test/intrinsics/gen/modf/e83560.wgsl.expected.wgsl
index 55a52e2..719781c 100644
--- a/test/intrinsics/gen/modf/e83560.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/e83560.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/e83560.wgsl:29:24 warning: use of deprecated intrinsic
+  var res: vec4<f32> = modf(vec4<f32>(), &arg_1);
+                       ^^^^
+
 fn modf_e83560() {
   var arg_1 : vec4<f32>;
   var res : vec4<f32> = modf(vec4<f32>(), &(arg_1));
diff --git a/test/intrinsics/gen/modf/f90945.wgsl.expected.hlsl b/test/intrinsics/gen/modf/f90945.wgsl.expected.hlsl
index 5e79aa3..7255685 100644
--- a/test/intrinsics/gen/modf/f90945.wgsl.expected.hlsl
+++ b/test/intrinsics/gen/modf/f90945.wgsl.expected.hlsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/f90945.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 void modf_f90945() {
   float arg_1 = 0.0f;
   float res = modf(1.0f, arg_1);
diff --git a/test/intrinsics/gen/modf/f90945.wgsl.expected.msl b/test/intrinsics/gen/modf/f90945.wgsl.expected.msl
index eed1548..795e7ef 100644
--- a/test/intrinsics/gen/modf/f90945.wgsl.expected.msl
+++ b/test/intrinsics/gen/modf/f90945.wgsl.expected.msl
@@ -1,13 +1,25 @@
+intrinsics/gen/modf/f90945.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 #include <metal_stdlib>
 
 using namespace metal;
+
+float tint_modf(float param_0, thread float* param_1) {
+  float whole;
+  float fract = modf(param_0, whole);
+  *param_1 = whole;
+  return fract;
+}
+
 struct tint_symbol {
   float4 value [[position]];
 };
 
 void modf_f90945() {
   float arg_1 = 0.0f;
-  float res = modf(1.0f, *(&(arg_1)));
+  float res = tint_modf(1.0f, &(arg_1));
 }
 
 vertex tint_symbol vertex_main() {
diff --git a/test/intrinsics/gen/modf/f90945.wgsl.expected.spvasm b/test/intrinsics/gen/modf/f90945.wgsl.expected.spvasm
index 0872a2f..29b6948 100644
--- a/test/intrinsics/gen/modf/f90945.wgsl.expected.spvasm
+++ b/test/intrinsics/gen/modf/f90945.wgsl.expected.spvasm
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/f90945.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
diff --git a/test/intrinsics/gen/modf/f90945.wgsl.expected.wgsl b/test/intrinsics/gen/modf/f90945.wgsl.expected.wgsl
index 6665ed2..fb28341 100644
--- a/test/intrinsics/gen/modf/f90945.wgsl.expected.wgsl
+++ b/test/intrinsics/gen/modf/f90945.wgsl.expected.wgsl
@@ -1,3 +1,7 @@
+intrinsics/gen/modf/f90945.wgsl:29:18 warning: use of deprecated intrinsic
+  var res: f32 = modf(1.0, &arg_1);
+                 ^^^^
+
 fn modf_f90945() {
   var arg_1 : f32;
   var res : f32 = modf(1.0, &(arg_1));
diff --git a/test/intrinsics/intrinsics.wgsl.tmpl b/test/intrinsics/intrinsics.wgsl.tmpl
index 1751b6d..9ed3c42 100644
--- a/test/intrinsics/intrinsics.wgsl.tmpl
+++ b/test/intrinsics/intrinsics.wgsl.tmpl
@@ -123,7 +123,7 @@
 {{- /* Make the call to the intrinsic */ -}}
 {{- /*indent*/}}  {{/*indent*/ -}}
 {{-   if .ReturnType -}}
-  var res: {{template "Type" .ReturnType}} = {{/* preserve space after = */ -}}
+  var res{{if IsDeclarable .ReturnType}}: {{template "Type" .ReturnType}}{{end}} = {{/* preserve space after = */ -}}
 {{-   end -}}
   {{$function}}(
 {{-   range $i, $p := .Parameters -}}
diff --git a/test/intrinsics/modf.wgsl b/test/intrinsics/modf.wgsl
index dae3447..f8b1cf3 100644
--- a/test/intrinsics/modf.wgsl
+++ b/test/intrinsics/modf.wgsl
@@ -1,5 +1,6 @@
 [[stage(compute), workgroup_size(1)]]
 fn main() {
-    var whole : f32;
-    let frac : f32 = modf(1.23, &whole);
+    let res = modf(1.23);
+    let fract : f32 = res.fract;
+    let whole : f32 = res.whole;
 }
diff --git a/test/intrinsics/modf.wgsl.expected.hlsl b/test/intrinsics/modf.wgsl.expected.hlsl
index 200d084..d2bdca4 100644
--- a/test/intrinsics/modf.wgsl.expected.hlsl
+++ b/test/intrinsics/modf.wgsl.expected.hlsl
@@ -1,6 +1,18 @@
+struct modf_result {
+  float fract;
+  float whole;
+};
+modf_result tint_modf(float param_0) {
+  float whole;
+  float fract = modf(param_0, whole);
+  modf_result result = {fract, whole};
+  return result;
+}
+
 [numthreads(1, 1, 1)]
 void main() {
-  float whole = 0.0f;
-  const float tint_symbol = modf(1.230000019f, whole);
+  const modf_result res = tint_modf(1.230000019f);
+  const float fract = res.fract;
+  const float whole = res.whole;
   return;
 }
diff --git a/test/intrinsics/modf.wgsl.expected.msl b/test/intrinsics/modf.wgsl.expected.msl
index 3f2627a..6f6cf69 100644
--- a/test/intrinsics/modf.wgsl.expected.msl
+++ b/test/intrinsics/modf.wgsl.expected.msl
@@ -1,9 +1,21 @@
 #include <metal_stdlib>
 
 using namespace metal;
+
+struct modf_result {
+  float fract;
+  float whole;
+};
+modf_result tint_modf(float param_0) {
+  float whole;
+  float fract = modf(param_0, whole);
+  return {fract, whole};
+}
+
 kernel void tint_symbol() {
-  float whole = 0.0f;
-  float const frac = modf(1.230000019f, *(&(whole)));
+  modf_result const res = tint_modf(1.230000019f);
+  float const fract = res.fract;
+  float const whole = res.whole;
   return;
 }
 
diff --git a/test/intrinsics/modf.wgsl.expected.spvasm b/test/intrinsics/modf.wgsl.expected.spvasm
index 090d8b8..3122347 100644
--- a/test/intrinsics/modf.wgsl.expected.spvasm
+++ b/test/intrinsics/modf.wgsl.expected.spvasm
@@ -1,24 +1,28 @@
 ; SPIR-V
 ; Version: 1.3
 ; Generator: Google Tint Compiler; 0
-; Bound: 13
+; Bound: 12
 ; Schema: 0
                OpCapability Shader
-         %10 = OpExtInstImport "GLSL.std.450"
+          %8 = OpExtInstImport "GLSL.std.450"
                OpMemoryModel Logical GLSL450
                OpEntryPoint GLCompute %main "main"
                OpExecutionMode %main LocalSize 1 1 1
                OpName %main "main"
-               OpName %whole "whole"
+               OpName %_modf_result "_modf_result"
+               OpMemberName %_modf_result 0 "fract"
+               OpMemberName %_modf_result 1 "whole"
+               OpMemberDecorate %_modf_result 0 Offset 0
+               OpMemberDecorate %_modf_result 1 Offset 4
        %void = OpTypeVoid
           %1 = OpTypeFunction %void
       %float = OpTypeFloat 32
-%_ptr_Function_float = OpTypePointer Function %float
-          %8 = OpConstantNull %float
+%_modf_result = OpTypeStruct %float %float
 %float_1_23000002 = OpConstant %float 1.23000002
        %main = OpFunction %void None %1
           %4 = OpLabel
-      %whole = OpVariable %_ptr_Function_float Function %8
-          %9 = OpExtInst %float %10 Modf %float_1_23000002 %whole
+          %5 = OpExtInst %_modf_result %8 ModfStruct %float_1_23000002
+         %10 = OpCompositeExtract %float %5 0
+         %11 = OpCompositeExtract %float %5 1
                OpReturn
                OpFunctionEnd
diff --git a/test/intrinsics/modf.wgsl.expected.wgsl b/test/intrinsics/modf.wgsl.expected.wgsl
index eea8562..ba6a7c6 100644
--- a/test/intrinsics/modf.wgsl.expected.wgsl
+++ b/test/intrinsics/modf.wgsl.expected.wgsl
@@ -1,5 +1,6 @@
 [[stage(compute), workgroup_size(1)]]
 fn main() {
-  var whole : f32;
-  let frac : f32 = modf(1.230000019, &(whole));
+  let res = modf(1.230000019);
+  let fract : f32 = res.fract;
+  let whole : f32 = res.whole;
 }
diff --git a/tools/src/cmd/intrinsic-gen/gen/generate.go b/tools/src/cmd/intrinsic-gen/gen/generate.go
index ff256fb..6972841 100644
--- a/tools/src/cmd/intrinsic-gen/gen/generate.go
+++ b/tools/src/cmd/intrinsic-gen/gen/generate.go
@@ -58,6 +58,8 @@
 		"SplitDisplayName":      splitDisplayName,
 		"HasPrefix":             strings.HasPrefix,
 		"HasSuffix":             strings.HasSuffix,
+		"TrimPrefix":            strings.TrimPrefix,
+		"TrimSuffix":            strings.TrimSuffix,
 		"IsEnumEntry":           is(sem.EnumEntry{}),
 		"IsEnumMatcher":         is(sem.EnumMatcher{}),
 		"IsFQN":                 is(sem.FullyQualifiedName{}),
@@ -66,6 +68,7 @@
 		"IsTemplateNumberParam": is(sem.TemplateNumberParam{}),
 		"IsTemplateTypeParam":   is(sem.TemplateTypeParam{}),
 		"IsType":                is(sem.Type{}),
+		"IsDeclarable":          isDeclarable,
 		"IsFirstIn":             isFirstIn,
 		"IsLastIn":              isLastIn,
 		"IntrinsicTable":        g.intrinsicTable,
@@ -200,6 +203,13 @@
 	return out
 }
 
+// isDeclarable returns false if the FullyQualifiedName starts with a
+// leading underscore. These are undeclarable as WGSL does not allow identifers
+// to have a leading underscore.
+func isDeclarable(fqn sem.FullyQualifiedName) bool {
+	return !strings.HasPrefix(fqn.Target.GetName(), "_")
+}
+
 // pascalCase returns the snake-case string s transformed into 'PascalCase',
 // Rules:
 // * The first letter of the string is capitalized
diff --git a/tools/src/cmd/intrinsic-gen/gen/permutate.go b/tools/src/cmd/intrinsic-gen/gen/permutate.go
index aa8f77e..61fda1a 100644
--- a/tools/src/cmd/intrinsic-gen/gen/permutate.go
+++ b/tools/src/cmd/intrinsic-gen/gen/permutate.go
@@ -364,6 +364,10 @@
 		}
 	}
 
+	if !isDeclarable(fqn) {
+		return false
+	}
+
 	for _, arg := range fqn.TemplateArguments {
 		if argFQN, ok := arg.(sem.FullyQualifiedName); ok {
 			if !validate(argFQN, uses) {
diff --git a/tools/src/cmd/intrinsic-gen/lexer/lexer.go b/tools/src/cmd/intrinsic-gen/lexer/lexer.go
index 424dabb..1f25aea 100644
--- a/tools/src/cmd/intrinsic-gen/lexer/lexer.go
+++ b/tools/src/cmd/intrinsic-gen/lexer/lexer.go
@@ -91,7 +91,7 @@
 			case l.match("enum", tok.Enum):
 			case l.match("type", tok.Type):
 			case l.match("match", tok.Match):
-			case unicode.IsLetter(l.peek(0)):
+			case unicode.IsLetter(l.peek(0)) || l.peek(0) == '_':
 				l.tok(l.count(alphaNumericOrUnderscore), tok.Identifier)
 			case unicode.IsNumber(l.peek(0)):
 				l.tok(l.count(unicode.IsNumber), tok.Integer)
diff --git a/tools/src/cmd/intrinsic-gen/lexer/lexer_test.go b/tools/src/cmd/intrinsic-gen/lexer/lexer_test.go
index da354c4..d0ec922 100644
--- a/tools/src/cmd/intrinsic-gen/lexer/lexer_test.go
+++ b/tools/src/cmd/intrinsic-gen/lexer/lexer_test.go
@@ -40,6 +40,9 @@
 		{"ident_123", tok.Token{Kind: tok.Identifier, Runes: []rune("ident_123"), Source: tok.Source{
 			S: loc(1, 1, 0), E: loc(1, 10, 9),
 		}}},
+		{"_ident_", tok.Token{Kind: tok.Identifier, Runes: []rune("_ident_"), Source: tok.Source{
+			S: loc(1, 1, 0), E: loc(1, 8, 7),
+		}}},
 		{"123456789", tok.Token{Kind: tok.Integer, Runes: []rune("123456789"), Source: tok.Source{
 			S: loc(1, 1, 0), E: loc(1, 10, 9),
 		}}},