tint: Implement const-eval of frexp()

Also add abstract overloads.

Bug: tint:1581
Fixed: tint:1768
Change-Id: Icda465e0cfe960b77823c2135f0cfe8f82ed394f
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/111441
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.glsl b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.glsl
new file mode 100644
index 0000000..e5ecc96
--- /dev/null
+++ b/test/tint/builtins/gen/var/frexp/6fb3ad.wgsl.expected.glsl
@@ -0,0 +1,67 @@
+#version 310 es
+
+struct frexp_result_vec2 {
+  vec2 fract;
+  ivec2 exp;
+};
+
+
+void frexp_6fb3ad() {
+  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+}
+
+vec4 vertex_main() {
+  frexp_6fb3ad();
+  return vec4(0.0f);
+}
+
+void main() {
+  gl_PointSize = 1.0;
+  vec4 inner_result = vertex_main();
+  gl_Position = inner_result;
+  gl_Position.y = -(gl_Position.y);
+  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
+  return;
+}
+#version 310 es
+precision mediump float;
+
+struct frexp_result_vec2 {
+  vec2 fract;
+  ivec2 exp;
+};
+
+
+void frexp_6fb3ad() {
+  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+}
+
+void fragment_main() {
+  frexp_6fb3ad();
+}
+
+void main() {
+  fragment_main();
+  return;
+}
+#version 310 es
+
+struct frexp_result_vec2 {
+  vec2 fract;
+  ivec2 exp;
+};
+
+
+void frexp_6fb3ad() {
+  frexp_result_vec2 res = frexp_result_vec2(vec2(0.5f), ivec2(1));
+}
+
+void compute_main() {
+  frexp_6fb3ad();
+}
+
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void main() {
+  compute_main();
+  return;
+}