[glsl][ir] Add polyfill for `frexp`

This CL adds the `frexp` polyfill for the GLSL IR backend.

Bug: 42251044
Change-Id: I54ba14e1a6d9c47c87c1665a9d9a7d77d1312419
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/208095
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/core/core.def b/src/tint/lang/core/core.def
index 6c309eb..078da7f 100644
--- a/src/tint/lang/core/core.def
+++ b/src/tint/lang/core/core.def
@@ -235,6 +235,7 @@
   depth
   compare_value
   elements
+  exp
   height
   insert
   level
diff --git a/src/tint/lang/core/parameter_usage.cc b/src/tint/lang/core/parameter_usage.cc
index 6bc39e7..a1ade91 100644
--- a/src/tint/lang/core/parameter_usage.cc
+++ b/src/tint/lang/core/parameter_usage.cc
@@ -70,6 +70,8 @@
             return "e";
         case ParameterUsage::kElements:
             return "elements";
+        case ParameterUsage::kExp:
+            return "exp";
         case ParameterUsage::kHeight:
             return "height";
         case ParameterUsage::kId:
diff --git a/src/tint/lang/core/parameter_usage.h b/src/tint/lang/core/parameter_usage.h
index b82e903..cdc8d0b 100644
--- a/src/tint/lang/core/parameter_usage.h
+++ b/src/tint/lang/core/parameter_usage.h
@@ -61,6 +61,7 @@
     kDepthRef,
     kE,
     kElements,
+    kExp,
     kHeight,
     kId,
     kInputAttachment,
diff --git a/src/tint/lang/glsl/builtin_fn.cc b/src/tint/lang/glsl/builtin_fn.cc
index a3369a7..4c21465 100644
--- a/src/tint/lang/glsl/builtin_fn.cc
+++ b/src/tint/lang/glsl/builtin_fn.cc
@@ -80,6 +80,8 @@
             return "dot";
         case BuiltinFn::kModf:
             return "modf";
+        case BuiltinFn::kFrexp:
+            return "frexp";
         case BuiltinFn::kTextureSize:
             return "textureSize";
         case BuiltinFn::kImageSize:
diff --git a/src/tint/lang/glsl/builtin_fn.h b/src/tint/lang/glsl/builtin_fn.h
index 1ed6ba0..c4bb90b 100644
--- a/src/tint/lang/glsl/builtin_fn.h
+++ b/src/tint/lang/glsl/builtin_fn.h
@@ -66,6 +66,7 @@
     kAll,
     kDot,
     kModf,
+    kFrexp,
     kTextureSize,
     kImageSize,
     kTexelFetch,
diff --git a/src/tint/lang/glsl/glsl.def b/src/tint/lang/glsl/glsl.def
index 51e5829..d68bcd8 100644
--- a/src/tint/lang/glsl/glsl.def
+++ b/src/tint/lang/glsl/glsl.def
@@ -175,6 +175,10 @@
 @must_use @const implicit(N: num, T: f32_f16) fn modf(value: vec<N, T>,
                                                       result: ptr<function, vec<N, T>, read_write>) -> vec<N, T>
 
+@must_use @const implicit(T: f32_f16) fn frexp(value: T, exp: ptr<function, i32, read_write>) -> T
+@must_use @const implicit(N: num, T: f32_f16) fn frexp(value: vec<N, T>,
+                                                       exp : ptr<function, vec<N, i32>, read_write>) -> vec<N, T>
+
 @must_use implicit(T: fiu32) fn textureSize(texture: texture_1d<T>,
                                             level: i32) -> i32
 @must_use implicit(T: fiu32) fn textureSize(texture: texture_2d<T>,
diff --git a/src/tint/lang/glsl/intrinsic/data.cc b/src/tint/lang/glsl/intrinsic/data.cc
index 1c50097..c02e72e 100644
--- a/src/tint/lang/glsl/intrinsic/data.cc
+++ b/src/tint/lang/glsl/intrinsic/data.cc
@@ -930,135 +930,142 @@
   /* [4] */ MatcherIndex(1),
   /* [5] */ MatcherIndex(2),
   /* [6] */ MatcherIndex(8),
-  /* [7] */ MatcherIndex(7),
-  /* [8] */ MatcherIndex(13),
+  /* [7] */ MatcherIndex(6),
+  /* [8] */ MatcherIndex(12),
   /* [9] */ MatcherIndex(0),
-  /* [10] */ MatcherIndex(1),
-  /* [11] */ MatcherIndex(8),
-  /* [12] */ MatcherIndex(5),
+  /* [10] */ MatcherIndex(5),
+  /* [11] */ MatcherIndex(2),
+  /* [12] */ MatcherIndex(8),
   /* [13] */ MatcherIndex(7),
-  /* [14] */ MatcherIndex(0),
-  /* [15] */ MatcherIndex(2),
-  /* [16] */ MatcherIndex(8),
-  /* [17] */ MatcherIndex(1),
-  /* [18] */ MatcherIndex(7),
-  /* [19] */ MatcherIndex(0),
-  /* [20] */ MatcherIndex(2),
-  /* [21] */ MatcherIndex(8),
-  /* [22] */ MatcherIndex(6),
-  /* [23] */ MatcherIndex(0),
-  /* [24] */ MatcherIndex(2),
-  /* [25] */ MatcherIndex(12),
-  /* [26] */ MatcherIndex(0),
-  /* [27] */ MatcherIndex(5),
-  /* [28] */ MatcherIndex(12),
+  /* [14] */ MatcherIndex(13),
+  /* [15] */ MatcherIndex(0),
+  /* [16] */ MatcherIndex(1),
+  /* [17] */ MatcherIndex(8),
+  /* [18] */ MatcherIndex(5),
+  /* [19] */ MatcherIndex(7),
+  /* [20] */ MatcherIndex(0),
+  /* [21] */ MatcherIndex(2),
+  /* [22] */ MatcherIndex(8),
+  /* [23] */ MatcherIndex(1),
+  /* [24] */ MatcherIndex(7),
+  /* [25] */ MatcherIndex(0),
+  /* [26] */ MatcherIndex(2),
+  /* [27] */ MatcherIndex(8),
+  /* [28] */ MatcherIndex(6),
   /* [29] */ MatcherIndex(0),
-  /* [30] */ MatcherIndex(4),
-  /* [31] */ MatcherIndex(12),
-  /* [32] */ MatcherIndex(0),
-  /* [33] */ MatcherIndex(6),
-  /* [34] */ MatcherIndex(12),
-  /* [35] */ MatcherIndex(1),
-  /* [36] */ MatcherIndex(5),
-  /* [37] */ MatcherIndex(12),
-  /* [38] */ MatcherIndex(1),
+  /* [30] */ MatcherIndex(2),
+  /* [31] */ MatcherIndex(8),
+  /* [32] */ MatcherIndex(6),
+  /* [33] */ MatcherIndex(5),
+  /* [34] */ MatcherIndex(2),
+  /* [35] */ MatcherIndex(12),
+  /* [36] */ MatcherIndex(0),
+  /* [37] */ MatcherIndex(4),
+  /* [38] */ MatcherIndex(12),
   /* [39] */ MatcherIndex(0),
-  /* [40] */ MatcherIndex(12),
-  /* [41] */ MatcherIndex(0),
-  /* [42] */ MatcherIndex(2),
-  /* [43] */ MatcherIndex(26),
-  /* [44] */ MatcherIndex(0),
+  /* [40] */ MatcherIndex(6),
+  /* [41] */ MatcherIndex(12),
+  /* [42] */ MatcherIndex(1),
+  /* [43] */ MatcherIndex(5),
+  /* [44] */ MatcherIndex(12),
   /* [45] */ MatcherIndex(1),
-  /* [46] */ MatcherIndex(27),
-  /* [47] */ MatcherIndex(0),
-  /* [48] */ MatcherIndex(1),
-  /* [49] */ MatcherIndex(28),
-  /* [50] */ MatcherIndex(0),
-  /* [51] */ MatcherIndex(1),
-  /* [52] */ MatcherIndex(29),
-  /* [53] */ MatcherIndex(0),
-  /* [54] */ MatcherIndex(1),
-  /* [55] */ MatcherIndex(26),
-  /* [56] */ MatcherIndex(8),
-  /* [57] */ MatcherIndex(4),
-  /* [58] */ MatcherIndex(26),
-  /* [59] */ MatcherIndex(10),
-  /* [60] */ MatcherIndex(4),
-  /* [61] */ MatcherIndex(26),
-  /* [62] */ MatcherIndex(9),
-  /* [63] */ MatcherIndex(4),
-  /* [64] */ MatcherIndex(27),
-  /* [65] */ MatcherIndex(8),
-  /* [66] */ MatcherIndex(4),
-  /* [67] */ MatcherIndex(27),
-  /* [68] */ MatcherIndex(10),
-  /* [69] */ MatcherIndex(4),
-  /* [70] */ MatcherIndex(27),
-  /* [71] */ MatcherIndex(9),
-  /* [72] */ MatcherIndex(4),
-  /* [73] */ MatcherIndex(29),
-  /* [74] */ MatcherIndex(8),
-  /* [75] */ MatcherIndex(4),
-  /* [76] */ MatcherIndex(29),
-  /* [77] */ MatcherIndex(10),
-  /* [78] */ MatcherIndex(4),
-  /* [79] */ MatcherIndex(29),
-  /* [80] */ MatcherIndex(9),
-  /* [81] */ MatcherIndex(4),
-  /* [82] */ MatcherIndex(28),
-  /* [83] */ MatcherIndex(8),
-  /* [84] */ MatcherIndex(4),
-  /* [85] */ MatcherIndex(28),
-  /* [86] */ MatcherIndex(10),
-  /* [87] */ MatcherIndex(4),
-  /* [88] */ MatcherIndex(28),
-  /* [89] */ MatcherIndex(9),
-  /* [90] */ MatcherIndex(4),
-  /* [91] */ MatcherIndex(12),
-  /* [92] */ MatcherIndex(1),
-  /* [93] */ MatcherIndex(2),
-  /* [94] */ MatcherIndex(9),
-  /* [95] */ MatcherIndex(3),
-  /* [96] */ MatcherIndex(14),
-  /* [97] */ MatcherIndex(0),
-  /* [98] */ MatcherIndex(9),
-  /* [99] */ MatcherIndex(5),
-  /* [100] */ MatcherIndex(15),
-  /* [101] */ MatcherIndex(0),
-  /* [102] */ MatcherIndex(10),
-  /* [103] */ MatcherIndex(5),
-  /* [104] */ MatcherIndex(16),
-  /* [105] */ MatcherIndex(0),
-  /* [106] */ MatcherIndex(17),
-  /* [107] */ MatcherIndex(0),
-  /* [108] */ MatcherIndex(18),
-  /* [109] */ MatcherIndex(0),
-  /* [110] */ MatcherIndex(19),
-  /* [111] */ MatcherIndex(0),
-  /* [112] */ MatcherIndex(20),
-  /* [113] */ MatcherIndex(0),
-  /* [114] */ MatcherIndex(11),
-  /* [115] */ MatcherIndex(0),
-  /* [116] */ MatcherIndex(11),
-  /* [117] */ MatcherIndex(4),
-  /* [118] */ MatcherIndex(11),
-  /* [119] */ MatcherIndex(5),
-  /* [120] */ MatcherIndex(11),
-  /* [121] */ MatcherIndex(6),
-  /* [122] */ MatcherIndex(9),
-  /* [123] */ MatcherIndex(0),
-  /* [124] */ MatcherIndex(10),
-  /* [125] */ MatcherIndex(0),
-  /* [126] */ MatcherIndex(30),
-  /* [127] */ MatcherIndex(34),
-  /* [128] */ MatcherIndex(31),
-  /* [129] */ MatcherIndex(21),
-  /* [130] */ MatcherIndex(22),
-  /* [131] */ MatcherIndex(23),
-  /* [132] */ MatcherIndex(24),
-  /* [133] */ MatcherIndex(25),
-  /* [134] */ MatcherIndex(32),
-  /* [135] */ MatcherIndex(33),
+  /* [46] */ MatcherIndex(0),
+  /* [47] */ MatcherIndex(12),
+  /* [48] */ MatcherIndex(0),
+  /* [49] */ MatcherIndex(2),
+  /* [50] */ MatcherIndex(26),
+  /* [51] */ MatcherIndex(0),
+  /* [52] */ MatcherIndex(1),
+  /* [53] */ MatcherIndex(27),
+  /* [54] */ MatcherIndex(0),
+  /* [55] */ MatcherIndex(1),
+  /* [56] */ MatcherIndex(28),
+  /* [57] */ MatcherIndex(0),
+  /* [58] */ MatcherIndex(1),
+  /* [59] */ MatcherIndex(29),
+  /* [60] */ MatcherIndex(0),
+  /* [61] */ MatcherIndex(1),
+  /* [62] */ MatcherIndex(26),
+  /* [63] */ MatcherIndex(8),
+  /* [64] */ MatcherIndex(4),
+  /* [65] */ MatcherIndex(26),
+  /* [66] */ MatcherIndex(10),
+  /* [67] */ MatcherIndex(4),
+  /* [68] */ MatcherIndex(26),
+  /* [69] */ MatcherIndex(9),
+  /* [70] */ MatcherIndex(4),
+  /* [71] */ MatcherIndex(27),
+  /* [72] */ MatcherIndex(8),
+  /* [73] */ MatcherIndex(4),
+  /* [74] */ MatcherIndex(27),
+  /* [75] */ MatcherIndex(10),
+  /* [76] */ MatcherIndex(4),
+  /* [77] */ MatcherIndex(27),
+  /* [78] */ MatcherIndex(9),
+  /* [79] */ MatcherIndex(4),
+  /* [80] */ MatcherIndex(29),
+  /* [81] */ MatcherIndex(8),
+  /* [82] */ MatcherIndex(4),
+  /* [83] */ MatcherIndex(29),
+  /* [84] */ MatcherIndex(10),
+  /* [85] */ MatcherIndex(4),
+  /* [86] */ MatcherIndex(29),
+  /* [87] */ MatcherIndex(9),
+  /* [88] */ MatcherIndex(4),
+  /* [89] */ MatcherIndex(28),
+  /* [90] */ MatcherIndex(8),
+  /* [91] */ MatcherIndex(4),
+  /* [92] */ MatcherIndex(28),
+  /* [93] */ MatcherIndex(10),
+  /* [94] */ MatcherIndex(4),
+  /* [95] */ MatcherIndex(28),
+  /* [96] */ MatcherIndex(9),
+  /* [97] */ MatcherIndex(4),
+  /* [98] */ MatcherIndex(12),
+  /* [99] */ MatcherIndex(1),
+  /* [100] */ MatcherIndex(2),
+  /* [101] */ MatcherIndex(9),
+  /* [102] */ MatcherIndex(3),
+  /* [103] */ MatcherIndex(14),
+  /* [104] */ MatcherIndex(0),
+  /* [105] */ MatcherIndex(9),
+  /* [106] */ MatcherIndex(5),
+  /* [107] */ MatcherIndex(15),
+  /* [108] */ MatcherIndex(0),
+  /* [109] */ MatcherIndex(10),
+  /* [110] */ MatcherIndex(5),
+  /* [111] */ MatcherIndex(16),
+  /* [112] */ MatcherIndex(0),
+  /* [113] */ MatcherIndex(17),
+  /* [114] */ MatcherIndex(0),
+  /* [115] */ MatcherIndex(18),
+  /* [116] */ MatcherIndex(0),
+  /* [117] */ MatcherIndex(19),
+  /* [118] */ MatcherIndex(0),
+  /* [119] */ MatcherIndex(20),
+  /* [120] */ MatcherIndex(0),
+  /* [121] */ MatcherIndex(11),
+  /* [122] */ MatcherIndex(0),
+  /* [123] */ MatcherIndex(11),
+  /* [124] */ MatcherIndex(4),
+  /* [125] */ MatcherIndex(11),
+  /* [126] */ MatcherIndex(5),
+  /* [127] */ MatcherIndex(11),
+  /* [128] */ MatcherIndex(6),
+  /* [129] */ MatcherIndex(9),
+  /* [130] */ MatcherIndex(0),
+  /* [131] */ MatcherIndex(10),
+  /* [132] */ MatcherIndex(0),
+  /* [133] */ MatcherIndex(30),
+  /* [134] */ MatcherIndex(34),
+  /* [135] */ MatcherIndex(31),
+  /* [136] */ MatcherIndex(21),
+  /* [137] */ MatcherIndex(22),
+  /* [138] */ MatcherIndex(23),
+  /* [139] */ MatcherIndex(24),
+  /* [140] */ MatcherIndex(25),
+  /* [141] */ MatcherIndex(32),
+  /* [142] */ MatcherIndex(33),
 };
 
 static_assert(MatcherIndicesIndex::CanIndex(kMatcherIndices),
@@ -1078,37 +1085,37 @@
   {
     /* [2] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [3] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [4] */
     /* usage */ core::ParameterUsage::kBase,
-    /* matcher_indices */ MatcherIndicesIndex(37),
+    /* matcher_indices */ MatcherIndicesIndex(44),
   },
   {
     /* [5] */
     /* usage */ core::ParameterUsage::kInsert,
-    /* matcher_indices */ MatcherIndicesIndex(37),
+    /* matcher_indices */ MatcherIndicesIndex(44),
   },
   {
     /* [6] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [7] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [8] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(11),
+    /* matcher_indices */ MatcherIndicesIndex(17),
   },
   {
     /* [9] */
@@ -1123,107 +1130,107 @@
   {
     /* [11] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [12] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [13] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(37),
+    /* matcher_indices */ MatcherIndicesIndex(44),
   },
   {
     /* [14] */
     /* usage */ core::ParameterUsage::kOffset,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [15] */
     /* usage */ core::ParameterUsage::kBits,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [16] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(96),
+    /* matcher_indices */ MatcherIndicesIndex(103),
   },
   {
     /* [17] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [18] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [19] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(100),
+    /* matcher_indices */ MatcherIndicesIndex(107),
   },
   {
     /* [20] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(98),
+    /* matcher_indices */ MatcherIndicesIndex(105),
   },
   {
     /* [21] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [22] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(104),
+    /* matcher_indices */ MatcherIndicesIndex(111),
   },
   {
     /* [23] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(102),
+    /* matcher_indices */ MatcherIndicesIndex(109),
   },
   {
     /* [24] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [25] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(112),
+    /* matcher_indices */ MatcherIndicesIndex(119),
   },
   {
     /* [26] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(98),
+    /* matcher_indices */ MatcherIndicesIndex(105),
   },
   {
     /* [27] */
     /* usage */ core::ParameterUsage::kSampleIndex,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [28] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(106),
+    /* matcher_indices */ MatcherIndicesIndex(113),
   },
   {
     /* [29] */
     /* usage */ core::ParameterUsage::kLocation,
-    /* matcher_indices */ MatcherIndicesIndex(102),
+    /* matcher_indices */ MatcherIndicesIndex(109),
   },
   {
     /* [30] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [31] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(55),
+    /* matcher_indices */ MatcherIndicesIndex(62),
   },
   {
     /* [32] */
@@ -1233,12 +1240,12 @@
   {
     /* [33] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(123),
   },
   {
     /* [34] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(58),
+    /* matcher_indices */ MatcherIndicesIndex(65),
   },
   {
     /* [35] */
@@ -1248,12 +1255,12 @@
   {
     /* [36] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(125),
   },
   {
     /* [37] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(61),
+    /* matcher_indices */ MatcherIndicesIndex(68),
   },
   {
     /* [38] */
@@ -1263,147 +1270,147 @@
   {
     /* [39] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(127),
   },
   {
     /* [40] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(64),
+    /* matcher_indices */ MatcherIndicesIndex(71),
   },
   {
     /* [41] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(122),
+    /* matcher_indices */ MatcherIndicesIndex(129),
   },
   {
     /* [42] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(123),
   },
   {
     /* [43] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(67),
+    /* matcher_indices */ MatcherIndicesIndex(74),
   },
   {
     /* [44] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(122),
+    /* matcher_indices */ MatcherIndicesIndex(129),
   },
   {
     /* [45] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(125),
   },
   {
     /* [46] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(70),
+    /* matcher_indices */ MatcherIndicesIndex(77),
   },
   {
     /* [47] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(122),
+    /* matcher_indices */ MatcherIndicesIndex(129),
   },
   {
     /* [48] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(127),
   },
   {
     /* [49] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(73),
+    /* matcher_indices */ MatcherIndicesIndex(80),
   },
   {
     /* [50] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(124),
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [51] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(123),
   },
   {
     /* [52] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(76),
+    /* matcher_indices */ MatcherIndicesIndex(83),
   },
   {
     /* [53] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(124),
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [54] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(125),
   },
   {
     /* [55] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(79),
+    /* matcher_indices */ MatcherIndicesIndex(86),
   },
   {
     /* [56] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(124),
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [57] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(127),
   },
   {
     /* [58] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(82),
+    /* matcher_indices */ MatcherIndicesIndex(89),
   },
   {
     /* [59] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(124),
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [60] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(116),
+    /* matcher_indices */ MatcherIndicesIndex(123),
   },
   {
     /* [61] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(85),
+    /* matcher_indices */ MatcherIndicesIndex(92),
   },
   {
     /* [62] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(124),
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [63] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(118),
+    /* matcher_indices */ MatcherIndicesIndex(125),
   },
   {
     /* [64] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(88),
+    /* matcher_indices */ MatcherIndicesIndex(95),
   },
   {
     /* [65] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(124),
+    /* matcher_indices */ MatcherIndicesIndex(131),
   },
   {
     /* [66] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(120),
+    /* matcher_indices */ MatcherIndicesIndex(127),
   },
   {
     /* [67] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(16),
+    /* matcher_indices */ MatcherIndicesIndex(22),
   },
   {
     /* [68] */
@@ -1413,12 +1420,12 @@
   {
     /* [69] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(37),
+    /* matcher_indices */ MatcherIndicesIndex(44),
   },
   {
     /* [70] */
     /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(37),
+    /* matcher_indices */ MatcherIndicesIndex(44),
   },
   {
     /* [71] */
@@ -1428,7 +1435,7 @@
   {
     /* [72] */
     /* usage */ core::ParameterUsage::kResult,
-    /* matcher_indices */ MatcherIndicesIndex(21),
+    /* matcher_indices */ MatcherIndicesIndex(27),
   },
   {
     /* [73] */
@@ -1442,193 +1449,213 @@
   },
   {
     /* [75] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(96),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(3),
   },
   {
     /* [76] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* usage */ core::ParameterUsage::kExp,
+    /* matcher_indices */ MatcherIndicesIndex(31),
   },
   {
     /* [77] */
-    /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(100),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(2),
   },
   {
     /* [78] */
-    /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* usage */ core::ParameterUsage::kExp,
+    /* matcher_indices */ MatcherIndicesIndex(6),
   },
   {
     /* [79] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(104),
+    /* matcher_indices */ MatcherIndicesIndex(103),
   },
   {
     /* [80] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [81] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(106),
+    /* matcher_indices */ MatcherIndicesIndex(107),
   },
   {
     /* [82] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [83] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(108),
+    /* matcher_indices */ MatcherIndicesIndex(111),
   },
   {
     /* [84] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [85] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(110),
+    /* matcher_indices */ MatcherIndicesIndex(113),
   },
   {
     /* [86] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [87] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(129),
+    /* matcher_indices */ MatcherIndicesIndex(115),
   },
   {
     /* [88] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [89] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(130),
+    /* matcher_indices */ MatcherIndicesIndex(117),
   },
   {
     /* [90] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [91] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(131),
+    /* matcher_indices */ MatcherIndicesIndex(136),
   },
   {
     /* [92] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [93] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(132),
+    /* matcher_indices */ MatcherIndicesIndex(137),
   },
   {
     /* [94] */
     /* usage */ core::ParameterUsage::kLevel,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [95] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(43),
+    /* matcher_indices */ MatcherIndicesIndex(138),
   },
   {
     /* [96] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [97] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(46),
+    /* matcher_indices */ MatcherIndicesIndex(139),
   },
   {
     /* [98] */
-    /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(98),
+    /* usage */ core::ParameterUsage::kLevel,
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [99] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(49),
+    /* matcher_indices */ MatcherIndicesIndex(50),
   },
   {
     /* [100] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(102),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [101] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(52),
+    /* matcher_indices */ MatcherIndicesIndex(53),
   },
   {
     /* [102] */
     /* usage */ core::ParameterUsage::kCoords,
-    /* matcher_indices */ MatcherIndicesIndex(102),
+    /* matcher_indices */ MatcherIndicesIndex(105),
   },
   {
     /* [103] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(6),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(56),
   },
   {
     /* [104] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(30),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(109),
   },
   {
     /* [105] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(28),
+    /* usage */ core::ParameterUsage::kTexture,
+    /* matcher_indices */ MatcherIndicesIndex(59),
   },
   {
     /* [106] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* usage */ core::ParameterUsage::kCoords,
+    /* matcher_indices */ MatcherIndicesIndex(109),
   },
   {
     /* [107] */
-    /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(25),
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(12),
   },
   {
     /* [108] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(1),
+    /* matcher_indices */ MatcherIndicesIndex(37),
   },
   {
     /* [109] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(31),
+    /* matcher_indices */ MatcherIndicesIndex(35),
   },
   {
     /* [110] */
     /* usage */ core::ParameterUsage::kValue,
-    /* matcher_indices */ MatcherIndicesIndex(94),
+    /* matcher_indices */ MatcherIndicesIndex(10),
   },
   {
     /* [111] */
-    /* usage */ core::ParameterUsage::kNone,
-    /* matcher_indices */ MatcherIndicesIndex(40),
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(8),
   },
   {
     /* [112] */
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(1),
+  },
+  {
+    /* [113] */
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(38),
+  },
+  {
+    /* [114] */
+    /* usage */ core::ParameterUsage::kValue,
+    /* matcher_indices */ MatcherIndicesIndex(101),
+  },
+  {
+    /* [115] */
+    /* usage */ core::ParameterUsage::kNone,
+    /* matcher_indices */ MatcherIndicesIndex(47),
+  },
+  {
+    /* [116] */
     /* usage */ core::ParameterUsage::kTexture,
-    /* matcher_indices */ MatcherIndicesIndex(133),
+    /* matcher_indices */ MatcherIndicesIndex(140),
   },
 };
 
@@ -1651,19 +1678,19 @@
   {
     /* [2] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(126),
+    /* matcher_indices */ MatcherIndicesIndex(133),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [3] */
     /* name */ "S",
-    /* matcher_indices */ MatcherIndicesIndex(12),
+    /* matcher_indices */ MatcherIndicesIndex(10),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [4] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(126),
+    /* matcher_indices */ MatcherIndicesIndex(133),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -1675,7 +1702,7 @@
   {
     /* [6] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(127),
+    /* matcher_indices */ MatcherIndicesIndex(134),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -1705,37 +1732,37 @@
   {
     /* [11] */
     /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(95),
+    /* matcher_indices */ MatcherIndicesIndex(102),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [12] */
     /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(59),
+    /* matcher_indices */ MatcherIndicesIndex(66),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [13] */
     /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(95),
+    /* matcher_indices */ MatcherIndicesIndex(102),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [14] */
     /* name */ "F",
-    /* matcher_indices */ MatcherIndicesIndex(62),
+    /* matcher_indices */ MatcherIndicesIndex(69),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [15] */
     /* name */ "A",
-    /* matcher_indices */ MatcherIndicesIndex(95),
+    /* matcher_indices */ MatcherIndicesIndex(102),
     /* kind */ TemplateInfo::Kind::kNumber,
   },
   {
     /* [16] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(134),
+    /* matcher_indices */ MatcherIndicesIndex(141),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -1747,7 +1774,7 @@
   {
     /* [18] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(135),
+    /* matcher_indices */ MatcherIndicesIndex(142),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
@@ -1759,13 +1786,13 @@
   {
     /* [20] */
     /* name */ "T",
-    /* matcher_indices */ MatcherIndicesIndex(128),
+    /* matcher_indices */ MatcherIndicesIndex(135),
     /* kind */ TemplateInfo::Kind::kType,
   },
   {
     /* [21] */
     /* name */ "C",
-    /* matcher_indices */ MatcherIndicesIndex(126),
+    /* matcher_indices */ MatcherIndicesIndex(133),
     /* kind */ TemplateInfo::Kind::kType,
   },
 };
@@ -1775,6 +1802,7 @@
 
 constexpr core::constant::Eval::Function kConstEvalFunctions[] = {
   /* [0] */ &core::constant::Eval::modf,
+  /* [1] */ &core::constant::Eval::frexp,
 };
 
 static_assert(ConstEvalFunctionIndex::CanIndex(kConstEvalFunctions),
@@ -1788,8 +1816,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
-    /* parameters */ ParameterIndex(75),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* parameters */ ParameterIndex(79),
+    /* return_matcher_indices */ MatcherIndicesIndex(10),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1799,8 +1827,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
-    /* parameters */ ParameterIndex(77),
-    /* return_matcher_indices */ MatcherIndicesIndex(98),
+    /* parameters */ ParameterIndex(81),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1810,8 +1838,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
-    /* parameters */ ParameterIndex(79),
-    /* return_matcher_indices */ MatcherIndicesIndex(102),
+    /* parameters */ ParameterIndex(83),
+    /* return_matcher_indices */ MatcherIndicesIndex(109),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1821,8 +1849,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
-    /* parameters */ ParameterIndex(81),
-    /* return_matcher_indices */ MatcherIndicesIndex(102),
+    /* parameters */ ParameterIndex(85),
+    /* return_matcher_indices */ MatcherIndicesIndex(109),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1832,8 +1860,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
-    /* parameters */ ParameterIndex(83),
-    /* return_matcher_indices */ MatcherIndicesIndex(98),
+    /* parameters */ ParameterIndex(87),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1843,8 +1871,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
-    /* parameters */ ParameterIndex(85),
-    /* return_matcher_indices */ MatcherIndicesIndex(102),
+    /* parameters */ ParameterIndex(89),
+    /* return_matcher_indices */ MatcherIndicesIndex(109),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1854,8 +1882,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(87),
-    /* return_matcher_indices */ MatcherIndicesIndex(98),
+    /* parameters */ ParameterIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1865,8 +1893,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(89),
-    /* return_matcher_indices */ MatcherIndicesIndex(102),
+    /* parameters */ ParameterIndex(93),
+    /* return_matcher_indices */ MatcherIndicesIndex(109),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1876,8 +1904,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(91),
-    /* return_matcher_indices */ MatcherIndicesIndex(98),
+    /* parameters */ ParameterIndex(95),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1887,8 +1915,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(93),
-    /* return_matcher_indices */ MatcherIndicesIndex(102),
+    /* parameters */ ParameterIndex(97),
+    /* return_matcher_indices */ MatcherIndicesIndex(109),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1899,7 +1927,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
     /* parameters */ ParameterIndex(25),
-    /* return_matcher_indices */ MatcherIndicesIndex(98),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1909,8 +1937,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(112),
-    /* return_matcher_indices */ MatcherIndicesIndex(98),
+    /* parameters */ ParameterIndex(116),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1920,8 +1948,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(10),
-    /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* parameters */ ParameterIndex(99),
+    /* return_matcher_indices */ MatcherIndicesIndex(123),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1931,8 +1959,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(10),
-    /* parameters */ ParameterIndex(97),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* parameters */ ParameterIndex(101),
+    /* return_matcher_indices */ MatcherIndicesIndex(123),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1942,8 +1970,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(10),
-    /* parameters */ ParameterIndex(99),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* parameters */ ParameterIndex(103),
+    /* return_matcher_indices */ MatcherIndicesIndex(123),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1953,8 +1981,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(10),
-    /* parameters */ ParameterIndex(101),
-    /* return_matcher_indices */ MatcherIndicesIndex(116),
+    /* parameters */ ParameterIndex(105),
+    /* return_matcher_indices */ MatcherIndicesIndex(123),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1964,8 +1992,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(12),
-    /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* parameters */ ParameterIndex(99),
+    /* return_matcher_indices */ MatcherIndicesIndex(125),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1975,8 +2003,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(12),
-    /* parameters */ ParameterIndex(97),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* parameters */ ParameterIndex(101),
+    /* return_matcher_indices */ MatcherIndicesIndex(125),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1986,8 +2014,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(12),
-    /* parameters */ ParameterIndex(99),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* parameters */ ParameterIndex(103),
+    /* return_matcher_indices */ MatcherIndicesIndex(125),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -1997,8 +2025,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(12),
-    /* parameters */ ParameterIndex(101),
-    /* return_matcher_indices */ MatcherIndicesIndex(118),
+    /* parameters */ ParameterIndex(105),
+    /* return_matcher_indices */ MatcherIndicesIndex(125),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2008,8 +2036,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(14),
-    /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(99),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2019,8 +2047,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(14),
-    /* parameters */ ParameterIndex(97),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(101),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2030,8 +2058,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(14),
-    /* parameters */ ParameterIndex(99),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(103),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2041,8 +2069,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(14),
-    /* parameters */ ParameterIndex(101),
-    /* return_matcher_indices */ MatcherIndicesIndex(120),
+    /* parameters */ ParameterIndex(105),
+    /* return_matcher_indices */ MatcherIndicesIndex(127),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2185,7 +2213,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
     /* parameters */ ParameterIndex(16),
-    /* return_matcher_indices */ MatcherIndicesIndex(114),
+    /* return_matcher_indices */ MatcherIndicesIndex(121),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2196,7 +2224,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
     /* parameters */ ParameterIndex(19),
-    /* return_matcher_indices */ MatcherIndicesIndex(114),
+    /* return_matcher_indices */ MatcherIndicesIndex(121),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2207,7 +2235,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
     /* parameters */ ParameterIndex(22),
-    /* return_matcher_indices */ MatcherIndicesIndex(114),
+    /* return_matcher_indices */ MatcherIndicesIndex(121),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2218,7 +2246,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
     /* parameters */ ParameterIndex(25),
-    /* return_matcher_indices */ MatcherIndicesIndex(114),
+    /* return_matcher_indices */ MatcherIndicesIndex(121),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2229,7 +2257,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(20),
     /* parameters */ ParameterIndex(28),
-    /* return_matcher_indices */ MatcherIndicesIndex(114),
+    /* return_matcher_indices */ MatcherIndicesIndex(121),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2239,8 +2267,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(8),
-    /* parameters */ ParameterIndex(95),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* parameters */ ParameterIndex(99),
+    /* return_matcher_indices */ MatcherIndicesIndex(10),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2250,8 +2278,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(8),
-    /* parameters */ ParameterIndex(97),
-    /* return_matcher_indices */ MatcherIndicesIndex(98),
+    /* parameters */ ParameterIndex(101),
+    /* return_matcher_indices */ MatcherIndicesIndex(105),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2261,8 +2289,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(8),
-    /* parameters */ ParameterIndex(99),
-    /* return_matcher_indices */ MatcherIndicesIndex(102),
+    /* parameters */ ParameterIndex(103),
+    /* return_matcher_indices */ MatcherIndicesIndex(109),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2272,8 +2300,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(8),
-    /* parameters */ ParameterIndex(101),
-    /* return_matcher_indices */ MatcherIndicesIndex(102),
+    /* parameters */ ParameterIndex(105),
+    /* return_matcher_indices */ MatcherIndicesIndex(109),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2283,8 +2311,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(104),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* parameters */ ParameterIndex(108),
+    /* return_matcher_indices */ MatcherIndicesIndex(10),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2294,8 +2322,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(5),
-    /* parameters */ ParameterIndex(105),
-    /* return_matcher_indices */ MatcherIndicesIndex(25),
+    /* parameters */ ParameterIndex(109),
+    /* return_matcher_indices */ MatcherIndicesIndex(8),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2305,7 +2333,7 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(104),
+    /* parameters */ ParameterIndex(108),
     /* return_matcher_indices */ MatcherIndicesIndex(1),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
@@ -2316,8 +2344,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(5),
-    /* parameters */ ParameterIndex(105),
-    /* return_matcher_indices */ MatcherIndicesIndex(31),
+    /* parameters */ ParameterIndex(109),
+    /* return_matcher_indices */ MatcherIndicesIndex(38),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2327,8 +2355,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(106),
-    /* return_matcher_indices */ MatcherIndicesIndex(30),
+    /* parameters */ ParameterIndex(110),
+    /* return_matcher_indices */ MatcherIndicesIndex(37),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2338,8 +2366,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(5),
-    /* parameters */ ParameterIndex(107),
-    /* return_matcher_indices */ MatcherIndicesIndex(28),
+    /* parameters */ ParameterIndex(111),
+    /* return_matcher_indices */ MatcherIndicesIndex(35),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2349,8 +2377,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(108),
-    /* return_matcher_indices */ MatcherIndicesIndex(30),
+    /* parameters */ ParameterIndex(112),
+    /* return_matcher_indices */ MatcherIndicesIndex(37),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2360,8 +2388,8 @@
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(5),
-    /* parameters */ ParameterIndex(109),
-    /* return_matcher_indices */ MatcherIndicesIndex(28),
+    /* parameters */ ParameterIndex(113),
+    /* return_matcher_indices */ MatcherIndicesIndex(35),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2372,7 +2400,7 @@
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(2),
     /* parameters */ ParameterIndex(10),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* return_matcher_indices */ MatcherIndicesIndex(10),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2383,7 +2411,7 @@
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(13),
-    /* return_matcher_indices */ MatcherIndicesIndex(34),
+    /* return_matcher_indices */ MatcherIndicesIndex(41),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2405,7 +2433,7 @@
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(13),
-    /* return_matcher_indices */ MatcherIndicesIndex(37),
+    /* return_matcher_indices */ MatcherIndicesIndex(44),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2427,7 +2455,7 @@
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(4),
     /* parameters */ ParameterIndex(4),
-    /* return_matcher_indices */ MatcherIndicesIndex(37),
+    /* return_matcher_indices */ MatcherIndicesIndex(44),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
@@ -2454,17 +2482,39 @@
   },
   {
     /* [61] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 1,
+    /* templates */ TemplateIndex(6),
+    /* parameters */ ParameterIndex(75),
+    /* return_matcher_indices */ MatcherIndicesIndex(3),
+    /* const_eval_fn */ ConstEvalFunctionIndex(1),
+  },
+  {
+    /* [62] */
+    /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse),
+    /* num_parameters */ 2,
+    /* num_explicit_templates */ 0,
+    /* num_templates   */ 2,
+    /* templates */ TemplateIndex(5),
+    /* parameters */ ParameterIndex(77),
+    /* return_matcher_indices */ MatcherIndicesIndex(2),
+    /* const_eval_fn */ ConstEvalFunctionIndex(1),
+  },
+  {
+    /* [63] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline, OverloadFlag::kMustUse, OverloadFlag::kMemberFunction),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(0),
-    /* parameters */ ParameterIndex(103),
-    /* return_matcher_indices */ MatcherIndicesIndex(12),
+    /* parameters */ ParameterIndex(107),
+    /* return_matcher_indices */ MatcherIndicesIndex(10),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [62] */
+    /* [64] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 0,
     /* num_explicit_templates */ 0,
@@ -2475,7 +2525,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [63] */
+    /* [65] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 3,
     /* num_explicit_templates */ 0,
@@ -2486,7 +2536,7 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [64] */
+    /* [66] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -2497,40 +2547,40 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [65] */
+    /* [67] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(110),
+    /* parameters */ ParameterIndex(114),
     /* return_matcher_indices */ MatcherIndicesIndex(1),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [66] */
+    /* [68] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 0,
     /* templates */ TemplateIndex(/* invalid */),
-    /* parameters */ ParameterIndex(108),
-    /* return_matcher_indices */ MatcherIndicesIndex(94),
+    /* parameters */ ParameterIndex(112),
+    /* return_matcher_indices */ MatcherIndicesIndex(101),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [67] */
+    /* [69] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 1,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 1,
     /* templates */ TemplateIndex(5),
-    /* parameters */ ParameterIndex(111),
+    /* parameters */ ParameterIndex(115),
     /* return_matcher_indices */ MatcherIndicesIndex(5),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [68] */
+    /* [70] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
@@ -2541,25 +2591,25 @@
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [69] */
+    /* [71] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(16),
     /* parameters */ ParameterIndex(69),
-    /* return_matcher_indices */ MatcherIndicesIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(98),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
   {
-    /* [70] */
+    /* [72] */
     /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
     /* num_parameters */ 2,
     /* num_explicit_templates */ 0,
     /* num_templates   */ 2,
     /* templates */ TemplateIndex(18),
     /* parameters */ ParameterIndex(69),
-    /* return_matcher_indices */ MatcherIndicesIndex(91),
+    /* return_matcher_indices */ MatcherIndicesIndex(98),
     /* const_eval_fn */ ConstEvalFunctionIndex(/* invalid */),
   },
 };
@@ -2572,37 +2622,37 @@
     /* [0] */
     /* fn length[T, A : access](ptr<storage, array<T>, A>) -> i32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(61),
+    /* overloads */ OverloadIndex(63),
   },
   {
     /* [1] */
     /* fn barrier() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(62),
+    /* overloads */ OverloadIndex(64),
   },
   {
     /* [2] */
     /* fn memoryBarrierBuffer() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(62),
+    /* overloads */ OverloadIndex(64),
   },
   {
     /* [3] */
     /* fn memoryBarrierImage() */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(62),
+    /* overloads */ OverloadIndex(64),
   },
   {
     /* [4] */
     /* fn atomicCompSwap[T : iu32](ptr<workgroup_or_storage, atomic<T>, read_write>, compare_value: T, value: T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(63),
+    /* overloads */ OverloadIndex(65),
   },
   {
     /* [5] */
     /* fn atomicSub[T : iu32, S : workgroup_or_storage](ptr<S, atomic<T>, read_write>, T) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(64),
+    /* overloads */ OverloadIndex(66),
   },
   {
     /* [6] */
@@ -2657,31 +2707,31 @@
     /* [13] */
     /* fn packFloat2x16(value: vec2<f16>) -> u32 */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(65),
+    /* overloads */ OverloadIndex(67),
   },
   {
     /* [14] */
     /* fn unpackFloat2x16(value: u32) -> vec2<f16> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(66),
+    /* overloads */ OverloadIndex(68),
   },
   {
     /* [15] */
     /* fn any[N : num](vec<N, bool>) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(67),
+    /* overloads */ OverloadIndex(69),
   },
   {
     /* [16] */
     /* fn all[N : num](vec<N, bool>) -> bool */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(67),
+    /* overloads */ OverloadIndex(69),
   },
   {
     /* [17] */
     /* fn dot[T : f32_f16, N : num](vec<N, T>, vec<N, T>) -> T */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(68),
+    /* overloads */ OverloadIndex(70),
   },
   {
     /* [18] */
@@ -2692,6 +2742,13 @@
   },
   {
     /* [19] */
+    /* fn frexp[T : f32_f16](value: T, exp: ptr<function, i32, read_write>) -> T */
+    /* fn frexp[N : num, T : f32_f16](value: vec<N, T>, exp: ptr<function, vec<N, i32>, read_write>) -> vec<N, T> */
+    /* num overloads */ 2,
+    /* overloads */ OverloadIndex(61),
+  },
+  {
+    /* [20] */
     /* fn textureSize[T : fiu32](texture: texture_1d<T>, level: i32) -> i32 */
     /* fn textureSize[T : fiu32](texture: texture_2d<T>, level: i32) -> vec2<i32> */
     /* fn textureSize[T : fiu32](texture: texture_2d_array<T>, level: i32) -> vec3<i32> */
@@ -2708,7 +2765,7 @@
     /* overloads */ OverloadIndex(0),
   },
   {
-    /* [20] */
+    /* [21] */
     /* fn imageSize[F : texel_format, A : access](texture: texture_storage_1d<F, A>) -> i32 */
     /* fn imageSize[F : texel_format, A : access](texture: texture_storage_2d<F, A>) -> vec2<i32> */
     /* fn imageSize[F : texel_format, A : access](texture: texture_storage_2d_array<F, A>) -> vec3<i32> */
@@ -2717,7 +2774,7 @@
     /* overloads */ OverloadIndex(41),
   },
   {
-    /* [21] */
+    /* [22] */
     /* fn texelFetch[T : fiu32](texture: texture_1d<T>, location: i32, level: i32) -> vec4<T> */
     /* fn texelFetch[T : fiu32](texture: texture_2d<T>, location: vec2<i32>, level: i32) -> vec4<T> */
     /* fn texelFetch[T : fiu32](texture: texture_2d_array<T>, location: vec3<i32>, level: i32) -> vec4<T> */
@@ -2727,7 +2784,7 @@
     /* overloads */ OverloadIndex(36),
   },
   {
-    /* [22] */
+    /* [23] */
     /* fn imageLoad[F : f32_texel_format, A : readable](texture: texture_storage_1d<F, A>, coords: i32) -> vec4<f32> */
     /* fn imageLoad[F : f32_texel_format, A : readable](texture: texture_storage_2d<F, A>, coords: vec2<i32>) -> vec4<f32> */
     /* fn imageLoad[F : f32_texel_format, A : readable](texture: texture_storage_2d_array<F, A>, coords: vec3<i32>) -> vec4<f32> */
@@ -2744,7 +2801,7 @@
     /* overloads */ OverloadIndex(12),
   },
   {
-    /* [23] */
+    /* [24] */
     /* fn imageStore[C : iu32](texture: texture_storage_1d<f32_texel_format, writable>, coords: C, value: vec4<f32>) */
     /* fn imageStore[C : iu32](texture: texture_storage_1d<i32_texel_format, writable>, coords: C, value: vec4<i32>) */
     /* fn imageStore[C : iu32](texture: texture_storage_1d<u32_texel_format, writable>, coords: C, value: vec4<u32>) */
@@ -2761,40 +2818,40 @@
     /* overloads */ OverloadIndex(24),
   },
   {
-    /* [24] */
+    /* [25] */
     /* fn lessThan[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(69),
-  },
-  {
-    /* [25] */
-    /* fn lessThanEqual[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
-    /* num overloads */ 1,
-    /* overloads */ OverloadIndex(69),
+    /* overloads */ OverloadIndex(71),
   },
   {
     /* [26] */
-    /* fn greaterThan[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
+    /* fn lessThanEqual[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(69),
+    /* overloads */ OverloadIndex(71),
   },
   {
     /* [27] */
-    /* fn greaterThanEqual[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
+    /* fn greaterThan[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(69),
+    /* overloads */ OverloadIndex(71),
   },
   {
     /* [28] */
-    /* fn equal[T : fiu32_f16_bool, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
+    /* fn greaterThanEqual[T : fiu32_f16, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(70),
+    /* overloads */ OverloadIndex(71),
   },
   {
     /* [29] */
+    /* fn equal[T : fiu32_f16_bool, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
+    /* num overloads */ 1,
+    /* overloads */ OverloadIndex(72),
+  },
+  {
+    /* [30] */
     /* fn notEqual[T : fiu32_f16_bool, N : num](vec<N, T>, vec<N, T>) -> vec<N, bool> */
     /* num overloads */ 1,
-    /* overloads */ OverloadIndex(70),
+    /* overloads */ OverloadIndex(72),
   },
 };
 
diff --git a/src/tint/lang/glsl/writer/builtin_test.cc b/src/tint/lang/glsl/writer/builtin_test.cc
index 55eef71..529f8c3 100644
--- a/src/tint/lang/glsl/writer/builtin_test.cc
+++ b/src/tint/lang/glsl/writer/builtin_test.cc
@@ -1598,5 +1598,69 @@
 )");
 }
 
+TEST_F(GlslWriterTest, Frexp_Scalar) {
+    auto* value = b.FunctionParam<f32>("value");
+    auto* func = b.Function("foo", ty.f32());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(core::type::CreateFrexpResult(ty, mod.symbols, ty.f32()),
+                              core::BuiltinFn::kFrexp, value);
+        auto* fract = b.Access<f32>(result, 0_u);
+        auto* exp = b.Access<i32>(result, 1_u);
+        b.Return(func, b.Add<f32>(fract, b.Convert<f32>(exp)));
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_.glsl;
+    EXPECT_EQ(output_.glsl, GlslHeader() + R"(
+
+struct frexp_result_f32 {
+  float fract;
+  int exp;
+};
+
+float foo(float value) {
+  frexp_result_f32 v = frexp_result_f32(0.0f, 0);
+  v.fract = frexp(value, v.exp);
+  frexp_result_f32 v_1 = v;
+  return (v_1.fract + float(v_1.exp));
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+}
+)");
+}
+
+TEST_F(GlslWriterTest, Frexp_Vector) {
+    auto* value = b.FunctionParam<vec4<f32>>("value");
+    auto* func = b.Function("foo", ty.vec4<f32>());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(core::type::CreateFrexpResult(ty, mod.symbols, ty.vec4<f32>()),
+                              core::BuiltinFn::kFrexp, value);
+        auto* fract = b.Access<vec4<f32>>(result, 0_u);
+        auto* exp = b.Access<vec4<i32>>(result, 1_u);
+        b.Return(func, b.Add<vec4<f32>>(fract, b.Convert<vec4<f32>>(exp)));
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_.glsl;
+    EXPECT_EQ(output_.glsl, GlslHeader() + R"(
+
+struct frexp_result_vec4_f32 {
+  vec4 fract;
+  ivec4 exp;
+};
+
+vec4 foo(vec4 value) {
+  frexp_result_vec4_f32 v = frexp_result_vec4_f32(vec4(0.0f), ivec4(0));
+  v.fract = frexp(value, v.exp);
+  frexp_result_vec4_f32 v_1 = v;
+  return (v_1.fract + vec4(v_1.exp));
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+}
+)");
+}
+
 }  // namespace
 }  // namespace tint::glsl::writer
diff --git a/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc b/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc
index 7f9f727..d2ce2a7 100644
--- a/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc
+++ b/src/tint/lang/glsl/writer/raise/builtin_polyfill.cc
@@ -81,6 +81,7 @@
                     case core::BuiltinFn::kDot:
                     case core::BuiltinFn::kExtractBits:
                     case core::BuiltinFn::kFma:
+                    case core::BuiltinFn::kFrexp:
                     case core::BuiltinFn::kInsertBits:
                     case core::BuiltinFn::kModf:
                     case core::BuiltinFn::kSelect:
@@ -133,6 +134,9 @@
                 case core::BuiltinFn::kFma:
                     FMA(call);
                     break;
+                case core::BuiltinFn::kFrexp:
+                    Frexp(call);
+                    break;
                 case core::BuiltinFn::kInsertBits:
                     InsertBits(call);
                     break;
@@ -255,6 +259,26 @@
         call->Destroy();
     }
 
+    void Frexp(core::ir::BuiltinCall* call) {
+        b.InsertBefore(call, [&] {
+            // GLSL's frexp returns `fract` and outputs `whole` as an output parameter.
+            // Polyfill it by declaring the result struct and then setting the values:
+            //   __frexp_result result = {};
+            //   result.fract = frexp(arg, result.exp);
+            auto* result_type = call->Result(0)->Type();
+            auto* float_type = result_type->Element(0);
+            auto* i32_type = result_type->Element(1);
+            auto* result = b.Var(ty.ptr(function, result_type));
+            auto* exp = b.Access(ty.ptr(function, i32_type), result, u32(1));
+            auto args = Vector<core::ir::Value*, 2>{call->Args()[0], exp->Result(0)};
+            auto* res =
+                b.Call<glsl::ir::BuiltinCall>(float_type, glsl::BuiltinFn::kFrexp, std::move(args));
+            b.Store(b.Access(ty.ptr(function, float_type), result, u32(0)), res);
+            b.LoadWithResult(call->DetachResult(), result);
+        });
+        call->Destroy();
+    }
+
     void Modf(core::ir::BuiltinCall* call) {
         b.InsertBefore(call, [&] {
             // GLSL's modf returns `fract` and outputs `whole` as an output parameter.
diff --git a/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc b/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc
index 148fbe6..351ba86 100644
--- a/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc
+++ b/src/tint/lang/glsl/writer/raise/builtin_polyfill_test.cc
@@ -1811,5 +1811,121 @@
     EXPECT_EQ(expect, str());
 }
 
+TEST_F(GlslWriter_BuiltinPolyfillTest, Frexp_Scalar) {
+    auto* value = b.FunctionParam<f32>("value");
+    auto* func = b.Function("foo", ty.f32());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(core::type::CreateFrexpResult(ty, mod.symbols, ty.f32()),
+                              core::BuiltinFn::kFrexp, value);
+        auto* fract = b.Access<f32>(result, 0_u);
+        auto* exp = b.Access<i32>(result, 1_u);
+        b.Return(func, b.Add<f32>(fract, b.Convert<f32>(exp)));
+    });
+
+    auto* src = R"(
+__frexp_result_f32 = struct @align(4) {
+  fract:f32 @offset(0)
+  exp:i32 @offset(4)
+}
+
+%foo = func(%value:f32):f32 {
+  $B1: {
+    %3:__frexp_result_f32 = frexp %value
+    %4:f32 = access %3, 0u
+    %5:i32 = access %3, 1u
+    %6:f32 = convert %5
+    %7:f32 = add %4, %6
+    ret %7
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+__frexp_result_f32 = struct @align(4) {
+  fract:f32 @offset(0)
+  exp:i32 @offset(4)
+}
+
+%foo = func(%value:f32):f32 {
+  $B1: {
+    %3:ptr<function, __frexp_result_f32, read_write> = var
+    %4:ptr<function, i32, read_write> = access %3, 1u
+    %5:f32 = glsl.frexp %value, %4
+    %6:ptr<function, f32, read_write> = access %3, 0u
+    store %6, %5
+    %7:__frexp_result_f32 = load %3
+    %8:f32 = access %7, 0u
+    %9:i32 = access %7, 1u
+    %10:f32 = convert %9
+    %11:f32 = add %8, %10
+    ret %11
+  }
+}
+)";
+
+    Run(BuiltinPolyfill);
+    EXPECT_EQ(expect, str());
+}
+
+TEST_F(GlslWriter_BuiltinPolyfillTest, Frexp_Vector) {
+    auto* value = b.FunctionParam<vec4<f32>>("value");
+    auto* func = b.Function("foo", ty.vec4<f32>());
+    func->SetParams({value});
+    b.Append(func->Block(), [&] {
+        auto* result = b.Call(core::type::CreateFrexpResult(ty, mod.symbols, ty.vec4<f32>()),
+                              core::BuiltinFn::kFrexp, value);
+        auto* fract = b.Access<vec4<f32>>(result, 0_u);
+        auto* exp = b.Access<vec4<i32>>(result, 1_u);
+        b.Return(func, b.Add<vec4<f32>>(fract, b.Convert<vec4<f32>>(exp)));
+    });
+
+    auto* src = R"(
+__frexp_result_vec4_f32 = struct @align(16) {
+  fract:vec4<f32> @offset(0)
+  exp:vec4<i32> @offset(16)
+}
+
+%foo = func(%value:vec4<f32>):vec4<f32> {
+  $B1: {
+    %3:__frexp_result_vec4_f32 = frexp %value
+    %4:vec4<f32> = access %3, 0u
+    %5:vec4<i32> = access %3, 1u
+    %6:vec4<f32> = convert %5
+    %7:vec4<f32> = add %4, %6
+    ret %7
+  }
+}
+)";
+    EXPECT_EQ(src, str());
+
+    auto* expect = R"(
+__frexp_result_vec4_f32 = struct @align(16) {
+  fract:vec4<f32> @offset(0)
+  exp:vec4<i32> @offset(16)
+}
+
+%foo = func(%value:vec4<f32>):vec4<f32> {
+  $B1: {
+    %3:ptr<function, __frexp_result_vec4_f32, read_write> = var
+    %4:ptr<function, vec4<i32>, read_write> = access %3, 1u
+    %5:vec4<f32> = glsl.frexp %value, %4
+    %6:ptr<function, vec4<f32>, read_write> = access %3, 0u
+    store %6, %5
+    %7:__frexp_result_vec4_f32 = load %3
+    %8:vec4<f32> = access %7, 0u
+    %9:vec4<i32> = access %7, 1u
+    %10:vec4<f32> = convert %9
+    %11:vec4<f32> = add %8, %10
+    ret %11
+  }
+}
+)";
+
+    Run(BuiltinPolyfill);
+    EXPECT_EQ(expect, str());
+}
+
 }  // namespace
 }  // namespace tint::glsl::writer::raise
diff --git a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.ir.glsl b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.ir.glsl
index 08584a6..cebdbd7 100644
--- a/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/frexp/scalar/mixed.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 
@@ -12,18 +10,10 @@
 void main() {
   float runtime_in = 1.25f;
   frexp_result_f32 res = frexp_result_f32(0.625f, 1);
-  res = frexp(runtime_in);
+  frexp_result_f32 v = frexp_result_f32(0.0f, 0);
+  v.fract = frexp(runtime_in, v.exp);
+  res = v;
   res = frexp_result_f32(0.625f, 1);
   float tint_symbol_1 = res.fract;
   int tint_symbol_2 = res.exp;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:13: 'frexp' : no matching overloaded function found 
-ERROR: 0:13: 'assign' :  cannot convert from ' const float' to ' temp structure{ global highp float fract,  global highp int exp}'
-ERROR: 0:13: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.ir.glsl b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.ir.glsl
index 2621d07..ee00b47 100644
--- a/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/frexp/scalar/runtime.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 
@@ -11,17 +9,9 @@
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   float tint_symbol_1 = 1.25f;
-  frexp_result_f32 res = frexp(tint_symbol_1);
+  frexp_result_f32 v = frexp_result_f32(0.0f, 0);
+  v.fract = frexp(tint_symbol_1, v.exp);
+  frexp_result_f32 res = v;
   float tint_symbol_2 = res.fract;
   int tint_symbol_3 = res.exp;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:12: 'frexp' : no matching overloaded function found 
-ERROR: 0:12: '=' :  cannot convert from ' const float' to ' temp structure{ global highp float fract,  global highp int exp}'
-ERROR: 0:12: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.ir.glsl b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.ir.glsl
index 44aefc9..4474078 100644
--- a/test/tint/builtins/frexp/vector/mixed.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/frexp/vector/mixed.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 
@@ -12,18 +10,10 @@
 void main() {
   vec2 runtime_in = vec2(1.25f, 3.75f);
   frexp_result_vec2_f32 res = frexp_result_vec2_f32(vec2(0.625f, 0.9375f), ivec2(1, 2));
-  res = frexp(runtime_in);
+  frexp_result_vec2_f32 v = frexp_result_vec2_f32(vec2(0.0f), ivec2(0));
+  v.fract = frexp(runtime_in, v.exp);
+  res = v;
   res = frexp_result_vec2_f32(vec2(0.625f, 0.9375f), ivec2(1, 2));
   vec2 tint_symbol_1 = res.fract;
   ivec2 tint_symbol_2 = res.exp;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:13: 'frexp' : no matching overloaded function found 
-ERROR: 0:13: 'assign' :  cannot convert from ' const float' to ' temp structure{ global highp 2-component vector of float fract,  global highp 2-component vector of int exp}'
-ERROR: 0:13: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.ir.glsl b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.ir.glsl
index 75fa0e7..67502f5 100644
--- a/test/tint/builtins/frexp/vector/runtime.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/frexp/vector/runtime.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 
 
@@ -11,17 +9,9 @@
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   vec2 tint_symbol_1 = vec2(1.25f, 3.75f);
-  frexp_result_vec2_f32 res = frexp(tint_symbol_1);
+  frexp_result_vec2_f32 v = frexp_result_vec2_f32(vec2(0.0f), ivec2(0));
+  v.fract = frexp(tint_symbol_1, v.exp);
+  frexp_result_vec2_f32 res = v;
   vec2 tint_symbol_2 = res.fract;
   ivec2 tint_symbol_3 = res.exp;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:12: 'frexp' : no matching overloaded function found 
-ERROR: 0:12: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 2-component vector of float fract,  global highp 2-component vector of int exp}'
-ERROR: 0:12: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/3dd21e.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/3dd21e.wgsl.expected.ir.glsl
index 3ce41cb..b6ac605 100644
--- a/test/tint/builtins/gen/var/frexp/3dd21e.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/3dd21e.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 precision highp float;
@@ -13,19 +11,13 @@
 
 void frexp_3dd21e() {
   f16vec4 arg_0 = f16vec4(1.0hf);
-  frexp_result_vec4_f16 res = frexp(arg_0);
+  frexp_result_vec4_f16 v = frexp_result_vec4_f16(f16vec4(0.0hf), ivec4(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec4_f16 res = v;
 }
 void main() {
   frexp_3dd21e();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:14: 'frexp' : no matching overloaded function found 
-ERROR: 0:14: '=' :  cannot convert from ' const float' to ' temp structure{ global 4-component vector of float16_t fract,  global highp 4-component vector of int exp}'
-ERROR: 0:14: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -37,20 +29,14 @@
 
 void frexp_3dd21e() {
   f16vec4 arg_0 = f16vec4(1.0hf);
-  frexp_result_vec4_f16 res = frexp(arg_0);
+  frexp_result_vec4_f16 v = frexp_result_vec4_f16(f16vec4(0.0hf), ivec4(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec4_f16 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_3dd21e();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:12: 'frexp' : no matching overloaded function found 
-ERROR: 0:12: '=' :  cannot convert from ' const float' to ' temp structure{ global 4-component vector of float16_t fract,  global highp 4-component vector of int exp}'
-ERROR: 0:12: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -66,7 +52,9 @@
 
 void frexp_3dd21e() {
   f16vec4 arg_0 = f16vec4(1.0hf);
-  frexp_result_vec4_f16 res = frexp(arg_0);
+  frexp_result_vec4_f16 v = frexp_result_vec4_f16(f16vec4(0.0hf), ivec4(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec4_f16 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -80,13 +68,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:16: 'frexp' : no matching overloaded function found 
-ERROR: 0:16: '=' :  cannot convert from ' const float' to ' temp structure{ global 4-component vector of float16_t fract,  global highp 4-component vector of int exp}'
-ERROR: 0:16: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.ir.glsl
index 553d399..a8fdcb2 100644
--- a/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/4b2200.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 precision highp float;
 precision highp int;
@@ -12,19 +10,13 @@
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result_f32 res = frexp(arg_0);
+  frexp_result_f32 v = frexp_result_f32(0.0f, 0);
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_f32 res = v;
 }
 void main() {
   frexp_4b2200();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:13: 'frexp' : no matching overloaded function found 
-ERROR: 0:13: '=' :  cannot convert from ' const float' to ' temp structure{ global highp float fract,  global highp int exp}'
-ERROR: 0:13: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -35,20 +27,14 @@
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result_f32 res = frexp(arg_0);
+  frexp_result_f32 v = frexp_result_f32(0.0f, 0);
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_f32 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_4b2200();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:11: 'frexp' : no matching overloaded function found 
-ERROR: 0:11: '=' :  cannot convert from ' const float' to ' temp structure{ global highp float fract,  global highp int exp}'
-ERROR: 0:11: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -63,7 +49,9 @@
 
 void frexp_4b2200() {
   float arg_0 = 1.0f;
-  frexp_result_f32 res = frexp(arg_0);
+  frexp_result_f32 v = frexp_result_f32(0.0f, 0);
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_f32 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -77,13 +65,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:15: 'frexp' : no matching overloaded function found 
-ERROR: 0:15: '=' :  cannot convert from ' const float' to ' temp structure{ global highp float fract,  global highp int exp}'
-ERROR: 0:15: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/5257dd.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/5257dd.wgsl.expected.ir.glsl
index 1f280c7..163e37e 100644
--- a/test/tint/builtins/gen/var/frexp/5257dd.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/5257dd.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 precision highp float;
@@ -13,19 +11,13 @@
 
 void frexp_5257dd() {
   float16_t arg_0 = 1.0hf;
-  frexp_result_f16 res = frexp(arg_0);
+  frexp_result_f16 v = frexp_result_f16(0.0hf, 0);
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_f16 res = v;
 }
 void main() {
   frexp_5257dd();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:14: 'frexp' : no matching overloaded function found 
-ERROR: 0:14: '=' :  cannot convert from ' const float' to ' temp structure{ global float16_t fract,  global highp int exp}'
-ERROR: 0:14: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -37,20 +29,14 @@
 
 void frexp_5257dd() {
   float16_t arg_0 = 1.0hf;
-  frexp_result_f16 res = frexp(arg_0);
+  frexp_result_f16 v = frexp_result_f16(0.0hf, 0);
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_f16 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_5257dd();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:12: 'frexp' : no matching overloaded function found 
-ERROR: 0:12: '=' :  cannot convert from ' const float' to ' temp structure{ global float16_t fract,  global highp int exp}'
-ERROR: 0:12: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -66,7 +52,9 @@
 
 void frexp_5257dd() {
   float16_t arg_0 = 1.0hf;
-  frexp_result_f16 res = frexp(arg_0);
+  frexp_result_f16 v = frexp_result_f16(0.0hf, 0);
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_f16 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -80,13 +68,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:16: 'frexp' : no matching overloaded function found 
-ERROR: 0:16: '=' :  cannot convert from ' const float' to ' temp structure{ global float16_t fract,  global highp int exp}'
-ERROR: 0:16: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/5f47bf.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/5f47bf.wgsl.expected.ir.glsl
index 5bb9452..9873605 100644
--- a/test/tint/builtins/gen/var/frexp/5f47bf.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/5f47bf.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 precision highp float;
@@ -13,19 +11,13 @@
 
 void frexp_5f47bf() {
   f16vec2 arg_0 = f16vec2(1.0hf);
-  frexp_result_vec2_f16 res = frexp(arg_0);
+  frexp_result_vec2_f16 v = frexp_result_vec2_f16(f16vec2(0.0hf), ivec2(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec2_f16 res = v;
 }
 void main() {
   frexp_5f47bf();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:14: 'frexp' : no matching overloaded function found 
-ERROR: 0:14: '=' :  cannot convert from ' const float' to ' temp structure{ global 2-component vector of float16_t fract,  global highp 2-component vector of int exp}'
-ERROR: 0:14: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -37,20 +29,14 @@
 
 void frexp_5f47bf() {
   f16vec2 arg_0 = f16vec2(1.0hf);
-  frexp_result_vec2_f16 res = frexp(arg_0);
+  frexp_result_vec2_f16 v = frexp_result_vec2_f16(f16vec2(0.0hf), ivec2(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec2_f16 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_5f47bf();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:12: 'frexp' : no matching overloaded function found 
-ERROR: 0:12: '=' :  cannot convert from ' const float' to ' temp structure{ global 2-component vector of float16_t fract,  global highp 2-component vector of int exp}'
-ERROR: 0:12: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -66,7 +52,9 @@
 
 void frexp_5f47bf() {
   f16vec2 arg_0 = f16vec2(1.0hf);
-  frexp_result_vec2_f16 res = frexp(arg_0);
+  frexp_result_vec2_f16 v = frexp_result_vec2_f16(f16vec2(0.0hf), ivec2(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec2_f16 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -80,13 +68,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:16: 'frexp' : no matching overloaded function found 
-ERROR: 0:16: '=' :  cannot convert from ' const float' to ' temp structure{ global 2-component vector of float16_t fract,  global highp 2-component vector of int exp}'
-ERROR: 0:16: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.ir.glsl
index 01d474a..756f772 100644
--- a/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/77af93.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 precision highp float;
 precision highp int;
@@ -12,19 +10,13 @@
 
 void frexp_77af93() {
   vec4 arg_0 = vec4(1.0f);
-  frexp_result_vec4_f32 res = frexp(arg_0);
+  frexp_result_vec4_f32 v = frexp_result_vec4_f32(vec4(0.0f), ivec4(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec4_f32 res = v;
 }
 void main() {
   frexp_77af93();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:13: 'frexp' : no matching overloaded function found 
-ERROR: 0:13: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 4-component vector of float fract,  global highp 4-component vector of int exp}'
-ERROR: 0:13: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -35,20 +27,14 @@
 
 void frexp_77af93() {
   vec4 arg_0 = vec4(1.0f);
-  frexp_result_vec4_f32 res = frexp(arg_0);
+  frexp_result_vec4_f32 v = frexp_result_vec4_f32(vec4(0.0f), ivec4(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec4_f32 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_77af93();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:11: 'frexp' : no matching overloaded function found 
-ERROR: 0:11: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 4-component vector of float fract,  global highp 4-component vector of int exp}'
-ERROR: 0:11: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -63,7 +49,9 @@
 
 void frexp_77af93() {
   vec4 arg_0 = vec4(1.0f);
-  frexp_result_vec4_f32 res = frexp(arg_0);
+  frexp_result_vec4_f32 v = frexp_result_vec4_f32(vec4(0.0f), ivec4(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec4_f32 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -77,13 +65,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:15: 'frexp' : no matching overloaded function found 
-ERROR: 0:15: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 4-component vector of float fract,  global highp 4-component vector of int exp}'
-ERROR: 0:15: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.ir.glsl
index e18d561..5e8ef38 100644
--- a/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/979800.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 precision highp float;
 precision highp int;
@@ -12,19 +10,13 @@
 
 void frexp_979800() {
   vec3 arg_0 = vec3(1.0f);
-  frexp_result_vec3_f32 res = frexp(arg_0);
+  frexp_result_vec3_f32 v = frexp_result_vec3_f32(vec3(0.0f), ivec3(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec3_f32 res = v;
 }
 void main() {
   frexp_979800();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:13: 'frexp' : no matching overloaded function found 
-ERROR: 0:13: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 3-component vector of float fract,  global highp 3-component vector of int exp}'
-ERROR: 0:13: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -35,20 +27,14 @@
 
 void frexp_979800() {
   vec3 arg_0 = vec3(1.0f);
-  frexp_result_vec3_f32 res = frexp(arg_0);
+  frexp_result_vec3_f32 v = frexp_result_vec3_f32(vec3(0.0f), ivec3(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec3_f32 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_979800();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:11: 'frexp' : no matching overloaded function found 
-ERROR: 0:11: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 3-component vector of float fract,  global highp 3-component vector of int exp}'
-ERROR: 0:11: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -63,7 +49,9 @@
 
 void frexp_979800() {
   vec3 arg_0 = vec3(1.0f);
-  frexp_result_vec3_f32 res = frexp(arg_0);
+  frexp_result_vec3_f32 v = frexp_result_vec3_f32(vec3(0.0f), ivec3(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec3_f32 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -77,13 +65,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:15: 'frexp' : no matching overloaded function found 
-ERROR: 0:15: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 3-component vector of float fract,  global highp 3-component vector of int exp}'
-ERROR: 0:15: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/ae4a66.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/ae4a66.wgsl.expected.ir.glsl
index 41f1165..75de641 100644
--- a/test/tint/builtins/gen/var/frexp/ae4a66.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/ae4a66.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 precision highp float;
@@ -13,19 +11,13 @@
 
 void frexp_ae4a66() {
   f16vec3 arg_0 = f16vec3(1.0hf);
-  frexp_result_vec3_f16 res = frexp(arg_0);
+  frexp_result_vec3_f16 v = frexp_result_vec3_f16(f16vec3(0.0hf), ivec3(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec3_f16 res = v;
 }
 void main() {
   frexp_ae4a66();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:14: 'frexp' : no matching overloaded function found 
-ERROR: 0:14: '=' :  cannot convert from ' const float' to ' temp structure{ global 3-component vector of float16_t fract,  global highp 3-component vector of int exp}'
-ERROR: 0:14: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -37,20 +29,14 @@
 
 void frexp_ae4a66() {
   f16vec3 arg_0 = f16vec3(1.0hf);
-  frexp_result_vec3_f16 res = frexp(arg_0);
+  frexp_result_vec3_f16 v = frexp_result_vec3_f16(f16vec3(0.0hf), ivec3(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec3_f16 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_ae4a66();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:12: 'frexp' : no matching overloaded function found 
-ERROR: 0:12: '=' :  cannot convert from ' const float' to ' temp structure{ global 3-component vector of float16_t fract,  global highp 3-component vector of int exp}'
-ERROR: 0:12: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 #extension GL_AMD_gpu_shader_half_float: require
 
@@ -66,7 +52,9 @@
 
 void frexp_ae4a66() {
   f16vec3 arg_0 = f16vec3(1.0hf);
-  frexp_result_vec3_f16 res = frexp(arg_0);
+  frexp_result_vec3_f16 v = frexp_result_vec3_f16(f16vec3(0.0hf), ivec3(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec3_f16 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -80,13 +68,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:16: 'frexp' : no matching overloaded function found 
-ERROR: 0:16: '=' :  cannot convert from ' const float' to ' temp structure{ global 3-component vector of float16_t fract,  global highp 3-component vector of int exp}'
-ERROR: 0:16: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1
diff --git a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.ir.glsl b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.ir.glsl
index e53f5f0..b4188a7 100644
--- a/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.ir.glsl
+++ b/test/tint/builtins/gen/var/frexp/eb2421.wgsl.expected.ir.glsl
@@ -1,5 +1,3 @@
-SKIP: FAILED
-
 #version 310 es
 precision highp float;
 precision highp int;
@@ -12,19 +10,13 @@
 
 void frexp_eb2421() {
   vec2 arg_0 = vec2(1.0f);
-  frexp_result_vec2_f32 res = frexp(arg_0);
+  frexp_result_vec2_f32 v = frexp_result_vec2_f32(vec2(0.0f), ivec2(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec2_f32 res = v;
 }
 void main() {
   frexp_eb2421();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:13: 'frexp' : no matching overloaded function found 
-ERROR: 0:13: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 2-component vector of float fract,  global highp 2-component vector of int exp}'
-ERROR: 0:13: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -35,20 +27,14 @@
 
 void frexp_eb2421() {
   vec2 arg_0 = vec2(1.0f);
-  frexp_result_vec2_f32 res = frexp(arg_0);
+  frexp_result_vec2_f32 v = frexp_result_vec2_f32(vec2(0.0f), ivec2(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec2_f32 res = v;
 }
 layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
 void main() {
   frexp_eb2421();
 }
-error: Error parsing GLSL shader:
-ERROR: 0:11: 'frexp' : no matching overloaded function found 
-ERROR: 0:11: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 2-component vector of float fract,  global highp 2-component vector of int exp}'
-ERROR: 0:11: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
 #version 310 es
 
 
@@ -63,7 +49,9 @@
 
 void frexp_eb2421() {
   vec2 arg_0 = vec2(1.0f);
-  frexp_result_vec2_f32 res = frexp(arg_0);
+  frexp_result_vec2_f32 v = frexp_result_vec2_f32(vec2(0.0f), ivec2(0));
+  v.fract = frexp(arg_0, v.exp);
+  frexp_result_vec2_f32 res = v;
 }
 VertexOutput vertex_main_inner() {
   VertexOutput tint_symbol = VertexOutput(vec4(0.0f));
@@ -77,13 +65,3 @@
   gl_Position[2u] = ((2.0f * gl_Position.z) - gl_Position.w);
   gl_PointSize = 1.0f;
 }
-error: Error parsing GLSL shader:
-ERROR: 0:15: 'frexp' : no matching overloaded function found 
-ERROR: 0:15: '=' :  cannot convert from ' const float' to ' temp structure{ global highp 2-component vector of float fract,  global highp 2-component vector of int exp}'
-ERROR: 0:15: '' : compilation terminated 
-ERROR: 3 compilation errors.  No code generated.
-
-
-
-
-tint executable returned error: exit status 1